SQL标准中的Join的类型: 


首先,设置表employees和department的数据为: 



1、inner join … on操作类型 
内连接inner join是基于连接谓词将两张表(如A和B)的列组合在一起的,产生新的结果表。 
例子:

  1. SELECT *
  2. FROM employees a
  3. inner join department b
  4. ON a.department_id = b.department_id
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

查询结果为: 

注意:inner join 可以简写为join,该查询得出的结果为两张表共同的部分。效果和使用where语句一样,如下语句:

  1. SELECT *
  2. FROM employees a, department b
  3. WHERE a.department_id = b.department_id
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2、left join … on操作类型 
左外连接又 称为左连接,以A表为基础,会显示A表的所有记录,如果匹配不到B表的记录,会显示null。 
例子:

  1. SELECT *
  2. FROM employees a
  3. LEFT JOIN department b
  4. ON a.department_id = b.department_id
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

查询结果为: 

可以看到,employees_id = 6 的department_id是null,因为该员工未分配部门。 
因此,可以利用这个特征,找出未被分配员工的名单,其SQL语句如下:

  1. SELECT *
  2. FROM employees a
  3. LEFT JOIN department b
  4. ON a.department_id = b.department_id
  5. WHERE a.department_id is NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

查询结果为: 

注意:在上面的语句中,添加了WHERE条件语句,找到等于空的部门id从而找到,未被分配员工的名单。 
该方法:亦可以用于优化not in的操作,通常not in不会使用索引操作,而left join 则可以使用索引操作。


3、right join …. on操作类型 
右外连接又称为右连接,以B表为基础,会显示B表的所有记录,如果匹配不到A表的记录,会显示null。 
例子:

  1. SELECT *
  2. FROM employees a
  3. RIGHT JOIN department b
  4. ON a.department_id = b.department_id
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

查询结果为: 

可以看到部门这张表的信息是全部展示出来的,而在部门id为4时的员工是空的,因此,可以利用这个特点找出部门中员工格式为0的部门,其sql语句如下:

  1. SELECT *
  2. FROM employees a
  3. RIGHT JOIN department b
  4. ON a.department_id = b.department_id
  5. WHERE a.employees_id is NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

查询结果为: 


4、full join … on操作类型 
MySQL中是不支持full join … on全连接操作,只能通过左连接和右连接的合集来实现,其代码如下:

  1. SELECT *
  2. FROM employees a
  3. LEFT JOIN department b
  4. ON a.department_id = b.department_id
  5. UNION ALL
  6. SELECT *
  7. FROM employees a
  8. RIGHT JOIN department b
  9. ON a.department_id = b.department_id
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果为: 


5、cross join 操作 
交叉连接(cross join),又称笛卡尔连接(cartersian join)或叉乘(product),如果A和B是两个集合,它们的交叉连接就标记为:A*B 
例子:

  1. SELECT *
  2. FROM employees a
  3. CROSS JOIN department b
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

查询结果为: 

my sql中join的操作的更多相关文章

  1. SQL点滴33—SQL中的字符串操作

    原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...

  2. 关于sql中join

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  3. SQL中join和cross join的区别

    SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...

  4. SQL中union运算操作的理解

    在SQL中,对于并运算,可以使用union关键字. 例如: SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FRO ...

  5. SQL中JOIN 的用法

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...

  6. SQL中join的用法

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...

  7. SQL中join连接查询时条件放在on后与where后的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时表时使用的条 ...

  8. Oracle SQL中join方式总结

    在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结).SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN. HASH JOIN等 ...

  9. SQL中的去重操作

    if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] ),[Memo] nvarchar()) In ...

随机推荐

  1. clientX、pageX、scrollLeft、offsetLeft、clientWidth、screen.width的用法和区别

    一.定义和用法 1.event.clientX:事件对象的水平偏移量: event.clientY:事件对象的垂直偏移量: 2.event.pageX:事件对象加上滚动距离后的水平偏移量: event ...

  2. Centos 6.5 rsync+inotify 两台服务器文件实时同步

    rsync和inotify是什么我这里就不在介绍了,有专门的文章介绍这两个工具. 1.两台服务器IP地址分别为: 源服务器:192.168.1.2 目标服务器:192.168.1.3 @todo:从源 ...

  3. iis 7.5 0x80004005 静态文件 html、js、css 500错误

    环境:iis 7.5 win7 64位 vs2012 问题:本地环境F5直接运行,没有任何问题,发布到IIS,静态文件不能访问,出现500错误,网上找了一堆解决办法,排除路径不正确,iis全部功能勾了 ...

  4. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

  5. 给破坏性的Rake任务加把锁 | Rails

    抄自这里 直接贴代码 # lib/tasks/skip_prod.rake desc 'Raises exception if used in production' task skip_prod: ...

  6. Discrete.Differential.Geometry-An.Applied.Introduction(sig2013) 笔记

    The author has a course on web: http://brickisland.net/DDGSpring2016/ It has more reading assignment ...

  7. JQuery获取元素本身HTML

    $('<p>').append($(this).clone()).html() 原理:创建一个匿名对象,克隆本身,追加到匿名对象中,再获取匿名对象的HTML

  8. 由system.currentTimeMillis() 获得当前的时间

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...

  9. SQL加权限

    grant view definition on 存储过程名字 to 用户名

  10. sql server 常见问题笔记

    1.关于复制类型 快照发布:发布服务器按预定的时间间隔向订阅服务器发送已发布数据的快照. 事务发布:在订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器. 对等发布:对等发布支 ...