博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql使用联结的好处_MySQL必知必会读书笔记-5(表的联结)
阅读量:6469 次
发布时间:2019-06-23

本文共 2281 字,大约阅读时间需要 7 分钟。

联结(join)操作是SQL语言最强大的功能之一。这个操作是建立在关系表的基础之上的

1--关系表

何谓关系表?

假设有一个产品表,每一个产品都有自己的属性和供应商,一个供应商可能有多种产品。

那么在何处存储供应商的信息呢?如果直接在产品表里面存储,假设某个供应商有一千种产品,

在产品表里,该供应商的信息就会被存储1000次,供应商要改个名字就要到表里改1000次,

这样不仅速度慢,还容易出错。

关键是,相同数据在表中多次出现不是什么好事(至少很浪费空间)。这时,关系表的作用

就显现出来了。我们可以建立两个表,供应商表和产品表。每个供应商都有一个独一无二的ID,

产品表每个产品里面存储一个供应商ID,两个表就能通过一个ID联系起来,即每个产品都能通过

其供应商ID找到对应的供应商。

供应商的ID就是主键,同时它也是产品表的外键,这个外键将产品表和供应商表关联起来。

这样做的好处有很多:不会产生重复的信息,如果供应商信息变动,只需要修改供应商表里的一条

信息即可。

2--联结(内联结)

以上面的例子说,当我们需要检索出一个产品的属性和它的供应商的属性时,需要两个表的信息

对应联结起来,这时候就用到了联结。

创建联结

SELECTvend_name, prod_name, prod_priceFROMvendors, productsWHERE vendors.vend_id = products.vend_id

86d075929be1798f31a312db7b8fc38c.png

329efa931774d416cbd1e75b2a859a82.png

如果没有where子句(即没有联结条件),输出的结果将是两个表的笛卡尔积。输出结果的数目将是第一个

表的行数乘以第二个表的行数。

内部联结

上面例子使用等值联结,也称为内部联结。

SELECTvend_name, prod_name, prod_priceFROM vendors INNER JOINproductsON vendors.vend_id = products.vend_id

d49d031aff3cedd3115d0bf5a5bcf6b3.png

660d99fcd0fc88f35898d1911e01883a.png

3--引用完整性

6abcc34b67e6dd34400b04428ca81650.png

4--联结多个表

显示编号为20005的订单中的物品的基本信息和供应商信息

SELECTprod_name, prod_price, vend_name, quantityFROMorderitems, products, vendorsWHERE order_num = 20005

AND orderitems.prod_id =products.prod_idAND products.vend_id = vendors.vend_id

cc06e39d70e0ca8a4bc417901ec6ff69.png

返回订购了TNT2的客户的信息

SELECTcustomers.cust_name, customers.cust_contact, orderitems.quantityFROMcustomers, orders, orderitemsWHERE orderitems.prod_id = 'TNT2'

AND orders.order_num =orderitems.order_numAND customers.cust_id = orders.cust_id

b7d1fab9e224ebf940729d3c8dfdddd2.png

5--使用表的别名

对上一个例子使用别名,可以缩短代码长度,结果相同

SELECTc.cust_name, c.cust_contact, oi.quantityFROM customers AS c, orders AS o, orderitems ASoiWHERE oi.prod_id = 'TNT2'

AND o.order_num =oi.order_numAND c.cust_id = o.cust_id

6--自联结

找出某个产品的供应商生产的其他产品

1.使用子查询

SELECTprod_id, prod_nameFROMproductsWHERE vend_id =(SELECTvend_idFROMproductsWHERE prod_id = 'DTNTR')

2.使用自联结

SELECTp1.prod_id, p1.prod_nameFROM products AS p1, products ASp2WHERE p1.vend_id =p2.vend_idAND p2.prod_id = 'DTNTR'

659632c5bc4aed9b979963d7d7fac67c.png

7--外部联结

d75694ac9a2e67fc60acb6633d0cebd9.png

上述例子中,联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结。

检索所有客户及其订单

1.使用内联结

SELECTcust_name, order_numFROM customers AS c INNER JOIN orders ASoON c.cust_id = o.cust_id

789bb938fedd5642968576abe4a63e5f.png

未列出没有订单的顾客

2.使用外联结

SELECTcust_name, order_numFROM customers AS c LEFT OUTER JOIN orders ASoON c.cust_id = o.cust_id

93879412f528e6f48597dcba21e78a5e.png

列出了没有订单的顾客

使用OUTER JOIN语法时,必须指定RIGHT或LEFT关键字

这里LEFT表示列出左边customer表中的所有行

8--使用带聚集函数的联结

检索所有客户和每个客户所下的订单数。

SELECT c.cust_name, c.cust_id, COUNT(o.order_num) ASnum_ordFROM customers AS c LEFT OUTER JOIN orders ASoON c.cust_id =o.cust_idGROUP BY c.cust_id

cc5da9824faa4e6b3c23d45de81a7bfd.png

9--总结

41cdf3eb43477eb7d3e49e31ad6be7a4.png

转载地址:http://dpdko.baihongyu.com/

你可能感兴趣的文章
046 SparlSQL中的函数
查看>>
Zookeeper 的 Lua 绑定(二)
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>
[LeetCode] Minimum Depth of Binary Tree
查看>>
,net运行框架
查看>>
Java 中 Emoji 的正则表达式
查看>>
Mixin Network第一届开发者大赛作品介绍- dodice, diceos和Fox.one luckycoin
查看>>
安卓Glide(4.7.1)使用笔记 01 - 引入项目
查看>>
AndroidNote
查看>>
中金易云:为出版社找到下一本《解忧杂货店》
查看>>
Flex布局
查看>>
Material Design之 AppbarLayout 开发实践总结
查看>>
Android中的SurfaceView详解
查看>>
Flutter之MaterialApp使用详解
查看>>
DataBinding最全使用说明
查看>>
原生Js交互之DSBridge
查看>>
Matlab编程之——卷积神经网络CNN代码解析
查看>>
白洋淀周末游
查看>>
三篇文章了解 TiDB 技术内幕 —— 说计算
查看>>
在Mac下使用Python3
查看>>