当前位置:首页 > 数据库 > 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 isnull-- 空判断where  age notin (20,23,...) --范围判断where age between20and25--区间判断between‘A‘ and ‘Z‘where  sname notlike%江%--sname like ‘江%‘  -- ‘江%‘ 以江开头 ‘%江‘ 以江结尾 ‘%江%‘ 包含江--模糊查询 _一个下划线表示一个位置orderby  age -- asc 升序 desc降序 默认升序selectdistinct age,sex from t_student   --distinct 去掉重复记录


统计函数:
  count:统计条数

            select
            count(*) from t_student
    selectcount(id) from t_student 
    selectcount(classid) from t_student 
    -- 统计的是该列中非空的记录的个数selectcount(1) from t_student;
    select id,sname,age,sex,classid,1,2,3from t_student
     sum:求和
    selectsum(age) from t_student;
     min:取最小值
    selectmin(age) from t_student;
     max:取最大值
    selectmax(age) from t_student;
     avg:取平均值
    selectavg(age) from t_student;
     
     selectsum(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)
    from t_student
    groupby classid,sex
    havingcount(1) >1-- 分组后的条件select classid,sex,count(1)
    from t_student
    where age >20-- 分组之前加条件groupby 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

            select
             sysdate
       ,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语句
    
            select
            
    id,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.*,rownum
    from 
    (select t.*,rownum num from t_student t) t1 --先查询所有的数据和行号where t1.num >=5and t1.num <=10--再从中选出想要的部分select t2.*,rownum
    from 
    (select t1.* ,rownum num from t_student t1 where rownum <=10) t2 --先取上限的数据及行号where t2.num >=5--再取下限的数据

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

            select t.*,
            casewhen age <=20then1else0end "21以下"
            ,casewhen age >20and age <26then1else0end "21-25"
            ,casewhen age >=26then1else0end "26以上"
        from t_student t
        
        selectsum(casewhen age <=20then1else0end ) "21以下"
            ,sum(casewhen age >20and age <26then1else0end) "21-25"
            ,sum(casewhen age >=26then1else0end )"26以上"
        from t_student t
        
        selectcount(casewhen age <=20then1elsenullend ) "21以下"
            ,count(casewhen age >20and age <26then1elsenullend) "21-25"
            ,count(casewhen age >=26then1elsenullend )"26以上"
        from t_student t

 

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


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!