oracle 查看表函数,Oracle之单表查询及常用函数

1.语法:

select 字段列表

from 表名

[where 查询条件]

[group by 分组]

[having 分组条件]

[order by 排序]

select *代表查询所有的字段select id as "编号",sname 学生姓名,age "【年龄】" --as 之后是别名 也可以直接省略

select t.*

from t_student t --给表取别名

where classid is null --空判断

where age not in (20,23,...) --范围判断

where age between 20 and 25 --区间判断between‘A‘ and ‘Z‘

where sname not like ‘%江%‘ --sname like ‘江%‘ -- ‘江%‘ 以江开头 ‘%江‘ 以江结尾 ‘%江%‘ 包含江

--模糊查询 _一个下划线表示一个位置

order by age --asc 升序 desc降序 默认升序

select distinct age,sex from t_student --distinct 去掉重复记录

统计函数:

count:统计条数

select count(*) fromt_studentselect count(id) fromt_studentselect count(classid) fromt_student--统计的是该列中非空的记录的个数

select count(1) fromt_student;select id,sname,age,sex,classid,1,2,3 fromt_studentsum:求和select sum(age) fromt_student;min:取最小值select min(age) fromt_student;max:取最大值select max(age) fromt_student;avg:取平均值select avg(age) fromt_student;select sum(age),min(age),max(age),avg(age) from t_student;

count(1)与count(*)比较:

如果你的数据表没有主键,那么count(1)比count(*)快

如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快

如果你的表只有一个字段的话那count(*)就是最快的啦

count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。

如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。

因为count(*),自动会优化指定到那一个字段。所以没必要去count(?),用count(*),sql会帮你完成优化的

count详解:

count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入).

distinct 列名,得到的结果将是除去值为null和重复数据后的结果

group by :分组函数

select age,sex

from t_student

group by age,sex

--注意:分组函数中的 字段列表只能出现分组的字段和统计函数

-- 分组函数在没有统计函数使用的时候作用和 distinct 是一样的

select sex,count(sex)

from t_student

group by sex

--分组函数【聚合函数】在没有和 group by 一块使用的时候统计的是查询的所有的数据

--如果和 group by 一块使用的化,那么统计的是分组后的各组数据

select classid,sex,count(1)fromt_studentgroup byclassid,sexhaving count(1) > 1 --分组后的条件

select classid,sex,count(1)fromt_studentwhere age > 20 --分组之前加条件

group by classid,sex

where 和 having 的区别

where 只能跟在 from 后面 表示对查询的数据源过滤

having 只能出现在 group by 后面,对分组后的数据进行过滤,

常用函数:

concat:连接函数

select concat(id,sname),length(sname) from t_student

日期函数:

字符串转date: to_date

update t_student set birth=to_date(‘1990-01-01‘,‘yyyy-mm-dd‘)

date转字符串: to_char

selectsysdate

,to_char(sysdate,‘yyyy-mm-dd hh:mi:ss‘)--在数据库中是HH24 mi

,to_char(sysdate,‘yyyy-mm-dd‘)

,to_char(sysdate,‘yyyy-mm‘)

,to_char(sysdate,‘yyyy‘)from dual;

months_between(sysdate,date);--两者时间的月份数

add_months:在当前时间的基础上增加月份数

select add_months(sysdate,12) from dual;

last_day():返回指定日期的当月的最后一天

select last_day(sysdate) from dual;

extract:截取日期指定部分的内容

select extract(DAY from sysdate) from dual; --dual是一个系统自带的虚表

nvl(column,value);如果查询的字段为null,就用默认值填充

select id,sname,sex,nvl(sex,‘哈哈‘) from t_student

decode:类似于Java中的if语句selectid,sname,sex

,decode(sex,1,‘男‘) --if(sex == 1){男}

,decode(sex,1,‘男‘,2,‘女‘) --if(){}else if(){}

,decode(sex,1,‘男‘,2,‘女‘,‘不详‘)--if(){}else if(){}else{}

from t_student

rowid:行id,数据存储的位置,唯一

rownum:行号,系统自动维护的,从1开始自增,有1才有2

select t.*,rownum from t_student t

查询出学生表中前5条的学生记录

select t.*,rownum from t_student t where rownum <=5

查询出学生表中第5条到第10条的记录

select t.*,rownum from t_student t where rownum >=5 and rownum <=10 ---这是错误的写法

---分页查询的实现方式(在Oracle中要这么实现)

select t1.*,rownumfrom(select t.*,rownum num from t_student t) t1 --先查询所有的数据和行号

where t1.num >= 5 and t1.num <=10 --再从中选出想要的部分

select t2.*,rownumfrom(select t1.* ,rownum num from t_student t1 where rownum <=10) t2 --先取上限的数据及行号

where t2.num >=5 --再取下限的数据

case的使用

查询出学生表中年龄在【20岁以下】【21-25】【26以上】分别有多少人

select t.*,case when age <= 20 then 1 else 0 end"21以下"

,case when age >20 and age <26 then 1 else 0 end "21-25"

,case when age >= 26 then 1 else 0 end"26以上"fromt_student tselect

sum(case when age <= 20 then 1 else 0 end) "21以下"

,sum(case when age >20 and age <26 then 1 else 0 end) "21-25"

,sum(case when age >= 26 then 1 else 0 end)"26以上"fromt_student tselect

count(case when age <= 20 then 1 else null end) "21以下"

,count(case when age >20 and age <26 then 1 else null end) "21-25"

,count(case when age >= 26 then 1 else null end)"26以上"from t_student t

原文:https://www.cnblogs.com/lrxvx/p/9413259.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值