zoukankan      html  css  js  c++  java
  • mysql学习之join用法

    转载  一张图看懂 SQL 的各种 join 用法

    一、JOIN 使用介绍

    下面例子使用的数据表如下:

    -- ----------------------------
    -- Table structure for dancing_hobby
    -- ----------------------------
    DROP TABLE IF EXISTS `dancing_hobby`;
    CREATE TABLE `dancing_hobby`  (
      `id` int(11) NOT NULL COMMENT '主键',
      `stu_num` int(11) NULL DEFAULT NULL COMMENT '学号',
      `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
      `age` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '年龄',
      `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '男生1 女生2',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of dancing_hobby
    -- ----------------------------
    INSERT INTO `dancing_hobby` VALUES (1, 1001, '小红', '18', '1');
    INSERT INTO `dancing_hobby` VALUES (2, 1002, '小红', '18', '2');
    INSERT INTO `dancing_hobby` VALUES (3, 1003, '小黑', '18', '1');
    INSERT INTO `dancing_hobby` VALUES (4, 2001, '大绿', '18', '1');
    INSERT INTO `dancing_hobby` VALUES (5, 1005, '小紫', '18', '2');
    INSERT INTO `dancing_hobby` VALUES (6, 2002, '大蓝', '18', '1');
    INSERT INTO `dancing_hobby` VALUES (7, 1007, '小黄', '18', '1');
    INSERT INTO `dancing_hobby` VALUES (8, 2003, '大白', '18', '1');
    INSERT INTO `dancing_hobby` VALUES (9, 1009, '小橙', '18', '2');
    INSERT INTO `dancing_hobby` VALUES (10, 2004, '大青', '18', '2');
    
    
    -- ----------------------------
    -- Table structure for sing_hobby
    -- ----------------------------
    DROP TABLE IF EXISTS `sing_hobby`;
    CREATE TABLE `sing_hobby`  (
      `id` int(11) NOT NULL COMMENT '主键',
      `stu_num` int(11) NULL DEFAULT NULL COMMENT '学号',
      `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
      `age` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '年龄',
      `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '男生1 女生2',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of sing_hobby
    -- ----------------------------
    INSERT INTO `sing_hobby` VALUES (1, 1001, '小红', '18', '1');
    INSERT INTO `sing_hobby` VALUES (2, 1002, '小红', '18', '2');
    INSERT INTO `sing_hobby` VALUES (3, 1003, '小黑', '18', '1');
    INSERT INTO `sing_hobby` VALUES (4, 1004, '小绿', '18', '1');
    INSERT INTO `sing_hobby` VALUES (5, 1005, '小紫', '18', '2');
    INSERT INTO `sing_hobby` VALUES (6, 1006, '小蓝', '18', '1');
    INSERT INTO `sing_hobby` VALUES (7, 1007, '小黄', '18', '1');
    INSERT INTO `sing_hobby` VALUES (8, 1008, '小白', '18', '1');
    INSERT INTO `sing_hobby` VALUES (9, 1009, '小橙', '18', '2');
    INSERT INTO `sing_hobby` VALUES (10, 1010, '小青', '18', '2');

    1.INNER JOIN(内连接)

    INNER JOIN 一般被译作内连接。内连接查询能将左表(表 A)和右表(表 B)中能关联起来的数据连接后返回。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list> 
    FROM Table_A A
    INNER JOIN Table_B B
    ON A.Key = B.Key

    例子:

    -- 内连接
    SELECT
        sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
    FROM
        sing_hobby sing
        inner JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

    2.LEFT JOIN(左连接)

    LEFT JOIN 一般被译作左连接,也写作 LEFT OUTER JOIN。左连接查询会返回左表(表 A)中所有记录,不管右表(表 B)中有没有关联的数据。在右表中找到的关联数据列也会被一起返回。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list>
    FROM Table_A A
    LEFT JOIN Table_B B
    ON A.Key = B.Key

    例子:

    -- 左连接
    SELECT
        sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
    FROM
        sing_hobby sing
        LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

    3.RIGHT JOIN(右连接)

    RIGHT JOIN 一般被译作右连接,也写作 RIGHT OUTER JOIN。右连接查询会返回右表(表 B)中所有记录,不管左表(表 A)中有没有关联的数据。在左表中找到的关联数据列也会被一起返回。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list>
    FROM Table_A A
    RIGHT JOIN Table_B B
    ON A.Key = B.Key

    例子:

    -- 右连接
    SELECT
        sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
    FROM
        sing_hobby sing
        RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

    4.FULL OUTER JOIN(外连接)

    FULL OUTER JOIN 一般被译作外连接、全连接,实际查询语句中可以写作 FULL OUTER JOIN 或 FULL JOIN。外连接查询能返回左右表里的所有记录,其中左右表里能关联起来的记录被连接后返回。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list>
    FROM Table_A A
    FULL OUTER JOIN Table_B B
    ON A.Key = B.Key

    注:mysql不支持外连接,可以使用 UNION ALL 代替,但要注意,如果要查询的两个表不是全部字段,那查询两个表的字段个数要相同,如下例子。

    例子:

    -- 外连接
    SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex 
    FROM sing_hobby sing
    LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
    UNION ALL
    SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex 
    FROM sing_hobby sing
    RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
    WHERE sing.stu_num IS NULL
    
    -- 外连接
    SELECT
        sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex
    FROM
        sing_hobby sing
        FULL JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num

    5.LEFT JOIN EXCLUDING INNER JOIN(左连接-内连接)

    返回左表有,右表没有的关联数据记录集。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list> 
    FROM Table_A A
    LEFT JOIN Table_B B
    ON A.Key = B.Key
    WHERE B.Key IS NULL

    例子:

    -- 左内连接
    SELECT
        sing.`name` AS sing_name,
        sing.sex sing_sex,
        dancing.`name` dancing_name,
        dancing.sex dancing_sex 
    FROM
        sing_hobby sing
        LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num 
    WHERE
        dancing.stu_num IS NULL

    6.RIGHT JOIN EXCLUDING INNER JOIN(右连接-内连接)

    返回右表有,左表没有的关联数据记录集。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list>
    FROM Table_A A
    RIGHT JOIN Table_B B
    ON A.Key = B.Key
    WHERE A.Key IS NULL

    例子:

    -- 右内连接
    SELECT
        sing.`name` AS sing_name,
        sing.sex sing_sex,
        dancing.`name` dancing_name,
        dancing.sex dancing_sex 
    FROM
        sing_hobby sing
        RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num 
    WHERE
        sing.stu_num IS NULL

    7.OUTER JOIN EXCLUDING INNER JOIN(外连接-内连接)

    返回右表、左表没有的关联数据记录集。

    一张图看懂 SQL 的各种 join 用法

    SELECT <select_list>
    FROM Table_A A
    FULL OUTER JOIN Table_B B
    ON A.Key = B.Key
    WHERE A.Key IS NULL OR B.Key IS NULL

     例子:

    -- 排除内连接的外连接
    SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex 
    FROM sing_hobby sing
    LEFT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
    WHERE sing.stu_num IS NULL OR dancing.stu_num IS NULL
    UNION ALL
    SELECT sing.`name` as sing_name,sing.sex sing_sex,dancing.`name` dancing_name,dancing.sex dancing_sex 
    FROM sing_hobby sing
    RIGHT JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num
    WHERE sing.stu_num IS NULL OR dancing.stu_num IS NULL
    
    -- 排除内连接的外连接
    SELECT
        sing.`name` AS sing_name,
        sing.sex sing_sex,
        dancing.`name` dancing_name,
        dancing.sex dancing_sex 
    FROM
        sing_hobby sing
        FULL JOIN dancing_hobby dancing ON sing.stu_num = dancing.stu_num 
    WHERE
        sing.stu_num IS NULL OR dancing.stu_num IS NULL

  • 相关阅读:
    Vue数据双向绑定原理
    JS递归
    JS数据结构-链表
    JS数据结构-树
    React性能优化手段
    Django请求的生命周期
    Devops-git初识
    Django数据迁移的问题
    无监控,不运维!运维监控工具平台建设总结
    数据库-数据类型及主键外键
  • 原文地址:https://www.cnblogs.com/nananana/p/9354135.html
Copyright © 2011-2022 走看看