转载  一张图看懂 SQL 的各种 join 用法

一、JOIN 使用介绍

下面例子使用的数据表如下:

-- ----------------------------
-- Table structure for dancing_hobby
-- ----------------------------
DROP TABLE IF EXISTS `dancing_hobby`;
CREATE TABLE `dancing_hobby` (
`id` int(11) NOT NULL COMMENT '主键',
`stu_num` int(11) NULL DEFAULT NULL COMMENT '学号',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`age` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '年龄',
`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '男生1 女生2',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ----------------------------
-- Records of dancing_hobby
-- ----------------------------
INSERT INTO `dancing_hobby` VALUES (1, 1001, '小红', '', '');
INSERT INTO `dancing_hobby` VALUES (2, 1002, '小红', '', '');
INSERT INTO `dancing_hobby` VALUES (3, 1003, '小黑', '', '');
INSERT INTO `dancing_hobby` VALUES (4, 2001, '大绿', '', '');
INSERT INTO `dancing_hobby` VALUES (5, 1005, '小紫', '', '');
INSERT INTO `dancing_hobby` VALUES (6, 2002, '大蓝', '', '');
INSERT INTO `dancing_hobby` VALUES (7, 1007, '小黄', '', '');
INSERT INTO `dancing_hobby` VALUES (8, 2003, '大白', '', '');
INSERT INTO `dancing_hobby` VALUES (9, 1009, '小橙', '', '');
INSERT INTO `dancing_hobby` VALUES (10, 2004, '大青', '', ''); -- ----------------------------
-- Table structure for sing_hobby
-- ----------------------------
DROP TABLE IF EXISTS `sing_hobby`;
CREATE TABLE `sing_hobby` (
`id` int(11) NOT NULL COMMENT '主键',
`stu_num` int(11) NULL DEFAULT NULL COMMENT '学号',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`age` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '年龄',
`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '男生1 女生2',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ----------------------------
-- Records of sing_hobby
-- ----------------------------
INSERT INTO `sing_hobby` VALUES (1, 1001, '小红', '', '');
INSERT INTO `sing_hobby` VALUES (2, 1002, '小红', '', '');
INSERT INTO `sing_hobby` VALUES (3, 1003, '小黑', '', '');
INSERT INTO `sing_hobby` VALUES (4, 1004, '小绿', '', '');
INSERT INTO `sing_hobby` VALUES (5, 1005, '小紫', '', '');
INSERT INTO `sing_hobby` VALUES (6, 1006, '小蓝', '', '');
INSERT INTO `sing_hobby` VALUES (7, 1007, '小黄', '', '');
INSERT INTO `sing_hobby` VALUES (8, 1008, '小白', '', '');
INSERT INTO `sing_hobby` VALUES (9, 1009, '小橙', '', '');
INSERT INTO `sing_hobby` VALUES (10, 1010, '小青', '', '');

1.INNER JOIN(内连接)

INNER JOIN 一般被译作内连接。内连接查询能将左表(表 A)和右表(表 B)中能关联起来的数据连接后返回。

SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

例子:

-- 内连接
SELECT
sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM
sing_hobby sing
inner JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

2.LEFT JOIN(左连接)

LEFT JOIN 一般被译作左连接,也写作 LEFT OUTER JOIN。左连接查询会返回左表(表 A)中所有记录,不管右表(表 B)中有没有关联的数据。在右表中找到的关联数据列也会被一起返回。

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

例子:

-- 左连接
SELECT
sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM
sing_hobby sing
LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

3.RIGHT JOIN(右连接)

RIGHT JOIN 一般被译作右连接,也写作 RIGHT OUTER JOIN。右连接查询会返回右表(表 B)中所有记录,不管左表(表 A)中有没有关联的数据。在左表中找到的关联数据列也会被一起返回。

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

例子:

-- 右连接
SELECT
sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM
sing_hobby sing
RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

4.FULL OUTER JOIN(外连接)

FULL OUTER JOIN 一般被译作外连接、全连接,实际查询语句中可以写作 FULL OUTER JOIN 或 FULL JOIN。外连接查询能返回左右表里的所有记录,其中左右表里能关联起来的记录被连接后返回。

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

注:mysql不支持外连接,可以使用 UNION ALL 代替,但要注意,如果要查询的两个表不是全部字段,那查询两个表的字段个数要相同,如下例子。

例子:

-- 外连接
SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM sing_hobby sing
LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
UNION ALL
SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM sing_hobby sing
RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
WHERE sing.stu_num IS NULL -- 外连接
SELECT
sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM
sing_hobby sing
FULL JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

5.LEFT JOIN EXCLUDING INNER JOIN(左连接-内连接)

返回左表有,右表没有的关联数据记录集。

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

例子:

-- 左内连接
SELECT
sing.`name` AS sing_name,
sing.sex sing_sex,
dancing.`name` dancing_name,
dancing.sex dancing_sex
FROM
sing_hobby sing
LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
WHERE
dancing.stu_num IS NULL

6.RIGHT JOIN EXCLUDING INNER JOIN(右连接-内连接)

返回右表有,左表没有的关联数据记录集。

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

例子:

-- 右内连接
SELECT
sing.`name` AS sing_name,
sing.sex sing_sex,
dancing.`name` dancing_name,
dancing.sex dancing_sex
FROM
sing_hobby sing
RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
WHERE
sing.stu_num IS NULL

7.OUTER JOIN EXCLUDING INNER JOIN(外连接-内连接)

返回右表、左表没有的关联数据记录集。

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

例子:

-- 排除内连接的外连接
SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM sing_hobby sing
LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
WHERE sing.stu_num IS NULL OR dancing.stu_num IS NULL
UNION ALL
SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
FROM sing_hobby sing
RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
WHERE sing.stu_num IS NULL OR dancing.stu_num IS NULL -- 排除内连接的外连接
SELECT
sing.`name` AS sing_name,
sing.sex sing_sex,
dancing.`name` dancing_name,
dancing.sex dancing_sex
FROM
sing_hobby sing
FULL JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
WHERE
sing.stu_num IS NULL OR dancing.stu_num IS NULL

mysql学习之join用法的更多相关文章

  1. mysql中的JOIN用法总结

    join是mysql中一个基础的关键词,一般在多表连接查询中使用,这里做一下总结 1.JOIN的语法格式 table_references: table_reference [, table_refe ...

  2. mysql学习之join从句

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

  3. MySQL学习 EXISTS的用法 转载

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  4. 一张图概括mysql的各种join用法

  5. MySQL基础之STRAIGHT JOIN用法简介

    MySQL基础之STRAIGHT JOIN用法简介 引用mysql官方手册的说法: STRAIGHT_JOIN is similar to JOIN, except that the left tab ...

  6. mysql中left join right join inner join用法分析

    mysql数据库中的关联查询,基本都会用到left join,right join,inner join等查询方式,今天来说说这三种用法的区别 1.创建表test1,test2,插入测试数据 #创建表 ...

  7. MySQL应用之CROSS JOIN用法简介教程

    目录 2. cross join用法 @ 本博客翻译自两篇博客的: http://www.mysqltutorial.org/mysql-cross-join/ https://www.w3resou ...

  8. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

  9. 一千行MySQL学习笔记 (转)

    出处:  一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...

随机推荐

  1. Git - 远程库的创建与认证

    前些日子因为某些原因,需要在windows上创建一个remote仓库. 由于实在是太麻烦而且时间紧急,就直接用了gitstack. 发现这个东西居然需要付费,未认证时只能创建两个用户. 其实对我而言足 ...

  2. monodb分片集群部署

    本文档基于MongoDB版本3.6.2 下载地址: 建议使用最新版本 https://www.mongodb.com/download-center#community 安装文件 集群ip及端口设计方 ...

  3. No.1一步步学习vuejs 环境配置安装篇

    一 安装与配置 需要安装node.js和 nmp管理器http://nodejs.cn/安装完后测试输入命令查看版本验证 node -v //查看node.js的版本 npm -v //查看 由于有些 ...

  4. jasperreports+iReport+jatoolsPrinter制作报表笔记

    此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 准备工作 1. 点击此下载相关的文件,并把 ims 文件夹放到 ims 工程对应的路劲下 2. 参考网址:杰创打印控件 二. ...

  5. TCP基础知识(一)简介与数据包

    TCP详解(1):简介与数据包 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 应用层向TCP层发送用于网间传输 ...

  6. centos自带python2.6升级到python2.7。并解决yum pip easy_install pip等模块兼容性问题

    参考原文:  https://www.cnblogs.com/kimyeee/p/7250560.html   https://www.cnblogs.com/galaxy-gao/p/5796488 ...

  7. 数据库字段值为null利用setInc方法无法直接写入

    1.数据库字段值为null利用setInc方法无法直接写入,先判断是否为空,再写入. if($points->add($dataList)){ $user=M('cuser'); $null=$ ...

  8. IIS 网站发布——遇到的问题,以及解决方案

    在 解决方案——Web 右键  发布  如图:   之后,在其他文件夹或盘  放入发布之后 生成的文件 如图所示,之所以这样是为了好整理查找发布的项目.   之后,在IIS 上发布出去     首先 ...

  9. Centos 7 系统安装(简单步骤)

    前面步骤忽略.进入安装步骤. 运行安装 到选择语言的时候最好选英文版,这里做模板,用的中文版 接着下一步到安装选项 在日期和时间里,选择上海时区 紧接着进行软件安装选择,如图安装就好 接着进行分区,也 ...

  10. File中mkdir()和mkdirs()的区别

    mkdir() 创建此抽象路径名指定的目录.只能在已经存在的目录中创建文件夹 如: File folder = new File("d:\\test1\\test2"); fold ...