1 Oracle是什么
2 SQL语言的分类
3 查询语法
4 条件查询
4.1 对比运算符
4.2 逻辑运算符
5 函数
5.1 数值函数
5.2 字符函数
5.3 日期时间函数
5.4 转换函数
5.5 聚合函数
5.6 通用函数
6 分组查询
Oracle就是一个关系型数据库管理系统。
查询所有的员工
select * from emp;
查询员工的名字。如果有重复的,去重复
select distinct ename from emp;
查询员工的信息,给表一个别名(Oracle 表的别名不能加as)
select * from emp e;
查询员工的名字,显示的列名为“员工名字”(可加as也可不加)
select ename 员工名字 from emp ;
select ename as 员工名字 from emp ;
查询员工的名字,显示的列名为:员工 名字(有空格)(如果有特殊字符串的别名,使用”“)
select ename as "员工 名字" from emp ;
为什么需要别名?
答:在复杂查询时,经常会出现查询的结果作为表再次被查询,而这时查询的结果是没有表名
的,所以需要表的别名作为这个临时表的标识符。
select e.avgsal from (select avg(sal) as avgsal from emp) e;
查询员工名字中的第三个字母为A 的员工
select * from emp where ename like '__A%';
通配符:“_”:匹配一个字符;“%”:匹配不限个字符
查询名字有(_)的员工
注意:_是一个特殊的匹配字符。所以需要转义
escape 用于声明一个转义字符
select * from emp where ename like '%\_%' escape '\';
说明:声明的转义字符可以是任何字符,但建议使用\,因为\是编程语言都支持的转义字符
select * from emp where ename like '%c_%' escape 'c';
查询员工部门编号为10 或者20 的员工
select * from emp where deptno =10 or deptno =20;
也可以使用in:
select * from emp where deptno in (10,20);
查询工资在1600 与3000 之间的员工,包括上下限。
select * from emp where sal>=1600 and sal <=3000;
也可以使用(between .. and ..),注意:between and 是包括上下限的
select * from emp where sal between 1600 and 3000;
查询入职日期为1981-02-20 到1981-06-09的员工
注意Oracle 的时间日期,不能使用字符串。必须要转换成日期,或者时间
select * from emp where hiredate between to_date('1981-02-20','yyyy-mm-dd') and to_date('1981-06-09','yyyy-mm-dd');
查询奖金不为null 的员工信息
select * from emp where comm is not null;
查询员工的信息,按部门编号降序
select * from emp order by deptno desc;
查询员工的信息,按部门编号降序。部门为null的员工放在最后(默认是放在最前面的)
select * from emp order by deptno desc nulls last;
查询员工的信息,按工资升序
select * from emp order by sal asc;
查询员工的信息,按部门排序,升序。在每个部门的员工按工资降序
select * from emp order by deptno asc,sal desc;
名称 | 说明 |
---|---|
AND | 与,并且 |
OR | 或,或者 |
NOT | 非,不是 |
查询工资范围为1600 至3000 的员工,包括上下限
select * from emp where sal >= 1600 and sal<=3000;
查询员工的部门编号,为10,或者20 的员工
select * from emp where deptno =10 or deptno=20;
查询奖金不为null 的员工
select * from emp where comm is not null;
函数,就是Oracle 数据库提供给我们使用的内置函数。
四舍五入函数:round(p,s) p:原值;s:精度
注意:精度如果为正数,表示保留小数点后的多少位;如果是0,表示精确到个位;如果是负数表示精确整数部分。整数部分是从个位开始。
查询员工的平均工资
select avg(sal) from emp;
查询员工的平均工资,保留四位小数,四舍五入
select round(avg(sal),4) ,avg(sal) from emp;
查询员工的平均工资,保留两位小数,四舍五入
select round(avg(sal),2) ,avg(sal) from emp;
截取函数:trunc(p,s) p:原值;s:精度
注意:精度如果为正数,表示保留小数点后的多少位;如果是0,表示精确到个位;如果是负数表示精确整数部分。整数部分是从个位开始。
select trunc(avg(sal),4) ,avg(sal) from emp;
统计字符长度函数:length(p)
注意:不管中文还是英文,一个字符长度都为1
select ename, length(ename) from emp;
左填充函数:lpad(p,l,c) p:原值;l:设置长度;c:填充的字符
注意:中文的字符长度与编码集有关,如果是GBK 为2,如果是UTF-8 为3,英文的为1
设置一个字符串的长度为10,传入的值为abcd ,如果不够就左边填充*号
select lpad('abcd',10,'*') from dual;
设置一个字符串的长度为10,传入的值为’好好学习’,如果不够就左边填充*号
select lpad('好好学习',10,'*') from dual;
Oracle 数据库所有的查询都是使用SELECT关键字的。而SELECT 关键字的语法为: select * from <表名> 但有一些情况的查询是没有表的。如果函数,关键字,运算等。对于这些没有表的数据,使用一个内置临时表dual 来存储。我们将这个内置的临时表称为伪表。
查询当前日期信息
select sysdate from dual;
查询运算的结果
select 7+8,7-8,7/8,7*8 from dual;
月份增加函数:add_months(d,m) d:原值;m:月份数
select add_months(sysdate,3) from dual;
月份对比函数:months_between(d1,d2) 传入两个日期,返回两个日期的月份间隔
select ename,months_between(sysdate,hiredate) from emp;
提取当前日期的年
select extract(year from sysdate) from dual;
提取当前日期的月
select extract(month from sysdate) from dual;
提取当前日期的日
select extract(day from sysdate) from dual;
提取当前日期的时
select systimestamp from dual;
select extract(hour from to_timestamp('2017-11-13 12:11:22','yyyy-mm-dd hh:mi:ss') ) from dual;
提取当前日期的分
select extract(minute from to_timestamp('2017-11-13 12:11:22','yyyy-mm-dd hh:mi:ss') ) from dual;
提取当前日期的秒
select extract(minute from to_timestamp('2017-11-13 12:11:22','yyyy-mm-dd hh:mi:ss') ) from dual;
将字符串转日期
将字符串转成时间(如果是24小时制,在hh后面加24)
select to_timestamp('2017-11-13 13:11:22','yyyy-mm-dd hh24:mi:ss') from dual;
将其他格式的数据转字符串。p:原值;f:格式
查询员工的入职日期,使用显示的格式为yyyy/mm/dd
select ename,to_char(hiredate,'yyyy/mm/dd') from emp;
将878765454 数值转成$878,765,454
Oracle 规定,数值的占位符必须为9
select to_char(878765454,'$999,999,999') from dual;
将字符类型转成数值类型。p:原值;f:格式
select to_number('$878,765,454','$999,999,999')+1 from dual;
max() min() avg() count() sum()
空处理函数:nvl(p,n) p:原值;n:替换的值
如果p 的值为null,自动转成n 的值
select ename,comm,nvl(comm,0) from emp;
空处理函数:nvl2(p,n1,n2) p:原值;n1:不为null的值;n2:为null的值
如果p 值不为null,使用n1 的值,否则使用n2 的值
select ename,comm,nvl2(comm,comm,0) from emp;
查询员工的所有岗位
select job from emp group by job;
按岗位,求每一个岗位的平均工资,最大工资,最小工资
select job,avg(sal),max(sal),min(sal) from emp group by job;
按岗位,求每一个岗位的平均工资,最大工资,最小工资。岗位为null的记录不算
问题:使用having还是where?
select job,avg(sal),max(sal),min(sal) from emp where job is not null group by job;
select job,avg(sal),max(sal),min(sal) from emp group by job having job is not null;
以上两种情况均可。但是从性能方面考虑,如果分组先进行过滤,效率会更高!
查询语句关键字的优先级别:from>where>group by>having>select>order by
岗位为null这个条件在分组前就可以判断的,所以使用where效率会更高。
按岗位,求每一个岗位的平均工资,最大工资,最小工资,岗位为null 的记录不算,平均工资大于等于3000 的岗位。
select job,avg(sal),max(sal),min(sal) from emp where job is not null group by job having avg(sal)>=3000;
这里使用having。因为岗位的平均工资是在分组后才知道的值。如果是必须分组后才能获得的数据,要使用having过滤。
在Oracle中,返回的字段必须是分组的字段,非分组的字段必须要通过聚合函数返回。因为一个字段不可以接收多个值。
select job from emp group by job;