索引
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填充。
修改日期: