SQL 中各种连接 JOIN

打印 上一主题 下一主题

主题 506|帖子 506|积分 1518



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

mysql版本
  1. select version();
复制代码

sql语句
  1. CREATE TABLE `bus_sche` (
  2.   `id` bigint NOT NULL AUTO_INCREMENT,
  3.   `lastStation` varchar(100) NOT NULL,
  4.   `nextStation` varchar(100) NOT NULL,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  7. INSERT INTO test.bus_sche (lastStation,nextStation) VALUES
  8.          ('武汉','南昌'),
  9.          ('武汉','广西'),
  10.          ('南昌','厦门'),
  11.          ('广西','上海');
  12. CREATE TABLE `Table_A` (
  13.   `id` bigint NOT NULL AUTO_INCREMENT,
  14.   `name` varchar(100) NOT NULL,
  15.   PRIMARY KEY (`id`)
  16. ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  17. INSERT INTO test.Table_A (name) VALUES
  18.          ('A1'),
  19.          ('A3'),
  20.          ('A4'),
  21.          ('A8');
  22. CREATE TABLE `Table_B` (
  23.   `id` bigint NOT NULL AUTO_INCREMENT,
  24.   `names` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  25.   PRIMARY KEY (`id`)
  26. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  27. INSERT INTO test.Table_B (names) VALUES
  28.          ('B1'),
  29.          ('B2'),
  30.          ('B3'),
  31.          ('B5'),
  32.          ('B6');
复制代码
自连接


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

  • 只在一张表中查询,表 bus_sche 使用了两个别名 bus_sche a, bus_sche b,因此相当于有两张表,用 WHERE条件连接查询,「 实际只有一张表在自我连接查询」。
  • 结果

内连接


  • 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。(内连接查询操作只列出与连接条件匹配的数据行,使用 INNER JOIN 或者直接使用 **JOIN **进行连接)。
  • 两张表的 id ,A中有1、3、4、8,B中有1、2、3、5、6,还有一个字段分别是 name 和names,该字段数据都是按顺序的小写字母,前面再加个 A 或 B 为了方便区分属于哪个表。
  1. SELECT * from Table_A JOIN Table_B;
  2. SELECT * from Table_A INNER JOIN Table_B;
复制代码

  • 内连接可以没有连接条件,没有条件之后的查询结果,会保留所有结果(笛卡尔集),与交叉连接差不多。

等值连接


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

  • 查询结果,列数是 4 列,两张表的字段直接拼接在一起,重复的字段在后面添加数字序列以做区分


  • 通俗讲就是根据条件,找到表 A 和 表 B 的数据的交集(包含重复列)

不等连接

<ul>不等连接跟等值连接仅仅是连接条件中使用的运算符不一样,其余一致。不等连接使用的是除等于号运算符以外的其它比较运算符,如>、>=、

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表