zoukankan      html  css  js  c++  java
  • Mysql的七种join

    对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。

    建表

    在这里呢我们先来建立两张有外键关联的张表。

    CREATE DATABASE db0206;
    USE db0206;
    
    CREATE TABLE `db0206`.`tbl_dept`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `deptName` VARCHAR(30),
      `locAdd` VARCHAR(40),
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB CHARSET=utf8;
    
    CREATE TABLE `db0206`.`tbl_emp`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(20),
      `deptId` INT(11),
      PRIMARY KEY (`id`),
      FOREIGN KEY (`deptId`) REFERENCES `db0206`.`tb_dept`(`id`)
    ) ENGINE=INNODB CHARSET=utf8;
    /*插入数据*/
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
    INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
    
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
    
    INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
    INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
    
    INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
    
    INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
    

    文氏图与SQL语句的编写以及查询结果

    内连接

    内连接文氏图

    表的内连接

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    select * from tbl_dept a inner join tbl_emp b on a.id=b.deptId;
    • 查询结果
      这里写图片描述

    左外连接

    左外连接文氏图

    左连接

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    select * from tbl_dept a left join tbl_emp b on a.id=b.deptId;
    • 查询结果
      左外连接

    右外连接

    右外连接文氏图

    这里写图片描述

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    select * from tbl_dept a right join tbl_emp b on a.id=b.deptId;
    • 查询结果
      这里写图片描述

    左连接

    左连接文氏图

    这里写图片描述

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    elect * from tbl_dept a left join tbl_emp b on a.id=b.deptId where b.deptId is null;
    • 查询结果

    这里写图片描述

    右连接

    右连接文氏图

    右连接

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    select * from tbl_dept a right join tbl_emp b on a.id=b.deptId where a.id is null;
    • 查询结果

    右连接

    全连接

    全连接文氏图

    这里写图片描述

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    select * from tbl_dept a right join tbl_emp b on a.id=b.deptId 
    union 
    select * from tbl_dept a left join tbl_emp b on a.id=b.deptId;
    • 查询结果
      全连接

    两张表中都没有出现的数据集

    文氏图

    执行的sql语句以及执行的查询结果

    • 执行的sql语句
    select * from tbl_dept a right join tbl_emp b on a.id=b.deptId where a.id is null union select * from tbl_dept a left join tbl_emp b on a.id=b.deptId where b.deptId is null;
    • 查询结果

    这里写图片描述

  • 相关阅读:
    Mysql(连接查询)
    Mysql(条件查询)
    mysql:dql(基本数据查询)
    mysql:ddl(创建表、创建数据库、删除表、修改表)
    多线程(线程间的数据共享、线程安全、线程通信)
    多线程(进程与线程、多线程的实现方式、线程池、多线程的优点)
    IO流(IO流的工具类、Properties类)
    IO流(转换流、打印流、序列化流与反序列化流)
    IO流(输入输出流(字节、字节缓冲、文件字符、文件字符缓冲)、IO流的应用、缓冲数组)
    IO流(File类:构造方法、常用方法、递归获取文件、文件过滤)
  • 原文地址:https://www.cnblogs.com/haifeiWu/p/9079584.html
Copyright © 2011-2022 走看看