Mysql-联结

联结

简介

联结是一种机制,用来在一条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不会。

猜你喜欢

转载自www.cnblogs.com/marton/p/11297534.html