一.Join语法概述

join 用于多表中字段之间的联系,语法如下:

... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona

table1:左表;table2:右表。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。

LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。

RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。

注意:mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL join.

接下来给出一个列子用于解释下面几种分类。用一下两个表做例子:

+----+------------+-----------------+---------+--------+
| id | time | process | name | result |
+----+------------+-----------------+---------+--------+
| 1 | 2016-08-31 | wait for result | baidu | 1 |
| 2 | 2016-08-25 | haha | tengxun | 1 |
| 3 | 2016-08-31 | jiayou | wangyi | 1 |
| 9 | 2016-08-31 | happy | wangyi | 1 |
+----+------------+-----------------+---------+--------+
+-----+------------+---------+
| id | time | name |
+-----+------------+---------+
| 1 | 2016-08-30 | tengxun |
| 2 | 2016-09-10 | alibaba |
| 8 | NULL | haha |
| 9 | 2016-08-31 | wangyi |
| 100 | 2014-08-06 | 4399 |
+-----+------------+---------+

二.Inner join

内连接,也叫等值连接,inner join产生同时符合A和B的一组数据。

mysql> select * from recuit inner join exam on recuit.id=exam.id;
+----+------------+-----------------+---------+--------+----+------------+---------+
| id | time | process | name | result | id | time | name |
+----+------------+-----------------+---------+--------+----+------------+---------+
| 1 | 2016-08-31 | wait for result | baidu | 1 | 1 | 2016-08-30 | tengxun |
| 2 | 2016-08-25 | haha | tengxun | 1 | 2 | 2016-09-10 | alibaba |
| 9 | 2016-08-31 | happy | wangyi | 1 | 9 | 2016-08-31 | wangyi |
+----+------------+-----------------+---------+--------+----+------------+---------+
3 rows in set (0.00 sec)

三.Left join

left join,(或left outer join:在Mysql中两者等价,推荐使用left join.)左连接从左表(A)产生一套完整的记录,与匹配的记录(右表(B)) .如果没有匹配,右侧将包含null。

mysql> select * from recuit left join exam on recuit.id=exam.id;
+----+------------+-----------------+---------+--------+------+------------+---------+
| id | time | process | name | result | id | time | name |
+----+------------+-----------------+---------+--------+------+------------+---------+
| 1 | 2016-08-31 | wait for result | baidu | 1 | 1 | 2016-08-30 | tengxun |
| 2 | 2016-08-25 | haha | tengxun | 1 | 2 | 2016-09-10 | alibaba |
| 3 | 2016-08-31 | jiayou | wangyi | 1 | NULL | NULL | NULL |
| 9 | 2016-08-31 | happy | wangyi | 1 | 9 | 2016-08-31 | wangyi |
+----+------------+-----------------+---------+--------+------+------------+---------+
4 rows in set (0.00 sec)

四.Right join

mysql> select * from recuit right join exam on recuit.id=exam.id;
+------+------------+-----------------+---------+--------+-----+------------+---------+
| id | time | process | name | result | id | time | name |
+------+------------+-----------------+---------+--------+-----+------------+---------+
| 1 | 2016-08-31 | wait for result | baidu | 1 | 1 | 2016-08-30 | tengxun |
| 2 | 2016-08-25 | haha | tengxun | 1 | 2 | 2016-09-10 | alibaba |
| 9 | 2016-08-31 | happy | wangyi | 1 | 9 | 2016-08-31 | wangyi |
| NULL | NULL | NULL | NULL | NULL | 8 | NULL | haha |
| NULL | NULL | NULL | NULL | NULL | 100 | 2014-08-06 | 4399 |
+------+------------+-----------------+---------+--------+-----+------------+---------+
5 rows in set (0.00 sec)
 

同left join,只不过是保留了表B的项目,表A中没有相对应的项被置为NULL。

五.Cross join

cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积

笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1), (a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选 课情况。

mysql> select * from recuit cross join exam;
+----+------------+-----------------+---------+--------+-----+------------+---------+
| id | time | process | name | result | id | time | name |
+----+------------+-----------------+---------+--------+-----+------------+---------+
| 1 | 2016-08-31 | wait for result | baidu | 1 | 1 | 2016-08-30 | tengxun |
| 2 | 2016-08-25 | haha | tengxun | 1 | 1 | 2016-08-30 | tengxun |
| 3 | 2016-08-31 | jiayou | wangyi | 1 | 1 | 2016-08-30 | tengxun |
| 9 | 2016-08-31 | happy | wangyi | 1 | 1 | 2016-08-30 | tengxun |
| 1 | 2016-08-31 | wait for result | baidu | 1 | 2 | 2016-09-10 | alibaba |
| 2 | 2016-08-25 | haha | tengxun | 1 | 2 | 2016-09-10 | alibaba |
| 3 | 2016-08-31 | jiayou | wangyi | 1 | 2 | 2016-09-10 | alibaba |
| 9 | 2016-08-31 | happy | wangyi | 1 | 2 | 2016-09-10 | alibaba |
| 1 | 2016-08-31 | wait for result | baidu | 1 | 8 | NULL | haha |
| 2 | 2016-08-25 | haha | tengxun | 1 | 8 | NULL | haha |
| 3 | 2016-08-31 | jiayou | wangyi | 1 | 8 | NULL | haha |
| 9 | 2016-08-31 | happy | wangyi | 1 | 8 | NULL | haha |
| 1 | 2016-08-31 | wait for result | baidu | 1 | 9 | 2016-08-31 | wangyi |
| 2 | 2016-08-25 | haha | tengxun | 1 | 9 | 2016-08-31 | wangyi |
| 3 | 2016-08-31 | jiayou | wangyi | 1 | 9 | 2016-08-31 | wangyi |
| 9 | 2016-08-31 | happy | wangyi | 1 | 9 | 2016-08-31 | wangyi |
| 1 | 2016-08-31 | wait for result | baidu | 1 | 100 | 2014-08-06 | 4399 |
| 2 | 2016-08-25 | haha | tengxun | 1 | 100 | 2014-08-06 | 4399 |
| 3 | 2016-08-31 | jiayou | wangyi | 1 | 100 | 2014-08-06 | 4399 |
| 9 | 2016-08-31 | happy | wangyi | 1 | 100 | 2014-08-06 | 4399 |
+----+------------+-----------------+---------+--------+-----+------------+---------+
20 rows in set (0.00 sec)

六.Full join

mysql不支持full join,可以用right join和left join模拟

mysql> select * from exam left join recuit on exam.id=recuit.id
-> union
-> select * from exam right join recuit on exam.id = recuit.id;
+------+------------+---------+------+------------+-----------------+---------+--------+
| id | time | name | id | time | process | name | result |
+------+------------+---------+------+------------+-----------------+---------+--------+
| 1 | 2016-08-30 | tengxun | 1 | 2016-08-31 | wait for result | baidu | 1 |
| 2 | 2016-09-10 | alibaba | 2 | 2016-08-25 | haha | tengxun | 1 |
| 9 | 2016-08-31 | wangyi | 9 | 2016-08-31 | happy | wangyi | 1 |
| 8 | NULL | haha | NULL | NULL | NULL | NULL | NULL |
| 100 | 2014-08-06 | 4399 | NULL | NULL | NULL | NULL | NULL |
| NULL | NULL | NULL | 3 | 2016-08-31 | jiayou | wangyi | 1 |
+------+------------+---------+------+------------+-----------------+---------+--------+
6 rows in set (0.25 sec)

SQL连接操作的更多相关文章

  1. (修改)oracle11g监听多台主机配置,用pl/sql连接操作多个数据库详解

    很多朋友在开发项目中并不是每个人用一个数据库,而是有单独的一台主机作为开发的数据库服务器,这样,就需要我们的开发人员去连接它. 首先是进入oracle的 Net  Mananger:

  2. php的SQL连接操作的方法

    初学php,于是一开始就在sql(具体点说是mysql)里受挫严重.于是这里记下一些方法. 首先是基本方法.基本方法现在我不用了,所以我就附一下hustoj中的部分吧 基本方法的数据库连接操作: if ...

  3. SQL 连接操作 及 查询分析

  4. 关闭数据库下的所有连接操作 sql存储过程

    use master go )) as begin ),) declare @spid int set @sql='declare getspid cursor for select spid fro ...

  5. SQL 经典回顾:JOIN 表连接操作不完全指南

    ​   2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...

  6. 【HANA系列】SAP HANA SQL字符串连接操作

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL字符串连 ...

  7. SQL连接

    SQL连接可以分为内连接.外连接.交叉连接. 数据库数据:             book表                                          stu表 1.内连接 ...

  8. SQL用法操作合集

    SQL用法操作合集   一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...

  9. MySQL 子查询与连接操作笔记

    SQL语句之间是可以进行连接操作的,在一些复杂的数据操作中必须用到连接操作.简单的说就是一个SQL语句的结果可以作为相连接的SQL操作的一部分.SQL结构化查询语句,子查询是指的所有的SQL操作,并非 ...

随机推荐

  1. eclipse 常用快捷键 及 windows快捷键

    Eclipse常用快捷键 打开Eclipse快捷键的快捷键 Ctrl+Shift+L 快捷键 描述 原英文描述 Ctrl+Shift+P 定位到光标所在处的括号的另一半括号的位置 Go to Matc ...

  2. 测试框架:使用SONAR分析代码质量

    介绍 Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd.checkstyl ...

  3. 关于MultipleActiveResultSets属性导致的There is already an open DataReader associated with this Command which must be closed first的解决方法

    执行SqlDataReader.Read之后,如果还想用另一个SqlCommand执行Insert或者Update操作的话,会得到一个错误提示:There is already an open Dat ...

  4. MetaWebBlogApi开发经验

    背景 花了一天的时间为某笔记软件开发了一款插件,能够发布笔记到博客园,本文就是记录开发时遇到的问题和解决方案,希望有大佬能开发出更好用的博客编辑器. 为什么要开发? 现在有很多开源的建站工具hexo, ...

  5. spring boot 事件发布与接收

    1.创建发布对象 LoginEvent 2.在要发布对象的地方注入 ApplicationEventPublisher @Autowired ApplicationEventPublisher pub ...

  6. centos/linux alternatives与update-alternatives详解与软件版本切换

    update-alternatives是linux系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令.哪个软件版本,比如,我们在系统中同时安装了open jdk和sun j ...

  7. 关于springmvc配置validator的注意事项

    <mvc:annotation-driven validator="validator" /> 在使用springmvc整合hibernate-validator做表单 ...

  8. PHP闭包和高阶函数

    <?php function func($a, $b) { $line = function ($x) use ($a, $b) { return $a*$x + $b; }; return $ ...

  9. python爬虫从入门到放弃(一)之初识爬虫

    整理这个文档的初衷是自己开始学习的时候没有找到好的教程和文本资料,自己整理一份这样的资料希望能对小伙伴有帮助 什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页 ...

  10. yum 源问题

    YUM源搭建 1.yum源是yum安装的获取源地,yum  = 红帽包管理 echo /dve/sr0 /media ios9660 defaults 0 0 >> /etc/fstab ...