该篇文章基于以下三个表进行解析
student表

DROP TABLE
IFEXISTS `student`;CREATE TABLE student (`sid` INT NOT NULL AUTO_INCREMENT,`snum` INT NOT NULL PRIMARY KEY,`sname` VARCHAR ( 20 ) NOT NULL,`sage` TINYINT,`sclass` SMALLINT NOT NULL, #PRIMARY KEY ( `sid` ),UNIQUE KEY `student_num`( `sid` )  # 最后不能加',',否则会报错)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;  # 使用'='的都放在student()之外。INSERT INTO `student`(`snum`, `sname`, `sage`, `sclass`)  # 当使用含有自增字段时,必须写明要插入的字段,否则插入失败
VALUES(20201101, 'zhangsan', 20, 150 ),(20201102, 'lisi', 18, 151),(20201103, 'wangwu', 19, 151),(20201104, 'zhaoliu', 18, 150),(20201105, 'qianqi', 21, 151),(20201106, 'sunba', 20, 152);


course表

DROP TABLEIF EXISTS `course`;CREATE TABLE course (`cid` INT NOT NULL AUTO_INCREMENT,`cnum` INT NOT NULL PRIMARY KEY ,`cname` VARCHAR ( 20 ) NOT NULL,
--  PRIMARY KEY ( `id` ),UNIQUE KEY `course_num`( `cid` )  # 最后不能加',',否则会报错)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;  # 使用'='的都放在student()之外。INSERT INTO `course`(`cnum`, `cname`)
VALUES (101, '数据结构'),(102, '编译原理'),(103, '计算机网络'),(105, '计算机组成原理'),(106, '数据库');


sc表

DROP TABLEIF EXISTS `sc`;CREATE TABLE `sc`(
`scid` INT NOT NULL UNIQUE AUTO_INCREMENT,
`snum` INT NOT NULL,
`cnum` INT NOT NULL,
`grade` SMALLINT,
PRIMARY KEY(`snum`, `cnum`),
FOREIGN KEY(`snum`) REFERENCES `student`(`snum`),
FOREIGN KEY(`cnum`) REFERENCES `course`(`cnum`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO `sc`(`snum`, `cnum`, `grade`)
VALUES(20201101, 101, 85),(20201102, 101, 55),(20201103, 101, 90),(20201101, 102, 88),(20201102, 102, 75),(20201103, 102, 58),(20201101, 103, 72),(20201102, 103, 80),(20201103, 103, 92);

1 等值连接

等值连接:它是基于两个表之间的相等测试,展现出来的是共同的数据,因此又称内部连接。

举例:

# 等值连接/内部连接-- 使用WHERE
SELECT `snum`, `cname`, `grade`
FROM`course`, `sc`
WHERE`course`.`cnum` = `sc`.`cnum`;-- 使用INNER JOIN
SELECT `snum`, `cname`, `grade`
FROM `course` INNER JOIN `sc`
ON `course`.`cnum` = `sc`.`cnum`;-- 使用INNER JOIN
SELECT `snum`, `cname`, `grade`
FROM `course` INNER JOIN `sc`
USING(`cnum`);

以上三种方法结果相同,都属于等值连接。

2 自连接

自连接:给一张表取两个不同的别名就,使用两个别名将表与表本身进行连接查询,然后附上连接条件。

举例:

# 自连接SELECT `stu1`.`sname` `stu1_sname`, `stu2`.`sage` `stu2_sage`
FROM`student` `stu1`, `student` `stu2`
WHERE`stu1`.`snum` = `stu2`.`snum`;

3 自然连接

自然连接:自然连接是一种特殊的等值连接。它要求两个关系表中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。

举例:

# 自然连接-- 使用NATURAL JOIN
SELECT *
FROM `course` NATURAL JOIN `sc`

4 外连接

外连接包括左外连接、右外连接、全外连接。

4.1 左外连接

左外连接:两表进行连接时,将返回右表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值。

举例:

# 左外连接-- 使用LEFT JOIN
SELECT `snum`, `cname`, `grade`
FROM `course` LEFT JOIN `sc`
-- USING(`cnum`);
ON`course`.`cnum` = `sc`.`cnum`;

4.2 右外连接

右外连接:两表进行连接时,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

举例:

# 右外连接-- 使用RIGHT JOIN
SELECT `snum`, `cname`, `grade`
FROM `sc` RIGHT JOIN `course`
-- USING(`cnum`);
ON`course`.`cnum` = `sc`.`cnum`;

4.3 全外连接

全外连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

举例:

# 全外连接-- 使用FULL JOIN,mysql 不支持,orcal支持
SELECT `snum`, `cname`, `grade`
FROM `sc` FULL JOIN `course`
-- USING(`cnum`);
ON`course`.`cnum` = `sc`.`cnum`;-- mysql中使用UNION来实现FULL JOIN的功能
SELECT `snum`, `cname`, `grade`
FROM `course` LEFT JOIN `sc`
-- USING(`cnum`);
ON`course`.`cnum` = `sc`.`cnum`
UNION
SELECT `snum`, `cname`, `grade`
FROM `sc` RIGHT JOIN `course`
-- USING(`cnum`);
ON`course`.`cnum` = `sc`.`cnum`;

5 补充

using 和 on 值可用于 left joinright joinfull join ,不可用于 natural join ,因为 natural join 不需要显示的连接条件。

using:当连接条件中的两张表的两个连接属性相同时可以使用using
on:连接条件中的两张表的两个连接属性不论是否相同,都可用 onusingon 两个连接属性相同时的简写。

MySQL--基础知识点--64--等值连接/自连接/自然连接/外连接相关推荐

  1. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  2. MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  3. MySQL基础知识点整理 - 账号和权限管理

    MySQL基础知识点整理 - 账号和权限管理 一.账号管理 1. 查看账号列表 MySQL用户账号和信息存储在名为 mysql 的数据库中.一般不需要直接访问 mysql 数据库和表,但有时需要直接访 ...

  4. MySQL 表的增删改查(进阶篇②)· 联合查询 内连接 外连接 · 自连接 · 子查询 exists · 合并查询 union

    接进阶篇①,我们继续学习. 一.联合查询 1.1 内连接 1.2 外连接 1.3 内连接和左右外连接的区别 二.自连接 三.子查询 3.1 单行子查询 3.2 多行子查询 使用 in 范围匹配多行 另 ...

  5. SQL语法 自然连接 外连接 内连接

    文章目录 笛卡尔积 连接 内连接 自连接 自然连接 外连接 左外连接 右外连接 区分连接 自然连接 内连接 内连接.外连接 on 和 where 条件过滤的区别 参考链接 笛卡尔积 结果集数目为多个表 ...

  6. SQL Server中的自连接和全外连接

                                SQL Server中的自连接和全外连接 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  7. MySQL基础知识点集合

    数据库MySQL MySql常用命令(不区分大小写, ; 表示结束) SQL语句的分类 查询语句 排序(order by) 以上综合使用 数据处理函数 单行处理函数 多行处理函数(分组函数) 分组查询 ...

  8. mysql基础知识点

    /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysq ...

  9. 【MySQL】MySQL进阶之路(三)MySQL基础知识点整理

    写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...

最新文章

  1. 【转】启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!...
  2. linux 数据复制 dd 简介
  3. python一次性读取整个文件-python-文件中的行是否读取整个文件
  4. 【Protocol Buffer】Protocol Buffer入门教程(六):枚举和包
  5. 对于mysql的用户权限管理
  6. 腾讯视频怎么设置下载视频位置
  7. 优化基于ExtJS 4.1的应用
  8. 海思 截图显示_三星Note10+5G国行跑分达到45万,华为海思麒麟990压力大不大?
  9. 马尔科夫模型与隐马尔科夫模型
  10. 回收站无法清空,提示无法读源文件或磁盘的解决办法
  11. 【亲测】80个经典在线休闲H5小游戏源码合集,直接上传空间即可使用,可玩性还不错
  12. grpc加TLS加密和令牌认证
  13. 简单的基于规则的汉语拼音分词
  14. photon 服务器操作系统,[专栏作家] Photon Server之Photon Control服务器控制界面
  15. webpack 的安装与使用
  16. ctp交易接口股票怎么查询历史数据?
  17. Elixir-Atoms
  18. linux下安装transmission下载种子
  19. 单片机•CPLD/FPGA开发综合实验装置
  20. python分治算法_Python算法:分治法

热门文章

  1. 如何理解泰勒展开式,他有何用途?
  2. jQuery框架的介绍以及基本用法--操作dom
  3. PS长图快速切片_ps基础(PS常用工具详解一)
  4. 微信的WXML和HTML WXSS和CSS的区别详解
  5. Linux画图工具gnuplot
  6. 自动驾驶仿真软件列表
  7. Internal error: Oops: 37 [#1] PREEMPT SMP ARM。处理方法果然touchscreens被编译了,但是我的触摸屏没有接,取消此编译选项,重新编译,开发成功启动
  8. AutoMapper源码解析
  9. 在linux上下载使用cisco anyconnect Software
  10. U盘安装Linux系统教程