MySQL基础表和数据

-- 5条数据
select * from test_a; -- 8条数据
select * from test_b;

内连接

-- 内连接,join,为inner join的简化写法,产生A和B的交集。条数=A和B匹配的条数=4<=max(A条数, B条数)
select * from test_a a join test_b b on a.name = b.name;

左外连接

-- 左外连接,left join,为left outer join的简化写法,产生表A的完全集,而B表中匹配的则有值,没匹配的以NULL值取代。条数=B中匹配A的条数+表A中未匹配的条数=4+3=7>=A表条数
select * from test_a a left join test_b b on a.name = b.name;

右外连接

-- 右外连接,right join,为right outer join的简化写法,产生表B的完全集,而A表中匹配的则有值,没匹配的以NULL值取代。条数=A中匹配B的条数+表B中未匹配的条数=4+4=8>=B表条数
select * from test_a a right join test_b b on a.name = b.name;
-- 等效如下
select * from test_b b left join test_a a on test_a.name = test_b.name;

全连接

MySQL并不支持 full join 操作,可以使用左连接 union all 右连接的方式来达到这个效果,条数为左连接条数 + 右连接条数 = 15

select * from test_a a left join test_b b on a.name = b.name
union all
select * from test_a a right join test_b b on a.name = b.name;

笛卡尔连接

又称交叉连接,一般情况下很少使用

-- A和B的笛卡尔集,即A的每一条都和B的每一条关联,所以条数为A * B,示例中是5 * 8 = 40
select count(*) from test_a a cross join test_b b;
-- 通过过滤条件达到内连接的效果
select * from test_a a cross join test_b b where a.name = b.name;

on and和on where的区别

在使用left join时,on and和on where条件的区别如下:  
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

(实际上左连接中如果有and语句是对左表进行过滤的,那么不管真假都不起任何作用。如果是对右表过滤的,那么左表所有记录都返回,右表筛选以后再与左表连接返回,即on and只能对右表过滤)  
2、where条件是在临时表生成好后,再对临时表进行过滤的条件(一般使用为对最左表的过滤)。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。

-- 第一条语句比较好理解,筛选之后跟左表连接,第二条语句输出同第一条,说明on and即是对右表进行过滤,建议使用第二条这一种(易读)
select * from test_a a left join (select * from test_b where name = '香蕉') b on b.name = a.name order by a.id;
select * from test_a a left join test_b b on b.name = a.name and b.name = '香蕉' order by a.id;
-- 第一条语句比较好理解,筛选之后跟右表连接,第二条语句输出同第一条,说明on where一般对左表进行过滤,建议使用第二条这一种(易读)
select * from (select * from test_a where name = '香蕉') a left join test_b b on a.name = b.name;
select * from test_a a left join test_b b on a.name = b.name where a.name = '香蕉';

在使用inner join时,不管是对左表还是右表进行筛选,on and和on where都会对生成的临时表进行过滤。

JOIN从句的更多相关文章

  1. mysql学习之join从句

    一.join从句共有5种类型 内连接(inner join) 全外连接(full outer join) 左外连接(left outer join) 右外连接(right outer join) 交叉 ...

  2. hive中sql解析出对应表和字段的实现

    import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map ...

  3. Hive 编程之DDL、DML、UDF、Select总结

    Hive的基本理论与安装可参看作者上一篇博文<Apache Hive 基本理论与安装指南>. 一.Hive命令行 所有的hive命令都可以通过hive命令行去执行,hive命令行中仍有许多 ...

  4. bootstrap教程,SQL

    版权声明:未经博主允许不得转载 SQL DDL数据定义语言 TPL事务处理语言 DCL数据控制语言 DML数据操作语言 DML SELECT INSERT UPDATE DELETE Join从句 J ...

  5. 查询SQL优化

    SQL优化的一般步骤 通过show status命令了解各种SQL的执行频率定位执行效率较低的SQL语句,重点select通过explain分析低效率的SQL确定问题并采取相应的优化措施 优化措施 s ...

  6. 慕课网--mysql开发技巧一 学习笔记

    现在存在下面的两张表,表的结构如下所示 师徒四人表结构:id,user_name,over数据:id user_name over1 唐僧 旃檀功德佛2 猪八戒 净坛使者3 孙悟空 斗战胜佛4 沙僧 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

  8. 英语语法最终珍藏版笔记-17名词性-主语-宾语-同位语-表语-that从句

    名词性从句 在主从复合句中,从句可以充当主句的主语.表语.宾语或同位语.由于在多数情况下,主语.表语.宾语或同位语这四种句子成分由名词性词类充当,所以,我们把这些作用相当于名词的从句统称为名词性从句, ...

  9. hive regex insert join group cli

    1.insert Insert时,from子句既能够放在select子句后,也能够放在insert子句前,以下两句是等价的 hive> FROM invites a INSERT OVERWRI ...

随机推荐

  1. CentOS 7升级php5.4到php7.2

    原因:CentOS 7下yum安装PHP版本默认是5.4的,但新框架要求PHP版本在7以上,所以把PHP升级一下了. 查看yum的可安装的php版本列表: yum provides php 开始升级P ...

  2. JS动态更新微信浏览器中的title

    问题: 最近在做一个微信中分享的宣传页,分不同的场景,切换不同的场景时需要设置不同的title,实现的方案很简单,当用户切换场景的时候,修改document对象的title属性,可是在实际测试中,io ...

  3. Spring @Transactional注解不回滚不起作用无效

    原文地址:http://www.cnblogs.com/wuxiaofeng/p/6819209.html   这几天在项目里面发现我使用@Transactional之后,抛了异常居然不回滚.后来终于 ...

  4. Linux安装python模块

    # 依赖解决 # yum -y install epel-release python-devel gcc # 安装模块 # pip install psutil  (若没有pip命令,可通过 yum ...

  5. 令assignment操作符返回一个reference to *this

    [令assignment操作符返回一个reference to *this] 关于赋值,可以把它们写成连锁形式: int x, y, z; x =y =z =15; II赋值连锁形式 上述连锁赋值被解 ...

  6. 关于初次使用Linux的一些小经验

    前些天看了一下腾讯的招聘的网站,发现大多数开发都要求在Linux系统下进行,所以就赶紧装了个Ubuntu来玩玩,可是装了以后才发现,初次接触Linux就跟小学生差不多,大部分操作都要通过命令行来完成, ...

  7. webpack详解

    webpack是现代前端开发中最火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包.那它是怎么做到通过对一些插件的配置,便可以轻松实现对代码的构建呢? webpack的配置 const ...

  8. F. Make It Connected(krustra+)

    题目链接:http://codeforces.com/contest/1095/problem/F 题目大意:首先给你n个点,然后给你每个点的权值,再给你m条边,这些边可以选也可以不选,然后问你要使这 ...

  9. 网站发布IIS后堆栈追踪无法获取出错的行号

    一.问题起因 系统发布上线后,有时会发生错误,那么错误的记录就很重要,它对于错误的排查和问题的发现有着重要的作用,通常我们采取的方式为Log日志文件记录和数据库错误记录.文本不会讨论错误记录的方式以及 ...

  10. Hibernate5笔记1--Hibernate简介和第一个程序

    Hibernate简介: Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hib ...