zoukankan      html  css  js  c++  java
  • 数据库——内置函数

    需要执行SQL语句

     

    create table student(
    id number(1,0) constraint studnet_id primary key,
    name varchar2(8),
    sex char(2) default '' ,
    age number(3) default 0
    )
    
    insert into student values ('1','王明','',18);
    insert into student values ('2','孙丽','',17);
    insert into student values ('3','王明','',27);
    insert into student (id,sex,age) values ('4','',27);
    commit;

    SQL函数概述

    数据库中的函数与Java中的函数类似,都是完成一定功能的代码的集合。根据函数操作数据行数可将SQL函数分为单行函数和多行函数:

    单行函数仅对条数据中的列进行操作并且返回一个结果,例如:select length('lanqiao') from dual——获取字符串字符个数

    多行函数可以操作成组的条数据,每组返回一个结果,所以多行函数又称之为函数,例如:

    select sex,count(id) from student group by sex——获取student表中男女人数

    单行函数

    单行函数根据操作对象的不同分为字符函数、数字函数、转换函数、日期函数和通用函数。

    1、字符函数

    a、lower(input):将大写字符转换为小写,例如:select lower('AbC') from dual——> abc

    b、upper(input):将小写字符转换为大写,例如:select upper('AbC') from dual——>ABC

    c、initcap(input):将每个单词首字母大写,例如:select initcap('i love you') from dual——> I Love You

    d、concat(input1,input2):连接两个字符串,等价于连接运算符||,例如:select concat('lan','qiao') from dual——> lanqiao

    e、substr(input,m[,n]):从m(m>=1)位置开始截取字符串,如果n被忽略则取到字符串结尾,否则取n个字符长度,例如:

     select substr('OracleDB',1) from dual——>OracleDB        select substr('OracleDB',1,6) from dual——>Oracle

    f、lengthc(input):获取以字符为单位的字符串长度,例如:select lengthc('lan') from dual——> 4

    g、lengthb(input):获取以字节为单位的字符串长度,例如:select lengthb('lan') from dual——> 5(:一个汉字2字节)

    h、length(input):获取字符串的字符数,等效于lengthc,例如:select length('lan') from dual——> 4

    i、replace(input,char1,char2):将字符串中的char1字符串替换为char2,例如:select replace('AbAcA','A','a') from dual——> abaca

    j、lpad(input,n,char):使用给定字符串从input边进行填充以使旧字符串的长度达到n,例如:select lpad('Oracle',9,'*') from dual——> ***Oracle

    k、rpad(input,n,char):使用给定字符串从input右边进行填充以使旧字符串的长度达到n,例如:select rpad('Oracle',9,'**') from dual——> Oracle***

    linstr(input,char[,m][,n]) :获取char字符串在input字符串中的位置,m用于指定查找的开始位置,n用于指定char字符串第n次出现。m与n的默认值为1,即从input字符串开头开始查找,获取char字符串第一次出现的位置,例如:

    select instr('DBOracleDB','DB') from dual——>1(从DBOracleDB字符串开头查找DB第一次出现的位置

    select instr('DBOracleDB','DB',3) from dual——>9(从DBOracleDB字符串第3个字符查找DB第一次出现的位置)  

    select instr('DBOracleDB','DB',1,2) from dual——>9(从DBOracleDB字符串第1个字符查找DB第二次出现的位置) 

    2、数字函数

    a、round(input[,n]):将数值四舍五入,参数n表示有效数位,如果忽略则无小数位部分,例如:

    select round(1.945) from dual——2                         select round(1.945,2) from dual——1.95

    b、trunc(input[,n]):将数值截断,参数n表示有效数位,如果忽略则无小数位部分,例如:

    select trunc(1.945) from dual——1                         select trunc(1.945,2) from dual——1.94

    c、mod(m,n):返回m除以n的余数,将m与n中间逗号理解成Java中%即可,例如:select mod(1,3) from dual——1

    3、转换函数

    a、to_number(char[,'fmt']):将字符串类型的数据转换成数字类型的数据,

    b、to_char(input[,'fmt']):将日期数字类型的数据转换为字符串

    将日期类型的数据转换为字符串

    日期格式元素

    格式元素

    说明

    结果

    CC

    世纪

    21

    YYYY

    2017

    YYY、YY、Y

    年的最后321数字

    017177

    Y,YYY

    年,在指定位置带逗号

    2,017

    YEAR

    拼写年

    TWENTY SEVENTEEN

    BC、AD

    根据日期自动设置为BCAD

    AD

    B.C.A.D.

    根据日期自动设置为B.C.A.D.

    A.D.

    Q

    季度

    3

    MM

    月:两位数字值

    06

    MONTH

    月份的全拼,右端补齐空格,总长度为9字符

    JUNE

    Mon

    月份的前3字母,首字母大写

    Jun

               

            时间格式元素

           

    e.g

    select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual

    fm、th和sp的使用

    fm:

    i、删除填补的空格,例如:select lengthb(to_char(sysdate,'fmmonth')) from dual

    ii、删除前导0,例如:select to_char(sysdate,'fmmm') from dual

    th:表示序数,例如:select to_char(sysdate,'Qth') from dual

    sp:将数字变为英文,例如:select to_char(sysdate,'Qsp') from dual

    注意:为了达到更好的输出效果,可以在格式模板中直接使用标点符号作为各元素之间的间隔,还可以在格式模板中增加字符串,但是该字符串需要用双引号引起来,例如

    select to_char(sysdate,'cc"世纪" yyyy-mm-dd hh24:mi:ss') from dual

    将数字类型的数据转换为字符串

    c、to_date(char[,'fmt']):将字符类型转为日期类型

    fx:用于限制所传入的日期字符串必须和格式模板精确匹配(包括标点符号和空格)

    select to_date('09 03,2006','fxMM DD,YYYY') from dual;--去掉fx才可以执行

    select to_date('9 3,2006','fxMM DD,YYYY') from dual;-- 去掉fx才可以执行

    select to_date('09 03,2006','fxMM DD;YYYY') from dual;--可以执行

    4、日期函数

    a、months_between(date1,date2):返回两个日期之间的月数,例如

    select months_between(to_date('2017-3-21','yyyy-mm-dd'), to_date('2017-1-21','yyyy-mm-dd')) from dual——2

    5、通用函数

    a、nvl(expr,value):如果expr为空,则返回value的值;否则返回expr

    b、nvl2(expr,value1,value2):如果expr1为非空,则返回value1的值,否则返回value2的值;

    许小力问题:

    select nvl(sysdate,1)from dual

    select nvl('1',sysdate)from dual

    select nvl('aa',1)from dual

    select nvl2('aa',1,sysdate)from dual

    c、coalesce(expr1, expr2,.. exprn):如果expr1为非空,则返回expr1的值;如果expr1为空,则返回expr2的值,依次类推,如果前面的表达式都为空,则返回exprn的值。

    6、其它

    a、decode (条件,1,返回值1,2,返回值2,...n,返回值n,默认值)

    create table user_info(
    name varchar2(8),
    sex number(1)
    )
    insert into user_info(name,sex) values ('张三',1); 
    insert into user_info(name,sex) values ('李四',0); 
    insert into user_info(name,sex) values ('王五',2); 
    commit;
    select name,decode(sex,0,'',1,'','其它') sex_name from user_info

    多行函数

    多行函数又称组函数,这类函数用于对行数据进行操作,在使用时需要注意一下几点:

    1、组函数忽略空值——可以通过nvl、nvl2coalesce函数用一个值代替空值;

    2、组函数默认考虑重复值——可以通过distinct关键字使组函数不考虑重复值;

            常用组函数:

    avg(input):求平均值,例如:select avg(age) from student——计算学生平均年龄,包括重复的年龄

    max(input):求最大值,例如:select max(age) from student——获取学生表中最大年龄

    min(input):求最小值,例如:select min(age) from student——获取学生表中最小年龄

    sum(input):求和,例如:select sum(age) from student——计算学生表中年龄之和

    count(*|input):求行数,如果使用*则不会忽略空值的行,例如:

    select count(name) from student——3student表中有一条数据中的name为空  

    select count(distinct name) from student——2student表中有一条数据中的name为空,有两条数据name的值重复

    select count(nvl(name,' ')) from student——4, name为空的值置为1个空格

    select count(*) from student——4,*不会忽略空值的行

    stddev(input):求标准差

    variance(input):求方差

    注意:count、max和min组函数操作的数据的数据类型可以是char、varchar2number或date,但不能为clob;avg、sum、stddev和varlance仅能用在数字类型的数据上。

    group by:

    group by用于将表中数据划分为若干个组,group by后面用于指定分组的依据,例如:

    select sex,count(id) from student group by sex——将student表学生按照sex分组,然后统计每组中的人数

    注意:

    a、只有对应相同的多行数据才会归为一组,如下:

    create table fruit(
           name varchar2(4),
           address varchar2(12),
           type_name varchar2(6)
    )
    
    insert into fruit values ('香蕉','广西','大香蕉');
    insert into fruit values ('苹果','山东','红富士');
    insert into fruit values ('香蕉','菲律宾','小香蕉');--帝王蕉比较小
    insert into fruit values ('苹果','山西','青苹果');
    insert into fruit values ('苹果','山西','国光');

       执行上面SQL语句后表中数据如下:

     

       i、执行select name from fruit group by name SQL语句,其查询结果如下:

     

       ii、执行select name,address from fruit group by name,address SQL语句,其查询结果如下:

     

    b、如果select语句中使用group by进行了分组,则select子句中只可以有组函数分组字段,不能含有其他字段,否则SQL语句报错; 

    c、如果group by子句后面跟着order by子句,则order by子句用于排序的字段必须是组函数或分组字段;

    d、如果select语句中含有where、order by,那么group by需放在where之后order by之前,即先获取符合where条件的“有效”数据,再依据group by对数据进行分组,最后再排序; 

        having:

    where后面不能使用多行函数,只能使用单行函数和字段having关键字弥补了这一不足having子句用于对分组结果进行约束,例如:

    select name from student group by name having count(name)>1——查询哪些名字重名了

    注意:

    a、having子句必须和group by子句一起使用,否则出现如下错误,例如:

       select name from student having count(name)>1

       

    b、having子句必须放在group by子句之后,order by子句之前

  • 相关阅读:
    003_&#x和ASCII的关系及URL中的中文转义
    001_机器学习的Hello world之MNIST手写数字识别模型
    Appnium安装-Mac平台
    Code Review 规范
    Spring AOP-xml配置
    JTLParser-linux上jmeter的jtl文件二次分析
    测试覆盖率Emma工具使用
    jmeter之java请求
    jmeter测试总结
    jstat监控gc情况
  • 原文地址:https://www.cnblogs.com/lyxcode/p/9454257.html
Copyright © 2011-2022 走看看