正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史记录

« 前一个 版本 4 当前 »

把一条查询的结果当另一条查询的参数,比如先从学生表中查出学号,再根据学号从成绩表中查询成绩:

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是怎样运行的');












  • 无标签