MySQL--基础知识点--64--等值连接/自连接/自然连接/外连接
该篇文章基于以下三个表进行解析
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 join
、right join
、full join
,不可用于 natural join
,因为 natural join
不需要显示的连接条件。
using
:当连接条件中的两张表的两个连接属性相同时可以使用using
。
on
:连接条件中的两张表的两个连接属性不论是否相同,都可用 on
, using
是 on
两个连接属性相同时的简写。
MySQL--基础知识点--64--等值连接/自连接/自然连接/外连接相关推荐
- mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎
MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...
- MySQL基础知识点整理 - 存储引擎
MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...
- MySQL基础知识点整理 - 账号和权限管理
MySQL基础知识点整理 - 账号和权限管理 一.账号管理 1. 查看账号列表 MySQL用户账号和信息存储在名为 mysql 的数据库中.一般不需要直接访问 mysql 数据库和表,但有时需要直接访 ...
- MySQL 表的增删改查(进阶篇②)· 联合查询 内连接 外连接 · 自连接 · 子查询 exists · 合并查询 union
接进阶篇①,我们继续学习. 一.联合查询 1.1 内连接 1.2 外连接 1.3 内连接和左右外连接的区别 二.自连接 三.子查询 3.1 单行子查询 3.2 多行子查询 使用 in 范围匹配多行 另 ...
- SQL语法 自然连接 外连接 内连接
文章目录 笛卡尔积 连接 内连接 自连接 自然连接 外连接 左外连接 右外连接 区分连接 自然连接 内连接 内连接.外连接 on 和 where 条件过滤的区别 参考链接 笛卡尔积 结果集数目为多个表 ...
- SQL Server中的自连接和全外连接
SQL Server中的自连接和全外连接 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- MySQL基础知识点集合
数据库MySQL MySql常用命令(不区分大小写, ; 表示结束) SQL语句的分类 查询语句 排序(order by) 以上综合使用 数据处理函数 单行处理函数 多行处理函数(分组函数) 分组查询 ...
- mysql基础知识点
/* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysq ...
- 【MySQL】MySQL进阶之路(三)MySQL基础知识点整理
写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...
最新文章
- 【转】启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!...
- linux 数据复制 dd 简介
- python一次性读取整个文件-python-文件中的行是否读取整个文件
- 【Protocol Buffer】Protocol Buffer入门教程(六):枚举和包
- 对于mysql的用户权限管理
- 腾讯视频怎么设置下载视频位置
- 优化基于ExtJS 4.1的应用
- 海思 截图显示_三星Note10+5G国行跑分达到45万,华为海思麒麟990压力大不大?
- 马尔科夫模型与隐马尔科夫模型
- 回收站无法清空,提示无法读源文件或磁盘的解决办法
- 【亲测】80个经典在线休闲H5小游戏源码合集,直接上传空间即可使用,可玩性还不错
- grpc加TLS加密和令牌认证
- 简单的基于规则的汉语拼音分词
- photon 服务器操作系统,[专栏作家] Photon Server之Photon Control服务器控制界面
- webpack 的安装与使用
- ctp交易接口股票怎么查询历史数据?
- Elixir-Atoms
- linux下安装transmission下载种子
- 单片机•CPLD/FPGA开发综合实验装置
- python分治算法_Python算法:分治法
热门文章
- 如何理解泰勒展开式,他有何用途?
- jQuery框架的介绍以及基本用法--操作dom
- PS长图快速切片_ps基础(PS常用工具详解一)
- 微信的WXML和HTML WXSS和CSS的区别详解
- Linux画图工具gnuplot
- 自动驾驶仿真软件列表
- Internal error: Oops: 37 [#1] PREEMPT SMP ARM。处理方法果然touchscreens被编译了,但是我的触摸屏没有接,取消此编译选项,重新编译,开发成功启动
- AutoMapper源码解析
- 在linux上下载使用cisco anyconnect Software
- U盘安装Linux系统教程