文档章节

mySQL的表连接

乐在克里特
 乐在克里特
发布于 2017/02/24 11:32
字数 1369
阅读 3
收藏 1
点赞 0
评论 0

一、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

© 著作权归作者所有

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

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

文文1 ⋅ 04/01 ⋅ 0

MySQL的JOIN(四):JOIN优化实践之快速匹配

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

文文1 ⋅ 04/01 ⋅ 0

MySQL的JOIN(三):JOIN优化实践之内循环的次数

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

文文1 ⋅ 04/01 ⋅ 0

Mysql 多表联合查询效率分析及优化

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

蓝狐乐队 ⋅ 2014/04/30 ⋅ 0

navicat for mysql的使用方法

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

阳光蜜汁 ⋅ 2017/08/17 ⋅ 0

PHP中使用数据库(一)

第一阶段,最简单的数据库操作 1、需要建立数据库的信息表。 最基础的是 新建config.php文件 $dbhost="localhost";$dbuser="root";$dbpassword="123";$dbdatabase="blogs";//数据库表的名称 ...

YYCRiver ⋅ 2014/04/15 ⋅ 0

MySQL 常见问题和应用技巧

一、 忘记 MySQL 的 root 密码 1. 登录到数据库所在的服务器,手工 kill 掉 mysql 进程。 (1) 登录到数据库所在的服务器,手工 kill 掉 MySQL 进程: 其中,mysql.pid 指的是 MySQL 数据目录...

waterandair ⋅ 2017/11/20 ⋅ 0

多表联合查询 效率

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

xinson ⋅ 2014/04/17 ⋅ 0

Mysql 多表联合查询效率分析

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

晨曦之光 ⋅ 2012/02/21 ⋅ 0

mysql-front远程连接自己linux服务器上的mysql服务器

大多的MySQL都是装在Linux上的,而我们的windowns本机上一般都会装MySQL-Front.那如何用MySQL-Front连接远端Linux系统上的mysql呢? 用MySQL-Front连接远端的MYSQL就会有些问题。大多提示104...

双月通天 ⋅ 2015/03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部