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只返回来自源表中的相关的行,即查询的结果表包含的两源表 ...
随机推荐
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...
- Confluence 6 白名单允许进入和禁用
允许进入 启用 CORS 请求,将会从特定的 URL 来源中允许进入(Allow Incoming).URL 格式必须匹配格式 scheme://host[:port],结尾是没有反斜杠的(:port ...
- Confluence 6 自定义站点和空间布局
你可以通过编辑布局文件来修改 Confluence 的外观和感觉(也可以被称为装饰).编辑这些文件将会允许你对整个 Confluence 站点的外观和感觉进行修改或者仅仅是一个独立的空间. 当你对一个 ...
- Swift 新增fileprivate 详解
以前项目中只要用了private 那么在同一个文件同一个类中还是能访问的(比如一个类中写了一个extension) swift3.0现在不行了 新增了一个fileprivate 的访问控制 以前的p ...
- binary(binary区分大小写),unsigned,unsigned zerofill关键字介绍
mysql建表时,每个字段的属性有三个选项: binary,unsigned,unsigned zerofill,作用如下: 一.binary CHAR VARCHAR:值根据缺省字符集以大小写不区分 ...
- python并发编程之IO模型,
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
- java易错题----静态方法的调用
class A{ public static String s="A.s"; } class B extends A{ public static String s="B ...
- jenkins持续集成:构建多个job同时执行
在jenkins 构建任务时,同时只能构建2个,但是有时候可能涉及到需要同时执行多个任务(大于2个),如果不能同时运行的话,就需要等待上一个执行完了,再执行第三个 比如用例非常多,需要把不同的用例分给 ...
- extjs5(项目中文件的加载过程)
现在来看看js类加载过程.如下图所示: 1、首先:浏览器中输入 localhost:1841 ,调用 index.html; <!DOCTYPE HTML> <html> &l ...
- Python推荐系统库--Surprise实战
一.使用movieLens数据集 from surprise import KNNBasic, SVD from surprise import Dataset from surprise impor ...