Skip to content
Menu
万别客的百宝袋
  • 首页
  • Linux命令|知识
  • 编程语言知识
    • Java
    • Mysql
万别客的百宝袋

Mysql中的 索引、主键、 INNRE JOIN、LEFT JOIN、RIGHT JOIN 知识

Posted on 2024年 9月 4日2024年 9月 4日
2024年 9月 4日

索引

KEY 'idx_id_name' (id, name),表示这是一个复合索引,它包含多个列。这个索引将按照id和name列的顺序对数据进行索引。其中 idx是索引的名称,是自定义的。

示例:

CREATE TABLE my_table (
id INT,
name VARCHAR(100),
KEY `idx_id_name` (`id`, `name`)
);

主键

PRIMARY KEY (user_id) USING BTREE :用于定义表中主键的语句并且指定使用B-tree索引类型。

  1. PRIMARY KEY:这是一个特殊的索引,用于唯一标识表中的每一行数据。一个表只能有一个主键,它必须包含唯一的值,并且不能包含NULL值。
  2. (user_id):这表示主键是由user_id这一列构成的。如果主键由多个列组成,可以列出多个列名,用逗号分隔,例如(column1, column2)。
  3. USING BTREE:这是指定索引的存储引擎类型。在MySQL中,B-tree(平衡树)索引是最常用的索引类型,适用于全值匹配、范围查询、前缀匹配等场景。USING BTREE是可选的,因为InnoDB和MyISAM存储引擎默认使用B-tree索引,所以即使不显式指定,也会使用B-tree索引。

示例:假设你正在创建一个新表,并且想要指定一个主键,你可以这样写:

CREATE TABLE users (
    user_id INT NOT NULL,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    PRIMARY KEY (user_id) USING BTREE
);

INNRE JOIN、LEFT JOIN、RIGHT JOIN相关知识

举例理解:

  • INNER JOIN(内连接):这就像是你只对那些在两个书架上都有的书感兴趣。你只会把那些在书架A和书架B上都有的书拿出来。如果一本书只在一个书架上,那么它就不会被选中。
  • LEFT JOIN(左连接):这就像是你把书架A上所有的书都拿出来,然后去书架B上找有没有编号相同的书。如果找到了,就把它们放在一起;如果没有找到,书架A上的书仍然会被拿出来,只是旁边没有书架B上的书与之配对。
  • RIGHT JOIN(右连接):这与LEFT JOIN相反。你首先把书架B上所有的书都拿出来,然后去书架A上找有没有编号相同的书。如果找到了,就把它们放在一起;如果没有找到,书架B上的书仍然会被拿出来,只是旁边没有书架A上的书与之配对。
  • FULL OUTER JOIN(全外连接):这就像是你把两个书架上所有的书都拿出来,然后找出所有配对的书放在一起,同时也会包括那些只在一个书架上的书。这种连接会显示两个书架上所有的书,无论它们是否配对。

在MySQL中,INNER JOIN、LEFT JOIN和RIGHT JOIN是最常用的,而FULL OUTER JOIN不是MySQL直接支持的,但你可以通过结合LEFT JOIN和RIGHT JOIN以及UNION来模拟它。

模拟操作:假设我们有两个表:books_a 和 books_b,并且每个表中都有一个名为book_id的列。

books_a
+---------+
| book_id |
+---------+
| A1      |
| A2      |
| A3      |
+---------+
books_b

+---------+
| book_id |
+---------+
| B1      |
| A2      |
| B3      |
+---------+

INNER JOIN:找出两个表中book_id相同的记录。

SELECT a.book_id, b.book_id
FROM books_a a
INNER JOIN books_b b ON a.book_id = b.book_id;

结果:
+———+———+
| book_id | book_id |
+———+———+
| A2 | A2 |
+———+———+

LEFT JOIN:返回books_a中的所有记录,以及在books_b中找到的匹配记录。如果books_b中没有匹配的记录,对应的列将显示为NULL。

SELECT a.book_id, b.book_id
FROM books_a a
LEFT JOIN books_b b ON a.book_id = b.book_id;

结果:

+———+———+
| book_id | book_id |
+———+———+
| A1 | NULL |
| A2 | A2 |
| A3 | NULL |
+———+———+

RIGHT JOIN:返回books_b中的所有记录,以及在books_a中找到的匹配记录。如果books_a中没有匹配的记录,对应的列将显示为NULL。

SELECT a.book_id, b.book_id
FROM books_a a
RIGHT JOIN books_b b ON a.book_id = b.book_id;

结果:

+———+———+
| book_id | book_id |
+———+———+
| NULL | B1 |
| A2 | A2 |
| NULL | B3 |
+———+———+

FULL OUTER JOIN(模拟):

SELECT a.book_id, b.book_id
FROM books_a a
LEFT JOIN books_b b ON a.book_id = b.book_id

UNION

SELECT a.book_id, b.book_id
FROM books_a a
RIGHT JOIN books_b b ON a.book_id = b.book_id
WHERE a.book_id IS NULL;

这里只解释一下 UNION 关键字 : UNION是一个用来合并两个或多个SELECT语句的结果集的操作符。使用UNION时,它会移除结果集中的重复行,只保留唯一的记录。如果你想保留所有行,包括重复的行,可以使用UNION ALL。

注意点:

在多表查询中使用多个LEFT JOIN(左连接)来连接多个表,”左表” 的概念是基于最近的 JOIN 操作

示例:

SELECT
    *
FROM
    orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
LEFT JOIN products p ON o.product_id = p.product_id;
  1. 第一个 LEFT JOIN 是在 orders 表(别名 o)和 customers 表(别名 c)之间进行的。在这里,orders 表是 “左表”,customers 表是 “右表”。
  2. 第二个 LEFT JOIN 是在结果集的基础上,再与 products 表(别名 p)进行连接。这里的 “左表” 是第一个 LEFT JOIN 的结果集,而不是单独指 orders 或 customers 表。”右表” 是 products 表。

所以,对于第二个 LEFT JOIN 来说:

  • 左表:是第一个 LEFT JOIN 的结果集,即包括 orders 和 customers 的联合结果。
  • 右表:是 products 表。

这个 “左表” 实际上是一个中间结果集,它包含了 orders 表和 customers 表的联合数据,然后这个中间结果集再与 products 表进行 LEFT JOIN。

结果集中会包含以下几部分:

  • orders 表的所有列。
  • customers 表的所有列,但只有当 orders 表中的 customer_id 与 customers 表中的 customer_id 匹配时,才会显示 customers 表的数据,否则对应的列会用 NULL 填充。
  • products 表的所有列,但只有当 orders 表中的 product_id 与 products 表中的 product_id 匹配时,才会显示 products 表的数据,否则对应的列会用 NULL 填充。

修改日期:

2024年 9月 4日

万别客

Brother_Wan

©2026 万别客的百宝袋