万万哇 发表于 2022-12-19 16:58:19

SQL 中各种连接 JOIN

https://cdn.nlark.com/yuque/0/2022/png/8364180/1671435411297-b982eab6-a293-4cdd-ad42-52b637f1b9e9.png#averageHue=%23cbccc8&clientId=u4388d076-c33e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=800&id=u2f92fb60&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1600&originWidth=2004&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1558432&status=done&style=none&taskId=u178aae94-c364-4e8b-b3eb-ba3d5261efd&title=&width=1002

[*]多表连接查询中的「多表」,可以是同一张表,自己和自己连接查询。相当于(可以理解为) A 表自己先复制自己后再和自己连接,如此称为「 自连接 」也可以在不同张表中连接查询,可分为「内连接」、「交叉连接」、「外连接」。
[*]内连接根据所使用的比较方式不同,又分为「等值连接」、「自然连接」和「不等连接」三种,连接的结果只列出这些表中与连接条件相匹配的数据行。
[*]与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。外连接分为「左外连接」或「左连接」( OUTER JOIN 或 LEFT JOIN)、「右外连接」或「右连接」(RIGHT OUTER JOIN 或 RIGHT JOIN)和「全外连接」或「全连接」(FULL OUTER JOIN 或 FULL JOIN)三种。
数据模拟

mysql版本

select version();https://cdn.nlark.com/yuque/0/2022/png/8364180/1671434184063-f0857326-a959-4b81-bd03-14a0bfd9bc0c.png#averageHue=%23f2f1ef&clientId=ud32e7ab4-3770-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=199&id=uf23d2cd5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=398&originWidth=774&originalType=binary&ratio=1&rotation=0&showTitle=false&size=124368&status=done&style=none&taskId=ube85096e-3b54-4e2d-a89c-c49e00e00d9&title=&width=387
sql语句

CREATE TABLE `bus_sche` (
`id` bigint NOT NULL AUTO_INCREMENT,
`lastStation` varchar(100) NOT NULL,
`nextStation` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


INSERT INTO test.bus_sche (lastStation,nextStation) VALUES
       ('武汉','南昌'),
       ('武汉','广西'),
       ('南昌','厦门'),
       ('广西','上海');

CREATE TABLE `Table_A` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO test.Table_A (name) VALUES
       ('A1'),
       ('A3'),
       ('A4'),
       ('A8');

CREATE TABLE `Table_B` (
`id` bigint NOT NULL AUTO_INCREMENT,
`names` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO test.Table_B (names) VALUES
       ('B1'),
       ('B2'),
       ('B3'),
       ('B5'),
       ('B6');自连接


[*]一张表中,假如有两个以上的字段,且这些字段有一定的关系,我们又刚好想摸清这些关系字段的数据,就可以在这上面做文章,俗称「自连接」。
[*]一张表 bus_sche,为了简单,表中只有上一站地点和下一站地点及唯一标识
SELECT b.lastStation,b.nextStation,a.lastStation,a.nextStation
FROM bus_sche a, bus_sche b
WHERE b.nextStation = a.lastStation;

[*]只在一张表中查询,表 bus_sche 使用了两个别名 bus_sche a, bus_sche b,因此相当于有两张表,用 WHERE条件连接查询,「 实际只有一张表在自我连接查询」。
[*]结果
https://cdn.nlark.com/yuque/0/2022/png/8364180/1671431658198-21b3b3e5-d888-4c65-9d78-a205a77d072a.png#averageHue=%23f4f4f3&clientId=u4b4a7572-f982-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=234&id=ubfa372d5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=468&originWidth=1320&originalType=binary&ratio=1&rotation=0&showTitle=false&size=220420&status=done&style=none&taskId=u2ff27658-5564-4d06-8ef5-e10e9bcb0b3&title=&width=660
内连接


[*]在表中存在至少一个匹配时,INNER JOIN 关键字返回行。(内连接查询操作只列出与连接条件匹配的数据行,使用 INNER JOIN 或者直接使用 **JOIN **进行连接)。
[*]两张表的 id ,A中有1、3、4、8,B中有1、2、3、5、6,还有一个字段分别是 name 和names,该字段数据都是按顺序的小写字母,前面再加个 A 或 B 为了方便区分属于哪个表。
https://cdn.nlark.com/yuque/0/2022/png/8364180/1671432057087-e254f7f4-d684-4cdb-9ab9-204768175472.png#averageHue=%23f2f2f1&clientId=u4b4a7572-f982-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=257&id=u77a70e46&margin=%5Bobject%20Object%5D&name=image.png&originHeight=514&originWidth=648&originalType=binary&ratio=1&rotation=0&showTitle=false&size=154097&status=done&style=none&taskId=u6e522d92-8269-4f4f-a768-ecd4f40c329&title=&width=324https://cdn.nlark.com/yuque/0/2022/png/8364180/1671432067049-7ebe6105-075d-46ce-8b25-a3c0595da87a.png#averageHue=%23f0f0ef&clientId=u4b4a7572-f982-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=255&id=u5f4bfada&margin=%5Bobject%20Object%5D&name=image.png&originHeight=510&originWidth=726&originalType=binary&ratio=1&rotation=0&showTitle=false&size=162552&status=done&style=none&taskId=u1216dafe-5473-44fd-a14d-c8d75ceb330&title=&width=363
SELECT * from Table_A JOIN Table_B;
SELECT * from Table_A INNER JOIN Table_B;

[*]内连接可以没有连接条件,没有条件之后的查询结果,会保留所有结果(笛卡尔集),与交叉连接差不多。
https://cdn.nlark.com/yuque/0/2022/png/8364180/1671432134433-83f5e7fa-7293-4a7a-8cb0-62351837b797.png#averageHue=%23f1f4f0&clientId=u4b4a7572-f982-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=532&id=ua4abb03d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1064&originWidth=1508&originalType=binary&ratio=1&rotation=0&showTitle=false&size=491897&status=done&style=none&taskId=u1732396b-8899-4538-8495-5c14b078d2b&title=&width=754
等值连接


[*]在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列
SELECT * from Table_A A JOIN Table_B B ON A.id = B.id;

[*]查询结果,列数是 4 列,两张表的字段直接拼接在一起,重复的字段在后面添加数字序列以做区分
https://cdn.nlark.com/yuque/0/2022/png/8364180/1671432174460-32bd1cbc-c22b-456e-87ef-d8333ede1ce1.png#averageHue=%23f3f3f2&clientId=u4b4a7572-f982-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=207&id=ubac84209&margin=%5Bobject%20Object%5D&name=image.png&originHeight=414&originWidth=1068&originalType=binary&ratio=1&rotation=0&showTitle=false&size=159416&status=done&style=none&taskId=u379b474a-d51c-42f7-9d15-fefa6271450&title=&width=534

[*]通俗讲就是根据条件,找到表 A 和 表 B 的数据的交集(包含重复列)
https://cdn.nlark.com/yuque/0/2022/png/8364180/1671432290628-44f719e3-14cb-4b68-ac23-89f47a604235.png#averageHue=%23929292&clientId=u4b4a7572-f982-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=179&id=ua0c988f8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=358&originWidth=412&originalType=binary&ratio=1&rotation=0&showTitle=false&size=48201&status=done&style=none&taskId=uf8b75d4c-b175-41c9-afce-5344a3dc406&title=&width=206
不等连接

<ul>不等连接跟等值连接仅仅是连接条件中使用的运算符不一样,其余一致。不等连接使用的是除等于号运算符以外的其它比较运算符,如>、>=、
页: [1]
查看完整版本: SQL 中各种连接 JOIN