索引
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索引类型。
PRIMARY KEY
:这是一个特殊的索引,用于唯一标识表中的每一行数据。一个表只能有一个主键,它必须包含唯一的值,并且不能包含NULL值。(user_id)
:这表示主键是由user_id
这一列构成的。如果主键由多个列组成,可以列出多个列名,用逗号分隔,例如(column1, column2)
。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;
- 第一个
LEFT JOIN
是在orders
表(别名o
)和customers
表(别名c
)之间进行的。在这里,orders
表是 “左表”,customers
表是 “右表”。 - 第二个
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
填充。
修改日期: