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值填充,如结果集中最后两条记录

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

原文地址:https://www.cnblogs.com/wulisz/p/9668908.html

时间: 2024-11-09 03:37:20

MySQL 表连接的相关文章

MySQL Study之--MySQL 表连接

MySQL Study之--MySQL 表连接 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON condition table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录

Mysql 表连接查询

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

Mysql表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能. 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录.我们最常用的是内连接. 例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp 和dept 中,因此,需要使用表连接来进行查询: select ename,deptname from emp,dept where emp.deptno=dept.deptno; ename是表emp

Mysql表连接查询

原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行. 2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接. 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或L

mysql表连接,子查询以及if判断

创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2) DEFAULT NULL, deptno int(2) DEFAULT NULL, age int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE dept ( deptno int(2) DEFAULT NUL

实操-mysql表连接笛卡尔积(join、left join)

1.为什么两张表连接会出现重复数据 2.表的连接过程是怎样的? 举例: 表A: 1 0 表B: 1 0 0 2 执行语句:select * from A join B on A.id = B.id; 顺序如下: join形成的表: 1 1 1 0 1 0 1 2 0 1 0 0 0 0 0 2 on之后: 1 1 0 0 0 0 所以表连接后出现了重复数据 两张表的关系存在一对多的关系,所以就会出现重复情况 什么是笛卡尔积呢? 就是两张表连接的时候,是通过笛卡尔积的方式连接. 笛卡尔(Desca

mysql表连接的时候注意事项

1. null值与null值是不可以连接的 2. 如果希望像null与null进行连接可以有如下方式 select * from ceview LEFT JOIN caview on IFNULL(ceview.ce, -1) = IFNULL(caview.ce,-1) and ceview.ca = caview.ca 3. 在postgresql中使用 select * from ceview LEFT JOIN caview on coalesce(ceview.ce, -1) = co

EF连接Mysql 表&#39;TableDetails&#39;中的列&#39;IsPrimaryKey&#39;的值为DBNull

无法生成模型,因为存在以下异常:'System.Data.StrongTypingException:表'TableDetails'中的列'IsPrimaryKey'的值为DBNull.---> System.InvalidCastException:指定的转换无效. 原文链接http://stackoverflow.com/questions/33575109/mysql-entity-the-value-for-column-isprimarykey-in-table-tabledetail

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep