联结
简介
联结是一种机制,用来在一条SELECT语句中关联表,联结是由Mysql根据需要而建立的,它存在于SELECT语句的执行当中。
在执行数据检索查询中使用联结是SQL强大的功能之一,
联结是利用SQL的SELECT能执行的最重要的操作,
在使用联结之前,我们必须要了解下关系表。
关系表
来个栗子说明下
有一个关于产品的数据表,每个产品为一条记录,记录中包含产品的名称,产品的介绍,产品的价格以及供应商的信息。
现在假如有一个供应商能够提供多种商品,那么如何存储供应商的信息,如名字,地址,手机号等,答案是应该将供应商的信息与产品的信息分开存储
理由如下:
1)同一个供应商的信息是相同的,对产品重复此信息浪费存储空间
2)如果供应商信息有改动,只需改动一处即可
3)如果有重复数据,很难保证每次输入数据的方式都相同(每种产品都存储供应商信息)
相同数据出现多次不是一件好事是关系数据库设计的基础,关系表的设计就是要保证把信息分成多个表,一类信息一个表,
各表通过某个常用值互相关联。
下面我们来创建vendors和products这两个表,并对其进行关联
CREATE TABLE vendors( vend_id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, telephone VARCHAR(11) )ENGINE="INNODB", CHARSET="UTF8"; CREATE TABLE products( pro_id INT(10) not NULL AUTO_INCREMENT PRIMARY KEY, vend_id INT(10), proc_name VARCHAR(20) not NULL, decs VARCHAR(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;
内连接
求两个表的交集,常见的内连接有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;
左连接
左连接以左表为主,返回包含左表中所有的数据行,对于右表中的某行在左表中没有匹配的行,那么右表将返回NULL
右连接
右连接以右表为主,返回包含右表中所有的数据行,对于左表中的某行在右表中没有匹配的行,那么左表将返回NULL
外连接
求两个或多个表之间的左连接和右连接的并集
Mysql不支持外连接,但是可以通过UNION来实现
当连接表的列采用相同的名称时,可用USING来简化ON语法
USING(col_name)指定一个属性名来连接两个表,而ON指定一个条件
在使用SELECT *时,USING会去除USING指定的列,而ON不会。
建议
1) 查询两表关联到相等的数据时用内连接
2) 左表中的关联列是右表中的关联列的子集,则使用右连接
3) 右表中的关联列是左表中的关联列的子集,则使用左连接
4) 左右表有交集但是又不互为子集时用全外连接
5) 求差操作是用联合查询
参考资料:《Mysql必知必会》