INNER JOIN,LEFT JOIN ,RIGHT JOIN 中一对多,多对一,多对多的情况

INNER JOIN,LEFT JOIN ,RIGHT JOIN 中一对多,多对一,多对多的情况


#建表

CREATE DATABASE test;
use test;
CREATE TABLE student (
	id int,
	name varchar(255),
	address varchar(255),
	city varchar(255),
    uid varchar(255)
);


CREATE TABLE teacher (
	id int,
	name varchar(255),
	address varchar(255),
    uid varchar(255)
);

一对多

INSERT INTO student VALUES (9, '吴九',  '孙七家隔壁', '杭州','12345');
INSERT INTO student VALUES (10, '郑十',  '周八家隔壁', '杭州','45678');
INSERT INTO student VALUES (8, '周八',  '雷峰塔附近', '杭州','56789');

INSERT INTO teacher VALUES (1, '李老师', '杭州','12345');
INSERT INTO teacher VALUES (2, '吴老师', '杭州','12345');
INSERT INTO teacher VALUES (1, '张老师', '杭州','45678');
INSERT INTO teacher VALUES (1, '王老师', '杭州','78910');
SELECT A.name,A.address,A.uid,B.name FROM student A INNER JOIN (SELECT * FROM teacher) B on A.uid=B.uid;

SELECT A.name,A.address,A.uid,B.name FROM student A LEFT JOIN (SELECT * FROM teacher) B on A.uid=B.uid;

SELECT A.name,A.address,A.uid,B.name FROM student A RIGHT JOIN (SELECT * FROM teacher) B on A.uid=B.uid;
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
郑十	周八家隔壁	45678	张老师
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
郑十	周八家隔壁	45678	张老师
周八	雷峰塔附近	56789	NULL
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
郑十	周八家隔壁	45678	张老师
NULL	NULL	NULL	王老师

多对一

INSERT INTO student VALUES (9, '吴九',  '孙七家隔壁', '杭州','12345');
INSERT INTO student VALUES (10, '郑十',  '周八家隔壁', '杭州','45678');
INSERT INTO student VALUES (8, '周八',  '雷峰塔附近', '杭州','56789');
INSERT INTO student VALUES (11, '吴九',  '孙七家隔壁', '杭州','12345');
 

INSERT INTO teacher VALUES (1, '李老师', '杭州','12345');
INSERT INTO teacher VALUES (1, '张老师', '杭州','45678');
INSERT INTO teacher VALUES (1, '王老师', '杭州','78910');
SELECT A.name,A.address,A.uid,B.name FROM student A INNER JOIN (SELECT * FROM teacher) B on A.uid=B.uid;

SELECT A.name,A.address,A.uid,B.name FROM student A LEFT JOIN (SELECT * FROM teacher) B on A.uid=B.uid;

SELECT A.name,A.address,A.uid,B.name FROM student A RIGHT JOIN (SELECT * FROM teacher) B on A.uid=B.uid;
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
郑十	周八家隔壁	45678	张老师
吴九	孙七家隔壁	12345	李老师
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	李老师
郑十	周八家隔壁	45678	张老师
周八	雷峰塔附近	56789	NULL
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
郑十	周八家隔壁	45678	张老师
吴九	孙七家隔壁	12345	李老师
NULL	NULL	NULL	王老师

多对多

INSERT INTO student VALUES (9, '吴九',  '孙七家隔壁', '杭州','12345');
INSERT INTO student VALUES (10, '郑十',  '周八家隔壁', '杭州','45678');
INSERT INTO student VALUES (8, '周八',  '雷峰塔附近', '杭州','56789');
INSERT INTO student VALUES (11, '吴九',  '孙七家隔壁', '杭州','12345');
 

INSERT INTO teacher VALUES (1, '李老师', '杭州','12345');
INSERT INTO teacher VALUES (2, '吴老师', '杭州','12345');
INSERT INTO teacher VALUES (1, '张老师', '杭州','45678');
INSERT INTO teacher VALUES (1, '王老师', '杭州','78910');
SELECT A.name,A.address,A.uid,B.name FROM student A INNER JOIN (SELECT * FROM teacher) B on A.uid=B.uid;

SELECT A.name,A.address,A.uid,B.name FROM student A LEFT JOIN (SELECT * FROM teacher) B on A.uid=B.uid;

SELECT A.name,A.address,A.uid,B.name FROM student A RIGHT JOIN (SELECT * FROM teacher) B on A.uid=B.uid;
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
吴九	孙七家隔壁	12345	吴老师
郑十	周八家隔壁	45678	张老师
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
吴九	孙七家隔壁	12345	吴老师
郑十	周八家隔壁	45678	张老师
周八	雷峰塔附近	56789	NULL
name	address	uid	name
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
郑十	周八家隔壁	45678	张老师
吴九	孙七家隔壁	12345	李老师
吴九	孙七家隔壁	12345	吴老师
NULL	NULL	NULL	王老师

一对多的情况,INNER JOIN 可能会出现结果数量比左表大的情况,LEFT JOIN 一定会出现结果数量比左表大,RIGHT JOIN 结果的数量和右表相同

多对一的情况,INNER JOIN 结果数量小于等于左表,LEFT JOIN 结果与左表一致,RIGHT JOIN 结果一定会比右表数量大。

多对多情况,INNER JOIN,LEFT JOIN,RIGHT JOIN 结果数量不可控

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值