把一条查询的结果当另一条查询的参数,比如先从学生表中查出学号,再根据学号从成绩表中查询成绩:
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 = '计算机科学与工程');
子查询的结果包含多行多列,称为表子查询。