连接查询
连接查询是关系型数据库的主要特点,通过连接运算符可以实现多个表连接查询。
当两个或者多个表中存在相同字段时,便可以通过这些字段对不同的表进行连接查询。
- 内连接查询
- 内连接查询
- 自连接查询
- 外连接查询
- 左外连接查询
- 右外连接查询
- 复合条件连接查询
- UNION / UNION ALL - 合并查询结果
内连接查询
INNNER JOIN
内连接使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组成新的记录。也就是说,在内连接查询中,只有满足条件的记录才能出现在结果关系中。
SELECT 后面的字段是两个表中的字段,FROM后面跟两个表,WHERE子句的查询条件表明只有在fruits的s_id和suppliers的s_id相同的时候,才是符合条件的查询结果。
SELECT suppliers.s_id, s_name, f_name, f_price
FROM fruits, suppliers
WHERE fruits.s_id = suppliers.s_id;
INNER JOIN,与上面WHERE子句的查询结果一样:
SELECT suppliers.s_id, s_name, f_name, f_price
FROM fruits INNER JOIN suppliers
ON fruits.s_id = suppliers.s_id;
使用INNER JOIN ... ON ...的语法确保连接条件不会被忘记。而WHERE子句在某些时候会影响查询性能。
自连接查询
- 自连接:如果在一个查询中,涉及的两个表都是同一个表,这种查询称为自连接查询。自连接是一种特殊的内连接查询。相互连接的表在物理上是同一张表,在逻辑上分为两张表。
SELECT f1.f_id, f1.f_name
FROM fruits AS f1, fruits AS f2
WHERE f1.s_id = f2.s_id AND f2.f_id = 'a1';
外连接查询
内连接的查询结果集合中仅包含符合查询条件和连接条件的行。
外连接有时候需要包含没有关联的行中数据,即返回结果集合中不仅包含符合连接条件的行,还包含左表、右表、或两个连接表中的所有行数据。外连接分为左连接、右连接。
左连接(左外连接)
返回包括左表中的所有记录和右表中连接字段相等的记录。
LEFT JOIN
右连接(右外连接)
返回包括右表中的所有记录和左表中连接字段相等的记录。
RIGHT JOIN
复合条件连接查询
其实就是在连接查询的基础上添加一些其他的查询条件,比如WHERE子句的条件表达式、GROUP BY分组、ORDER BY排序等;
子查询
子查询指一个查询语句嵌套在另一个查询语句内的查询。
在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表;
ANY
num1的值大于任意一个num2的值,则符合查询条件
SELECT num1 FROM tab1 WHERE num1 > ANY(SELECT num2 FROM tab2);
ALL
num1的值大于所有num2的值,则符合查询条件
SELECT num1 FROM tab1 WHERE num1 > ALL(SELECT num2 FROM tab2);
EXISTS / NOT EXISTS
EXISTS后面是一个任意的子查询,系统对自查询进行运算,判断它是否返回。
- EXISTS示例:
这个示例,子查询的条件是是否存在107这个人,如果存在,才会执行SELECT * FROM fruits
语句
SELECT * FROM fruits
WHERE EXISTS
(SELECT s_name FROM suppliers WHERE s_id = 107);
- EXISTS 和 WHERE 同时使用示例:
SELECT * FROM fruits
WHERE f_price > 10.20 AND EXISTS
(SELECT s_name FROM suppliers WHERE s_id = 107);
IN / NOT IN关键字的子查询
- 示例
SELECT c_id
FROM orders
WHERE o_num
IN (SELECT o_num FROM orderitems WHERE f_id = 'c0');
子查询的功能也可以通过连接查询实现,但是子查询代码使MYSQL代码更容易阅读和编写。
带比较运算符的子查询
- 示例:
SELECT s_id, f_name
FROM fruits
WHERE s_id =
(SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin');
这个示例,先通过子查询(SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin')
查到符合条件的s_id,再通过外层嵌套的查询通过WHERE子句比较,的到最终的查询结果;
UNION / UNION ALL - 合并查询结果
利用UNION,可以给出多条SELECT语句,并将他们的结果组合成单个结果集。
合并时,两个表对应的列数和数据类型必须相同。
各个SELECT语句之间使用UNION或者UNION ALL关键字分割。
UNION 执行的时候删除重复的记录,所有返回的行都是唯一的;UNION ALL 执行的时候删除重复的记录。
SELECT column, ... FROM table1
UNION [ALL]
SELECT column, ... FROM table2
UNION ALL的查询效率比UNION的高,如果没必要删除重复行,使用UNION ALL来查询。