第15章(联结表)、16章(创建高级联结)、17章(组合查询)

《MySQL必知必会》学习笔记 第15-16章

第15章 联结表

 更多内容参考:https://blog.csdn.net/Michaelwubo/article/details/80923248

 

当数据存储在多个表中,使用联结检索多个表,返回一组输出

注意:联结不是物理实体

方法一:使用WHERE

但是WHERE会先生成笛卡尔积,再进行过滤,效率极低。因此能使用内部联结就不用WHERE

 

方法二:使用 INNER JOIN(内部联结或等值联结)

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON venders.vend_id = products.vend_id;

使用INNER JOIN 联结表vendors 和 products

使用联结有时可替代子查询,甚至效率比它更高。

 

第16章 创建高级联结

一、使用表别名

把customers表的别名起为c,后面的别名同理。

之后可用表的别名代替表名,输入方便。

但与列的别名不同,表别名不返回到客户机。(个人理解就是该别名不被输出到检索结果中。)

SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'TNT2'

 

二、自联结

例子:要寻找产品id是DTNTR的产品的供应商所生产的其他产品信息,在同一个products表中检索。

以p1, p2为别名。

使用WHERE p1.vend_id = p2.vend.id 联结两个表

使用p2.prod_id过滤数据

SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend.id
 AND p2.prod_id = 'DTNTR'

注意:SELECT语句中p1.prod_id等用法,否则将分别存在两个prod_id 和prod_name

 

三、外部联结

两个表相关联时,有时需要包含其中没有关联的行。

比如对customers表和orders表,要包含没有下订单的客户

比如检索客户及其订单:

SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;

使用了关键字 OUTER JOIN。加上LEFT使包含左边表customers的所有行,如果用RIGHT则包含orders所有行。

 

四、使用带聚集函数的联结

注:order_num是orders表里的唯一订单号。

在两个表联结并以customers表为准、以cust_id分组后,

由COUNT()统计每个cust_id对应的订单数,输出为num_ord

SELECT customers.cust_name,
          customers.cust_id,
          COUNT(orders.order_num) AS num_ord
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = order.cust_id
GROUP BY customers.cust_id;

用左外部联结将customers和orders相互关联。

以客户id分组数据,使用COUNT()统计客户订单数,输出为num_ord列。

 

五、使用联结和联结条件

① 总是提供联结条件,避免笛卡尔积

② 一个联结中可包含多个表、每个联结可采用不同联结类型,但在一起测试它们前,应分别测试每个联结。

 

第17章 组合查询

使用UNION联结多个SELECT语句(多条查询),将结果作为单个查询结果集返回。

UNION规则:

①  UNION必须由2条及以上SELECT语句组成

② 每个查询包含相同的列、表达式或聚集函数(顺序可以不同)

③ 列数据类型必须兼容

 

对组合结果查询排序:在最后一条SELECT语句之后加上ORDER BY语句。虽然是多个SELECT语句出现,但是ORDER BY只写在最后,对所有查询结果排序。

UNION自动去除重复的行,如果想包含重复的行可以用UNION ALL。

 

UNION与WHERE:

对于复杂的过滤条件或者从多个表查询,UNION处理更简单。

 

posted @ 2020-07-14 13:52  来一个烤包子  阅读(122)  评论(0)    收藏  举报