-- 空值查询
-- 查询mgr为空的记录
select * from emp where mgr is null;
-- 查询comm不为空的记录
select * from emp where mgr is not null;
-- 查询每位员工的实发工资(基本工资+提成,将comm空值填充为0)
#空值不能跟其他任何值进行运算;会影响数据分析
select *,sal+ifnull(comm,0) from emp;
-- 设置别名
select *,sal+ifnull(comm,0) as 实发工资 from emp;
select *,sal+ifnull(comm,0) 实发工资 from emp;
-- 练习:查询每位员工的年薪
select *,sal*12 as 年薪 from emp;
-- 模糊查询
-- 查询姓名以a开头的员工信息
select * from emp where ename like \'a%\';
-- 查询姓名中包含a的员工信息
select * from emp where ename like \'%a%\';
-- 查询姓名中第二个字符为a的员工信息
select * from emp where ename like \'_a%\';
-- 练习:查询员工姓名不以s开头的员工信息
select * from emp where ename not like \'s%\';
-- 查询结果排序
-- 单字段排序:查询所有员工信息按sal降序显示
select * from emp order by sal desc;
-- 多字段排序:查询所有员工信息按deptno升序、sal降序显示
-- 默认是升序
select * from emp order by deptno asc,sal desc;
-- 限制查询结果数量
-- 查询基本工资最高的前5位员工
select * from emp order by sal desc limit 5;
-- 查询基本工资第6到10名的员工(偏移量以第一行为基准)
-- limit(偏移量,需要展示的总行数)
select * from emp order by sal desc limit 9,6;
select * from emp order by sal desc limit 6 offset 9;
-- 练习:查询最后入职的5位员工
select * from emp order by hiretime desc limit 5;
-- 聚合运算
-- 查询emp表中员工总数、最高工资、最低工资、平均工资及工资总和
select count(*)员工总数,max(sal)最高工资,min(sal)最低工资,avg(sal)平均工资,sum(sal)工资总和 from emp;
-- 分组查询
-- 查询各部门的平均工资
select deptno,avg(sal)平均工资
from emp
group by deptno;
-- 查询各部门不同职位的平均工资
select deptno,job,avg(sal)平均工资
from emp
group by deptno,job;
-- 练习:查询各部门的员工数
select deptno,count(empno)员工数
from emp
group by deptno;
-- 练习:查询各部门不同职位的人数
select deptno,job,count(empno)
from emp
group by deptno,job;
-- 分组后筛选
-- 查询各部门clerk的平均工资
-- 先分组再筛选
-- 分组之后只能显示分组字段和求值字段
SELECT
deptno, job, AVG(sal) 平均工资
FROM
emp
GROUP BY deptno , job
HAVING job = \'clerk\';
-- 先筛选再分组
SELECT
deptno, job, AVG(sal) 平均工资
FROM
emp
WHERE
job = \'clerk\'
GROUP BY deptno , job;
-- 查询各部门平均工资大于3000的职位
SELECT
deptno, job, AVG(sal)
FROM
emp
GROUP BY deptno , job
HAVING AVG(sal) > 3000;
SELECT
deptno, job, AVG(sal)
FROM
emp
WHERE
AVG(sal) > 3000
GROUP BY deptno , job;
-- 报错:where字句不能用聚合函数
-- 练习:查询平均工资在2000元以上的职位,并按照平均工资降序显示
SELECT
deptno, job, AVG(sal)
FROM
emp
GROUP BY deptno , job
HAVING AVG(sal) > 2000
ORDER BY AVG(sal) DESC;
-- 日期函数
select month(now());
-- 查询每位员工的入职年份
select year(hiretime) from emp;
-- 查询每位员工的工龄
select datediff(curdate(),hiretime)/365 工龄 from emp;
-- 将员工入职日期转换为时间戳
select *,unix_timestamp(hiretime) from emp;
select from_unixtime(345830400);
-- 将每位员工的入职日期加上一年
select adddate(hiretime,interval 1 year) from emp;
-- 练习:查询员工姓名、入职日期和试用截止日期
select * from emp;
select ename,hiretime,adddate(hiretime,interval 3 month) from emp;
-- 字符串函数
-- 将每位员工的职位转换为大写
select upper(job) from emp;
-- 将员工姓名与职位合并
select concat(ename,job) from emp;
-- 练习:将每位员工的姓名首字母转换为大写
select concat(upper(left(ename,1)),lower(mid(ename,2))) from emp;
-- 分组合并函数
-- 查询各部门的员工姓名
select deptno,group_concat(distinct ename order by sal desc)
from emp
group by deptno;
-- !!!!!! 练习:查询上层管理者工号及其对应的下属员工姓名
select * from emp;
select mgr,group_concat(ename)
from emp
group by mgr;
-- 逻辑函数
-- if函数:查询每位员工的工资级别:3000及以上为高,1500-3000为中,1500以下为低
select *,if(sal>=3000,\'高\',if(sal>=1500,\'中\',\'低\')) from emp;
-- 逻辑表达式 case when ...then... else ... end
select *,case when sal>=3000 then \'高\'
when sal<=1500 then \'低\'
else \'中\'
end 工资级别
from emp;
-- 多表连接查询
select * from emp;
select * from dept;
-- 内连接
-- 英文句号表示限定符号
select * from emp inner join dept on emp.deptno=dept.deptno;
-- 左连接
select * from emp left join dept on emp.deptno=dept.deptno;
-- 右连接
select * from emp right join dept on emp.deptno=dept.deptno;
-- 多表查询练习
select * from emp;
select * from dept;
select * from salgrade;
-- 查询每位员工的ename,dname,sal
select ename,dname,sal
from emp
left join dept
on emp.deptno=dept.deptno;
-- 查询manager的姓名、所属部门名称和入职日期:ename,dname,job,hiretime
select ename,dname,job,hiretime
from emp left join dept on emp.deptno=dept.deptno
where job=\'manager\';
-- 查询每位员工的工资等级;empno,ename,sal,grade
select empno,ename,sal,grade
from emp left join salgrade on sal between minimum and maximum;
-- 查询每个工资等级的员工数
select grade,count(empno) 员工数
from emp left join salgrade on sal between minimum and maximum
group by grade;
-- 查询所有管理者姓名及其下属员工姓名
-- (自连接、笛卡尔积连接)
-- 通过设置别名,区分同一张表
select 领导表.ename,员工表.ename
from emp 领导表 inner join emp 员工表 on 领导表.empno=员工表.mgr;
-- 笛卡尔积连接
select 领导表.ename,员工表.ename
from emp 领导表,emp 员工表
where 领导表.empno=员工表.mgr;
-- 查询入职日期早于其直属领导的员工:empno,ename,dname
select 员工表.empno,员工表.ename,dname
from emp 领导表 inner join emp 员工表 on 领导表.empno=员工表.mgr
join dept on 员工表.deptno=dept.deptno
where 领导表.hiretime>员工表.hiretime;


雷达卡


京公网安备 11010802022788号







