需要执行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***
l、instr(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 |
年的最后3、2、1个数字 |
017、17、7 |
Y,YYY |
年,在指定位置带逗号 |
2,017 |
YEAR |
拼写年 |
TWENTY SEVENTEEN |
BC、AD |
根据日期自动设置为BC、AD |
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、nvl2或coalesce函数用一个值代替空值;
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——3,student表中有一条数据中的name为空
select count(distinct name) from student——2,student表中有一条数据中的name为空,有两条数据name的值重复
select count(nvl(name,‘ ‘)) from student——4, 将name为空的值置为1个空格
select count(*) from student——4,*不会忽略空值的行
stddev(input):求标准差
variance(input):求方差
注意:count、max和min组函数操作的数据的数据类型可以是char、varchar2、number或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子句之前
原文地址:https://www.cnblogs.com/lyxcode/p/9454257.html