MySQL数据库(11)----使用子查询实现多表查询
子查询指的是用括号括起来,并嵌入另一条语句里的那条 SELECT 语句。下面有一个示例,它实现的是找出与考试类别('T')相对应的所有考试事件行的 ID,然后利用它们来查找那些考试的成绩:
SELECT * FROM score WHERE event_id IN ( SELECT event_id FROM grade_event WHERE category = 'T' ) ;
1.1 带关系比较运算符的子查询
运算符 =、<>、>、>=、< 和 <= 可用来对值之间的关系进行比较。当与标量子查询配合使用时,它们会将外层查询里所有与子查询的返回值有着特定关系的行找出来。例如:
SELECT * FROM score WHERE event_id=( SELECT event_id FROM grade_event WHERE event_id FROM grade_event WHERE date='2016-07-27' AND category = 'Q' );
如果遇到问题可以通过在 WHERE 子句里使用某个聚合函数来解决,那么可以考虑用带关系比较运算符的标量子查询。例如,想要知道在 student 表里的那个学生出生最早,则可能会试着编写出下面这条语句:
SELECT * FROM student WHERE birth= ( SELECT MIN( birth ) FROM student );
可是这个办法是行不通的,因为不能在 WHERE 子句里使用聚合函数。(WHERE 子句的用途是确定应该选取哪些行,但 MIN() 的值只有在选取行之后才能确定下来。) 不过,可以使用像下面这样的子查询来产生一个最小的出生日期:
SELECT * FROM student WHERE birth = ( SELECT MIN(birth) FROM student );
也可以使用其他聚合函数来解决类似问题。下面的这条语句使用了一个子查询来选取某次考试中高于平均分的分数:
SELECT * FROM score WHERE event_id=5 AND score > ( SELECT AVG(score) FROM score WHERE event_id = 5 );
如果子查询返回的是一个行,那么可以用一个构造器来实现一组值(即元组)与子查询结果的比较。下面这条语句会返回多行与 'Lily' 出生在同一个 state 和 city 的学生的名字:
mysql> SELECT name,city,state FROM student -> WHERE (city,state)= -> (SELECT city ,state FROM student WHERE name = 'Lily');