文章目录

  • 建立相关表
  • 七大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 种用法相关推荐

  1. 如何在MySQL中进行FULL OUTER JOIN?

    我想在MySQL中进行完全外部联接. 这可能吗? MySQL是否支持完全外部联接? #1楼 在SQLite中,您应该这样做: SELECT * FROM leftTable lt LEFT JOIN ...

  2. SQL OUTER JOIN概述和示例

    This article will provide a full overview, with examples of the SQL Outer join, including the full, ...

  3. SQL学习之full outer join关键字

    目录 参考源 SQL full outer join 关键字 图例 full outer join语法 示例数据 full outer join使用 参考源 简单教程 https://www.twle ...

  4. “INNER JOIN”和“OUTER JOIN”有什么区别?

    问题描述: 另外,LEFT JOIN.RIGHT JOIN 和 FULL JOIN 如何适应? 保持自己快人一步,享受全网独家提供的一站式外包任务.远程工作.创意产品订阅服务–huntsbot.com ...

  5. 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 ...

  6. SQL中inner join、outer join和cross join的区别

    对于SQL中inner join.outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多,如果你使用join连表,缺陷的情况下是inne ...

  7. [摘]终于找到一个有助理解left/right/full outer join的例子

    近日在学习<Understading DB2>的时候找到了一个例子,对于理解 left/right/full 三种 outer join 的大有裨益. 先看样本数据,来自DB2的示例数据库 ...

  8. SQL 中 left join 的底层原理(各种JOIN的复杂度探究)

    01. 前言 写过或者学过 SQL 的人应该都知道 left join,知道 left join 的实现的效果,就是保留左表的全部信息,然后把右表往左表上拼接,如果拼不上就是 null.除了 left ...

  9. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇

    Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...

最新文章

  1. python中time的用法_python中的计时器timeit的使用方法
  2. 单调谐回路谐振放大器等效电路分析_谐振回路的工作原理
  3. python程序占用内存高_如何优化Python占用的内存,面试必学
  4. leetcode 214. Shortest Palindrome | 214. 最短回文串(Java)
  5. Android Json 解析
  6. 华为天才少年1万块自制机械臂,网友:200万给少了
  7. 深度学习花书-3.8 期望、方差与协方差
  8. vue差(插)值表达式
  9. msf后渗透之获取登入password、远程控制、调用摄像头
  10. 5个值得收藏的视频下载网站
  11. Linux usbkey自动登陆,Usbkey怎么用?|3分钟让您了解Usbkey使用方法
  12. ORA-39194: Table mode jobs require the tables to be comma separated.
  13. Android竖虚线绘制
  14. 用Python简单代码实现炫酷动态条形图
  15. 纪录片让你开阔眼界、增长见识
  16. 记一次疑难杂症-HTTP请求RST
  17. 云原生背景看这一篇就够了
  18. Java线程生命周期与状态切换
  19. Hash(散列)冲突解决 线性探测再散列和二次探测再散列
  20. google源码下载方法

热门文章

  1. 工业控制计算机系统总线,工业控制计算机总线技术.ppt
  2. std::wstring std::wstring::sizetype wstring::npos 简单示例介绍
  3. UE5 官方案例Lyra 全特性详解 13.背包系统Inventory System 2
  4. 安装centOS 7双系统(四)——解决Broadcom博通BCM 43xx无线网卡驱动问题
  5. CHIL-SQL-UNIQUE 约束
  6. 上海浦东新区计算机专科学校,上海|专科
  7. 面对大量的用户数据泄露事件,普通用户该如何保护个人的网络信息安全?
  8. html 表头单元格换行,Table组件怎样在单元格长文本不换行情况下正确对应表头与单元格?...
  9. Flutter 自定义Widget——风车实现
  10. 挽回前男友的方法(挽回必看)