小伙伴蚂蚁金服二面遇到的三道题:
- SQL 查询语句:
SELECT * FROM A JOIN B ON A.id = B.id
,执行过程性能差,原因可能是什么? - 上述 SQL 语句的执行过程是什么?哪里需要建立索引?
- 在 A.id 还是 B.id 上建立索引呢?
可能你会一脸懵逼,But 实际上,其实考的就是 join
这个知识点,不难,看完这篇文章你就会啦~
老规矩,背诵版在文末。
join 基本语法
MySQL 中常见的有三种用法:
代码语言:javascript复制select * from table1 inner join table2 on condition
select * from table1 left join table2 on condition
select * from table1 right join table2 on condition
- inner join:内连接(等值连接)
- left join:左连接
- right join:右连接
下面用例子来解释这三种用法,假设有两张表,用户表 user 和部门表 depart:
inner join
代码语言:javascript复制select user.name, user.age, depart.department
from user inner join depart
on user.name = depart.name;
inner join 获取同时符合两张表的数据并组合起来。
在这个例子中,就是在 user 表和 depart 表中找到 name 相同的行记录,并组合起来
来看实际的执行结果:
需要注意的是,如果不指定 on 条件进行过滤的话,取得的结果就是两张表的笛卡尔积
代码语言:javascript复制什么是笛卡尔积 ? 举个例子,两个集合 A{1, 2, 3} 和 B{a, b, c},则两个集合的笛卡尔积为 {1a, 1b, 1c, 2a, 2b, 2c, 3a, 3b, 3c}
select user.name, user.age, depart.department
from user inner join depart;
光看这个例子大伙儿可能觉得笛卡尔积没啥用,其实还是很常见的,举个例子:如果 A 表示某学校学生的集合,B 表示该学校所有课程的集合,则 A 与 B 的笛卡尔积就表示这个学校所有可能的选课情况(梦回大一被数据库支配的恐惧