三天入门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"))
  • 输出

三天入门MySQL---DAY 3--子查询、联结表、组合查询_第1张图片

注意 :对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。

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
  • 输出

三天入门MySQL---DAY 3--子查询、联结表、组合查询_第2张图片

  • 思路:从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

三天入门MySQL---DAY 3--子查询、联结表、组合查询_第3张图片

  • left join :选中customers表中的所有行进行匹配
SELECT
cu.cust_id,ord.order_num
from customers cu left JOIN orders ord
on cu.cust_id=ord.cust_id

三天入门MySQL---DAY 3--子查询、联结表、组合查询_第4张图片

  • right join:选择orders表中的所有行进行匹配
SELECT
cu.cust_id,ord.order_num
from customers cu RIGHT JOIN orders ord
on cu.cust_id=ord.cust_id

三天入门MySQL---DAY 3--子查询、联结表、组合查询_第5张图片

我将在后面的面试知识点总结文章中对这部分进行详细进行总结 ,敬请期待。

3.组合查询union

利用union操作多条SELECT语句组合成一个结果。面试考点。

符号 说明 备注
union 查询结果集自动去重 一般默认使用union all,因为去重会影响查询效率
union all 查询的结果集不去重

4.总结参考

  • 参考用书:MySQL必知必会
  • 子查询
  • 联结表使用速度优于子查询
  • union联合表

你可能感兴趣的:(数据库,sql,数据库)