Mysql
表:
dept
emp
salgrade
1. 分组函数(多行处理函数)
2. 分组查询(重要)
2.1 group by
2.2 having
使用having可以对分完组的数据再一次过滤,having不能代替where,必须和group by 联合使用
select
deptno,max(sal)
from
emp
group by
deptno
having
max(sal) > 3000;
<
? 思路2:先将大于3k 的都找到,再分组
优化策略:优先使用where
select
deptno,max(sal)
from
emp
where
sal > 3000
group by
deptno;
select
deptno,avg(sal)
from
emp
group by
deptno
having avg
(sal)>2500;s
2.3 select 语句总结
执行顺讯:from -> where -> group by -> having -> select -> order by
从某张表中查询数据,先经过where条件筛选出有价值的数据,对有价值的数据进行分组,再使用having继续筛选。
-
找出每个岗位的平均薪资,要求显示平均薪资大于1500,除MANAGER之外,要求按照平均薪资降序 思路: select
job,avg(sal) as avgsal
from
emp
where
job <> 'MANAGER'
group by
job
having
avg(sal) > 1500;
order by
avgsal desc;
3. distinct 关键字
-
把查询结果取出重复记录 注意:原表数据不会被修改,只是查询结果去重。 -
distinct只能出现在所有字段的最前方
4. 连接查询
4.1 什么是连接查询
从一张表单独查询,称为单表查询。
跨表查询,多张表联合起来查询数据,被称为连接查询。
4.2 表连接的分类方式
4.3 怎么避免笛卡尔积现象?
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为笛卡尔积现象。
连接时加条件,满足这个条件的记录被筛选出来就可以避免笛卡尔积现象。
-
查询每个员工所在的部门名称 select
ename,dname
from
emp,dept
where emp.deptno = dept.deptno
select
e.ename,d.dname
from
emp e,dept d
where e.deptno = d.deptno
4.4 内连接
4.4.1 等值连接
-
查询每个员工所在部门名称,显示员工名和部门名
select
e.name,d.name
from
emp e,dept d
where
e.deptnp = d.deptno
select
e.ename,d.dname
from
emp e
inner join
dept d
on
e.deptno = d.deptno;
SQL99优点:表连接的条件是独立的,链接之后,如果还需要进一步筛选,再往后继续添加where
4.4.2 非等值连接
-
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级 select
e.ename,e.sal,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
4.4.3 自连接
技巧:一张表看成两张表,emp a 员工表,emp b 领导表
select
a.ename as '员工名', b.ename as '领导名'
from
emp a
join
emp b
on
a.mgr = b.empno;
4.5 外连接
-
找出员工的部门名
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
select
e.ename,d.dname
from
emp e
right outer join
dept d
on
e.deptno = d.deptno;
select
e.ename,d.dname
from
dept d
left join
emp e
on
e.deptno = d.deptno;
right:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表 在外连接当中,两张表连接,产生主次关系 内连接,两张表平等,没有主次 思考:外连接的查询结果条数一定是 大于等于 内连接的查询条数 -
查询每个员工的上级领导,要求显示所有员工的名字和领导名 select
a.ename as '员工名', b.ename as '领导名'
from
emp a
left join
emp b
on
a.mgr = b.empnp;
内连接14条,外连接15条,有KING
4.6 多表查询
语法:
select
...
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
join
d
on
a和d的连接条件
一条SQL中内连接和外连接可以混合,都可以出现。
- 找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级
select
e.ename,e.sal,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptnp
join
salgrade s
on
e.sal between s.losal and s.hisal;
-
找出每个员工的部门名称以及工资等级还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级 select
e.ename,e.sal,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptnp
join
salgrade s
on
e.sal between s.losal and s.hisal
left join
emp m
on
e.mgr = m.empno;
5. 子查询
- 什么是子查询?
- select语句中嵌套select语句,被嵌套的称为子查询
5.1 where子句中的子查询
5.2 from子句中的子查询
注意:from后面的子查询,可以将子查询的查询结果当做一张临时表
-
找出每个岗位的平均工资的薪资等级 思路: 1.找出平均工资(按照岗位分组求平均值)
2.把以上的查询结果当做一张真实存在的表 t,查询工资等级表 s
3.t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal
select
t.*,s.grade
from
(select job,avg(sal) as avgsal from emp group by job) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
5.3 select后面出现的子查询(了解)
|