三天入门MySQL---DAY 3--子查询、联结表、组合查询

序言:上次课程我们学习了数据汇总与分组,这次我们进行数据库进阶学习子查询、联结表、组合查询。

目录

1. 子查询

1.1利用子查询进行过滤

1.2 作为计算字段使用子查询

2.联结表

2.1自联结

2.2外部联结

3.组合查询union

4.总结参考


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联合表
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值