SQL-内连接、外连接(左、右)、交叉连接
本文测试基于以下两个表,student(左) \ teacher(右),使用数据库MariaDB,图形化界面HeidiSQL.
连接查询的概念:根据两个表或多个表的列之间的关系,从这些表中查询数据,即联合查询通常用连接的方式实现。
一、交叉连接
交叉联接返回左表中每一行与右表中每一行的所有行组合。交叉联接也称作笛卡尔积。有一下两种方法:
select 字段列表 from 表1,表2;
select 字段列表 from 表1 cross join 表2;
实例(两种方法):
MariaDB [test]> select * from student,teacher;
MariaDB [test]> select * from student cross join teacher;
运行结果:
+----+----------+------+----+--------+
| id | name | cid | id | name |
+----+----------+------+----+--------+
| 1 | Geoffrey | 1 | 1 | 张三 |
| 1 | Geoffrey | 1 | 2 | 李四 |
| 1 | Geoffrey | 1 | 3 | 王五 |
| 1 | Geoffrey | 1 | 4 | NULL |
| 2 | Tracy | 2 | 1 | 张三 |
| 2 | Tracy | 2 | 2 | 李四 |
| 2 | Tracy | 2 | 3 | 王五 |
| 2 | Tracy | 2 | 4 | NULL |
| 3 | Benjamin | 1 | 1 | 张三 |
| 3 | Benjamin | 1 | 2 | 李四 |
| 3 | Benjamin | 1 | 3 | 王五 |
| 3 | Benjamin | 1 | 4 | NULL |
| 4 | William | 1 | 1 | 张三 |
| 4 | William | 1 | 2 | 李四 |
| 4 | William | 1 | 3 | 王五 |
| 4 | William | 1 | 4 | NULL |
| 5 | Julie | NULL | 1 | 张三 |
| 5 | Julie | NULL | 2 | 李四 |
| 5 | Julie | NULL | 3 | 王五 |
| 5 | Julie | NULL | 4 | NULL |
| 6 | NULL | 2 | 1 | 张三 |
| 6 | NULL | 2 | 2 | 李四 |
| 6 | NULL | 2 | 3 | 王五 |
| 6 | NULL | 2 | 4 | NULL |
+----+----------+------+----+--------+
24 rows in set (0.00 sec)
二、外连接
1. 右连接
右表有就显示,左表有则显示,无则填写NULL。
select 字段列表 from 表1 right join 表2 on 条件;
测试中在原命令的基础上,添加了别名和排序。
MariaDB [test]> select a.id, a.name '学生姓名', b.name '老师姓名' from student as a right join teacher as b on a.cid=b.id order by a.id;
+------+--------------+--------------+
| id | 学生姓名 | 老师姓名 |
+------+--------------+--------------+
| NULL | NULL | 王五 |
| NULL | NULL | NULL |
| 1 | Geoffrey | 张三 |
| 2 | Tracy | 李四 |
| 3 | Benjamin | 张三 |
| 4 | William | 张三 |
| 6 | NULL | 李四 |
+------+--------------+--------------+
7 rows in set (0.00 sec)
2. 左连接
左表有就显示,右表有则显示,无则填写NULL。
select 字段列表 from 表1 left join 表2 on 条件;
MariaDB [test]> select a.id, a.name '学生姓名', b.name '老师姓名' from student as a left join teacher as b on a.cid=b.id order by a.id;
+----+--------------+--------------+
| id | 学生姓名 | 老师姓名 |
+----+--------------+--------------+
| 1 | Geoffrey | 张三 |
| 2 | Tracy | 李四 |
| 3 | Benjamin | 张三 |
| 4 | William | 张三 |
| 5 | Julie | NULL |
| 6 | NULL | 李四 |
+----+--------------+--------------+
6 rows in set (0.00 sec)
三、内连接
显示相互关联的条目。
select 字段列表 from 表1 inner join 表2 on 条件;
MariaDB [test]> select a.id, a.name '学生姓名', b.name '老师姓名' from student as a inner join teacher as b on a.cid=b.id order by a.id;
+----+--------------+--------------+
| id | 学生姓名 | 老师姓名 |
+----+--------------+--------------+
| 1 | Geoffrey | 张三 |
| 2 | Tracy | 李四 |
| 3 | Benjamin | 张三 |
| 4 | William | 张三 |
| 6 | NULL | 李四 |
+----+--------------+--------------+
5 rows in set (0.01 sec)
四、总结
注意两个词即可:
基准(如左连接,会以表1为基准,显示条目数量同表1)
关联(通过on条件,两个表达式产生相互作用的两个条目称为有关联,如左连接为以表1为基准,并且可以显示表2中对应信息)
SQL-内连接、外连接(左、右)、交叉连接的更多相关文章
- sql内连接外连接自然连接
为什么我们要使用内连接和外连接呢?可以从两张或者多张表中找出,我们需要的属性. 这个比较好:http://www.cnblogs.com/youzhangjin/archive/2009/05/22/ ...
- 知识点:Oracle+表连接方式(内连接-外连接-自连接)+详解 来自百度文库
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右 ...
- mysql数据库中的多表查询(内连接,外连接,子查询)
用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...
- mysql 内连接 左连接 右连接 外连接
mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...
- SQL中的内连接外连接和交叉连接是什么意思?
内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接( ...
- ORACLE 左连接 右连接 内连接 外连接 全连接 五中表连接方式
1.左连接 :left join 2.右连接:right join 3.内连接:inner join 4.外连接:outer join 5.全连接:full join
- SQL内连接-外连接join,left join,right join,full join
1.创建测试表test1及test2 SQL)); 表已创建. SQL)); 表已创建. ,'name1'); ,'name2'); ,'name3'); ,'name4'); ,'name5'); ...
- mysql8必知必会7 连接 内连接 外连接 交叉连接
/* 2 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- --------------- ...
- mysql中的内连接,外连接实例详解
内连接: 只连接匹配的行左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边 ...
- Oracle内链接+外连接详解
inner join(内连接) 内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据.也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表 ...
随机推荐
- Windows 批处理大全(附各种实例)
Windows 批处理大全(附各种实例) 2009年07月19日 21:31:00 阅读数:2552 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命 ...
- Confluence 6 SQL Server 测试你的数据库连接
在你的数据库设置界面,有一个 测试连接(Test connection)按钮可以检查: Confluence 可以连接你的数据库服务器 数据库字符集和隔离级别是正确的 你的数据库用户有正确的数据库权限 ...
- ionic3 使用html2canvas将数据导出为图片,并下载本地
1.安装html2canvas npm install --save html2canvas 官方网站 https://html2canvas.hertzen.com/ 2.在需要的组件中引入html ...
- AngularJs中,如何在ng-repeat完成之后,执行Js脚本
//ng-repeat生成4个li,生成后再执行自定义方法fn在每个li后加一根横线 <script> var myapp=angular.module('myapp',[]); myap ...
- Nginx的进程模型及高可用方案(OpenResty)
1. Nginx 进程模型简介 Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程.其中master充当整个进程组与用户的交互接口,同时对进程进行监护 ...
- LeetCode(122):卖股票的最佳时机 II
Easy! 题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参 ...
- 【mongo】centos6.9安装mongo2.6.3
参考:http://www.haorooms.com/post/3m 注意:centos6上就不要装mongo3了,容易出错. 1. 下载 curl -O http://downloads.mongo ...
- bzoj 1222
比较简单的背包dp,设计状态f[i][j]表示到了前i个物品,第一台机器加工时间为j,第二台机器加工所用的最小时间,然后背包转移即可 本题卡空间,需要滚动数组优化 本题卡时间,稍微卡下常就行 #inc ...
- python2.7 (x64) 调用 java 代码实践
背景:公司实施接口自动化测试,使用的框架python+unittest:因为开发使用的架构师SpringBoot,在测试过程中难免需要使用到python调用JAVA的一些接口,所以需要用到python ...
- shell 按序删除文件
一.按时间排序 cd /data/wosbak/hrs/pre/ && ls -A -t | awk '{if(NR>15){print $9}}' | xargs rm -rf ...
