Oracle入门2

单表查询

# 查询一个表的所有字段
select * from 表名;
# 指定字段查询
select 字段名(,连接) from 表名;
# 可以在指定字典查询时,使用||进行拼接
select 字段名||字段名 from 表名;
# 字段的值在显示的时候可以进行简单的数学运算(不局限于*)
select 字段名*n from 表名;
# 可以使用别名,来修改字段的显示数据(只修改显示结果,字段名称不会因为查询而改变)
select 字段名 as 别名 from 表名;


# where条件筛选
# Oracle中所有的系统关键字,字段名,表名,在编译的时候,都会被强制转化为大写
# 但是字段的值不会,严格区分大小写
select * from 表名 where 字段名=字段值;
# and 并列关系
select * from 表名 where 字段名>n and 字段名<m; # 查询字段值在n-m之间的信息
# or 或
select * from 表名 where 字段名>n or 字段名=m; # 查询字段值大于n或者=m的信息
# not 取反
select * from 表名 where not 字段名=n;# 查询字段名不为n的信息
# between A and B 闭区间
select * from 表名 where 字段名 between A and B; # 查询字段名在A和B之间的信息

空值处理

​ 如果某一个字段对应的字段值为空,可以指定值为null的数据如何显示

# 查询字段值为空的信息
select * from 表名 where 字段值 is null;
# 查询字段值不为空的信息
select * from 表名 where 字段值 is not null;

# nvl函数,可以对空值的显示进行处理
select 字段1,字段2,nvl(字段3,0) from 表名; 
# 查询字段1,2,3的信息,字段3的信息如果为空就显示为0

# nvl2函数
select 字段1,字段2,nvl2(字段3,a,n) from 表名; 
# 查询字段1,2,3的信息,字段3的信息如果为空则显示n,如果非空则显示a 

聚合函数

​ 对多行数据进行统计的韩式,如果没有指定数据统计的范围则默认统计所有数据

# min 统计最小
select min(字段) from 表名;
# max 统计最大
select max(字段) from 表名;
# avg 统计平均 (floor 对小数进行向下取整)
select floor(avg(字段)) from 表名; # 查询字段的平均值,并向下取整
# sum 统计和
select sum(字段) from 表名;
# count 统计数量 (统计的是非空字段值的数量)
select count(字段) from 表名;
# 大部分用于统计指定数据的行数
# count(*)是sql语句的标准用法
select count(*) from 表名;

group by分组

​ 根据 group by 后面的字段将所有字段值相同的数据进行分组

# 将字段2的值相同的数据归为一组,查询每一组字段1的平均值
select avg(字段1) from 表名 group by 字段2;
# 不局限于求平均
select max(字段1),min(字段1),sum(字段1) from 表名 group by 字段2;
# 数据在被分组之后,求从行数据编程组数据,不可以再查询子数据
# 在使用 group by 之后,select之后,只可以出现杯分组的字段本身和族中聚合函数

# group by 可以基于多个字段进行分组
select count(*) from 表名 group by 字段1,字段2;

条件筛选(having)

​ having用于筛选分组之后的数据(组数据),where用于筛选分组之前的数据(行数据)

# 对字段2的值为1的数据进行筛选,并对字段4的值大于20的数据进行分组,显示这些组的字段1的平均值
select avg(字段1) from 表名 where 字段2=1 group by 字段3 having 字段4>20;

排序(order by)

​ 按照指定的字段值,对数据进行排序

# 根据字段1进行升序排序,asc可以忽略
select * from 表名 order by 字段1 asc;
# 根据字段1进行降序排序,desc不可以忽略
select * from 表名 order by 字段1 desc;

# 多条件排序
# 排序的时候,必须要对排序字段的空值进行处理,因为控制在排序时,会默认无穷大
# 根据字段1和字段2进行降序排序,并且处理字段2出现空值的情况(遇到空值置0)
select * from 表名 order by 字段1,nvl(字段2,0) desc;

distinct 去重处理

select distinct 字段1 from 表名 order by 字段2;
# 对字段2进行分组,并根据字段2进行去重处理

sql语句的执行顺序

from -> where -> group by -> having -> distinct -> select -> order by

不相关子查询

​ 将一条语句的查询结果,作为另一条语句的查询条件或者是数据来源

​ 子查询不需要外部查询提供任何条件就可以独立运行,外部查询会等待子查询执行完成之后,再执行

select * from 表名 where 字段1>(select * from 表名 where 字段2=n);
# 查询字段1的值大于字段2等于n的数据的字段1的值的信息

# 不相关子查询可以进行简单的跨表查询
# 如果可以确定子查询的结果为唯一值,可以使用等号
# 如果不可以,则需要使用in
select * from 表2 where 字段2-1 in
(select 字段1-1 from 表1 where 字段1-2=n);
#先查询表1中字段1-2等于n的数据的字段1-1的值,然后再根据表2中字段2-1在刚才查找到的字段1-1中的信息

别名的使用

​ 别名除了在字段后可以使用之外,还可以在其他地方使用,但是使用的时候,必须注意辨明的定义必须在别名的使用之前。

​ 别名的使用于sql语句的执行顺序息息相关

# 查询表1 中的字段1和字段2的平均值,并且按照平均值降序排序(给平均值起别名)
select 字段1,avg(字段2) as 别名 from 表1 order by 别名 desc;

模糊查询

​ 根据匹配情况进行查询

特殊符号 作用
% 表示匹配任意个任意字符
_ 表示匹配单个任意字符
# 查询字段1以a开头的信息
select * from 表1 where 字段1 like 'a%';
# 查询字段1第二个字母为a的信息
select * from 表1 where 字段1 like '_a%';
# 查询字段1第二个字母为a 且倒数第二个字母为b 的信息
select * from 表1 where 字段1 like '_a%b_';

常用的单行函数

​ dual 虚表:专门用来显示数据的,本身并没有数据

# 查看当前时间(sysdate)
select sysdate from dual;
# 查看日期
# add_months的参数也可以是我们表中的日期类型的字段,也可以时我们使用to_date函数转换所生成的日期类型数据
select sysdate,add_months(sysdate,1) from dual;
# 查询2044年1月1日之后100个月的日期
select add_months(to_date('2044-01-01','YYYY-MM-DD'),100) from dual;
# last_day 获取指定日期所在月的最后一天
select last_day(sysdate) from dual;

# 例子:
# emp表中有一个字段,名为入职时间(hierdate),计算emp表中所有员工的工龄
# 1.日期类型的数据是可以直接相减,得到的时天数,除以365即可得到年数
select ename,floor((sysdate-firedate)/365) as 工龄 from emp;
# 2.使用to_char函数,将日期类型的数据转换为字符串类型
#    在Oracle中如果字符串时由纯数字组成的可以直接进行计算
select ename,to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY') as 工龄 from emp;
# 3.使用extract函数,从指定日期中提取年份,也可以提取日,月,时,分,秒
select ename,extract(year from sysdate)-extract(year from firedate) as 工龄 from emp;

minus union 去交集和取并集

# 如果需要做union并集的查询结果,并不是来自于同一张表
# 需要保证两张表的字段数量,字段数据类型相同即可
# 最终显示的查询结果的字段名称以第一个表的字段名称为标准
select * from 表1 union select * from 表2; # 表1中添加表2有表1没有的数据,输出所有数据(表1)

select * from 表1 minus select * from 表2; # 表1中去掉表2有表1也有的数据,输出剩余数据(表1)

热门相关:无量真仙   天启预报   天启预报   刺客之王   大神你人设崩了