mysql使用--子查询
1.标量子查询
将一个查询结果集中只含一行,行中只有一列的结果集称为标量结果集。
标量结果集可以作为数值参与到另一个查询中。
如:SELECT * FROM student_score WHERE number = (SELECT number FROM student_info WHERE name = ‘狗哥’);
2.列子查询
将一个查询结果集中包含多行,但行只有一列的结果集称为列子查询。
如:SELECT * FROM student_score WHERE number IN (SELECT number FROM student_info WHERE major = ‘计算机科学与工程’);
3.行子查询
将一个查询结果集中包含一行,但行包含多列的结果集称为行子查询。
如:SELECT * FROM student_score WHERE (number, subject) = (SELECT number, ‘MySQL是怎样运行的’ FROM student_info LIMIT 1);
4.表子查询
将一个查询结果集中包含多行,行中包含多列的结果集称为表子查询。
如:SELECT * FROM student_score WHERE (number, subject) IN (SELECT number, ‘MySQL是怎样运行的’ FROM student_info WHERE major = ‘计算机科学与工程’);
5.EXISTS和NOT EXISTS子查询
运算符 | 示例 | 描述 |
---|---|---|
EXISTS | EXISTS (SELECT …) | 当子查询结果集不是空集时表达式为真 |
NOT EXISTS | NOT EXISTS (SELECT …) | 当子查询结果集是空集时表达式为真 |
6.不相关子查询,相关子查询
若子查询可以独立运行并产生结果,则之后再拿结果参与外层查询,这种子查询称为不相关子查询。
如: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);
相关子查询的运作规律为:
1.基于FROM得到结果集1
2.对结果集1中每一行执行WHERE过滤,过滤通过时,行加入结果集2。这里的过滤是在行确定下,针对其执行EXISTS语句。
3.对结果集2中每一行执行SELECT语句,得到最终结果集。