from_子句-内连接-左连接-右连接
此文有网上多片好文 拼接而成
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录(以左表主表,右表为辅表)
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录(以右表主表,左表为辅表)
inner join(等值连接) 只返回两个表中联结字段相等的行(交集)
左联接和右联接 又称为外连接
**************
* left join *
* 左连接 *
**************
1. mysql> select * from a;
+----+
| ID |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+----+
6 rows in set (0.05 sec)
mysql> select * from b;
+----+
| ID |
+----+
| 1 |
| 2 |
| 3 |
+----+
2. mysql> select a.id,b.id from a left join b on a.id=b.id;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
+----+------+
左表(a,主表)的记录将会全部表示出来,而右表(b,辅表)只会显示符合搜索条件的记录(例子中为: a.id = b.id).
b表记录不足的地方均为NULL.
on 后面的 and 条件语句
说明: and 后的条件语句 只会对 辅表(b表)产生作用,不会对主表(a表)产生作用。即 左连接是以左边的表 作为主表。
因为 on条件是 在生成临时表时 使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
mysql> select a.id,b.id from a left join b on a.id=b.id and b.id <3;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | NULL |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
+----+------+
6 rows in set (0.00 sec)
mysql> select a.id,b.id from a left join b on a.id=b.id and a.id <3;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | NULL |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
+----+------+
where
mysql> select a.id,b.id from a left join b on a.id=b.id where b.id <3;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
+----+------+
where条件是在临时表生成好后,再对临时表进行过滤的条件。
这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
*****************
* right join *
* 右连接 *
*****************
mysql> select b.id,a.id from a right join b on b.id=a.id;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
右表(b,主表)的记录将会全部表示出来,而左表(a,辅表)只会显示符合搜索条件的记录(例子中为: b.id = a.id).
a表记录不足的地方均为NULL.
on 后面的 and 条件语句
说明:and 后的条件语句 只会对 辅表(a表)产生作用,不会对主表(b表)产生作用。即 右连接是以右边的表 作为主表。
因为 on条件是 在生成临时表时 使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
mysql> select b.id,a.id from a right join b on b.id=a.id and a.id <3;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | NULL |
+----+------+
mysql> select b.id,a.id from a right join b on b.id=a.id and b.id <3;
+----+------+
| id | id |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | NULL |
+----+------+
where
mysql> select a.id,b.id from a right join b on a.id=b.id where a.id <3;
+------+----+
| id | id |
+------+----+
| 1 | 1 |
| 2 | 2 |
+------+----+
where条件是在临时表生成好后,再对临时表进行过滤的条件。
这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
**************
* inner join *
* 内连接 *
**************
在inner join中 两张表是是平等的,限制条件会对两表张表都起使用。
inner join 中on后面的限制条件将全部起作用,这与where的执行结果是一样的
取两个表的交集
mysql> select b.id,a.id from a join b on b.id=a.id and a.id <3;
+----+----+
| id | id |
+----+----+
| 1 | 1 |
| 2 | 2 |
+----+----+
mysql> select b.id,a.id from a join b on b.id=a.id where a.id <3;
+----+----+
| id | id |
+----+----+
| 1 | 1 |
| 2 | 2 |
+----+----+
***********************
* on和where的区别 *
***********************
1.
先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走, 如果join 是left join,
就把on过滤掉的左主表中的数据再添加回来; 然后再执行where里的过滤;
on中不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.
只有当使用外连接(left, right)时, on 和 where 才有这个区别, 如果用inner join, 在哪里制定都一样,
因为on 之后就是where, 中间没有其它步骤.
2.
SQL语句如下:
SELECT *
FROM 表1
LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff'
WHERE 表1.NAME != 'aa'
步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2)
步骤2:应用ON筛选器(当前的条件为 表1.id = 表2.id AND 表2.Name != 'ff')
步骤3:添加外部行
这一步只对OUTER JOIN起作用,如果是LEFT JOIN会以左边的表为保留表,如果是RIGHT JOIN会以右边的表为保留表。所谓外部行是指,保留表中的行。
即使第二步的ON过滤掉了一些行,在这一步,会根据保留表添加第二步过滤掉的行。当前的例子,不存在这种情况。
步骤4.应用WHERE筛选器(当前是Name != ‘aa’)过滤前三步所生成虚拟表的数据。
总结:如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用
如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
转载于:https://blog.51cto.com/wxhh12/1244293
from_子句-内连接-左连接-右连接相关推荐
- 数据库内、外、左、右连接详解
写在前面: 数据库连接操作非常重要,明确连接操作有助于更好地掌握SQL语句查询操作. 数据库连表方式: 内连接 :inner join 外连接 :outer join 左外连接 :left outer ...
- linq to entity 左联接 右连接 以及内连接写法的区别(转)
linq to entity 左连接 右连接 以及内连接写法的区别 还有就是用lambda表达式怎么写,那个效法效率高些? [解决办法] 左连右连还是内连这个其实你不需要关心.只需要根据实体的映射关 ...
- 区分笛卡儿积,自然连接,等值连接,内连接,外连接—左,右
1.笛卡尔积 笛卡儿积,不用多说,返回所有的情况. 2.自然连接 自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系.自然连接是一种特殊的等值 ...
- oracle右连接失效,oracle 右连接
t1.name(+) = t2.name 的意思是 用t2表做主表 t1表做副表做右关联 会用t2的所有数据,如果和t1关联不上则放空值 转自http://blog.csdn.net/one132/a ...
- 【MySQL】MySQL 的连接(内、左、右、全)
一.表 的连 结 1.目的:减少数据的冗余 2.核心:分类 ***连接时至少要两张表,连接主要有内连接(inner join).左外连接(left outer join).右外连接(right out ...
- c++中实现域内,左,右对齐的方法
需要包含头文件 实现域内左对齐 int main() {cout.setf(ios::left);//for (int i = 0; i < 5; i++)cout << setw( ...
- oracle in的用法_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法
Oracle中的连接可分为,内连接(INNER JOIN).外连接(OUTER JOIN).全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式. Oracle ...
- oracle 建表id自增长_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法...
Oracle中的连接可分为,内连接(INNER JOIN).外连接(OUTER JOIN).全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式. Oracle ...
- SQL连接的理解和使用(内连接:自然连接等值连接,外连接:左连接右连接全外连接)
目录 一.连接的介绍 连接是什么? 连接分几种? 条件连接 等值连接 自然连接 二.连接的使用 内连接 INNER JOIN 内连接与等值连接区别 内连接与自然连接区别 外连接 OUTER JOIN ...
最新文章
- Mysql中的count()与sum()区别
- 对OCR文字识别软件进行自动分析和识别设置的教程
- xcode:关于Other Linker Flags
- Debug Tensorflow: 随着训练进行,内存消耗越来越大
- 阿里研究员:缩短软件开发中的反馈弧
- 用java自动化访问百度测试_java+eclipse+selenium+百度搜索设置自动化测试
- GUI Design Studio 4 5 151 0原型设计工具的使用
- 深度学习(六十六)生成模型、最大化似然、KL散度
- hdu 6149 Valley Numer II(01背包套状压dp)
- 警惕分页中的checkbox
- linux虚拟机网卡无法启动
- 项目管理中,制定项目进度计划有何意义?
- c语言常量定义的数组初始化
- 一个屌丝程序猿的人生(三十二)
- 计算机第一个应用领域是,第一代计算机主要应用领域是什么
- 生成SGML格式,用于算BLEU,NIST,TER
- 数字图像处理及其表示
- 属于python保留字的是_属牛的女人全集:属牛女的性格、命运、属相婚配表等-第一星座网...
- Golang并发编程入门教程
- 【技术美术图形部分】2.3 HLSL常用函数
热门文章
- Chrome 浏览器 NET::ERR_SSL_OBSOLETE_VERSION 问题及解决方式
- [Ext JS 7]基于NPM的开发
- Hibernate的缓存机制介绍
- html 自动滚动到底部,Javascript实现DIV滚动自动滚动到底部的代码
- sql查询三级菜单分类_SQL面试50题——思路解答与分类整理(中)窗口函数与子查询...
- Python标准库中的zipfile
- android 开机打开串口失败,请大神帮我看看这是怎么回事,一用就说串口打开失败,再电脑上试...
- 64位系统目录在那里_旷视王珏:前Adobe首席科学家,手握64项专利,曾助力奥斯卡...
- php微信公众号测试号token配置失败,微信公众号Token配置失败解决办法
- ebc是什么意思_什么是亚马逊EBC,EBC有什么用?