版本比较
比较
标识
- 该行被添加。
- 该行被删除。
- 格式已经改变。
把一条查询的结果当另一条查询的参数,比如先从学生表中查出学号,再根据学号从成绩表中查询成绩:
代码块 |
---|
SELECT number FROM student_info WHERE name = '狗哥'; SELECT * from student_score WHERE number = 20210101; |
标量子查询
代码块 |
---|
SELECT * FROM student_score WHERE number = (SELECT number FROM student_info WHERE name = '狗哥'); SELECT (SELECT number FROM student_info WHERE name = '狗哥') AS 学号; SELECT * FROM student_score WHERE number > (SELECT number FROM student_info WHERE name = '狗哥'); |
子查询的结果只有一个值,这种子查询称为标量子查询。由于子查询单纯代表一个值,所以可以作为表达式的操作数来参与运算。
列子查询
代码块 |
---|
SELECT number FROM student_info WHERE major = '计算机科学与工程'; SELECT * FROM student_score WHERE number IN (20210101, 20210102); |
子查询的结果为一个列,称为列查询,如下:
代码块 |
---|
SELECT * FROM student_score WHERE number IN
-> (SELECT number FROM student_info WHERE major = '计算机科学与工程'); |
列子查询的结果是每个子查询的行都对应一个查询结果。
行子查询
代码块 |
---|
SELECT * FROM student_score WHERE -> (number, subject) = (SELECT number, 'MySQL是怎样运行的' FROM student_info LIMIT 1); |
子查询的结果只有一行,但包含多个列。由于子查询包含多个列,所以与其进行相等比较的另一个操作数也必须包含多个列,这里是(number, subject)。
表子查询
代码块 |
---|
SELECT * FROM student_score WHERE (number, subject) IN
-> (SELECT number, 'MySQL是怎样运行的' FROM student_info WHERE major = '计算机科学与工程'); |
子查询的结果包含多行多列,称为表子查询。
EXISTS 和 NOT EXISTS 子查询
代码块 |
---|
SELECT * FROM student_score WHERE EXISTS(SELECT * FROM student_info WHERE number = 20210108); |
只关心只查询的结果是否存在,而不关心具体的值,用作条件判断。
不相关子查询和相关子查询
代码块 |
---|
SELECT * FROM student_score WHERE number = (SELECT number FROM student_info WHERE name = '狗哥'); |
子查询可以单独运行并生产结果,称为不相关子查询。
如果在子查询中引用外层查询的结果,则称为相关查询,比如下面的查询:
代码块 |
---|
SELECT number, name, id_number, major FROM student_info -> WHERE EXISTS (SELECT * FROM student_score WHERE student_score.number = student_info.number); |
先从student_info表中取出第一条记录,然后把它的number传给子查询,看看有没有结果,也就是student_score表中有没有这个number的记录,如果有则输入父查询的结果。
- 从stduent_info表中获取一些学生信息。
- 把这些学生信息传给子查询,判断是否符合条件,也就是number必须在student_score表中有记录。
对同一个表的子查询
代码块 |
---|
SELECT * FROM student_score WHERE subject = 'MySQL是怎样运行的' AND score > AVG(score); |
查询一门课中超过平均分的分数。上面的语句会出错,因为AVG函数是针对分组的,正确的方式应该是像下面这样:
代码块 |
---|
SELECT * FROM student_score WHERE subject = 'MySQL是怎样运行的' -> AND score > (SELECT AVG(score) FROM student_score WHERE subject = 'MySQL是怎样运行的'); |
目录 |
---|