1 case()
(姓名,目前薪资,薪资评价)。 (01000(含1000):实习生,10003000(含3000):试用期) 30005000(含5000):普通技工,50008000(含8000):管理层) 8000以上的:公司高层)
select 姓名,目前薪资,
case
when 目前薪资<=1000 then ‘实习期’
when 目前薪资>1000 and 目前薪资<=3000 then ‘试用期’
when 目前薪资>3000 and 目前薪资<=5000 then ‘普通技工’
when 目前薪资>5000 and 目前薪资<=8000 then ‘管理层’
else
‘公司高层’
end 薪资评价
from 员工
2 order by
从选课表中查询按课程号的升序,同一课程按成绩降序排列
select * from 选课 order by 课程号 asc,成绩 desc
[asc|desc]:asc代表升序,desc代表降序
- order by 字段 其后的[asc|desc] 可省,如省略,则代表asc (默认升序)
- order by 可以针对多个字段进行排序,如:order by 字段1 desc,字段2 asc
但优先第一个字段排序 - order by 后可以使用字段的索引来进行排序(索引是从1开始)
order by 子句中可以使用 “别名”
对于Northwind数据库中的员工表进行查询,要求如下:
- 显示字段:姓名,出生日期,年龄
- 按年龄进行降序排列
select 姓名,出生日期,year(now())-year(出生日期) as 年龄 from 员工 order by 年龄 desc
等价于:
select 姓名,出生日期,year(now())-year(出生日期) as 年龄 from 员工 order by 出生日期 asc
在上面这个查询的基础上找出年龄最大的员工是谁?
select 姓名,出生日期,year(now())-year(出生日期) as 年龄 from 员工 order by 出生日期 asc limit 1
在上面这个查询的基础上找出年龄最小的员工是谁?
select 姓名,出生日期,year(now())-year(出生日期) as 年龄 from 员工 order by 出生日期 desc limit 1
查找出订货明细表中销售金额最大的那笔订单.
select 订单号码,单价数量(1-折扣) as 总金额 from 订货明细 order by 总金额 desc limit 1
3 limit()的用法
SELECT * FROM table LIMIT skip,pagesize
select 员工编号,姓名 from 员工 limit 20,10
page pagesize
select 员工编号,姓名 from 员工 limit (page-1)*pagesize,pagesize
取员工表第一页的数据(每页5条记录)
page=1,pagesize=5
select 员工编号,姓名 from 员工 limit 0,5
取员工表第二页的数据(每页5条记录)
select 员工编号,姓名 from 员工 limit 5,5
取员工表第三页的数据(每页5条记录)
select 员工编号,姓名 from 员工 limit 9,5
4 count()的用法
从学生表中查询各个专业的人数
select 专业,count(*) as 人数 from 学生 group by 专业
从学生表中统计每个专业男女生人数
select 专业,性别,count(*) as 人数 from 学生 group by 专业,性别
从学生表中查询超过2个人专业。
select 专业,count(*) as 人数 from 学生 group by 专业 having 人数>2
统计哪个专业没有女生。
select distinct 专业 from 学生 where 专业 not in ( select 专业 from 学生 group by 专业,性别 having 性别=‘女’)
或
select distinct 专业 from 学生 where 专业 not in (select distinct 专业 from 学生 where 性别=‘女’)
6 聚合函数
COUNT()函数
SUM()函数
AVG()函数
MAX()函数
MIN()函数
我想知道公司有多少个员工?
select count(*) from 员工
等价于:
select count(员工编号) from 员工
统计员工表中发放员工工资总和
select sum(目前薪资) as 工资总额 from 员工
统计本公司员工平均工资是多少。
select avg(目前薪资) as 平均工资 from 员工
统计本公司最高薪资是多少?最低薪资是多少
select max(目前薪资) as 最高工资 from 员工
select min(目前薪资) as 最低工资 from 员工
统计本公司的基本信息(人数,月工资发放总额,员工平均工资,月最高工资,月最低工资)
select count(*) as 人数,sum(目前薪资) as 工资总额,avg(目前薪资) as 平均工资,max(目前薪资) as 最高工资,min(目前薪资) as 最低工资 from 员工
我想知道本公司月薪最高的员工是哪位?
select 员工姓名,部门,目前薪资 from 员工 where 目前薪资 = max(目前薪资)
我想知道本公司月薪最低的员工是哪位?
select 姓名,部门,目前薪资 from 员工 where 目前薪资=(select min(目前薪资) as 最低工资 from 员工)
本公司年龄最大的员工是哪位?
select 姓名,部门,出生日期 from 员工 where 出生日期=(select min(出生日期) from 员工)
另一种实现方式:
select 姓名,部门,year(now())-year(出生日期) as 年龄 from 员工 where
year(now())-year(出生日期)=(select max(year(now())-year(出生日期) ) from 员工)
查询出生产制造部员工的最高工资
select max(目前薪资) from 员工 where 部门=‘生产制造部’
查询出比生产造部员工最高工资还要高的其他部门员工工资情况
select 姓名,部门,目前薪资 where 目前薪资>(生产制造部员工的最高工资)
select 姓名,部门,目前薪资 from 员工 where 目前薪资>(select max(目前薪资) from 员工 where 部门=‘生产制造部’) and 部门!=‘生产制造部’
查询比生产制造部平均工资还要高的其他部门员工的工资情况
select 姓名,部门,目前薪资 from 员工 where 目前薪资>(生产制造部员工的平均工资) and
部门!=‘生产制造部’
生产制造部员工的平均工资:select avg(目前薪资) from 员工 where 部门=‘生产制造部’
select 姓名,部门,目前薪资 from 员工 where 目前薪资>(select avg(目前薪资) from 员工 where 部门=‘生产制造部’) and
部门!=‘生产制造部’
7 group by
统计出生产制造部中女性员工的人数
select 部门,性别,count(*) as 人数 from 员工 where 部门=‘生产制造部’ and 性别=-1
统计出生产制造部中员工的人数(另一种写法)
select 部门,
case 性别
when 0 then ‘男’
when -1 then ‘女’
end as sex ,count(*) as 人数 from 员工 group by 部门,性别 having 部门=‘生产制造部’ and 性别=-1
select 部门,
case 性别
when 0 then ‘男’
when -1 then ‘女’
end as sex ,count(*) as 人数 from 员工 group by 部门,性别 having 部门=‘生产制造部’ and sex=‘女’
更复杂的示例:
select 部门,
case 性别
when 0 then ‘男’
when -1 then ‘女’
end as sex ,婚姻状况, count(*) as 人数 from 员工 group by 部门,性别,婚姻状况 having 部门=‘生产制造部’ and sex=‘女’ and 婚姻状况=-1