image.png

inner join

例子:

启动mysql

  1. 启动 mysql
  2. docker container start mysql1
  3. 或者
  4. docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.27
  5. 进入 mysql
  6. docker exec -it mysql1 bash
  7. mysql -u root -p
  8. 输入密码 123456

创建数据库&表

  1. 创建数据库
  2. CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  3. show databases;
  4. use db1;
  5. 创建表
  6. create table users(id serial, name text);
  7. create table staffs(id serial, name text);
  8. create table orders(id serial, user_id bigint unsigned, staff_id bigint unsigned, amount int unsigned);

创建三个表
用户表、员工表、订单表

创建记录

  1. 创建记录
  2. insert into users (name) values ('XiaoMing');
  3. insert into staffs (name) values ('XiaoHong');
  4. insert into orders(user_id,staff_id, amount) values (1,1, 100);
  5. 使用 inner join
  6. select users.name as uname, orders.amount as amount from users inner join orders on users.id =orders.user_id;
  7. 得到 XiaoMing 100

用户表记录一个用户小明
员工表记录一个员工小红
在订单表里面记录:小明 向小红 购买了100块钱东西

问题:到底是哪个人的名字 购买了多少块钱的东西(因为在order表里,我们是看不见名字的)
方法:使用inner join

  1. select users.name, orders.amount from users inner join orders on users.id = orders.user_id;

意思是:在users表跟orders的交集(组合成一个表)里,选择符合users.id = orders.user_id条件的users.name和orders.amount。
image.png

小结

根据上面的例子 应该能出来几个join 的区别了
如果两个表合起来的时候,会出现有多余的数据(白色部分)
image.png

  • inner join :两个表之间的交集 (多余的数据都不要)

  • left join: 交集 + 左边的表的所有内容 (左边多得数据留下)

会保留右边的null,以保证左边都显示

  • right join :交集 + 右边的表的所有内容 (右边多的数据留下)

会保留左边的null,以保证右边都显示

  • full outer join: 如果两边都有多的数据,都留着(多对多才会出现)

会保留两边的null,以保证两边都显示

一般使用前面两种:inner join和left join

语法

把表名改为

  1. T1 {[INNER] | {LEFT | RIGHT | FULL} [OUTER]} JOIN T2 ON boolean_expression

例如:
PK 主键
AS 别名

  1. SELECT A.PK AS A_PK, B.PK AS B_PK,
  2. A.Value AS A_Value, B_Value AS B_Value
  3. FROM Table_A A
  4. INNER JOIN TABLE_B B
  5. ON A.PK = B.PK