联结
简介
联结是一种机制,用来在一条SELECT语句中关联表,联结是由Mysql根据需要而建立的,它存在于SELECT语句的执行当中。
在执行数据检索查询中使用联结是SQL强大的功能之一,
联结是利用SQL的SELECT能执行的最重要的操作,
在使用联结之前,我们必须要了解下关系表。
关系表
来个栗子说明下
有一个关于产品的数据表,每个产品为一条记录,记录中包含产品的名称,产品的介绍,产品的价格以及供应商的信息。
现在假如有一个供应商能够提供多种商品,那么如何存储供应商的信息,如名字,地址,手机号等,答案是应该将供应商的信息与产品的信息分开存储
理由如下:
1)同一个供应商的信息是相同的,对产品重复此信息浪费存储空间
2)如果供应商信息有改动,只需改动一处即可
3)如果有重复数据,很难保证每次输入数据的方式都相同(每种产品都存储供应商信息)
相同数据出现多次不是一件好事是关系数据库设计的基础,关系表的设计就是要保证把信息分成多个表,一类信息一个表,
各表通过某个常用值互相关联。
下面我们来创建vendors和products这两个表,并对其进行关联
CREATE TABLE vendors( vend_id INT(10) not null PRIMARY KEY, name VARCHAR(20) not null, telephone VARCHAR(11) ); CREATE TABLE products( pro_id INT(10) not NULL PRIMARY KEY, name VARCHAR(20) not NULL, dec VARCHAR(50) DEFAULT NULL );
外键为某个表的一列,它包含另一个表的主键值,定义两个表之间的关系。
联结表的优点:
1)避免了信息重复,节约了时间和空间
2)某个数据变动,只需改变其响应的数据表即可
3)数据无重复使得数据能够更有效的存储和方便的处理,伸缩性强能够适应不断增加的工作量
如果数据存储在多个表中,那么怎么用一条语句检索出数据?答案是使用联结。
Mysql中常用join来建立表之间的连接。
join
要理解join,我们首先要理解笛卡尔积,由没有联结条件的表关系返回的结果为笛卡尔积。
比如表products中有m条记录,表vendors中有n条记录,那么这两个表的笛卡尔积为m*n条记录。
如下方式可以产生笛卡尔积
1 SELECT * FROM products INNER JOIN vendors 2 SELECT * FROM products JOIN vendors
内连接
求两个表的交集,常见的内连接有JOIN, INNER JOIN, WHERE
左连接
两个表的交集加上左表剩下的数据
右连接
两个表的交集加上右表剩下的数据
外连接
求两个或多个表之间的左连接和右连接的并集
Mysql不支持外连接,但是可以通过UNION来实现
当连接表的列采用相同的名称时,可用USING来简化ON语法
USING(col_name)指定一个属性名来连接两个表,而ON指定一个条件
在使用SELECT *时,USING会去除USING指定的列,而ON不会。