0
点赞
收藏
分享

微信扫一扫

mysql基础学习---day9

绪风 2022-04-07 阅读 62
学习mysql

时间函数  ----now()
select now()

返回指定日期的年份-year()  月份-month()   天-day() ---
select year(now()),month(now()),day(now())

对时间进行加减操作
date_add(时间点,interval 操作数量 操作类型)  操作类型有年,月,日--year(),month(),day()
select now(),date_add(now(),interval -3 year),date_add(now(),interval 3 month),date_add(now(),interval 3 day)

练习:查询员工信息表,返回员工姓名,入职日期,以及将入职日期推迟10天后的信息
select ename,hiredate,date_add(hiredate,interval 10 day) from emp

指定时间格式--date_format(时间点,指定格式)  ‘%Y-%m-%d %H:%i:%s’
select now(),date_format(now(),'%Y-%m-%d %H:%i:%s')

数学函数:
取绝对值--abs(值)
select id,id-5,abs(id-5) from emp

向下取整--floor(值)
select sal,floor(sal) from emp

向上取整--ceiling(值)
select sal,floor(sal),ceiling(sal) from emp

round(数值,保留小数点位数)---指定保留小数点位数,会自动进行四舍五入操作
select sal,round(sal,1) from emp

truncate(数值,保留小数点位数)---指定保留小数点位数,不会进行四舍五入操作
select sal,truncate(sal,1) from emp

取余---mod(a,b)   返回a除以b得到的余数
select id,mod(id,10) from emp


控制流函数:
if(表达式,值1,值2)----如果表达式成立,则返回值1,否则返回值2

示例:查询员工信息表,返回员工姓名、工资以及工资等级(工资大于30000等级为高,否则为低)
select ename,sal,if(sal>30000,'高','低') as 工资等级 from emp

练习:查询员工信息表emp中的员工姓名,职位,如果职位空,显示为“暂无职位信息”
select ename,if(job is null,'暂无职位信息',job) from emp

ifnull(字段,指定值)---表示如果字段值为空,则返回指定值,否则返回该字段值本身

示例:查询员工信息表emp中的员工姓名,职位,如果职位空,显示为“暂无职位信息”
select ename,job,ifnull(job,'暂无职位信息') from emp


练习:查询员工信息表,返回员工姓名,工资,奖金,以及工资和奖金的总和
select ename,sal,comm,sal+ifnull(comm,0) as 总和 from emp

nullif(值1,值2)---表示如果值1=值2,则返回null,否则返回值1
select nullif(id,3) from emp
 

示例:查询员工信息表,返回员工姓名、工资以及工资等级(工资大于30000等级为高,10000~30000为中级,否则为低)
select ename,sal,if(sal>30000,'高',if(sal > 10000 and sal < 30000,'中','低')) from emp


控制流语句---case when

语法1:
case when 表达式1 then 值1
     when 表达式2 then 值2
     .....
     when 表达式n then 值n
     else 其他数据
end
表示如果表达式1成立,则返回值1,否则如果表达式2成立,则返回值2,……,否则如果表达式n成立,则返回值n,如果这些表达式都不成立,则返回其他值
注意:在判断的过程中,如果满足了某个条件,则结束判断


示例:查询员工信息表,返回员工姓名、工资以及工资等级(工资大于30000等级为高,10000~30000为中级,否则为低)
select ename,sal,case when sal>30000 then '高' when sal between 10000 and 30000 then '中' else '低' end from emp

语法2:
case 字段 when 值1 then 数据1
                    when 值2 then 数据2
                    ……
                    when 值n then 数据n
                    else 其他数据
end 
表示如果字段的值等于值1,那么返回数据1,否则入字段值等于值2,那么返回数据2,……,否则如果字段值等于值n,那么返回数据n,如果字段值与所罗列的所有值都不相等,那么返回其他数据
主要:在判断的过程中,如果满足了某个条件,则结束

示例:查询员工信息表,返回员工姓名,性别以及性别的中文名称(0-男,1-女,2-未知)
select ename,sex,(case sex when 0 then '男' when 1 then '女' when 2 then '未知' else '数据错了' end)as 性别 from emp;

多表查询
在一个select语句中同时查询多张表

示例:查询员工信息表中编号为10000002的员工编号,姓名,所属部门编号和部门名称
select * from emp;
select * from dept;
select * from emp as e,dept as d where e.deptno = d.deptno

简单来说,所谓的多表查询就是通过匹配条件,将多张表横向的拼接成一张新的临时表,再对这张新的临时表进行查询操作

内连接:
在进行多表查询的时候,在返回结果中只保留满足匹配条件的数据,不满足匹配条件的数据都扔掉

语法1:
select 查询内容 from 表1,表2,表3,…… where 表1和表2的匹配条件 and 表1(或者表2)和表3的匹配条件 and …… and 查询前的限定条件 group by 分组条件1,分组条件2,…… having 分组后再次限定 order by 排序条件1 排序方式,排序条件2 排序方式,…… limit 起始位置,返回数量

示例:查询员工信息表中姓张员工编号,姓名,部门编号以及部门名称
select e.empno,e.ename,e.deptno,d.dname from emp as e,dept as d where e.deptno=d.deptno

练习: 查询在贵阳办公的所有员工编号,姓名,性别,部门编号,部门名称和办公地点信息
select e.empno,e.ename,e.sex,e.deptno,d.dname,d.loc from emp as e,dept as d where e.deptno = d.deptno and d.loc like '%贵阳%'


语法2: inner join 
select 查询内容 from 表1 inner join 表2 on 表1和表2的匹配条件 inner join 表3 on 表1(或者表2)和表3的匹配条件 where 查询前的限定条件 group by 分组条件1,分组条件2,…… having 分组后再次限定 order by 排序条件1 排序方式,排序条件2 排序方式,…… limit 起始位置,返回数量

示例:查询各部门中张姓员工的所属部门编号,部门名称,人员数量和人员名称明细
select e.deptno,d.dname,count(*),group_concat(e.ename) from emp as e inner join dept as d on e.deptno= d.deptno where e.ename like '张%' group by e.deptno

练习:查询男性员工的员工编号,姓名,性别,工资以及工资所属等级
select * from emp;
select * from salgrade;
select e.empno,e.ename,e.sex,e.sal,s.grade from emp as e inner join salgrade as s on e.sal between s.losal and s.hisal where sex = 0

等值连接:进行多表查询的时候,使用 “等号” 来进行关联匹配

非等值连接:进行多表查询的时候,使用的是 “非等号”来进行关联匹配

自然连接: 在进行多表连接查询的时候,不指定具体的匹配条件,它会自动找相同名称的字段进行等值连接(不要用这种方式,查询的数据不靠谱)

自连接:多表查询的时候,把同一张表当做是多张不同的表进行查询
注意:在进行自连接的时候,必须给表起别名
 

举报

相关推荐

0 条评论