mySQL的表连接
一、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/
写的比较简单:
mySQL的表连接的更多相关文章
- mysql join表连接
1.表连接,就是将两个表合并起来,被合并的表的记录要通过中间字段,一一匹配起来左边的表的记录,形成一张临时的合并的表,并且每条记录的值都是两张表一一准确对应的 实例 尝试以下实例: root@host ...
- MySQL多表连接
主要分3种:内连接,外连接,交叉连接 其 他:联合连接,自然连接 1.内联接 典型的联接运算,使用像 = 或 <> 之类的比较运算).包括相等联接和自然联接. 内联接使用比 ...
- MySQL之表连接-> 内连接,左外连接,右外链接,全连接
1.首先创建student库 create database student; 2. 在数据库中创建boy表 和 girl表, mysql> create table boy( -> bo ...
- 【连接查询】mySql多表连接查询与union与union all用法
1.准备两个表 表a: 结构: mysql> desc a; +-------+-------------+------+-----+---------+-------+ | Field | T ...
- Mysql 多表连接查询 inner join 和 outer join 的使用
JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. 首先先列举本篇用到的分类(内连接,外连接,交 ...
- mysql多表连接和子查询
文章实例的数据表,来自上一篇博客<mysql简单查询>:http://blog.csdn.net/zuiwuyuan/article/details/39349611 MYSQL的多表连接 ...
- mysql多表连接查询
新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...
- mysql 多表连接
现有表R,S如下: 笛卡尔积 select * from R,S; 结果: 注:不需要任何条件.结果为两张表函数相乘(3x3=9). 自连接 select e.empno,e.ename,m.empn ...
- MySQL之表连接(内外连接和重命名的使用)
#要多练练 1.连接查询根据连接方式分为 内连接 等值连接 非等值连接 自连接 外连接 左外连接(左连接) 右外连接(右连接) 当多张表进行连接查询,若没有任何条件进行限制,会 发生什么现象? 会出现 ...
随机推荐
- elasticsearch 基础 —— _mget取回多个文档及_bulk批量操作
取回多个文档 Elasticsearch 的速度已经很快了,但甚至能更快. 将多个请求合并成一个,避免单独处理每个请求花费的网络延时和开销. 如果你需要从 Elasticsearch 检索很多文档,那 ...
- getString()方法与getObject()方法的区别
JDBC提供了getString().getInt()和getData()等方法从ResultSet中获取数据,当查询结果集中的数据量较小时,不用考虑性能,使用这些方法完全可以满足需求,但是当Resu ...
- 牛客多校第10场J Wood Processing 分治优化/斜率优化 DP
题意:你有n块木头,每块木头有一个高h和宽w,你可以把高度相同的木头合并成一块木头.你可以选择一些木头消去它们的一部分,浪费的部分是 消去部分的高度 * 木头的宽度,问把n块木头变成恰好m块木头至少要 ...
- java ArrayList的基本使用
package java06; /* 数组的长度是不可以发生改变的 Arraylist 集合的长度可以发生改变 对于ArrayList来说,有一个尖括号<E>代表泛型 泛型:就是装在结合中 ...
- JS基础入门篇(四十三)—ES6(二)
1.对象简洁表示法 原来写法 var name = "lzf"; var gender = "male"; var fn = function(){consol ...
- 组合的输出(回溯、dfs)
问题 O: [回溯法]组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r ...
- java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包
首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...
- sonarqube6.7.1使用
1.插件安装 方法1.登入sonarqube-web安装 admin/admin 配置--应用市场--全部 英文片:administration--configuration--marketplace ...
- [CSP-S模拟测试]:画作(BFS+数学)
题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...
- JSP 获取访问者真正的IP地址
request.getRemoteAddr(),这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了, 如果使用了反向代理软件,用re ...