案例理解LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法
文章目录
- 建立相关表
- 七大JOIN
- Inner JOIN
- Left JOIN
- Left Excluding JOIN
- Right JOIN
- Right Excluding JOIN
- FULL Outer JOIN
- FULL Outer Excluding JOIN
本文将着重分析下图中联合查询的用法:
图片来源: 一张图看懂 SQL 的各种 JOIN 用法 。
建立相关表
在理解之前,我们首先建立相关的表,首先建立学生表:
create table student(stuNo char(5) primary key, -- 学生学号stuName varchar(32) not null, -- 学生姓名gender char(1) not null default '男', -- 学生性别age int not null -- 学生年龄
)charset='utf8';
之后插入数据:
-- 添加学生数据
insert into student(stuNo,stuName,gender,age) values('001','李志','男',14);
insert into student(stuNo,stuName,gender,age) values('002','宋东野','男',23);
insert into student(stuNo,stuName,gender,age) values('003','赵雷','男',34);
insert into student(stuNo,stuName,gender,age) values('004','马頔','男',32);
insert into student(stuNo,stuName,gender,age) values('005','陈粒','女',18);
insert into student(stuNo,stuName,gender,age) values('006','筠子','女',4);
insert into student(stuNo,stuName,gender,age) values('007','寸铁','男',56);
insert into student(stuNo,stuName,gender,age) values('008','狗毛','男',47);
insert into student(stuNo,stuName,gender,age) values('009','崔健','男',39);
insert into student(stuNo,stuName,gender,age) values('010','草东','男',40);
insert into student(stuNo,stuName,gender,age) values('011','张悬','女',36);
insert into student(stuNo,stuName,gender,age) values('012','撒娇','女',25);
insert into student(stuNo,stuName,gender,age) values('013','宋东野','男',35);
再建立分数表,此处的分数表不严谨,因为并没有相关课程的信息,并且应该和学生表有一个外键关联,但为了简单的理解联合查询以及需要插入一个特殊的数据,此处就不弄那么复杂了:
create table score(id int not null AUTO_INCREMENT primary key,sNo char(5) not null , -- 教师号score double not null -- 成绩-- foreign key(sNo) references student(stuNo)
);
之后插入数据:
-- 添加成绩数据
insert into score(sNo,score) values('001',56);
insert into score(sNo,score) values('002',87);
insert into score(sNo,score) values('004',92);
insert into score(sNo,score) values('005',76);
insert into score(sNo,score) values('007',90);
insert into score(sNo,score) values('008',53);
insert into score(sNo,score) values('010',67);
insert into score(sNo,score) values('011',69);
insert into score(sNo,score) values('012',78);
insert into score(sNo,score) values('014',80); -- 此数据如果有外键关联则无法插入
此时就得到了学生表和分数表,删除重建命令如下:
-- 删除表
drop table if exists score;
drop table if exists student;
七大JOIN
现在我们假设学生表为A,分数表为B。
两张表的详细信息如下:
Inner JOIN
查询学生中参加考试的学生的分数
select s.stuNo, s.stuName, sc.score FROM student as s inner join score as sc on s.stuNo=sc.sNo ;
可得结果:
Left JOIN
查询所有学生的分数(包含缺考的)
select s.stuNo, s.stuName, sc.score FROM student as s left join score as sc on s.stuNo=sc.sNo order by s.stuNo ASC;
可得结果:
Left Excluding JOIN
查询缺考的学生
select s.stuNo, s.stuName, sc.score FROM student as s left join score as sc on s.stuNo=sc.sNo where sc.score is NULL order by s.stuNo ASC;
可得结果如下:
Right JOIN
查询所有分数对应的学生
select s.stuNo, s.stuName, sc.score FROM student as s right join score as sc on s.stuNo=sc.sNo order by s.stuNo ASC;
可得结果如下:
Right Excluding JOIN
查询有分数但不在学生表的分数
select s.stuNo, s.stuName, sc.score FROM student as s right join score as sc on s.stuNo=sc.sNo where s.stuNo is NULL order by s.stuNo ASC;
可得结果如下:
FULL Outer JOIN
我们需要注意, Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+ union+右外连接实现。 UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
查询所有的学生和所有的分数
select s.stuNo, s.stuName, sc.score FROM student as s left join score as sc on s.stuNo=sc.sNo
UNION
select s.stuNo, s.stuName, sc.score FROM student as s right join score as sc on s.stuNo=sc.sNo;
可得结果如下:
FULL Outer Excluding JOIN
查询分数为空的学生和学生为空的分数
select s.stuNo, s.stuName, sc.score FROM student as s left join score as sc on s.stuNo=sc.sNo where sc.score is NULL
UNION
select s.stuNo, s.stuName, sc.score FROM student as s right join score as sc on s.stuNo=sc.sNo where s.stuNo is NULL ;
可得结果如下:
案例理解LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法相关推荐
- 如何在MySQL中进行FULL OUTER JOIN?
我想在MySQL中进行完全外部联接. 这可能吗? MySQL是否支持完全外部联接? #1楼 在SQLite中,您应该这样做: SELECT * FROM leftTable lt LEFT JOIN ...
- SQL OUTER JOIN概述和示例
This article will provide a full overview, with examples of the SQL Outer join, including the full, ...
- SQL学习之full outer join关键字
目录 参考源 SQL full outer join 关键字 图例 full outer join语法 示例数据 full outer join使用 参考源 简单教程 https://www.twle ...
- “INNER JOIN”和“OUTER JOIN”有什么区别?
问题描述: 另外,LEFT JOIN.RIGHT JOIN 和 FULL JOIN 如何适应? 保持自己快人一步,享受全网独家提供的一站式外包任务.远程工作.创意产品订阅服务–huntsbot.com ...
- oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...
建表语句: create table EMPLOYEE ( EID NUMBER, DEPTID NUMBER, ENAME VARCHAR2(200) ) create table DEPT ( D ...
- SQL中inner join、outer join和cross join的区别
对于SQL中inner join.outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多,如果你使用join连表,缺陷的情况下是inne ...
- [摘]终于找到一个有助理解left/right/full outer join的例子
近日在学习<Understading DB2>的时候找到了一个例子,对于理解 left/right/full 三种 outer join 的大有裨益. 先看样本数据,来自DB2的示例数据库 ...
- SQL 中 left join 的底层原理(各种JOIN的复杂度探究)
01. 前言 写过或者学过 SQL 的人应该都知道 left join,知道 left join 的实现的效果,就是保留左表的全部信息,然后把右表往左表上拼接,如果拼不上就是 null.除了 left ...
- left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...
最新文章
- python中time的用法_python中的计时器timeit的使用方法
- 单调谐回路谐振放大器等效电路分析_谐振回路的工作原理
- python程序占用内存高_如何优化Python占用的内存,面试必学
- leetcode 214. Shortest Palindrome | 214. 最短回文串(Java)
- Android Json 解析
- 华为天才少年1万块自制机械臂,网友:200万给少了
- 深度学习花书-3.8 期望、方差与协方差
- vue差(插)值表达式
- msf后渗透之获取登入password、远程控制、调用摄像头
- 5个值得收藏的视频下载网站
- Linux usbkey自动登陆,Usbkey怎么用?|3分钟让您了解Usbkey使用方法
- ORA-39194: Table mode jobs require the tables to be comma separated.
- Android竖虚线绘制
- 用Python简单代码实现炫酷动态条形图
- 纪录片让你开阔眼界、增长见识
- 记一次疑难杂症-HTTP请求RST
- 云原生背景看这一篇就够了
- Java线程生命周期与状态切换
- Hash(散列)冲突解决 线性探测再散列和二次探测再散列
- google源码下载方法
热门文章
- 工业控制计算机系统总线,工业控制计算机总线技术.ppt
- std::wstring std::wstring::sizetype wstring::npos 简单示例介绍
- UE5 官方案例Lyra 全特性详解 13.背包系统Inventory System 2
- 安装centOS 7双系统(四)——解决Broadcom博通BCM 43xx无线网卡驱动问题
- CHIL-SQL-UNIQUE 约束
- 上海浦东新区计算机专科学校,上海|专科
- 面对大量的用户数据泄露事件,普通用户该如何保护个人的网络信息安全?
- html 表头单元格换行,Table组件怎样在单元格长文本不换行情况下正确对应表头与单元格?...
- Flutter 自定义Widget——风车实现
- 挽回前男友的方法(挽回必看)