Oracle基础查询语法

1 Oracle是什么
2 SQL语言的分类
3 查询语法
4 条件查询
    4.1 对比运算符
    4.2 逻辑运算符
5 函数
    5.1 数值函数
    5.2 字符函数
    5.3 日期时间函数
    5.4 转换函数
    5.5 聚合函数
    5.6 通用函数
6 分组查询

1 Oracle是什么

Oracle就是一个关系型数据库管理系统。

数据库和数据库管理系统
  • 数据库就是存储数据的仓库,仅仅是一段数据文件而已。
  • 数据库管理系统就是管理数据库的软件(服务端的),如MySQL,Oracle…

2 SQL 语言的分类

  • DDL:数据定义语言(create,alter,drop)
  • DML:数操作语言(insert,delete,update)
  • DQL:数据查询语言(select)
  • DCL:数据控制语言(grant,revoke)
  • TCL:事务控制语言(commit,rollback)

3 查询语法

  • 查询所有的员工
    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;

4 条件查询

4.1 对比运算符

示例代码

  • 查询员工名字中的第三个字母为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;

4.2 逻辑运算符

名称 说明
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;

5 函数

函数,就是Oracle 数据库提供给我们使用的内置函数。

5.1 数值函数

round(p,s)

四舍五入函数: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)

截取函数:trunc(p,s) p:原值;s:精度

注意:精度如果为正数,表示保留小数点后的多少位;如果是0,表示精确到个位;如果是负数表示精确整数部分。整数部分是从个位开始。

  • 查询员工的平均工资,保留四位小数
    select trunc(avg(sal),4) ,avg(sal) from emp;

5.2 字符函数

length(p)

统计字符长度函数:length(p)

注意:不管中文还是英文,一个字符长度都为1

  • 查询员工的名字,以及计算员工名字的长度
    select ename, length(ename) from emp;

lpad(p,l,c)

左填充函数: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;

dual

Oracle 数据库所有的查询都是使用SELECT关键字的。而SELECT 关键字的语法为: select * from <表名> 但有一些情况的查询是没有表的。如果函数,关键字,运算等。对于这些没有表的数据,使用一个内置临时表dual 来存储。我们将这个内置的临时表称为伪表

  • 查询当前日期信息
    select sysdate from dual;

  • 查询运算的结果
    select 7+8,7-8,7/8,7*8 from dual;

5.3 日期时间函数

add_months(d,m)

月份增加函数:add_months(d,m) d:原值;m:月份数

  • 计算当前日期+3 个月的日期
    select add_months(sysdate,3) from dual;

months_between(d1,d2)

月份对比函数:months_between(d1,d2) 传入两个日期,返回两个日期的月份间隔

  • 查询员工入职到现在,一共工作了多少个月.不够一个月的忽略
    select ename,months_between(sysdate,hiredate) from emp;

extract(year|month|day|hour|minute|second from <日期|时间>)

  • 提取当前日期的年
    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;

5.4 转换函数

to_date()

将字符串转日期

to_timestamp()

将字符串转成时间(如果是24小时制,在hh后面加24)
select to_timestamp('2017-11-13 13:11:22','yyyy-mm-dd hh24:mi:ss') from dual;

to_char(p,f)

将其他格式的数据转字符串。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;

to_number(p,f)

将字符类型转成数值类型。p:原值;f:格式
select to_number('$878,765,454','$999,999,999')+1 from dual;

5.5 聚合函数

max() min() avg() count() sum()

5.6 通用函数

nvl(p,n)

空处理函数:nvl(p,n) p:原值;n:替换的值

如果p 的值为null,自动转成n 的值

  • 查询员工的信息,如果员工的奖金为null,显示0
    select ename,comm,nvl(comm,0) from emp;

nvl2(p,n1,n2)

空处理函数:nvl2(p,n1,n2) p:原值;n1:不为null的值;n2:为null的值

如果p 值不为null,使用n1 的值,否则使用n2 的值

  • 查询员工的信息,如果员工的奖金为null,显示0。使用nvl2 实现
    select ename,comm,nvl2(comm,comm,0) from emp;

6 分组查询

  • 查询员工的所有岗位
    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;

你可能感兴趣的:(Oracle基础查询语法)