序言:上次课程我们学习了数据汇总与分组,这次我们进行数据库进阶学习子查询、联结表、组合查询。
目录
1. 子查询
子查询就是将其他语句查询结果再进行查询操作(我一般能用join就不用这个)
1.1利用子查询进行过滤
题目:需要列出订购物品TNT2的所有客户
思路:(1)在ordertimes表中检索出rod_id="TNT2"的所有订单号order_num
(2)在检索出订单编号力的所有客户id
(3)利用客户id检索出客户信息
(4)之前的每一句话都是下一句的where中的查询
- 输入
SELECT cust_name,cust_contact
FROM customers
where cust_id IN
(SELECT
cust_id
FROM orders
WHERE order_num IN
(SELECT
order_num
FROM
orderitems
where prod_id="TNT2"))
- 输出
注意 :对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
1.2 作为计算字段使用子查询
题目:现实customers表格中每个客户的订单数量
- 输入
SELECT
cust_name,
cust_state,
( SELECT COUNT(*) AS orders FROM orders WHERE orders.cust_id = customers.cust_id ) AS orders_num
FROM
customers
ORDER BY
cust_name
- 输出
- 思路:从customers表中检索客户列表,然后检索出的每个客户,统计其在orders表中的订单数目
2.联结表
2.1自联结
作为子查询的优化代码,在相同表中中检索数据时使用子查询语句,联结查询语句执行速度远高于子查询语句。
问题:查询生产id为DTNR的产品的供应商提供的所有产品(使用两种查询方式达到相同的目标)
(1)子查询代码
SELECT
prod_id,
prod_name
FROM
products
WHERE
vend_id = (
SELECT
vend_id
FROM
products
WHERE
prod_id = 'DTNTR')
(2)自联结代码
SELECT
p1.prod_id,
p1.prod_name
FROM
products p1,
products p2
WHERE
p1.vend_id=p2.vend_id
and p2.prod_id="DTNTR"
2.2外部联结
- inner join:选中customers表中的所有行进行匹配,并且删除没有匹配的行
SELECT
cu.cust_id,ord.order_num
from customers cu INNER JOIN orders ord
on cu.cust_id=ord.cust_id
- left join :选中customers表中的所有行进行匹配
SELECT
cu.cust_id,ord.order_num
from customers cu left JOIN orders ord
on cu.cust_id=ord.cust_id
- right join:选择orders表中的所有行进行匹配
SELECT
cu.cust_id,ord.order_num
from customers cu RIGHT JOIN orders ord
on cu.cust_id=ord.cust_id
我将在后面的面试知识点总结文章中对这部分进行详细进行总结 ,敬请期待。
3.组合查询union
利用union操作多条SELECT语句组合成一个结果。面试考点。
符号 | 说明 | 备注 |
union | 查询结果集自动去重 | 一般默认使用union all,因为去重会影响查询效率 |
union all | 查询的结果集不去重 |
4.总结参考
- 参考用书:MySQL必知必会
- 子查询
- 联结表使用速度优于子查询
- union联合表