五月:Oracle数据库总结(二)
一、排序 Order by
语法:order by 列名1,列名2 asc
---------升序排列,如果不加排列规则的默认排序方法,先以列名1排序,再以列名2排序,可以只写一个列名
order by 列名1,列名2 desc
---------降序排列,先以列名1排序,再以列名2排序,可以只写一个列名
--书写顺序
select 需要展示的列名
from 表名
where 条件
order by 用来排序的列名
二、哑表
哑表:oracle 数据库内部提供的一个用于测试的只有一行一列的哑表,用于我们进行语法测试,叫做 dual 表
下面是获取系统时间语句的测试:
--获取当前系统时间 年月日 时分秒
select sysdate from dual
--获取当前系统时间 年月日 时分秒 毫秒
select systimestamp from dual
三、单行函数
函数的三要素:函数名、参数、返回值
具体语句:
--1.length 求长度
select length('xxx') from dual
--常用于(查询名字长度超过5个字符的员工)
select * from employees where length(first_name) > 5
--2.mod 求余数 (上次说不能用 % 求余数/取模)
select mod(10,3) from dual
--3.nvl 空值处理
select nvl(5,55) from dual --输出结果 5
select nvl(null,55) from duall --输出结果 55
--4.to_char 将数据转换成字符串的格式,最常用的是将日期类型换成字符串
-- oracle 数据格式化处理:yyyy-mm-dd hh:m1:ss
-- yyyy-mm-dd hh24:m1:ss
-- (因为oracle不区分大小写,所以注意月份和分钟的区别)
-- java 数据格式处理:yyyy-MM-dd hh:mm:ss (java区分大小写,MM和mm可以代表不同的含义)
select sysdate from dual
select to_char(sysdate,'yyyy-mm-dd') from dual
--5.to_date 将date对象转化成字符串
select sysdate from dual
select to_date('2020-02-20','yyyy-mm-dd') from dual
--注意:需要比较时间时,需要转化为同种类型再进行比较
四、组函数
组函数也可以叫做聚合函数,组函数和单行哈数的区别是,单行函数不会对查询结果的函数长生影响
可以通过组函数处理,多行函数会变成一行
常用的组函数:
max() --求最大值
min() --求最小值
avg() --求平均值
sum() --求和
count() --求总行数
select max(salary) from employees -- 查询最高的工资
select min(salary) from employees -- 查询最低的工资
select avg(salary) from employees -- 查询平均工资
select sum(salary) from employees -- 求和
select count(*) from employees -- 求总行数
--注意
五、分组 group by
通过 group by 关键词指定根据哪些列进行分组,可以将相同的数据合并成一行(组),在分组之后可以配合组函数进行组内数据统计
--统计每个部门下的员工人数
select department_id ,count(*)
from employees
where department_id is not null -- 有一个员工的没有部门编号,给排除掉
group by department_id
六、 Having
和group by 配合使用,对分组之后的数据进行筛选
having 和 where 都有筛选的功能, where 是在分组之前,having是在分组之后
select department_id ,count(*) c
from employees
group by department_id
having count(*) > 30
七、 SQL的书写顺序、执行顺序
—— 书写顺序
select 列名1,列名2
from 表名
where 筛选条件
group by 列名
having 筛选条件
order by 列名
——执行顺序
⑤select 列名1,列名2
①from 表名
②where 筛选条件
③group by 列名
④having 筛选条件
⑥order by 列名
八、伪列
建表的时候并不存在,通过查询可以获取的列,在oracle中称之为伪列
oracle中的两个伪列:rowid ,rownum
rowid:可以表示一行数据在硬盘上的物理位置
——rowid
select rowid,t1.* from employees t1
-- 通过rowid可以直接定位硬盘数据,效率高,可读性差 select * from employees t1 where t1.rowid = 'AAAC9EAAEAAAABXAAA'
-- 其实通过员工编号(主键),底层会用到rowid,效率也很高,常用 select * from employees t1 where t1.employee_id = 100
——rownum
rownum这个伪列可以给查询结果进行编号,从1开始,依次递增
rownum的应用场景:查询前n条
select * from 表 where rownum <= n
rownum可以出现的位置:
1.select 语句里
2.where 条件里
九、子查询(嵌套查询)
一个SQL语句的查询结果可以作为另外一个SQl语句中的一部分
1、子查询结果是一行一列
-- 需求:查询工资高于公司平均工资的员工信息
select * from employees where salary > (
select avg(salary) from employees
)
2、子查询结果是多行一列
使用 in 关键字,由于内层查询会返回多行
select * from employees where salary in (
select salary from employees where first_name = 'Steven'
)
3、子查询结果是多行多列
如果子查询结果是多行多列,可以将它当做一张表进行查询
这个表只存在于内存缓冲区中
-- 将一个SQL语句的查询结果,当成一张虚拟表看待
select * from (
select * from employees
where salary > 13000
) t1
——分页查询
何为分页查询:表中数据量比较大,不能一次查询展示,需要通过分页 完成
分页查询 = rownum + 子查询
--查询第6到10行
select * from (
select rownum rn,t1.*
from employees t1
)t2 where t2.rn >= 6 and t2.rn <= 10