在mysql中的两表进行连接时,总共有7种连接情况,具体可见下图

  由图的从左到右的顺序

    图1.左连接(left join):返回左表中的所有记录和右表中的连接字符字段相等的记录,若右表没有匹配值则补NULL

    图2.右连接(right join):返回右表中的所有记录和右表中的连接字符字段相等的记录,若左表没有匹配值则补NULL

    图3.内连接(inner join):只有满足条件的巨鹿才会出现在查询结果中,即左表和右表的公共部分

    图4.左表中的独自拥有的部分,去除与右表中的重合部分

    图5.右表中的独自拥有的部分,去除与左表中的重合部分

    图6.左表和右表的重合部分,以及左右表的重和部分(可以看成两表的左连接和右连接的拼接)

    图7.左表和右表的独自拥有部分(可以看成是图4和图5的拼接)

实例详解:

   创建相关表以及插入数据

  

create table student(
sid int(11) primary key auto_increment,
sname varchar(20) not null,
class_id int(11) null
);
create table class(
cid int(11) primary key,
cname varchar(20) not null
);
alter table student add foreign key(class_id) references class(cid);
desc student;
insert into class(cid,cname) values
(1,'一年级'),
(2,'二年级'),
(3,'三年级'),
(4,'四年级'),
(5,'五年级'),
(6,'六年级');
set sql_safe_updates = 0;
insert into student(sid,sname,class_id) values
(1,'张三',1),
(2,'李四',4),
(3,'王五',1),
(4,'赵柳',2),
(5,'孙权',6),
(6,'钱升',null),
(7,'刘备',3),
(8,'周往',5);
#内连接
select
student.*,
class.*
from
student
inner join class
on student.class_id = class.cid;

#左连接
select
student.*,
class.*
from
student
left join class
on student.class_id = class.cid;

#右连接
select
student.*,
class.*
from
student
right join class
on student.class_id = class.cid;

#student数据表锁独有的数据
select
student.*,
class.*
from
student
left join class
on student.class_id = class.cid
where class.cid is null;

#class表锁独有的数据
select
student.*,
class.*
from
student
right join class
on student.class_id = class.cid
where student.class_id is null;

select
student.*,
class.*
from
student
left join class
on student.class_id = class.cid
union
select
student.*,
class.*
from
student
right join class
on student.class_id = class.cid;

select
student.*,
class.*
from
student
left join class
on student.class_id = class.cid
where class.cid is null
union
select
student.*,
class.*
from
student
right join class
on student.class_id = class.cid
where student.class_id is null;

七种join的书写规范的更多相关文章

  1. MySQL逻辑架构、SQL加载执行顺序、七种JOIN模式图解

    逻辑架构   存储引擎 查看当前安装的mysql提供的存储引擎 查看当前mysql默认的存储引擎 MyISAM和InnoDB SQL加载执行顺序 sql书写顺序 mysql解析器执行的顺序  考点:m ...

  2. 【知识库】-数据库_MySQL 的七种 join

    掘金作者:haifeisi 文章出处: MySQL 的七种 join Learn [已经过测试校验] 一.内连接 二.左外连接 三.右外连接 四.左连接 五.右连接 六.全连接 七.两张表中都没有出现 ...

  3. 1. 七种join的sql编写

    一.join图 二.sql演示 a.创建演示表及数据 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ----------------------- ...

  4. Mysql七种 JOIN 连接

    内连接 SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key = B.Key 左外连接 SELECT <se ...

  5. MySQL的七种join

    转载 原文地址 建表 在这里我们先建立两张有外键关联的两张表: CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept` ...

  6. MySQL 的七种 join

    建表 在这里呢我们先来建立两张有外键关联的张表. CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` ...

  7. MySQL七种join理论

    1. 内连接 select * from A inner join B where A.key=B.key; 2. 左连接 select * from A left join B on A.key=B ...

  8. MYSQL 的七种join

    建表 在这里呢我们先来建立两张有外键关联的张表. CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` ...

  9. ECMA-262规范定义的七种错误类型

    第一种:Error    所有错误的基本类型,实际上不会被抛出.   第二种:EvalError   执行eval错误时抛出. 第三种:ReferenceError    对象不存在是抛出. 第四种: ...

随机推荐

  1. python 编码问题随笔

    原文点击这里 借用原作者的一句话"据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError.UnicodeDecodeError,你 ...

  2. Github Docs All In One

    Github Docs All In One docs https://docs.github.com/en https://github.com/github/docs GitHub REST AP ...

  3. 你不知道的 JS (系列丛书) - 第二版

    你不知道的 JS (系列丛书) - 第二版 You Don't Know JS (book series) - 2nd Edition https://github.com/learning-js-b ...

  4. how to make one your own promise version Ajax

    how to make one your own promise version Ajax XMLHttpRequest https://developer.mozilla.org/en-US/doc ...

  5. docs search & algolia & docsearch

    docs search & algolia & docsearch https://www.algolia.com/docsearch https://www.algolia.com/ ...

  6. js 上传图片,用户自定义截取图片大小

    js 上传图片,用户自定义截取图片大小 js 组件

  7. Flutter: 监听App显示,隐藏

    关键代码 class _MyAppState extends State<MyApp> with WidgetsBindingObserver { @override void initS ...

  8. Dart: 执行shell命令

    1 创建包 >stagehand console-full 2 安装插件 process_run: ^0.10.1 3 编写 bin/main.dart ... import 'package: ...

  9. 在多线程编程中不要使用sleep()、usleep()函数

    这两个函数是非线程安全的,可能会造成程序卡死. 对于c++程序,建议使用std::this_thread::sleep_for()和std::this_thread::yield()代替. 纯c程序可 ...

  10. 【python接口自动化】- 正则用例参数化

    ​ 我们在做接口自动化的时候,处理接口依赖的相关数据时,通常会使用正则表达式来进行提取相关的数据. ​ 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(Regular Ex ...