一、什么是联结
如果数据存储在多个表中,怎么用单条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、两个查询必须包含相同的列、表达式或聚集函数