SQL连接操作
一.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连接操作的更多相关文章
- (修改)oracle11g监听多台主机配置,用pl/sql连接操作多个数据库详解
很多朋友在开发项目中并不是每个人用一个数据库,而是有单独的一台主机作为开发的数据库服务器,这样,就需要我们的开发人员去连接它. 首先是进入oracle的 Net Mananger:
- php的SQL连接操作的方法
初学php,于是一开始就在sql(具体点说是mysql)里受挫严重.于是这里记下一些方法. 首先是基本方法.基本方法现在我不用了,所以我就附一下hustoj中的部分吧 基本方法的数据库连接操作: if ...
- SQL 连接操作 及 查询分析
- 关闭数据库下的所有连接操作 sql存储过程
use master go )) as begin ),) declare @spid int set @sql='declare getspid cursor for select spid fro ...
- SQL 经典回顾:JOIN 表连接操作不完全指南
2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...
- 【HANA系列】SAP HANA SQL字符串连接操作
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL字符串连 ...
- SQL连接
SQL连接可以分为内连接.外连接.交叉连接. 数据库数据: book表 stu表 1.内连接 ...
- SQL用法操作合集
SQL用法操作合集 一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...
- MySQL 子查询与连接操作笔记
SQL语句之间是可以进行连接操作的,在一些复杂的数据操作中必须用到连接操作.简单的说就是一个SQL语句的结果可以作为相连接的SQL操作的一部分.SQL结构化查询语句,子查询是指的所有的SQL操作,并非 ...
随机推荐
- java equals和==区别及string类的说明
一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) { return true; ...
- Dubbo高级特性实践-泛化调用
引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...
- Java xml 解析
1. XML框架结构 Java SE 6 平台提供的 XML 处理主要包括两个功能:XML 处理(JAXP,Java Architecture XML Processing)和 XML 绑定(JAXB ...
- Java数据类型+练习
java基础数据类型: 四类八种: 1, 整数型 byte 2的8次方(取值范围--<-128~127>)--1个字节 short 2的16次方--2个 int 2的32次方- ...
- 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...
- PC-lint集成于SourceInsight 范例以及简单分析;提高代码的健壮性;
写代码之际突然想起了pc-lint这个"古董级"的代码静态分析工具; 下午机房的服务器歇菜了,没法调试游戏,刚好抽出时间来研究一下pc-lint集成在SourceInsight ...
- Storm笔记——技术点汇总
目录 概况 手工搭建集群 引言 安装Python 配置文件 启动与测试 应用部署 参数配置 Storm命令 原理 Storm架构 Storm组件 Stream Grouping 守护进程容错性(Dae ...
- 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》
首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和 ...
- PowerShell 脚本中的密码
引言 笔者在<PowerShell 远程执行任务>一文中提到了在脚本中使用用户名和密码的基本方式: $Username = 'xxxx' $Password = 'yyyy' $Pass ...
- 花了一年时间开发的TTFEditor 字体编辑器
TTF(True Type Font)字库是微软定义的基于windows的标准字库格式.但其由于专利保护以及无法跨平台导致TTF字库在实际应用中无法有效使用. 为此我推出TTFEditor字体编辑软件 ...