《MySQL必知必会》学习笔记八(自/外联结)------掌握部分

来源:互联网 发布:网络漏洞扫描工具 编辑:程序博客网 时间:2024/04/20 23:20

MySQL必知必会知识预览
第一章——了解SQL
第二章——MySQL简介
第三章——使用MySQL
第四章——检索数据
第五章——排序检索数据
第六章——过滤数据
第七章——数据过滤
第八章——用通配符进行过滤
第九章——用正则表达式进行搜索
第十章——创建计算字段
第十一章——使用数据处理函数
第十二章——汇总数据
第十三章——分组数据
第十四章——使用子查询
第十五章——联结表
第十六章——创建高级联结
第十七章——组合查询
第十八章——全文本搜索
第十九章——插入数据
第二十章——更新和删除数据
第二十一章——创建和操纵表
第二十二章——使用视图
第二十三章——使用储存过程
第二十四章——使用游标
第二十五章——使用触发器
第二十六章——管理事务处理
第二十七章——全球化和本地化
第二十八章——安全管理
第二十九章——数据库维护
第三十章——改善性能
————————————– 华丽的分隔符 ————————————————–

第十六章

使用表别名:缩短SQL语句,允许在单条select语句中多次使用相同的表,表别名只是在查询中使用,与列别名不一样的是,列别名可以在客户机进行查询使用
select cust_name,cust_contact from customers as cuorders as ordorderitems as ort where cu.cust_id =ord.cust_id and ord.order_num =ort.order_num and ort.prod_id=’tnt2’

应该注意: 表别名只在查询中使用,与列别名不一样,表列名不返回到客户机。

自联结

思考: 如果 商品(其ID为DTNTR)有问题,因此想要知道生产该产品的供应商的其他产品是否也存在这些问题。

————————————–————————————–————————————–
首先找到ID为DTNTR的供应商,然后再查找该供应商的其他产品信息。

子查询实现:
select prod_name,prod_id from products where vend_id =(select vend_id from products where prod_id=’DTNTR’);

自联结查询实现:
select p1.prod_name,p1.prod_id from products as p1 , products as p2 where p1.vend_id = p2.vend_id and p2.prod_id=’DTNTR’;

这里写图片描述

注意:
用自联结而不用子查询:自联结通常作为外部语句用来代替从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多。多试,看看哪种性能更好

外部联结

联结包含了那些在相关表中没有关联行的行,这种类型的链接称为外部联结。
使用outer join 语法时,必须使用right 或left 关键字进行指定包括其所有行的表。
左联结:查询各表中满足条件相同的行,并且查询出左表的所有信息行。
右联结:查询各表中满足条件相同的行,并且查询出右表的所有信息行。
select customers.cust_id,orders.order_num from customers left outer join orders on orders.cust_id = customers.cust_id;
select customers.cust_id,orders.order_num from customers right outer join orders on orders.cust_id = customers.cust_id;
这里写图片描述
注意: 图中的数据一个是6条数据,一个是5条数据。在左联结查询时,会将左表的所有信息给查询出来,而有些数据在右表不存在,从而连带出空数据。而在右联结查询时,则是将右表的数据查询出来,然后连带出左表的部分数据,

MySQL不支持简化字符” *= ”和” =* ”的使用 ,但是这种操作符在其他DBMS中很是流行。

带聚集函数的联结

聚集函数用来汇总数据。也可以与联结进行使用。

select customers.cust_name,customers.cust_id, count(orders.order_num) as n
um_ord from customers inner join orders on customers.cust_id = orders.cust_id gr
oup by customers.cust_id;
这里写图片描述

select 语句使用Inner Join 将customers和orders表相互关联。group by 子句按客户分组数据,因此,函数调用count对每个客户的订单计数,然后返回。

使用联结的要点:
一般我们是使用内部联结,但是使用外部联结也是有效的。
保证使用正确的联结条件,否则将返回不正确的结果。
应该提供有效的联结条件,否则将会产生笛卡儿积。
在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。但是应该在一起测试他们之前,分别测试每个联结。

0 0
原创粉丝点击