inner join
启动mysql
启动 mysql
docker container start mysql1
或者
docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.27
进入 mysql
docker exec -it mysql1 bash
mysql -u root -p
输入密码 123456
创建数据库&表
创建数据库
CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
show databases;
use db1;
创建表
create table users(id serial, name text);
create table staffs(id serial, name text);
create table orders(id serial, user_id bigint unsigned, staff_id bigint unsigned, amount int unsigned);
创建三个表
用户表、员工表、订单表
创建记录
创建记录
insert into users (name) values ('XiaoMing');
insert into staffs (name) values ('XiaoHong');
insert into orders(user_id,staff_id, amount) values (1,1, 100);
使用 inner join
select users.name as uname, orders.amount as amount from users inner join orders on users.id =orders.user_id;
得到 XiaoMing 100
用户表记录一个用户小明
员工表记录一个员工小红
在订单表里面记录:小明 向小红 购买了100块钱东西
问题:到底是哪个人的名字 购买了多少块钱的东西(因为在order表里,我们是看不见名字的)
方法:使用inner join
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。
小结
根据上面的例子 应该能出来几个join 的区别了
如果两个表合起来的时候,会出现有多余的数据(白色部分)
inner join :两个表之间的交集 (多余的数据都不要)
left join: 交集 + 左边的表的所有内容 (左边多得数据留下)
会保留右边的null,以保证左边都显示
- right join :交集 + 右边的表的所有内容 (右边多的数据留下)
会保留左边的null,以保证右边都显示
- full outer join: 如果两边都有多的数据,都留着(多对多才会出现)
会保留两边的null,以保证两边都显示
一般使用前面两种:inner join和left join
语法
把表名改为
T1 {[INNER] | {LEFT | RIGHT | FULL} [OUTER]} JOIN T2 ON boolean_expression
例如:
PK 主键
AS 别名
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B_Value AS B_Value
FROM Table_A A
INNER JOIN TABLE_B B
ON A.PK = B.PK