|
|
@ -993,15 +993,72 @@ SELECT CONCAT('学科:', subject), COUNT(student_score.number) AS 人数 FROM st |
|
|
|
## 11.2 标量子查询 |
|
|
|
## 11.2 标量子查询 |
|
|
|
|
|
|
|
|
|
|
|
- 标量子查询代表的仅仅是一个值 |
|
|
|
- 标量子查询代表的仅仅是一个值 |
|
|
|
|
|
|
|
- 子查询必须用括号括起来 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 标量子查询 查名字叫狗哥的人的所有学科成绩 |
|
|
|
|
|
|
|
SELECT * FROM student_score WHERE number = (SELECT number FROM student_info WHERE name = '狗哥'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 查比狗哥学号大的所有人的信息 |
|
|
|
|
|
|
|
SELECT * FROM student_info WHERE number > (SELECT number FROM student_info WHERE name = '狗哥'); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 11.3 列子查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 列子查询 查计算机科学与工程的学生的成绩 |
|
|
|
|
|
|
|
SELECT * FROM student_score WHERE number IN (SELECT number FROM student_info WHERE major = '计算机科学与工程'); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 11.4 行子查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 加入不知道子查询会出现几条记录,加上`LIMIT 1`吧 |
|
|
|
|
|
|
|
- 两边均要用括号 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
SELECT * FROM student_score WHERE (number, subject) = (SELECT number, 'MySQL是怎样运行的' FROM student_info LIMIT 1); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 11.5 表子查询 (多行多列) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 此版本的MySQL还不支持“LIMIT&IN/ALL/AANY/SOME子查询” MYSQL8.3 |
|
|
|
|
|
|
|
SELECT * FROM student_score WHERE (number, subject) IN (SELECT number, 'MySQL是怎样运行的' FROM student_info WHERE major = '计算机科学与工程'); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 11.6 `EXISTS` 和 `NOT EXISTS`子查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 如果存在记录就查 |
|
|
|
|
|
|
|
SELECT * FROM student_info WHERE EXISTS(SELECT * FROM student_info WHERE number = 10086); |
|
|
|
|
|
|
|
-- 如果不存在记录就查 |
|
|
|
|
|
|
|
SELECT * FROM student_info WHERE NOT EXISTS(SELECT * FROM student_info WHERE number = 10086); |
|
|
|
|
|
|
|
-- 相等 |
|
|
|
|
|
|
|
SELECT * FROM student_info WHERE (SELECT COUNT(*) FROM student_info WHERE number != 10086) > 1; |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 11.7 不相关子查询和相关子查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 像上面的,外层查询和子查询不想管,独立运行叫做不相关查询 |
|
|
|
|
|
|
|
- 相关查询是,外层查询的值需要被子查询应用,外层查询每查到一行,再拿行数据和子查询进行匹配 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 相关子查询 查存在成绩的学生信息 |
|
|
|
|
|
|
|
SELECT * FROM student_info a WHERE EXISTS(SELECT number FROM student_score b WHERE a.number = b.number); |
|
|
|
|
|
|
|
-- 显然这个效率很低 |
|
|
|
|
|
|
|
SELECT * FROM student_info a WHERE number = IF((SELECT COUNT(number) FROM student_score b WHERE a.number = b.number) > 0, a.number, NULL); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 11.8 对同一个表的子查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 查大于平均分的成绩 |
|
|
|
|
|
|
|
SELECT * FROM student_score WHERE score > (SELECT AVG(score) FROM student_score); |
|
|
|
|
|
|
|
-- 查和狗哥一个学院的人 |
|
|
|
|
|
|
|
SELECT * FROM student_info WHERE department = (SELECT department FROM student_info WHERE name = '狗哥'); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第十二章 连接查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|