第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处理更简单。

浙公网安备 33010602011771号