MYSQL- 使用SQL99 实现7种JOIN 操作
DESC employees ;
DESC departments;
## 中图 就是内连接 SELECT last_name,department_name FROM employees e JOIN departments d ON e.department_id=d.department_id ##sql 99 内连接 SELECT last_name,department_name,city FROM employees e INNER JOIN departments d ON e.department_id=d.department_id JOIN locations l on d.location_id=l.location_id ##sql 99 左上图左外连接 SELECT last_name,department_name FROM employees e left outer join departments d ON e.department_id=d.department_id; #右上图,右外连接 SELECT last_name,department_name FROM employees e right OUTER JOIN departments d ON e.department_id=d.department_id; #左中图 SELECT last_name,department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id=d.department_id WHERE d.department_id IS NULL ; #右中图 SELECT last_name,department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id=d.department_id WHERE e.department_id IS NULL ; #左下图,满外连接 # 方法一左上图+ 右中图 SELECT last_name,department_name FROM employees e left outer join departments d ON e.department_id=d.department_id UNION ALL SELECT last_name,department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id=d.department_id WHERE e.department_id IS NULL ; #左下图,满外连接 # 方法二右上图+ 左中图 SELECT last_name,department_name FROM employees e right OUTER JOIN departments d ON e.department_id=d.department_id union ALL SELECT last_name,department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id=d.department_id WHERE d.department_id IS NULL ; #右下图 左中加右中 SELECT last_name,department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id=d.department_id WHERE d.department_id IS NULL union all SELECT last_name,department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id=d.department_id WHERE e.department_id IS NULL ;
练习:
SELECT *
FROM t_dept;
SELECT *
FROM t_emp;
CREATE TABLE `t_dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE `t_emp` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) DEFAULT NULL, `age` INT(3) DEFAULT NULL, `deptId` INT(11) DEFAULT NULL, empno int not null, PRIMARY KEY (`id`), KEY `idx_dept_id` (`deptId`) #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 1. 所有有门派的人员信息 ( A、B两表共有) INSERT INTO t_dept(deptName,address) VALUES('华山','华山'); INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳'); INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山'); INSERT INTO t_dept(deptName,address) VALUES('武当','武当山'); INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶'); INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺'); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010); SELECT * FROM t_dept; SELECT * FROM t_emp; 【题目】 #1.所有有门派的人员信息 ( A、B两表共有) SELECT * FROM t_emp a JOIN t_dept b ON a.`deptId`=b.`id`; #2.列出所有用户,并显示其机构信息 (A的全集) SELECT a.name , b.deptName FROM t_emp a LEFT OUTER JOIN t_dept b ON a.`deptId`=b.`id`; #3.列出所有门派 (B的全集) SELECT b.deptName FROM t_emp a RIGHT OUTER JOIN t_dept b ON a.`deptId`=b.`id`; #4.所有不入门派的人员 (A的独有) SELECT a.name , b.deptName FROM t_emp a LEFT OUTER JOIN t_dept b ON a.`deptId`=b.`id` WHERE b.`id` IS NULL; #5.所有没人入的门派 (B的独有) SELECT a.name , b.deptName FROM t_emp a RIGHT OUTER JOIN t_dept b ON a.`deptId`=b.`id` WHERE a.`deptId` IS NULL; #6.列出所有人员和机构的对照关系 (AB全有) SELECT a.name , b.deptName FROM t_emp a LEFT OUTER JOIN t_dept b ON a.`deptId`=b.`id` UNION ALL SELECT a.name , b.deptName FROM t_emp a RIGHT OUTER JOIN t_dept b ON a.`deptId`=b.`id` WHERE a.`deptId` IS NULL; ## 方法2 SELECT a.name, b.deptName FROM t_emp a RIGHT OUTER JOIN t_dept b ON a.`deptId`=b.`id` UNION ALL SELECT a.name , b.deptName FROM t_emp a LEFT OUTER JOIN t_dept b ON a.`deptId`=b.`id` WHERE b.`id` IS NULL; #MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法 #left join + union(可去除重复数据)+ right join #7.列出所有没入派的人员和没人入的门派 (A的独有+B的独有) SELECT a.name , b.deptName FROM t_emp a LEFT OUTER JOIN t_dept b ON a.`deptId`=b.`id` WHERE b.`id` IS NULL UNION ALL SELECT a.name , b.deptName FROM t_emp a RIGHT OUTER JOIN t_dept b ON a.`deptId`=b.`id` WHERE a.`deptId` IS NULL;
每天进步一点点~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!