MySQL知识点总结(二)DQL续篇

一: 多表操作—多表联合查询


-- 内连接查询(查询多张表的交集)
-- 格式
-- 隐式内连接 select * from A,B where 条件;
-- 显示内连接 select * from A inner join B on 条件;(inner可以省略)

-- 外连接查询
-- 左外连接 (left outer join) select * from A left outer join B on 条件;
SELECT * FROM dept3 a LEFT OUTER JOIN emp3 b ON a.deptno = b.dept_id;
-- 右外连接 (right outer join)select * from A right outer join B on 条件;
SELECT * FROM dept3 a RIGHT OUTER JOIN emp3 b ON a.deptno = b.dept_id;
-- 满外连接(union)
-- union是将两个查询结果上下拼接,并去重
SELECT * FROM dept3 a LEFT OUTER JOIN emp3 b ON a.deptno = b.dept_id
UNION
SELECT * FROM dept3 a RIGHT OUTER JOIN emp3 b ON a.deptno = b.dept_id
-- union all是将两个查询结果上下拼接,不去重
SELECT * FROM dept3 a LEFT OUTER JOIN emp3 b ON a.deptno = b.dept_id
UNION ALL
SELECT * FROM dept3 a RIGHT OUTER JOIN emp3 b ON a.deptno = b.dept_id


二:子查询(子查询就是指在一个完整的查询语句中,嵌套若干个不同功能的小查询)


-- 查询年龄最大的员工信息,显示信息包含员工号、员工名字、员工年龄
-- 1:查询最大年龄
SELECT MAX(age) FROM emp3;
-- 2:让每一个员工的年龄和最大年龄比较,相等则满足条件
SELECT * FROM emp3 WHERE age = (SELECT MAX(age) FROM emp3); -- 单行单列,可以作为一个值来用

-- 查询研发部和销售部的员工信息,包含员工号、员工名字
-- 方式一:关联查询
SELECT * FROM dept3 a JOIN emp3 b ON a.deptno =  b.dept_id AND (NAME = '研发部'OR NAME ='销售部');
-- 方式二:子查询
-- 1:先查研发部和销售部的部门号(1001,1002)
SELECT deptno FROM dept3 WHERE NAME ='研发部' OR NAME ='销售部';
-- 2:查询哪个员工的部门号是1001,1002
SELECT * FROM emp3 WHERE dept_id IN (SELECT deptno FROM dept3 WHERE NAME ='研发部' OR NAME ='销售部');-- 多行单列,多个值

-- 查询研发部20岁以下的员工信息,包括员工号,员工名字,部门名字
-- 方式一:关联查询
SELECT * FROM dept3 a JOIN emp3 ON a.deptno = b.dept_id AND (NAME = '研发部'AND age < 20);
-- 方式二:子查询
-- 1:在部门表中查询研发部信息
SELECT * FROM dept3 WHERE NAME = '研发部';-- 一行多列
-- 2:在员工表中查询年龄小于30岁的员工信息
SELECT * FROM emp3 WHERE age < 30;
-- 3:将以上两个查询的结果进行关联查询
SELECT * FROM (SELECT * FROM dept3 WHERE NAME = '研发部')t1 JOIN (SELECT * FROM emp3 WHERE age < 30)t2 ON t1.deptno = t2.dept_id;-- 多行多列


三: 子查询-关键字


-- 关键字(all)格式:select ... from ... where c > all(查询语句)
-- 1:查询年龄大于'1003'部门所有年龄的员工信息
SELECT * FROM emp3 WHERE age > ALL(SELECT age FROM emp3 WHERE dept_id ='1003');
-- 2:查询不属于任何一个部门
SELECT * FROM emp3 WHERE dept_id != ALL(SELECT deptno FROM dept3);

-- 关键字(any和some)格式:select ... from where c > any(查询语句)
-- 查询年龄大于'1003'部门任意一个员工年龄的员工信息
SELECT * FROM emp3 WHERE age > ANY (SELECT age FROM emp3 WHERE dept_id = '1003')AND dept_id !='1003';

-- 关键字(in)格式:select ... from ... where c in(查询语句)
-- 查询研发部和销售部的员工信息,包含员工号,员工名字
SELECT eid,ename FROM emp3 WHERE dept_id IN (SELECT deptno FROM dept3 WHERE NAME = '研发部'OR NAME = '销售部');

-- 关键字(exists)格式:select ... from ... where exists(查询语句)
-- 后面查询结果是'true'外层查询执行,反之则不执行
-- 查询公司是否有大于60岁的员工,有则输出
SELECT * FROM emp3 a WHERE EXISTS(SELECT * FROM emp3 WHERE a.age > 60);
SELECT * FROM emp3 a WHERE eid IN (SELECT eid FROM emp3 WHERE a.age > 60);
-- 查询有所属部门的员工信息
SELECT * FROM emp3 a WHERE EXISTS(SELECT * FROM dept3 b WHERE a.dept_id = b.deptno);
SELECT * FROM emp3 a WHERE EXISTS (SELECT * FROM emp3 WHERE a.age > 60);

四:进行自关联查询


-- 1:查询每个三国人物及他的上级信息,如:关羽  刘备
SELECT a.ename,b.ename FROM t_sanguo a,t_sanguo b WHERE a.manager_id = b.eid;
SELECT a.ename,b.ename FROM t_sanguo a JOIN t_sanguo b ON a.manager_id = b.eid;
-- 2:查询所有人物及上级
SELECT a.name,b.name FROM t_sanguo a LEFT JOIN t_sanguo b ON a.manager_id = b.eid;
-- 3:查询所有人物,上级,上上级 比如:张飞 刘备 刘协
SELECT
   a.ename,b.name,c.name 
FROM t_sanguo a 
LEFT JOIN t_sanguo b ON a.manager_id = b.eid
LEFT JOIN t_sanguo c ON b.manager_id = c.eid;
 

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值