mysql使用联结的好处_Mysql-联结

联结

简介

联结是一种机制,用来在一条SELECT语句中关联表,联结是由Mysql根据需要而建立的,它存在于SELECT语句的执行当中。

在执行数据检索查询中使用联结是SQL强大的功能之一,

联结是利用SQL的SELECT能执行的最重要的操作,

在使用联结之前,我们必须要了解下关系表。

关系表

来个栗子说明下

有一个关于产品的数据表,每个产品为一条记录,记录中包含产品的名称,产品的介绍,产品的价格以及供应商的信息。

现在假如有一个供应商能够提供多种商品,那么如何存储供应商的信息,如名字,地址,手机号等,答案是应该将供应商的信息与产品的信息分开存储

理由如下:

1)同一个供应商的信息是相同的,对产品重复此信息浪费存储空间

2)如果供应商信息有改动,只需改动一处即可

3)如果有重复数据,很难保证每次输入数据的方式都相同(每种产品都存储供应商信息)

相同数据出现多次不是一件好事是关系数据库设计的基础,关系表的设计就是要保证把信息分成多个表,一类信息一个表,

各表通过某个常用值互相关联。

下面我们来创建vendors和products这两个表,并对其进行关联

CREATE TABLEvendors(

vend_idINT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,

nameVARCHAR(20) NOT NULL,

telephoneVARCHAR(11)

)ENGINE="INNODB", CHARSET="UTF8";CREATE TABLEproducts(

pro_idINT(10) not NULL AUTO_INCREMENT PRIMARY KEY,

vend_idINT(10),

proc_nameVARCHAR(20) not NULL,

decsVARCHAR(50) DEFAULT NULL)ENGINE="INNODB", CHARSET="UTF8";INSERT INTO vendors VALUES(NULL, "tom", "13711111111");INSERT INTO vendors VALUES(NULL, "lily", "13811111111");INSERT INTO vendors VALUES(NULL, "marton", "13911111111");INSERT INTO products VALUES(NULL, 1, "apple", "big");INSERT INTO products VALUES(NULL, 2, "organge", "small");INSERT INTO products VALUES(NULL, 1, "grapes", NULL);

外键为某个表的一列,它包含另一个表的主键值,定义两个表之间的关系。

联结表的优点:

1)避免了信息重复,节约了时间和空间

2)某个数据变动,只需改变其响应的数据表即可

3)数据无重复使得数据能够更有效的存储和方便的处理,伸缩性强能够适应不断增加的工作量

如果数据存储在多个表中,那么怎么用一条语句检索出数据?答案是使用联结。

Mysql中常用join来建立表之间的连接。

join

要理解join,我们首先要理解笛卡尔积,由没有联结条件的表关系返回的结果为笛卡尔积。

比如表products中有m条记录,表vendors中有n条记录,那么这两个表的笛卡尔积为m*n条记录。

如下方式可以产生笛卡尔积

SELECT p.pro_id, p.vend_id, v.name, v.telephone FROM products p INNER JOIN vendors v;

463cbbb7b12d403de827031dd20f98c7.png

内连接

求两个表的交集,常见的内连接有JOIN, INNER JOIN, WHERE

以下两种查询方式是等价的

SELECT * FROM vendors, products WHERE vendors.vend_id=products.vend_id;SELECT * FROM vendors inner JOIN products WHERE vendors.vend_id=products.vend_id;

fac28282eecd5a0d318e8238fcf200c3.png

左连接

左连接以左表为主,返回包含左表中所有的数据行,对于右表中的某行在左表中没有匹配的行,那么右表将返回NULL

右连接

右连接以右表为主,返回包含右表中所有的数据行,对于左表中的某行在右表中没有匹配的行,那么左表将返回NULL

外连接

求两个或多个表之间的左连接和右连接的并集

Mysql不支持外连接,但是可以通过UNION来实现

当连接表的列采用相同的名称时,可用USING来简化ON语法

USING(col_name)指定一个属性名来连接两个表,而ON指定一个条件

在使用SELECT *时,USING会去除USING指定的列,而ON不会。

建议

1) 查询两表关联到相等的数据时用内连接

2) 左表中的关联列是右表中的关联列的子集,则使用右连接

3) 右表中的关联列是左表中的关联列的子集,则使用左连接

4) 左右表有交集但是又不互为子集时用全外连接

5) 求差操作是用联合查询

参考资料:《Mysql必知必会》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值