
inner join
启动mysql
启动 mysqldocker container start mysql1或者docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.27进入 mysqldocker exec -it mysql1 bashmysql -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 joinselect 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_ValueFROM Table_A AINNER JOIN TABLE_B BON A.PK = B.PK
