Mysql梳理(多表查询)

 2023-09-17 阅读 24 评论 0

摘要:1.连接查询: 内连接 外连接 自然连接 --内连接(mysql方言 逗号 , ) #会把字段连接起来,数据进行组合 #四条记录和三条记录的表会组合成12条记录 select * from emp,dept; select * from emp e inner join dept d; #加上where条件,去除不用的数据

1.连接查询:
内连接
外连接
自然连接

--内连接(mysql方言 逗号 , )
#会把字段连接起来,数据进行组合
#四条记录和三条记录的表会组合成12条记录
select * from emp,dept;
select * from emp e inner join dept d;
#加上where条件,去除不用的数据
select * from emp e ,dept d where e.deptno=d.deptno;

--查询甘宁所在的部门的部门号部门名称
select  e.ename,e.deptno,d.dname  from emp e,dept d where e.deptno=d.deptno and e.ename='甘宁';

--张二(部门表中没有他所在部门)需要使用外连接查询。外连接就是以某个表为主要查询表。
--左外连接,就是以左表 left join 右表,左表里的数据。必定会查出。右表里没有对应数据,填null。
select e.ename,e.deptno,d.dname
from emp e left join dept d  on e.deptno=d.deptno where e.ename='张二';
--右连接 ,左表 right join 右表, 右表里的数据 必定会查出,左表没有对应的数据,填null。
select * from empt e right join dept d on e.deptno=d.deptno where e.ename='张二';

--自然连接.  系统会自动帮你找到两个表的关联的列  做内连接查询。
select * from emp e entural join dept d;

多表查询sql?2.连接查询练习(连什么,连接之后查什么条件)
--查询所有销售员或分析师的名字,月薪,部门号,部门名。
--查什么名字,月薪,部门号,部门名,job
--几个表 emp dept
--条件 1.连接条件 关联列 2.job=销售员或分析师
select e.ename,e.job,e.sal,e.deptno,d.dname
from emp e left join dept d 
on e.deptno=d.deptno
where job='销售员' or job='分析师';

--查询公司里dept表里,所有的部门号,部门名,这个部门中工资和奖金和>2万的人数;
select d.deptno,d.dname,count(e,empno)
from dept left join emp e
on d.deptno= e.deptno
where (ifnull(sal,0)+ifnull(comm,0))>20000 or (d.deptno is not null and e.empno is null)
group by d.deptno;

--反之
如果只想要那些非零的
select c.cid,c.cname,COUNT(b.title)
FROM blog b RIGHT JOIN category c
on c.cid=b.cid
where b.bid is not null
GROUP BY c.cid;

3.表的自关联 
--查询每个员工的名字,入职日期,上司的名字和上司的入职日期
select e.name, e.hiredate, m.ename, m.hiredate
from emp e left join emp m on e.mgr=m.empno
where e.hiredate<m.hiredate;

4.三表查询
--查询入职日期早于上司的 员工名 员工入职日期,上司名,上司入职日期,员工部门号和部门所在地。
select e.name, e.hiredate, m.ename, m.hiredate,e.deptno,d.loc
from emp e left join emp m on e.mgr=m.empno  left  join dept d on e.deptno=d.deptno
where e.hiredate<m.hiredate;

5.子查询
--一个select语句里的 查询条件 和 条件值 有可能来自另外一个查询
--一个select语句里的 查询的列们 中的某列/多列  有可能来自 另外一个查询结果表中。

MySQL多表查询?#当子查询返回单行,单列值,可以当成一个普通标量使用,出现在where后面作为过滤的值使用;
#当子查询返回一个多行多列(行内视图),当作一个临时视图,出现在from后面作为数据表使用;

--查询工资大于关羽工资的员工名字和工资(子单行单列)
select ename,sal from emp where sal>( select sal from emp where ename='关羽' );
--查询工资大于20部门所有人工资的人和工资(子多行单列)
select ename,sal from emp where sal>all(select sal from emp where deptno=20 );--max 比最大的还大
select ename,sal from emp where sal>any(select sal from emp where deptno=20 );--min 比最小的大就可以

--查询工作和工资与殷天正完全相同的员工信息(子查询单行一列)
SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='殷天正')
--查询增阿牛 的部门号(员工表),部门名,下属名,下属部门名。(子查询多行多列)
--1.查增阿牛的部门号,部门名
select e.ename,e.empno,e.deptno,d.name
from emp e left join dept d 
on e.deptno = d.deptno
where ename='增阿牛';

--2
select      e.ename as 下属名,d.name as 下属部门名,
    m.ename as 上司名,m.dname as 上司部门名
from    emp e
left join dept d on e.deptno=d.deptno
left join(
select e.ename,e.empno,e.deptno,d.name
from emp e left join dept d 
on e.deptno = d.deptno
where ename='增阿牛';
) m on e.mgr=m.empno 
where m.ename is not null;

6.case语句
#case when then else end 语句 类似于 Java中的switch
--本月给员工加薪,<2万 *5 ,<2 >3 *2,>3 不变,查看原来的工资和本月的工资。
select ename,sal,(
case
when sal<20000 then sal*5
when sal>20000 and sal<30000 then sal*2
else sal
end
)as 本月工资 from emp;

--查询文员的人数 和销售员人数
select job,count(*) from emp group by job having job in('文员','销售员');

问题梳理表、--case一行显示
select
sum(
case
when job='文员' then 1
else 0
end
)as 文员人数
sum(
case
when job='销售员' then 1
else 0
end
)as 销售员人数 from emp;

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/72596.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息