• MySQL 表连接


    MySQL数据库表有4种连接方式:

    左连接(左外连接

    右连接(右外连接

    等值连接(内连接

    全连接(全外连接)

    以下,小编将依次简要介绍,希望能对初学的小伙伴们有所裨益。

    首先先介绍下将要使用的两张数据库表

                表a

          表b

    表b中的uid字段,与表a中id字段相对应。

    表a中id为6的记录,在表b中没有体现,表b中id为9,uid为7的记录在表a中没有体现。

    建表语句如下:

     1 SET NAMES utf8mb4;
     2 SET FOREIGN_KEY_CHECKS = 0;
     3 
     4 -- ----------------------------
     5 -- Table structure for a
     6 -- ----------------------------
     7 DROP TABLE IF EXISTS `a`;
     8 CREATE TABLE `a`  (
     9   `id` int(11) NOT NULL AUTO_INCREMENT,
    10   `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    11   `age` int(11) NOT NULL,
    12   `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    13   `psw` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    14   PRIMARY KEY (`id`) USING BTREE
    15 ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    16 
    17 -- ----------------------------
    18 -- Records of a
    19 -- ----------------------------
    20 INSERT INTO `a` VALUES (1, 'zhangsan', 30, 'f', '123456');
    21 INSERT INTO `a` VALUES (2, 'lisi', 31, 'f', '123456');
    22 INSERT INTO `a` VALUES (3, 'wangwu', 32, 'm', '123456');
    23 INSERT INTO `a` VALUES (4, 'zhaoliu', 33, 'm', '123456');
    24 INSERT INTO `a` VALUES (5, 'baiqi', 34, 'm', '123456');
    25 INSERT INTO `a` VALUES (6, 'hongba', 35, 'f', '123456');
    26 
    27 SET FOREIGN_KEY_CHECKS = 1;
    a.sql
     1 SET NAMES utf8mb4;
     2 SET FOREIGN_KEY_CHECKS = 0;
     3 
     4 -- ----------------------------
     5 -- Table structure for b
     6 -- ----------------------------
     7 DROP TABLE IF EXISTS `b`;
     8 CREATE TABLE `b`  (
     9   `id` int(11) NOT NULL AUTO_INCREMENT,
    10   `uid` int(11) NOT NULL,
    11   `pet` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    12   PRIMARY KEY (`id`) USING BTREE
    13 ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    14 
    15 -- ----------------------------
    16 -- Records of b
    17 -- ----------------------------
    18 INSERT INTO `b` VALUES (1, 1, 'cat');
    19 INSERT INTO `b` VALUES (2, 2, 'dog');
    20 INSERT INTO `b` VALUES (3, 1, 'sheep');
    21 INSERT INTO `b` VALUES (4, 3, 'goat');
    22 INSERT INTO `b` VALUES (5, 4, 'dog');
    23 INSERT INTO `b` VALUES (6, 5, 'duck');
    24 INSERT INTO `b` VALUES (7, 5, 'cat');
    25 INSERT INTO `b` VALUES (8, 5, 'rabbit');
    26 INSERT INTO `b` VALUES (9, 7, 'shark');
    27 
    28 SET FOREIGN_KEY_CHECKS = 1;
    b.sql

    一、左连接

    返回左表中的所有记录 + 右表中与左表连接字段相等的记录

    例如:

    SELECT * FROM `a` left join `b` on a.id = b.uid

    其查询结果为:

    由记录可以发现,

    1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示

    2.表a中所有数据均出现,当表b中出现无法与表a按照既定方式匹配的数据时,表b的字段显示为null。例如,表a中id为6的记录,在表b中不存在uid为6的记录,因此表b的相应字段显示为null。

    3.表b中的数据不是全部出现,若b中的uid无法与a中匹配是,该条数据不显示。例如,表b中id为9,uid为7的记录,因为表a中不存在id为7的记录,因此在查询结果中不显示该条记录。

    4.第2、3条中可以发现,所有的null值只能出现在后表(表b)的字段中。

    二、右连接

    返回右表中的所有记录 + 左表中与左表连接字段相等的记录

    例如:

    SELECT * FROM `a` right join `b` on a.id = b.uid

    查询结果如下:

    由记录可以发现,

    1.返回的结果集的顺序是按照被JOIN的表(表b)的顺序显示

    2.表b中所有数据均出现,当表a中出现无法与表b按照既定方式匹配的数据时,表a的字段显示为null,例如表b中id为9,uid为7的记录。

    3.表a中的数据不是全部出现,若b中的uid无法与a中匹配是,该条数据不显示。例如表a中id为6的记录,在表b中并没有uid为6的记录,因此不显示。

    4.第2、3条中可以发现,所有的null值只能出现在前表的字段中

    三、等值连接

    返回两个表中,连接字段相等的值。

    例如:

    SELECT * FROM `a` inner join b on a.id = b.uid

    查询结果为:

    由记录可以发现,

    1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示

    2.表a、表b均不是出现所有记录,而是仅返回满足a.id=b.uid的记录。a表中id为6的记录未显示,b表中id为9,uid为7的记录未显示

    3.返回的结果集中不存在null值

    四、全连接

    mysql中不支持全连接,因此需采用union来连接左连接和右连接的结果集

    SELECT * FROM `a` left join b on a.id = b.uid
    UNION
    SELECT * FROM `a` right join b on a.id = b.uid

    查询结果如下:

    1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示

    2.表a、表b均出现所有记录,无法按a.id=b.uid匹配的记录,本表正常显示,连接表用null值填充,如结果集中最后两条记录

    具体项目中使用哪种连接,还需要小伙伴们根据需求自己选择了。

  • 相关阅读:
    mvc EF SQL语句
    Android自适应屏幕大小和布局
    6263=1 这个等式是错的,只移动一个数字(不能动符号)变成正确的等式
    public static const int A=1;这段代码有错误么?错了.常量不能标记为static
    jquery的ajax全局事件和AJAX 请求正在进行时显示“正在加载”
    visual studio中javascript脚本智能感应
    使用Windows API获取和改变当前显示设置
    IP Helper API 使用方法
    Rundll32.exe使用方法大全
    WIN32 API编程枚举系统显示器
  • 原文地址:https://www.cnblogs.com/wulisz/p/9668908.html
Copyright © 2020-2023  润新知