码迷,mamicode.com
首页 > 数据库 > 详细

数据库——内置函数

时间:2018-08-10 12:28:17      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:love   英文   字符   sum   9.png   prim   div   cin   格式   

需要执行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子句之前

 

数据库——内置函数

标签:love   英文   字符   sum   9.png   prim   div   cin   格式   

原文地址:https://www.cnblogs.com/lyxcode/p/9454257.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!