文档章节

mySQL的表连接

乐在克里特
 乐在克里特
发布于 2017/02/24 11:32
字数 1369
阅读 4
收藏 1

一、mysql表的连接方式

内连接和外连接的区别:

我把两个表比作集合A、B,其中,内连接是集合A和集合B的交集,而交集的内容在两个表中都存在,即在每一个表的内部;而外连接则是除了交集外,还有另一个表中的内容(左、右、全),所涉及的结果集是两个表中的内容。

 

二、表的连接方式:

表的连接查询方式有内连接、外连接(左连接、右连接、全连接)、交叉连接。

 

下面举例中所采用的表:

mysql> select * from Store_Information;

+---------------+-------+------------+

| store_name    | Sales | Date       |

+---------------+-------+------------+

| Los Angeles   |  1500 | 1999-01-05 |

| Los Angeles   |   500 | 1999-01-08 |

| Boston        |   700 | 1999-01-08 |

| Seven Eleven  |   860 | 1999-01-09 |

| Good Neighbor |  1100 | 1999-01-10 |

| Wumark        |  3000 | 1999-01-11 |

| Walmark       |  3500 | 1998-04-15 |

| Titi          |  1100 | 1999-05-15 |

+---------------+-------+------------+

8 rows in set (0.00 sec)

 

mysql> select * from Geography;

+-------------+-------------+

| region_name | store_name  |

+-------------+-------------+

| East        | Boston      |

| East        | New York    |

| West        | Los Angeles |

| West        | San Diego   |

+-------------+-------------+

4 rows in set (0.00 sec)

 

mysql>

 

1.内连接:

内连接查询操作列出与连接条件匹配的数据航,它使用比较运算符比较被连接列的列值。只有两个表相匹配的行才能出现在结果集中,也就是根据条件得到两个表的交集。

 

举例说明:

mysql> select * from Store_Information S,Geography G where S.store_name=G.store_name;

+-------------+-------+------------+-------------+-------------+

| store_name  | Sales | Date       | region_name | store_name  |

+-------------+-------+------------+-------------+-------------+

| Los Angeles |  1500 | 1999-01-05 | West        | Los Angeles |

| Los Angeles |   500 | 1999-01-08 | West        | Los Angeles |

| Boston      |   700 | 1999-01-08 | East        | Boston      |

+-------------+-------+------------+-------------+-------------+

3 rows in set (0.00 sec)

 

mysql> select * from Store_Information S inner join Geography G on S.store_name=G.store_name;

+-------------+-------+------------+-------------+-------------+

| store_name  | Sales | Date       | region_name | store_name  |

+-------------+-------+------------+-------------+-------------+

| Los Angeles |  1500 | 1999-01-05 | West        | Los Angeles |

| Los Angeles |   500 | 1999-01-08 | West        | Los Angeles |

| Boston      |   700 | 1999-01-08 | East        | Boston      |

+-------------+-------+------------+-------------+-------------+

3 rows in set (0.00 sec)

 

mysql> select * from Store_Information S inner join Geography G using(store_name);

+-------------+-------+------------+-------------+

| store_name  | Sales | Date       | region_name |

+-------------+-------+------------+-------------+

| Los Angeles |  1500 | 1999-01-05 | West        |

| Los Angeles |   500 | 1999-01-08 | West        |

| Boston      |   700 | 1999-01-08 | East        |

+-------------+-------+------------+-------------+

3 rows in set (0.00 sec)

 

mysql>

 

上面的第一条sql和第二条sql语句是等价的,第三条语句是第二条sql的简写形式,on子句和using子句的替换模式。在下面不再演示using的子句了。

 

2.外连接:

返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或左右两边的表(全外连接)中的所有行。

 

左外连接:

mysql> select * from Store_Information S left join Geography G on S.store_name=G.store_name;

+---------------+-------+------------+-------------+-------------+

| store_name    | Sales | Date       | region_name | store_name  |

+---------------+-------+------------+-------------+-------------+

| Los Angeles   |  1500 | 1999-01-05 | West        | Los Angeles |

| Los Angeles   |   500 | 1999-01-08 | West        | Los Angeles |

| Boston        |   700 | 1999-01-08 | East        | Boston      |

| Seven Eleven  |   860 | 1999-01-09 | NULL        | NULL        |

| Good Neighbor |  1100 | 1999-01-10 | NULL        | NULL        |

| Wumark        |  3000 | 1999-01-11 | NULL        | NULL        |

| Walmark       |  3500 | 1998-04-15 | NULL        | NULL        |

| Titi          |  1100 | 1999-05-15 | NULL        | NULL        |

+---------------+-------+------------+-------------+-------------+

8 rows in set (0.00 sec)

 

mysql>

 

右外连接:

mysql> select * from Store_Information S right join Geography G on S.store_name=G.store_name;

+-------------+-------+------------+-------------+-------------+

| store_name  | Sales | Date       | region_name | store_name  |

+-------------+-------+------------+-------------+-------------+

| Boston      |   700 | 1999-01-08 | East        | Boston      |

| NULL        |  NULL | NULL       | East        | New York    |

| Los Angeles |  1500 | 1999-01-05 | West        | Los Angeles |

| Los Angeles |   500 | 1999-01-08 | West        | Los Angeles |

| NULL        |  NULL | NULL       | West        | San Diego   |

+-------------+-------+------------+-------------+-------------+

5 rows in set (0.00 sec)

 

mysql>

 

全连接(mysql中不支持全连接,我们可以用左右合并来解决):

mysql> select * from Store_Information S left join Geography G on S.store_name=G.store_name union (select * from Store_Information S right join Geography G on S.store_name=G.store_name);

+---------------+-------+------------+-------------+-------------+

| store_name    | Sales | Date       | region_name | store_name  |

+---------------+-------+------------+-------------+-------------+

| Los Angeles   |  1500 | 1999-01-05 | West        | Los Angeles |

| Los Angeles   |   500 | 1999-01-08 | West        | Los Angeles |

| Boston        |   700 | 1999-01-08 | East        | Boston      |

| Seven Eleven  |   860 | 1999-01-09 | NULL        | NULL        |

| Good Neighbor |  1100 | 1999-01-10 | NULL        | NULL        |

| Wumark        |  3000 | 1999-01-11 | NULL        | NULL        |

| Walmark       |  3500 | 1998-04-15 | NULL        | NULL        |

| Titi          |  1100 | 1999-05-15 | NULL        | NULL        |

| NULL          |  NULL | NULL       | East        | New York    |

| NULL          |  NULL | NULL       | West        | San Diego   |

+---------------+-------+------------+-------------+-------------+

10 rows in set (0.00 sec)

 

mysql>

 

3.交叉连接:

 

交叉连接不带where子句,它返回被连接的两个表所有数据航的笛卡尔积,返回到结果集中的额数据行数等于第一个表中符合查询条件的数据航乘以第二个表中符合查询条件的数据行数。

mysql> select * from Store_Information S cross join Geography G order by S.store_name;

+---------------+-------+------------+-------------+-------------+

| store_name    | Sales | Date       | region_name | store_name  |

+---------------+-------+------------+-------------+-------------+

| Boston        |   700 | 1999-01-08 | West        | Los Angeles |

| Boston        |   700 | 1999-01-08 | East        | New York    |

| Boston        |   700 | 1999-01-08 | East        | Boston      |

| Boston        |   700 | 1999-01-08 | West        | San Diego   |

| Good Neighbor |  1100 | 1999-01-10 | West        | Los Angeles |

| Good Neighbor |  1100 | 1999-01-10 | East        | New York    |

| Good Neighbor |  1100 | 1999-01-10 | East        | Boston      |

| Good Neighbor |  1100 | 1999-01-10 | West        | San Diego   |

| Los Angeles   |  1500 | 1999-01-05 | West        | Los Angeles |

| Los Angeles   |   500 | 1999-01-08 | West        | Los Angeles |

| Los Angeles   |  1500 | 1999-01-05 | East        | New York    |

| Los Angeles   |   500 | 1999-01-08 | East        | New York    |

| Los Angeles   |  1500 | 1999-01-05 | East        | Boston      |

| Los Angeles   |   500 | 1999-01-08 | East        | Boston      |

| Los Angeles   |  1500 | 1999-01-05 | West        | San Diego   |

| Los Angeles   |   500 | 1999-01-08 | West        | San Diego   |

| Seven Eleven  |   860 | 1999-01-09 | West        | Los Angeles |

| Seven Eleven  |   860 | 1999-01-09 | East        | New York    |

| Seven Eleven  |   860 | 1999-01-09 | East        | Boston      |

| Seven Eleven  |   860 | 1999-01-09 | West        | San Diego   |

| Titi          |  1100 | 1999-05-15 | West        | Los Angeles |

| Titi          |  1100 | 1999-05-15 | East        | New York    |

| Titi          |  1100 | 1999-05-15 | East        | Boston      |

| Titi          |  1100 | 1999-05-15 | West        | San Diego   |

| Walmark       |  3500 | 1998-04-15 | West        | Los Angeles |

| Walmark       |  3500 | 1998-04-15 | East        | New York    |

| Walmark       |  3500 | 1998-04-15 | East        | Boston      |

| Walmark       |  3500 | 1998-04-15 | West        | San Diego   |

| Wumark        |  3000 | 1999-01-11 | West        | Los Angeles |

| Wumark        |  3000 | 1999-01-11 | East        | New York    |

| Wumark        |  3000 | 1999-01-11 | East        | Boston      |

| Wumark        |  3000 | 1999-01-11 | West        | San Diego   |

+---------------+-------+------------+-------------+-------------+

32 rows in set (0.00 sec)

 

mysql>

自然连接是除去重复属性的等值连接。

两者之间的区别和联系如下:

1、自然连接一定是等值连接,但等值连接不一定是自然连接。等值连接不把重复的属性除去;而自然连接要把重复的属性除去。

2、等值连接要求相等的分量,不一定是公共属性;而自然连接要求相等的分量必须是公共属性。

 

http://blog.163.com/girl_lihuiyue@126/blog/static/1806962120142141165441/

写的比较简单:

http://huaxia524151.iteye.com/blog/1423614

© 著作权归作者所有

共有 人打赏支持
乐在克里特
粉丝 16
博文 268
码字总数 394729
作品 0
杭州
程序员
私信 提问
MySQL的JOIN(五):JOIN优化实践之排序

这篇博文讲述如何优化JOIN查询带有排序的情况。大致分为对连接属性排序和对非连接属性排序两种情况。插入测试数据。 CREATE TABLE t1 ( 对连接属性进行排序 现要求对t1和t2做内连接,连接条件...

文文1
04/01
0
0
MySQL的JOIN(四):JOIN优化实践之快速匹配

这篇博文讲述如何优化扫描速度。我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接。这个过程的实质就是查...

文文1
04/01
0
0
Mysql 多表联合查询效率分析及优化

多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: [sql]view plaincopyprint? SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM...

蓝狐乐队
2014/04/30
0
0
MySQL的JOIN(三):JOIN优化实践之内循环的次数

这篇博文讲述如何优化内循环的次数。内循环的次数受驱动表的记录数所影响,驱动表记录数越多,内循环就越多,连接效率就越低下,所以尽量用小表驱动大表。先插入测试数据。 CREATE TABLE t1 ...

文文1
04/01
0
0
navicat for mysql的使用方法

mysql数据库管理工具navicat for mysql 7 mysql数据库管理工具navicat for mysql,对于不怎么喜欢图形界面或者不太方便使用SQL的时候。我们可以通过用这个图形界面数据库管理工具来管理mysql...

阳光蜜汁
2017/08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安卓代码混淆

Proguard是安卓提供的方便开发者对代码和apk进行保护和精简的工具,可在SDK/tools文件夹下找到。 proguard的作用 : 1,代码混淆 2,精简代码,删掉没有用到的代码,减小apk的体积。 使用场景...

whoisliang
9分钟前
0
0
配置Tomcat虚拟主机

12月13日任务 16.4 配置Tomcat监听80端口 16.5/16.6/16.7 配置Tomcat虚拟主机 16.8 Tomcat日志 配置tomcat监听80端口 默认tomcat监听的是8080端口,如果想直接输入ip就访问到网页,就需要进行...

robertt15
15分钟前
1
0
emqtt Qos 0, 1, 2 图解

SimonAt
16分钟前
0
0
基于vue2定义自己的图表echart组件

先安装echarts cnpm i echarts -S,然后定义父组件 <template> <div> <echarts :option="echartOpion"></echarts> </div></template><script> import echarts from './e......

莫沫达
23分钟前
1
0
详解CSS的Flex布局

本文由云+社区发表 Flex是Flexible Box 的缩写,意为"弹性布局",是CSS3的一种布局模式。通过Flex布局,可以很优雅地解决很多CSS布局的问题。下面会分别介绍容器的6个属性和项目的6个属性。每...

腾讯云加社区
35分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部