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;
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态