mySQL的表连接
mySQL的表连接
乐在克里特 发表于11个月前
mySQL的表连接
  • 发表于 11个月前
  • 阅读 3
  • 收藏 1
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购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

共有 人打赏支持
粉丝 14
博文 254
码字总数 387498
×
乐在克里特
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: