Mysql从0到1(六):联结查询

一、什么是联结

如果数据存储在多个表中,怎么用单条SELECT语句检索出数据?

答案就是使用联结,直接举例子:

SELECT
	vend_name,
	prod_name,
	prod_price
FROM
	vendors,
	products
WHERE
	vendors.vend_id = products.vend_id
ORDER BY
	vend_name,
	prod_name

使用where子句把两个表联结起来,其实就是进行行的配对。

二、内部联结

刚刚使用的叫等值联结,基于两个表之间的相等测试,我们也可以用以下语法来实现:

SELECT
	vend_name,
	prod_name,
	prod_price
FROM
	vendors
INNER JOIN products ON vendors.vend_id = products.vend_id
ORDER BY
	vend_name,
	prod_name

尽管使用where字句比较简单,但是ANSI SQL规范首选inner join语法,这样明确联结语法,也有性能影响。

where字句的联结也叫隐式的内连接

三、自联结

在单条SELECT语句中使用相同的表,两种方法:使用子查询和使用自联结查询

已知ID为DTNTR的商品有问题,先需要查出生成该商品的供应商的其他商品的信息

1、先查出供应商ID

2、根据供应商ID查出商品

方式一:

SELECT
	prod_id,
	prod_name
FROM
	products
WHERE
	vend_id = (
		SELECT
			vend_id
		FROM
			products
		WHERE
			prod_id = 'DTNTR'
	)

方式二:首先联结两个表,然后根据按第二个表中的prod_id 过滤数据

SELECT
	p1.prod_id,
	p1.prod_name
FROM
	products p1 ,products p2
WHERE p1.vend_id = p2.vend_id
And   p2.prod_id = 'DTNTR'

虽然结果是相同的,但是使用自联结效率快很多。

三、外部联结

    许多联结是将一个表的行与另一个表的行相关联,但有时候会需要包含那些没有关联行的那些行。这种联结叫做外部联结。

   例子:对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户

分析:查出每个用户ID,以及其对于的定单数,但是这个用户ID必须去用户表里面查

SELECT customers.cust_id ,COUNT(orders.order_num) as order_nums
FROM customers LEFT  OUTER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id

语法:LEFT | RIGHT OUTER JOIN

 1、left join 是left outer join的简写

2、right join是right outer join的简写

LEFT : 选择左边表的所有行

RIGHT : 选择右边表的所有行

四、组合查询

应用组合查询:组合查询也叫并,使用UNION

1、在单个查询中从不同的表返回类似结构的数据;

2、在单个表执行多个查询,按单个查询返回数据。

UNION规则:

1、必须由两条Select字句构成

2、加了自动去重功能

3、两个查询必须包含相同的列、表达式或聚集函数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值