Oracle函数练习_Joker


测试数据

 1 create table info2
 2 (
 3     id varchar2(32) primary key,
 4     name varchar2(20) not null,
 5     gender varchar2(20) not null,
 6     clazz varchar2(20),
 7     score number(11),
 8     bir date
 9 )
10 
11 insert into info2 values(sys_guid(),'余胜军','','s1t80',92,date'1992-01-20');
12 insert into info2 values(sys_guid(),'黄辉','','s1t80',91,date'1986-09-01');
13 insert into info2 values(sys_guid(),'汪保国','','s1t80',78,date'1996-01-24');
14 insert into info2 values(sys_guid(),'商宇彤','','s1t80',98,date'1994-05-17');
15 insert into info2 values(sys_guid(),'应明珠','','s1t81',95,date'1997-06-15');
16 insert into info2 values(sys_guid(),'廖一帆','','s1t81',52,date'1993-09-12');
17 insert into info2 values(sys_guid(),'陈杰','','s1t80',83,date'1993-08-08');
18 insert into info2 values(sys_guid(),'胡文鑫','','s1t81',82,date'1991-07-05');
19 insert into info2 values(sys_guid(),'刘坤','','s1t80',53,date'1996-04-01');
20 insert into info2 values(sys_guid(),'蒋文哲','','s1t81',64,date'1986-05-21');
21 insert into info2 values(sys_guid(),'冷泽华','','s1t81',72,date'1993-09-27');
22 insert into info2 values(sys_guid(),'曹敏','','s1t81',66,date'1989-03-15');
23 insert into info2 values(sys_guid(),'陈秦定','','s1t80',89,date'1995-05-11');
24 insert into info2 values(sys_guid(),'赵娇','','s1t80',73,date'1993-05-03');
25 insert into info2 values(sys_guid(),'柳星','','s1t82',77,date'1998-06-12');
26 insert into info2 values(sys_guid(),'胡月','','s1t82',87,date'2000-02-09');
27 insert into info2 values(sys_guid(),'郑克','','s1t82',68,date'1983-11-29');
28 insert into info2 values(sys_guid(),'柳月','','s1t83',97,date'2000-03-31');
29 insert into info2 values(sys_guid(),'吴敏','','s1t83',78,date'1983-11-30');
30 insert into info2 values(sys_guid(),'周静','','s1t83',88,date'1981-12-30');
31 insert into info2 values(sys_guid(),'大柳','','s1t80',78,date'1981-10-29');
32 insert into info2 values(sys_guid(),'二柳','','s1t80',94,date'1997-03-21');
33 insert into info2 values(sys_guid(),'bruceLee','','s1t80',88,date'1981-12-30');
34 insert into info2 values(sys_guid(),'BruceChen','','s1t80',93,date'1984-12-30');

 

add_months 将一个日期加上一指定的月份数

select add_months(date'2022-03-17',3) from dual;
select add_months(date'2022-03-17',36) from dual;
select name 姓名,bir 出生日期,add_months(bir,216) 成年时间 from info2;

months_between 返回两个日期之间的月份数 ===》 months_between(较近的日期,较远的日期);

1 select months_between(date'2022-09-10',date'2022-01-10') from dual;
2 select name,bir 生日,floor(months_between(sysdate,bir)/12) 年龄 from info2;

next_day(date,char) 指定时间的下一个星期几(由char指定) 所在的日期;1代表星期日,2代表星期一....

1 select next_day(sysdate,1) from dual;
2 select next_day(sysdate,'wed') from dual;

last_day 指定日期对应月份的最后一天

select last_day(date'2001-02-01') from dual;
select last_day(sysdate) from dual;

trunc(sysdate, 'mm') 返回当月的第1天

1 select trunc(sysdate, 'mm') from dual

trunc(sysdate,'yyyy') 返回当年的第1天 2022年1月1日

select trunc(sysdate,'yyyy') from dual;

求当前日期的上个月月初和上个月月末日期

select trunc(add_months(sysdate,-1),'mm') , last_day(add_months(sysdate,-1)) from dual;

extract 获得一个日期中指定部分的值
extract(year from date) 获得date中的年份
extract(month from date) 获得date中的月份
extract(day from date) 获得date中的日期

select extract(month from date'2001-09-10') from dual;
select name,bir,extract(year from bir) 出生年份 from info2;

1.查询所有学生信息,显示的内容包含:编号,姓名,班级,性别,出生日期,年龄,成绩

select id 编号,name 姓名,clazz 班级,gender 性别,bir 出生日期,floor(months_between(sysdate,bir)/12)||'' 年龄 from info2;

2.查询每个班的学生人数各有几人

select clazz,count(*) from info2 group by clazz;
select clazz 班级名称,count(*) 人数 from info2 group by clazz;

3.查询每个班考试合格的人数

select clazz,count(*) from info2 where score >= 60 group by clazz;

4.查询每个班考试合格的人数,并且按照每个班考试合格人数降序序排列

select clazz,count(*) from info2 where score >= 60 group by clazz order by count(*) desc;

5.查询平均分在75分以上的班级信息,并且升序排序

select clazz,count(*) from info2 group by clazz having avg(score) >= 75 order by count(*) asc;

6.查询1994,1997,1986这几个年份中出生的学生信息

select * from info2 where extract(year from bir) in(1994,1997,1986);

7.查询22岁---25岁区间的学生信息

select * from info2 where floor(months_between(sysdate,bir)/12) between 22 and 25;

8.查询不在22岁-25岁这个区间的数据

select * from info2 where floor(months_between(sysdate,bir)/12) not between 22 and 25;

9.查询姓名三个字的,并且考试合格20岁以上的男生信息

select * from info2 where name like '___' and score >= 60 and gender = '' and floor(months_between(sysdate,bir)/12) >= 20;

10.查询不是1994,1997,1986这几个年份出生的学生信息

select * from info2 where extract(year from bir) not in(1994,1997,1986);

11.查询20岁上的学生,每个班级考试合格的男女生人数各有多少人

select clazz,gender,count(*) from info2 where floor(months_between(sysdate,bir)/12) >= 20 and score >= 60 group by clazz,gender;

12.查询年龄最大的前5名学员信息

select * from (select * from info2 order by bir asc) b where rownum <= 5;

13.查询生日为每一个月最后一天出生的人员信息,并且按年龄从大到小排列

select * from info2 where bir=last_day(bir) order by bir asc;