截至目前,我们学的都是对于一个表的内容进行查询,但在现实情况中我们涉及的查询内容过于广泛,我们需要的内容可能包含几个表中的内容,是否我们又需要一个表一个表的去输入语句进行查询呢?比如我们现在要查一个人的成绩。
mysql> select number from student_info where name='三玖';
+-----------+
| number |
+-----------+
| 220101103 |
+-----------+
1 row in set (0.02 sec)
mysql> select score from student_score where number=220101103;
+-------+
| score |
+-------+
| 78 |
+-------+
1 row in set (0.01 sec)
标量子查询:
仔细看看上面的查询语句,其实第二条查询语句的搜索条件其实是用到了第一条查询语句的查询结果。其实这两句就可以合并到一句。
mysql> select score from student_score where number=(select number from student_info where name='三玖');
+-------+
| score |
+-------+
| 78 |
+-------+
1 row in set (0.01 sec)
我们把第二条语句用小括号括起来,并作为一个操作数放到了第一条查询语句的搜索条件处,这样就起到了合并两条查询语句的作用。
在这个例子中,子查询的结果只有一个值,这种子查询称为标量子查询,由于标量子查询就只单纯代表一个值,因此可以与其它操作数通过运算符连接起来,组成更多复杂的表达式。
列子查询:
mysql> select * from student_score where number in (select number from student_info where major='jike');
+-----------+--------------------+-------+
| number | subject | score |
+-----------+--------------------+-------+
| 220101101 | 计算机是怎样运行的 | 78 |
| 220101102 | 计算机是怎样运行的 | 79 |
| 220101103 | 计算机是怎样运行的 | 78 |
| 220101104 | 计算机是怎样运行的 | 77 |
| 220101105 | 计算机是怎样运行的 | 77 |
+-----------+--------------------+-------+
5 rows in set (0.01 sec)
显然,在这个例子中,子查询的结果集中并不是一个单独的值,而是一个列,它包含的值并不单一,所以这个子查询也成为列子查询。
行子查询:
mysql> select * from student_score where (number, subject) = (select number, '计算机是怎样运行的' from student_info limit 1);
+-----------+--------------------+-------+
| number | subject | score |
+-----------+--------------------+-------+
| 220101101 | 计算机是怎样运行的 | 78 |
+-----------+--------------------+-------+
1 row in set (0.00 sec)
行子查询顾名思义:就是子查询的结果集中最多只包含一条记录,而且这条记录中有超过一个列的数据(如果该条记录只包含一个列的话该子查询就变成了标量子查询)。
表子查询:
如果子查询的结果集中包含多行多列,那么这个子查询也可以称为表子查询。
exists和not exists子查询:
exists(select .....):当子查询结果集不是空集时表达式为真
not exists(select...):当子查询结果集时空集时表达式为真
不相关子查询:
前面介绍的子查询可以独立并产生结果,之后再拿结果作为外层查询的条件去执行外层查询,这种子查询称为不相关子查询
有时候,我们需要在子查询的语句中引用外层查询的列,这样的话子查询就不能当作一个独立的语句去执行,这种子查询称为相关子查询。
对同一个表的子查询:
对同一表进行子查询我们需要注意的就是一个点,是否在查询的时候对数据进行了修改或者汇总等操作,有的话 就要再输入一次。
比如这样:
mysql> select * from student_score where subject = '计算机是怎样运行的' and score > avg(score);
ERROR 1111 (HY000): Invalid use of group function
mysql> select * from student_score where subject = '计算机是怎样运行的' and score > (select avg(score) from student_score where subject = '计算机是怎样运行的');
+-----------+--------------------+-------+
| number | subject | score |
+-----------+--------------------+-------+
| 220101101 | 计算机是怎样运行的 | 78 |
| 220101102 | 计算机是怎样运行的 | 79 |
| 220101103 | 计算机是怎样运行的 | 78 |
+-----------+--------------------+-------+
3 rows in set (0.01 sec)