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

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 = '计算机科学与工程');

子查询的结果包含多行多列,称为表子查询。