mysql——排序查询和函数

排序查询和函数

  • 排序查询
  • 常见的函数
  • 一、字符函数
  • 二、数学函数
  • 三、日期函数
  • 四、其他函数
  • 五、流程控制函数
  • 六、分组函数

排序查询

/*
select 查询列表 from 表
where 筛选条件
order by 排序列表 asc(升序)|desc(降序)
order by 字句中可以支持单个字段、多个字段、表达式、函数、别名
order by子句一般是放在查询的最后面,limit子句除外
*/

##案例1:查询员工信息,要求按工资从高到低排序
select * from 员工表 order by 工资 desc

##案例2:查询部门编号>=90的员工信息,按入职时间的先后排序
select * from 员工表 where 部门编号>=90 order by 入职时间 asc

##案例3:按年薪的高低显示员工的信息和年薪
select ,工资12*(1+奖金率)as 年薪 from 员工表 order by 工资12(1+奖金率)desc

##案例4:按年薪的高低显示员工的信息和年薪
select ,工资12*(1+奖金率)as 年薪 from 员工表 order by 年薪 desc

##案例5:按姓名的长度显示员工姓名和工资
select length(姓名) as 字节长度,姓名,工资 from 员工表 order by length(姓名) desc

#案例6:查询员工信息,要求先按工资排序,再按员工编号排序

select * from 员工表 order by 工资 asc ,员工编号 desc

常见的函数

分类:
1、单行函数
如:concat、length、ifnull等
2、分组函数

功能:做统计使用又称为统计函数、聚合函数、组函数

一、字符函数

length获取参数值得字节个数

concat 拼接字符串

upper lower 变大写和小写

substr、substring 截取字符串,索引从1开始

instr返回子串第一次出现的索引,如果找不到返回0

trim 去重前后空格,也可以去掉指定字符
select trim('a’from ‘aaaaaa张aa三aaaa’)

lpad 左填充指定的字符串
select lpad(‘李四’,12,’#’)

rpad 右填充指定的字符串
select rpad(‘李四’,12,‘a’)

replace替换
select replace(‘张无忌爱上了周芷诺’,‘周芷诺’,‘赵敏’)

二、数学函数

round 四舍五入
select round(1.4633,2)小数点后保留两位

ceil向上取整,返回>=该参数的最小整数
select ceil(1.52)

floor向下取整,返回<=该参数的最大整数
select floor(1.52)

truncate 截断
select truncate
SELECT TRUNCATE(1.65,4)

mod取余 a-a/b*b
select mod(10,3)

三、日期函数

now 返回当前系统日期+时间

curdate 返回当前系统的日期,不包含时间

curtime 返回当前的时间,不包含日期

获取指定的部分

str_to_data将字符串通过指定的格式换成日期
select str_to_data(‘2020-1-4’,’%Y-%c-%d’)

date_format
select date_format(now(),’%y年%m月%d日’)
select 姓名,date_format(日期,’%m月%d日 %Y年’)入职日期 from 员工表

datediff:返回两个日期相差的天数
monthname:以英文形式返回月

四、其他函数

select version()查看版本
select database()查看数据库
select user当前用户
password(‘字符’):返回加密的字符
md5(‘字符’)

五、流程控制函数

if else
if(10>5,‘大’,‘小’):如果条件表达式成立,返回表达式1,否则返回表达式2

case switch case的效果
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
else 要显示的值n或语句n
end

case
when 条件1 then 值1
when 条件2 then 值2
else n
end

#案例:查询员工的工资,要求
部门号=10,显示工资为1.1倍
部门号=20,显示工资为1.2倍
部门号=30,显示为工资的1.3倍
其他部门,显示为工资的原工资

select 部门号,工资 as 原工资,
case 部门号
when 10 then 工资1.1
when 20 then 工资
1.2
when 30 then 工资*1.3
else 工资
end as 新工资
from 员工表

多重if用case来完成
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
when 条件3 then 要显示的值3或语句3
else 要显示的值n或语句n
end

select 工资,
case
when 工资>20000 then ‘A’
when 工资>15000 then ‘B’
when 工资>10000 then ‘C’
else ‘D’
end
from 员工表

六、分组函数

sum()求和,avg平均值,max最大值,min最小值,count计算个数

以上分组函数忽略null

和分组函数一同查询的字段要求是group by后的字段

select datediff(max(日期),min(日期))from 员工表

分组查询
引入:查询每个部门的平均工资

#案例1:查询每个工种的最高工资
select max(工资),工种id from 员工表 group by 工种id

#案例2:查询每个位置上的部门个数
select count(*),位置id from 部门表 group by 部门id

添加筛选条件
案例1:查询邮箱中包含a字符的,每个部门的平均工资
select avg(工资),工种id from 员工表 where 邮箱 like’%a%’
group by 工种id

案例2:查询有奖金的每个领导手下员工的最高工资
select max(工资),管理id from 员工表 where 奖金率 is not null
group by 管理id

添加复杂的筛选条件
案例1:查询哪个部门的员工个数>2
select cout(),部门id from 员工表
group by 部门id
having count(
)>2

案例2:查询每个工种有奖金的员工最高工资大于12000的工种id和最高工资
①查询每个工种有奖金的员工最高工资
select max(工资),工种id from
where 奖金率 is not null

②最高工资大于12000
select max(工资),工种id from
where 奖金率 is not null
group by 工种id
Having max(工资)>12000

案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,及其最低工资
select 工资,领导id from 员工表,min工资)
where 领导id>102
group by 领导id
having 工资>5000

#案例:查询每个部门每个工种的员工的平均工资
select avg(工资),部门id,工种id from 员工表
group by 部门id,工种id

添加排序:
案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
select avg(工资),部门id,工种id from 员工表
where 部门id is not null
group by 部门id,工种id
order by avg(工资) desc

group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用得较少)

连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行
分类:
按年代分类:
sql192标准:仅仅支持内连接
sql199标准:内连接,外连接(左外连接,右外连接),交叉连接

按功能分类:
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接,全外连接
交叉连接

1.sql1992标准
多表等值连接
①多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③多表顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所欲子语句
1)等值连接
案例1:查询女神名和对应的男神名
select name,boyName
from boys,beauty
where beauty.boyfriend_id = boys.id;

案例2:查询员工名对应的部门名
select 姓名,部门名 from 员工表,部门表
where 员工表.部门id = 部门表.部门id;

2)为表起别名
/*
提高语句的简洁度
区分多个重名字段
*/
查询员工名、工种号、工种名
select 姓名,员工表.工种号,工种名 from 员工表 as e,工种表 as j
where e.工种id=j.工种id;

3)两个表的顺序可以调换

4)可以添加筛选
案例:查询有奖金的员工名、部门名
select 姓名,部门名,奖金率 from 员工表 as e,部门表 as d
where e.部门id = d.部门id and 奖金率 is not null

5)添加分组
案例1:查询每个城市的部门个数
select count(*) as 个数,city from 部门表 as d,位置表 as l
where d.位置id=l.位置id
group by city;

案例2:查询有奖金的每个部门的部门名和部门领导编号和该部门的最低工资
select 部门名,领导id,min(工资) from 员工表as e,部门表 as d
where e.部门id=d.部门id and 奖金率 is not null
group by 部门id,领导id

6)可以添加排序
案例:查询每个工种的工种名和员工的个数,并且按员工个数的降序
select 工种名,count() from 员工表 as e,工种表 as j
where e.工种id=j.工种id
group by 工种名
order by count(
) DESC;

7)三表连接

2.非等值连接
案例1:查询员工的工资和工资级别
select 工资,等级 from 员工表,等级表
where 工资 between 等级表.最低工资 and 等级表.最高工资;

3.自连接

你可能感兴趣的:(mysql,mysql)