数据库函数

-- 函数
-- 1.文本函数
-- CHAR_LENGTH(str)可以返回文本字符个数
select CHAR_LENGTH('abcdefgh') from dual

select ename,CHAR_LENGTH(ename) from emp

-- CONCAT(str1,str2,...) 可以将参数合并成一个字符串
select ename,job,CONCAT(ename,'职位是',job) '某人的职位是' from emp

-- 转换大小写 LOWER(str)转小写 UPPER(str)转大写
select LOWER('HHHH'),UPPER('abcdef') from dual

-- SUBSTR(str,pos,len) str就是要揭取的原字符串 POS 从第几个字符开始截取
-- len截取的长度(从1开始)
select ename,SUBSTR(ename,2,3) from emp

-- TRIM(str)截取首尾空格
select CHAR_LENGTH(' abc '),CHAR_LENGTH(TRIM(' def ')) from dual

-- MOD(N,M) 取余
select MOD(5,3) from dual

-- 时间函数
-- CURDATE() 获取当前日期 年月日
-- CURTIME() 获取当前时间 小时分秒
-- NOW() 获取当前的日期和时间

select CURDATE(),CURTIME(),NOW() from dual

-- 追加时间
-- DATE_ADD(date,INTERVAL expr unit)
-- date:当前时间(日期类型的时间) INTERVAL expr
-- INTERVAL expr:表达式(数字)
-- type year month day hour

-- 当前时间后一小时
select now(),DATE_ADD(NOW(),INTERVAL 1 hour) from dual

-- 计算两个日期间的天数 DATEDIFF(expr1,expr2)
-- 计算员工入职的天数
select ename,hiredate,DATEDIFF(CURDATE(),hiredate)/365 from emp

-- 计算日期所在月份的最后一天 LAST_DAY(date)
select ename,hiredate,LAST_DAY(hiredate) from emp

-- 分组函数(重要的):将多行数据统计为最后一个结果
-- MAX(expr)求最大值
-- MIN(expr)求最小值
-- COUNT(expr)求表中总记录数(总人数)COUNT(*)表中所有的记录
-- AVG([DISTINCT] expr)求平均值
-- SUM(expr)求总和

select * from emp
select MAX(sal),MIN(sal),COUNT(*),AVG(sal),SUM(sal) from emp

select COUNT(ename) 总人数 from emp

select COUNT(comm) from emp

-- 计算所有员工的平均月薪
select AVG(sal+IFNULL(comm,0)) from emp

-- 分组函数与多值的列不能混合使用,否则一定要使用GROUP BY进行分组
select ename,AVG(sal+IFNULL(comm,0)) from emp

-- 如何分组 SELECT.....from.....WHERE.....GROUP BY....ORDER BY
-- 查询每个部门的平均工资
select deptno,AVG(sal) from emp group by deptno

-- group by 后面可以按多列进行分组
select deptno,job,AVG(sal) from emp group by deptno,job

-- 分组函数条件的筛选 having
-- 编写语法:select....FROM....WHERE.....group BY.....HAVING....order by
-- 执行语句:FROM....where....group BY....HAVING....SELECT....order by
-- 查询平均工资高于4000的编号,平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal)>4000

select *from student
select *from grade
select *from lession

-- 1号同学的姓名和总成绩(两种方法)
select sname,SUM(sgrade) from student,grade where student.sid=grade.sid and student.sid=1 group by sname

-- 查询一班学生的学号。姓名,总成绩
select s.sid,s.sname,SUM(g.sgrade)
from student s,grade g where s.sid=g.sid and s.sclass='一班' group by s.sid,s.sname

select s.sid,s.sname,sum(g.sgrade)
from student s inner join grade g on s.sid=g.sid and s.sclass='一班' group by s.sid,s.sname

-- 查询平均分大于85,总分大于170的学生学号,姓名,班级
select s.sid,s.sname,s.sclass,sum(g.sgrade),AVG(g.sgrade) from student s,grade g
where s.sid=g.sid group by s.sid,s.sname,s.sclass having AVG(g.sgrade)>85 and sum(g.sgrade)>170

-- 子查询(嵌套查询):
-- 在查询的逻辑中,引入另一个查询作为条件或数据的来源
-- 查询与TOM在同一个部门工作的员工信息
-- 1.查询TOM所在的部门编号(子查询)
-- 2.查询与TOM在同一个部门工作的其他员工信息(主查询:会利用子查询的结果)
select * from emp
select deptno from emp where ename='TOM' (子查询)
select * from emp where deptno=(select deptno from emp where ename='TOM') and ename<>'TOM'

-- 子查询出现的位置
-- 1.可以放在from后面,可以将子查询当成一张临时表来处理
select t.* from (select * from emp) t(在子查询中写多列)
-- 2.可以出现在where后面
-- 3.可以出现在having后面
-- 通常都是写在where和from后面

-- 子查询分为:单行子查询和多行子查询
-- 单行子查询:单行子查询查询到的结果为一行一列的数据(简单的数据)
-- 可以使用单行比较运算符(> < >= <= !=)
-- 查询比TOM工资高的员工的信息
-- 1.查询出TOM的工资 2。工资比TOM高的员工的工资
select sal from emp where ename='TOM'
select * from emp where sal>(select sal from emp where ename='TOM')

-- 2.查询与LEE同一个职位的同一部门的员工信息
-- 查询LEE的职位
-- 查询LEE所在的部门
select job from emp where ename='LEE'
select deptno from emp where ename='LEE'
select *from emp where job=(select job from emp where ename='LEE')
and deptno=(select deptno from emp where ename='LEE') and ename<>'LEE'

-- 多行子查询:子查询返回的结果是多行一列的数据
-- 多行子查询使用多行比较运算符(in 等于)
select DISTINCT mgr from emp where mgr is not null
select * from emp where empno in (select DISTINCT mgr from emp where mgr is not null)

-- 查询不是经理的员工的信息(注意 新或 not in 数据不能有null值 相当于执行了=null的操作,查询不到结果)
select job from emp where job<>'MANAGER' and job is not null
select * from emp where job in (select job from emp where job<>'MANAGER' and job is not null)
-- 多行比较运算符(ANY任何一个 ALL所有的)
-- < ANY 比最大的小 >ANY 比最小值大 =ANY相当于in
-- < ALL 比最小的小 >ALL 比最大值大

-- 查询比10号部门所有人的工资都要高的员工信息
-- 1.先要查询10号部门的工资
select sal from emp where deptno=10
select * from emp where sal> all (select sal from emp where deptno=10)

select * from emp where sal> (select MAX(sal) from emp where deptno=10)

-- from 后也可以写子查询(表)
-- 查询部门编号,部门名成,部门所在地址,部门人数
-- 1.
select * from dept
select * from emp

select e.deptno,t.dname,t.loc,COUNT(e.ename) '部门人数' from (select * from dept) t,emp e where e.deptno=t.deptno group by e.deptno

select e.deptno,t.dname,t.loc,COUNT(e.ename) '部门人数' from (select * from dept) t left join emp e on e.deptno=t.deptno group by e.deptno

-- 1.查询每个部门的编号及人数(显示结果为多行多列的数据,所以将子查询但做一张表来处理)
select deptno,COUNT(ename) from emp where deptno is not null group by deptno

select d.deptno,d.dname,d.loc,IFNULL(t.empnum,0)
from dept d left join (select deptno,COUNT(ename) empnum from emp where deptno is not null group by deptno) t
on d.deptno=t.deptno

-- 1)查询张三的同班同学的信息
select * from student
select * from grade
select sclass from student where sname='张三'
select * from student where sclass=(select sclass from student where sname='张三')

-- 2.查询总成绩比张三总成绩高的学生的学号,姓名,总成绩
select sum(g.sgrade) from student s,grade g where s.sid=g.sid and s.sname='张三'

select s.sid,s.sname,sum(g.sgrade) from student s,grade g where s.sid=g.sid group by s.sid,s.sname
having sum(g.sgrade)>(select sum(g.sgrade) from student s,grade g where s.sid=g.sid and s.sname='张三')

-- 3.查询一班总成绩最高的同学的学号,姓名,总成绩
select sum(g.sgrade) from student s,grade g where s.sid=g.sid and s.sclass='一班' group by g.sid

select s.sid,s.sname,SUM(g.sgrade) from student s,grade g where s.sid=g.sid group by s.sid,s.sname
having sum(g.sgrade)>=all(select sum(g.sgrade) from student s,grade g where s.sid=g.sid and s.sclass='一班' group by g.sid)

-- 4.查询总成绩比3号同学总成绩高的人的姓名
select sum(g.sgrade) from student s,grade g where s.sid=g.sid and s.sid=3

select s.sname from student s,grade g where s.sid=g.sid group by s.sname having sum(g.sgrade)>
(select sum(g.sgrade) from student s,grade g where s.sid=g.sid and s.sid=3)

你可能感兴趣的:(数据库函数)