数据库介绍3

1、基础查询
1)IS NULL
//查询哪些员工没有奖金
select * from emp_xu where bonus=null;//未选定行


select * from emp_xu where bonus is null;
注意:测试NULL值时要使用IS NULL(IS NOT NULL),
NULL不能用等于(=)或者不等于(<>)跟任何值进行比较。


2)条件查询中的否定形式
//查询哪些员工有奖金
select * from emp_xu where bonus is not null;


//查询薪水不在5000到10000的员工信息
select ename,salary
from emp_xu
where salary<5000 or salary>10000;


select ename,salary 
from emp_xu
where salary not between 5000 and 10000;


//查询不是20部门和30部门的员工
select ename,deptno from emp_xu
where deptno<>20 and deptno<>30;


等同于:
select ename,deptno from emp_xu
where deptno not in(20,30);//not in表示判断不在
列表项中,要全部满足即可。


修改:
select ename,deptno from emp_xu
where deptno not in(20,30,null);//未选定行
当使用not in时,列表项中如果有null情况,查询
不到任何满足要求的数据




select ename,deptno from emp_xu
where deptno<>20 and deptno<>30
or deptno is null;


select ename,deptno from emp_xu
where nvl(deptno,0)<>20 and nvl(deptno,0)<>30


2、查询语句中使用的函数
1)单行函数
每一行数据都会返回一个结果
//数字函数
a.round
round(数字,小数点后的位数)用于对数字进行四舍五入
//计算员工工资使用四舍五入函数
select salary*0.123456 s1,
round(salary*0.123456,2) s2,
round(salary*0.123456) s3
from emp_xu;//s1表示原样输出,s2表示四舍五入保留
2位小数,s3表示四舍五入保留到整数位


//round第二个参数是负数
select round(163.456,-2) from dual;
注意:如果round第二个参数是负数,则表示保留
到对应的整数位


b.trunc
trunc(数字,小数点后的位数):用于截取数据的,如果
没有第二个参数,默认是0
//计算员工的工资用截取函数
select salary*0.123456 s1,
trunc(salary*0.123456,2) s2,
trunc(salary*0.123456) s3
from emp_xu;//s1原样输出,s2截取到小数后面2位,
s3截取到整数位


//日期函数
a.sysdate
sysdate获取当前系统时间
select sysdate from dual;


b.months_between
months_between(d1,d2)计算两个日期之间相隔的月份
//计算员工入职多少个月
select trunc(months_between(sysdate,hiredate)) months 
from emp_xu;


c.add_months
add_months(date,number):在date时间上增加number
个月份
//计算3个月之后的时间
select add_months(sysdate,3) from dual;
//计算3个月之前的时间
select add_months(sysdate,-3) from dual;


d.last_day
last_day(date):计算当前月份的最后一天
select last_day(sysdate) from dual;


//转换函数
a.to_char
to_char(日期数据,日期格式):把日期数据按照指定
格式转换成字符数据
select to_char(sysdate,'yyyy-mm-dd') from dual;


select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;


常用日期格式:
yyyy 四位的年 如:2018
year 全拼的年 如:twenty eighteen
mm  两月的月份 如:05
month 全拼的月  如:May或5月(中文)
mon  简拼的月  如:May或5月
dd  两位的天 如:18
day 全拼的星期 如:Friday或星期五
dy  简拼的星期 如:Fri
am/pm 上午/下午
select to_char(sysdate,'year') from dual;


b.to_date
to_date(字符数据,日期格式):把字符数据按照指定
格式转换成日期数据
select to_date('2018-05-18','DD-MON-YY') 
from dual;//文字与格式字符串不匹配


select to_date('2018-05-18','yyyy-mm-dd') 
from dual;


//其他函数
a.coalesce
coalesce(参数列表):返回参数列表中第一个非空参数
值,参数列表中最后一个值通常为常量。
//计算员工的年终奖,要求bonus不为null,年终奖就
是bonus值;如果bonus为null,年终奖为salary*0.05;
如果bonus和salary都是null,年终奖为1000
select ename,bonus,salary,
coalesce(bonus,salary*0.05,1000) year_money
from emp_xu;


b.case..when
case..when表示数据中分支语句
//根据员工的职位计算加薪之后的薪水值。要求:
如果职位是Analyst加薪20%;如果职位是Programmer
加薪5%;如果职位是Clerk加薪2%;其他职位薪水不变
select ename,position,salary,
case position 
when 'Analyst' then salary*1.2
when 'Programmer' then salary*1.05
when 'Clerk' then salary*1.02
else salary end new_salary
from emp_xu;//case..when中间没有逗号,else相当于
java中case语句中的default,end是case语句中结束
标识


c.decode
decode作用类似于case..when
decode(判断条件,匹配1,值1,匹配2,值2...默认值)


select ename,position,salary,
decode(position,'Analyst',salary*1.2,
'Programmer',salary*1.05,
'Clerk',salary*1.02,salary) new_salary
from emp_xu;


2)组函数
多行数据返回一个结果
count():求记录数,能够处理任何数据类型,
忽略空值
//查询员工表中有多少记录
select count(empno) from emp_xu;//13


select count(position) from emp_xu;//12 忽略空值


select count(*) from emp_xu;// *不忽略空值的


sum():求和
avg():求平均
注意:只能处理数值类型


min():最小值
max():最大值
注意:能处理任何数据类型


//计算员工的薪水总和
select sum(salary) from emp_xu;


//计算员工的人数总和、薪水总和及平均薪水
select count(*),sum(salary),avg(salary)
from emp_xu;//avg忽略空值,数据不正确


select count(*),sum(salary),avg(nvl(salary,0))
from emp_xu;


//查询员工的最低、最高薪水
select min(salary),max(salary) from emp_xu;


总结:
count/sum/avg/min/max 如果函数中写列名默认是
忽略空值的,count(*)不忽略空值。sum/avg针对
数值类型的操作,min/max针对全部数据类型的操作。


3、排序
order by语句进行排序
将查询结果进行排序。(先有结果集再进行排序)
asc:表示升序,默认是升序
desc:表示降序


//查询员工的薪水按由低到高进行排序
select ename,salary 
from emp_xu
order by salary asc;//asc可以不写默认是升序




select ename,salary 
from emp_xu
order by salary desc;//降序
注意:排序时空值null被看做是最大值


//按照入职时间进行排序,入职时间越早的在前面
select ename,hiredate 
from emp_xu
order by hiredate;//升序


//按照部门升序排序,同一个部门按照薪水降序排序
select deptno,salary
from emp_xu
order by deptno asc,salary desc;//排序使用列名


select deptno d,salary s
from emp_xu
order by d asc,s desc;//排序使用列别名


select deptno,salary 
from emp_xu
order by 1 asc,2 desc;//排序使用数字表示的是结果
集的列数


总结:
排序语句(order by)的执行在SELECT之后,因此排序
可以使用结果集的列名、列别名、表达式、函数还有
数字。(数字表示按照结果集第几列排序,第一列是
用1)


4、分组
分组使用的是group by语句
group by column_name:按照指定的列进行分组


//查询每个部门的最高薪水和最低薪水
select deptno,max(salary),min(salary)
from emp_xu
where deptno is not null
group by deptno;


//查询每个部门的薪水总和和平均薪水,没有部门号
 的不算在内
select deptno,sum(salary),avg(nvl(salary,0))
from emp_xu
where deptno is not null
group by deptno;


//按照职位分组,每个职位的最高、最低薪水和人数
select position,max(salary),min(salary),
count(*)
from emp_xu
where position is not null
group by position;


select nvl(position,'No Position'),max(salary),min(salary),
count(*)
from emp_xu
group by nvl(position,'No Position');


注意:SELECT之后出现的列凡是没有被组函数包围的,
必须出现在group by语句中


having语句
having用于对分组后的数据进行过滤


注意:where语句是对表中的记录进行过滤,having
是对分组得到的数据进一步过滤


//查询平均薪水大于5000的部门号、平均薪水,要求
没有部门的不算在内
select deptno,avg(nvl(salary,0))
from emp_xu
where deptno is not null
group by deptno
having avg(nvl(salary,0))>5000;


select deptno,avg(nvl(salary,0)) avg_salary
from emp_xu
where deptno is not null
group by deptno
having avg_salary>5000;//avg_salary标识符无效,
不能直接使用列别名,having在select之前执行的


//查询薪水总和大于20000的部门号和薪水总和,没有
部门的不算在内
select deptno,sum(salary)
from emp_xu
where deptno is not null
group by deptno
having sum(salary)>20000;


//查询哪些职位的人数超过2个人,没有职位的不算在

select position,count(*)
from emp_xu
where position is not null
group by position
having count(*)>2;


//查询哪些职位的人数超过2个人,没有职位的不算
在内,求出每个职位的平均薪水,按照平均薪水进行
排序
select position,count(*),avg(nvl(salary,0))
from emp_xu
where position is not null
group by position
having count(*)>2
order by avg(nvl(salary,0));


select position,count(*),avg(nvl(salary,0)) avg_salary
from emp_xu
where position is not null
group by position
having count(*)>2
order by avg_salary;


select position,count(*),avg(nvl(salary,0)) 
from emp_xu
where position is not null
group by position
having count(*)>2
order by 3;


总结:基础查询语句
写法:select->from->where->group by->having->
 order by
 
执行:from->where->group by->having->select->
order by  


where语句和having语句的区别:
a.where过滤的是行记录,having过滤的是组
b.where可以跟任何列名、单行函数,不能用组函数
c.having只能包含group by之后的表达式或组函数
d.where执行在前的,having执行在后的
e.where和having都不能跟列别名



























猜你喜欢

转载自blog.csdn.net/little_____white/article/details/81052935