首页 > 数据库 > Oracle > 正文

ORACLE 函数

2024-08-29 13:54:50
字体:
来源:转载
供稿:网友

字符函数

字符函数参数全部是字符类作为参数,字符函数返回值有的是varchar2类型的值,有的是number类型的值,返回number类型时,没有定义任何精度和刻度范围

表3-1-1字符函数

函数名

函数功能

ASCII

返回与指定的字符对应的十进制数

 select ascii(ename) ,job from emp;

CHR

参数为整数,表示某个字符的Unicode码,返回对应的字符

 

 

CONCAT

连接两个字符串

select concat(ename,'---') name from emp;

select concat(concat(ename,'--'),job) name from emp;

连接字符串也可以使用||

 

 

LOWER

返回字符串,并将所有的字符小写

 select lower(ename) ename  ,job from emp;

UPPER

返回字符串,并将所有的字符大写

select upper(lower(ename)) ename  ,job from emp

INITCAP

返回字符串并将字符串的第一个字母变为大写

 select INITCAP('sdaf  dsfasd') from emp;

 

 

INSTR

在一个字符串中搜索指定的字符,返回发现指定的字符的位置 

select instr('aab','aa') from dual;

select * from emp where  instr(ename,'A')!=0;

select instr(‘Oracle training’,’ra’,1,2) instring from dual;

 

LENGTH

返回字符串的长度

select * from emp where  length(ename)>5

 

 

RPAD

在列的右边粘贴字符

select rpad(ename,10,'*') ename from emp;

LPAD

在列的左边粘贴字符

 

 

 

 

SUBSTR

取子字符串

select substr('abcdefg' ,2,5) from dual;

取身份证的生日;

REPLACE

将一个字符串中的子字符串替换成其他的字符串

select replace('abc','ab') from dual;

select replace('abc','ab') from dual;

 

TRIM

删除字符串两边的字符串,如删除字符串两边的空格,删除字符串两边的#字符

select trim('  sd sdf   ') from dual;

应用 登陆

select * from emp where ename=trim('     SCOTT  ');

select trim(' ' from '  sdfdf ds   ') from dual;

select trim('a' from 'aasdfaaadf dsaaa') from dual

删除123Tech111两端的1字符

SQL>select trim (both  ‘1’ from ‘123tech111’) from dual;

 

SQL> select trim(leading ‘0’ from ‘000123’)  from dual;

 

删除Tech1尾部的1字符

SQL>select trim(trailing ‘1’ from ‘Tech1’) from dual;

 

 

LTRIM

删除左边出现的字符串

 

RTRIM

删除右边出现的字符串

 

 

 

在电子商务系统中,对于用户的联系方式,特别是固定电话,在数据库中区号和电话号码是分别用两列存贮的,因为这样方便查询。但是展现信息是需要区号和电话作为一个整体。此时必须使用 字符串拼接函数CONCAT

示例3.3:

SQL> SELECT CONCAT(‘010-’,’88888888’) || ‘转23’ 电话号码 from dual;

连接010、88888888、转23这3个字符串 

字符串连接可以有两种方法,一是使用CONCAT函数,二是使用||字符串连接符。

 

美国人的名字中每个单词的首字母必须大写显示,这是英语的习惯。下面要显示迈克尔杰克逊人名,需要将每个单词首字符大写

示例3.4:

SQL> select initcap(‘michael jackson’) as name  from dual;

有些时候,我们可能需要在一长串字符中找某个字符串,并且有可能需要找到第几次出现的位置,这时可以使用instr函数。

在oracle traning字符串中找ra字符,从第一个字符开始,查找第二次出现的位置示例3.5:

SQL> select instr(‘oracle training’,’ra’,1,2) instring from dual;

INSTR一共有4个参数,第一个是被查找的字符串,第二个是要查找的字符串,我们要查找ra字符串,第三个参数是一个数字,表示从哪个位置开始找,此参数可选,如果省略默认为1。第四个参数表示要查找第几次出现的ra,此参数可选,如果省略默认为1。

 

在英语信息中,有时我们可能需要可能首字符大写、全大写和全小写的形式向客户展示我们的信息,这时我们可以使用initcap,upper,lower函数。

示例3.6:

SQL> select initcap(ename), upper(ename), lower(ename) from emp;

上面的例子分别以首字符大写、全大写和全小写的形式显示emp表中的姓名(ename)字段

电子商务中,我们有时需要在源字符串的基础上在其前后增加若干个特殊字符,已达到某一个固定的长度。这时可以使用lpad,rpad函数

示例3.7:

SQL> select lpad(rpad(‘gao’,10,’#’),17,’*’) from dual;

上面的示例将gao字符串右边增加若干个#使总长度达到10,然后再左边增加若干个*,使总长度达到17

RPAD 是在列的右边粘贴字符包括有3个参数,第一个是原字符串gao,第二个参数是增加后达到10个字符,第三个参数表示要加#字符。

 

示例3.8: 

SQL> select ltrim(rtrim(‘’****gao qian jing    ,’ ’),’*’) from dual;

上面的示例删除了”****gao qian jing   “字符串左边的*,再删除右边的空格

 

取字符串的子串在实际的业务中用的非常多,如取身份证的某几位得到某人的出生年月日,再如获得一个移动电话的后8位等等。

示例3.9:

SQL> select substr(‘13088888888’,3,8) from dual;

上面的示例从13088888888中取子字符串,从3开始,取8个

 

将字符串中的子串替换成新的值在业务中也有使用,比如我们将信息中的一些不雅的词语替换成****,这时我们可以使用replace函数

示例3.10:

SQL> select replace(‘he love you’,’he’,’I’) from dual;

上面的示例替换he love you字符串中的he为i

 

用户输入时用户名或密码时有可能输入空格,我们可以使用trim删除两端的空格

示例3.11:

SQL> select trim(‘   tech   ‘) from dual;  

 

trim('字符1' from '字符串2')  分别从字符2串的两边开始,删除指定的字符1

SQL>select trim(‘ ‘ from ‘    tech       ‘)  from dual;

 

删除000123头部的0字符

SQL> select trim(leading ‘0’ from ‘000123’)  from dual;

 

删除Tech1尾部的1字符

SQL>select trim(trailing ‘1’ from ‘Tech1’) from dual;

 

删除123Tech111两端的1字符

SQL>select trim (both  ‘1’ from ‘123tech111’) from dual;

注意:leading表示从字符串的头开始删除。Trailing表示从字符串的尾部开始删除。Borth表示从字符串的两边删除。

当然也可以简化成

select ltrim('****gao qian jing------','*') from dual

数学函数

数学函数以number类型作为参数返回number类型。

表3-1-2数学函数

函数名

函数功能

ABS

返回指定值的绝对值

CEIL

返回大于或等于给出数字的最小整数

FLOOR

对给定的数字取整数

MOD(n1,n2)

返回一个n1除以n2的余数

POWER(n1,n2)

返回n1的n2次方

SIGN

取数字n的符号,大于0返回1,小于0返回-1,等于0返回0

SQRT

返回数字的根

ROUND

按照指定的精度四舍五入

TRUNC

按照指定的精度截取一个数

 

天花板函数示例3.12:

SQL> select ceil(3.1415927) from dual;

地板函数 示例3.13:

 select floor(2345.67) from dual;

示例3.14: 

SQL> select round(124.1666,-2) , round(124.1666,2) from dual;

SQL> select trunc(124.1666,-2) , trunc(124.16666,2) from dual;

注意:Round函数进行四舍五入,trunc函数进行截取。第二个参数为正时,表示从小数位计算。第二个参数为负时,表示从整数位计算。

日期函数

日期函数以DATE类型为参数。除了MONTHS_BETWEEN函数,它返回NUMBER类型,它返回DATE或日期时间类型。日期函数常用的格式模型如表3-1-1所示

表3-1-3   格式模型

模板

描述

HH

一天的小时数 (01-12)

HH12

一天的小时数 (01-12)

HH24

一天的小时数 (00-23)

MI

分钟 (00-59)

SS

秒 (00-59)

MS

毫秒 (000-999)

US

微秒 (000000-999999)

SSSS

午夜后的秒 (0-86399)

AM 或 A.M. 或 PM 或 P.M.

正午标识(大写)

am 或 a.m. 或 pm 或 p.m.

正午标识(小写)

Y,YYY

带逗号的年(4 和更多位)

YYYY

年(4和更多位)

YYY

年的后三位

YY

年的后两位

Y

年的最后一位

BC 或 B.C. 或 AD 或 A.D.

年标识(大写)

bc 或 b.c. 或 ad 或 a.d.

年标识(小写)

MONTH

全长大写月份名(9字符) 英文的月份 或者4月

Month

全长混合大小写月份名(9字符)

month

全长小写月份名(9字符)

MON

大写缩写月份名(3字符)

Mon

缩写混合大小写月份名(3字符)

mon

小写缩写月份名(3字符)

MM

月份 (01-12)

DAY

全长大写日期名(9字符)

Day

全长混合大小写日期名(9字符)

day

全长小写日期名(9字符)

DY

缩写大写日期名(3字符)

Dy

缩写混合大小写日期名(3字符)

dy

缩写小写日期名(3字符)

DDD

一年里的日子(001-366)

DD

一个月里的日子(01-31)

D

一周里的日子(1-7;SUN=1)

W

一个月里的周数(1-5),这里第一周从该月第一天开始

WW

一年里的周数(1-53),这里的第一周从该年的第一天开始

Q

季度

 

表3-1-4  日期函数

函数名

函数功能

SYSDATE

用来得到系统的当前日期

插入当前时间

使用默认格式字符串直接插入

Todate  日期的格式

Tochar

ADD_MONTHS

增加或减去月份

trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒

 

 

LAST_DAY

返回日期的最后一天

MONTHS_BETWEEN(date2,date1)

 

给出date2和date1相差的月份

NEXT_DAY(date,'day')

给出日期date和星期x之后计算下一个星期的日期

 

 

 

示例3.15:

SQL> select sysdate, to_char(sysdate,’dd-mm-yyyy day’) from dual;

有时我们想按照自己的格式显示今天几号星期几,可以采用以上写法

 

trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒

想得到某个日期前后若干月是哪一天,可以使用ADD_MONTHS函数增加或减去月份

示例3.16:

SQL> select to_char(add_months(to_date('1999-12','yyyy-mm'),2),'yyyy-mm') from dual;

在人员管理系统中,我们可能需要得到某两个日期相差多少个月,或某日期和今天相差月份,可以使用MONTHS_BETWEEN函数

示例3.17:

SQL> select months_between('9-12月-1999','19-3月-1999') mon_between from dual;

转换函数:

 

转换函数是将PL/SQL数据由一种数据类型转到另一种数据类型,例如to_date to_char tonumber

 

PL/SQL将会通过对转换函数的隐式调用进行自动转换。但是,隐式调用转换函数时无法对使用的格式指定符进行控制,这时我们最好使用显式调用转换函数。

SQL> select * from test;

 

       AGE

----------

         1

 

SQL> select * from test where age='1';

 

表3-1-5 转换函数

函数

返回

描述

例子

to_char(timestamp, text)

text

把 timestamp 转换成 string

to_char(timestamp 'now','HH12:MI:SS')

to_char(int, text)

text

把 int4/int8 转换成 string

to_char(125, '999')

to_char(double PRecision, text)

text

把 real/double precision 转换成 string

to_char(125.8, '999D9')

to_char(numeric, text)

text

把 numeric 转换成 string

to_char(numeric '-125.8', '999D99S')

to_date(text, text)

date

把 string 转换成 date

to_date('05 Dec 2000', 'DD Mon YYYY')

to_timestamp(text, text)

date

把 string 转换成 timestamp

to_timestamp('05 Dec 2000', 'DD Mon YYYY')

to_number(text, text)

numeric

把 string 转换成 numeric

to_number('12,454.8-', '99G999D9S')

 

将今天按照某种特殊的格式显示,可以使用to_char

示例18:

SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

表3-1-6  to_date函数格式模板

模板

描述

HH

一天的小时数 (01-12)

HH12

一天的小时数 (01-12)

HH24

一天的小时数 (00-23)

MI

分钟 (00-59)

SS

秒 (00-59)

MS

毫秒 (000-999)

US

微秒 (000000-999999)

SSSS

午夜后的秒 (0-86399)

AM 或 A.M. 或 PM 或 P.M.

正午标识(大写)

am 或 a.m. 或 pm 或 p.m.

正午标识(小写)

Y,YYY

带逗号的年(4 和更多位)

YYYY

年(4和更多位)

YYY

年的后三位

YY

年的后两位

Y

年的最后一位

BC 或 B.C. 或 AD 或 A.D.

年标识(大写)

bc 或 b.c. 或 ad 或 a.d.

年标识(小写)

MONTH

全长大写月份名(9字符)

Month

全长混合大小写月份名(9字符)

month

全长小写月份名(9字符)

MON

大写缩写月份名(3字符)

Mon

缩写混合大小写月份名(3字符)

mon

小写缩写月份名(3字符)

MM

月份 (01-12)

DAY

全长大写日期名(9字符)

Day

全长混合大小写日期名(9字符)

day

全长小写日期名(9字符)

DY

缩写大写日期名(3字符)

Dy

缩写混合大小写日期名(3字符)

dy

缩写小写日期名(3字符)

DDD

一年里的日子(001-366)

DD

一个月里的日子(01-31)

D

一周里的日子(1-7;SUN=1)

W

一个月里的周数(1-5),这里第一周从该月第一天开始

WW

一年里的周数(1-53),这里的第一周从该年的第一天开始

IW

ISO 一年里的周数(第一个星期四在第一周里)

CC

世纪(2 位)

J

Julian 日期(自公元前4712年1月1日来的日期)

Q

季度

RM

罗马数字的月份(I-XII;I=JAN)-大写

rm

罗马数字的月份(I-XII;I=JAN)-小写

TZ

时区字串 - 大写

tz

时区字串 - 小写

 

示例19:

SQL> select * from emp where hiredate> to_date(‘1990-12-2’,’yyyy-mm-dd’);

SQL> select  to_date(‘3月 7,1999’,’Month DD,yyyy) from dual;

SQL>select  to_char(hiredate,’yyyy-MM-dd day’) from emp where rownum<10;

将字符串转化为ORACLE中的一个日期

 

保存到数据库中的数据可能是字符串,但是我们可以将其转换为数字再参与数学运算,这时使用to_number函数。如年份可能保存成字符,计算1999年后是哪一年

示例20:

SQL> select to_number(‘1999’) + 10  year  from dual;

其他函数

 

函数名

函数功能

UID

返回标识当前用户的唯一整数

 

USER

返回当前用户的名字

 

NVL(expr1, expr2)

NVL(expr1, expr2)表示如果expr1为NULL,返回expr2;不为NULL,返回expr1。注意expr1和expr2两者的类型要一致

NVL2 (expr1, expr2, expr3)

expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型

NULLIF (expr1, expr2)

expr1和expr2相等返回NULL,不等返回expr1

 

 

用户登录成功后,我们可能要记录当前登录用户的姓名和id,这时我们要使用UID,USER函数

示例20:

SQL> select uid from dual;

SQL> select username,user_id from user_users where user_id = uid;

显示当前用户编号,当然我们可以把这个编号存入自己定义的日志表中。

 

在数据库中,经常出现某个字段值为空。这时,我们希望字段值为空时,显示某个值,否则显示自身。例如奖金字段(comm)的值为null,返回0,不为null显示comm.

示例21:

SQL>select empno,ename,hiredate,sal,nvl(comm,0) ,sal+nvl(comm,0) from emp;

除了nvl外,还可以使用nvl2函数。Nvl2有3个参数,如果参数1不为NULL, 返回第二个参数;为NULL,返回第三个参数。

示例22:

SQL> SELECT COMM,NVL2(COMM,COMM,0) FROM EMP;

奖金字段COMM不为NULL,返回COMM;为NULL,返回0。

3.7 聚合函数

聚合函数将多条记录聚合成一条记录。聚合函数有AVG,MAX,MIN,COUNT,SUM

 

示例23:创建示例表和示例数据

SQL> create table test(xm varchar(8),sal number(7,2));

语句已处理。

SQL>  insert into table3 values(‘gao’,1111.11);

SQL>  insert into table3 values(‘gao’,1111.11);

SQL>  insert into table3 values(‘zhu’,5555.55);

SQL> commit;

得到不同的sal的平均值,如果出现相同的sal值,如1111.11出现两次,只算一次。

SQL> select avg(distinct sal) from test;

得到所有的sal的平均值,如果出现相同的sal值,如1111.11出现两次,算两次。

SQL> select avg(all sal) from gao.test;

意:如果什么都不写,默认是all

 

3.8  Oracle分析函数Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。  常用的分析函数如下所列: row_number() over (partition by ... order by ...) rank() over (partition by ... order by ...) dense_rank() over (partition by ... order by ...)

count() over (partition by ... order by ...) max() over (partition by ... order by ...) min() over (partition by ... order by ...) sum() over (partition by ... order by ...) avg() over (partition by ... order by ...)

OVER子句前面必须是排名函数或者是聚合函数。

注意:下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行 $ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。 

开窗函数的的理解: 开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化

 

举例如下: over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数 over(partition by deptno)按照部门分区 over(order by salary range between 50 preceding and 150 following) 每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150 over(order by salary rows between 50 preceding and 150 following) 每行对应的数据窗口是之前50行,之后150行 over(order by salary rows between unbounded preceding and unbounded following) 每行对应的数据窗口是从第一行到最后一行

等效: over(order by salary range between unbounded preceding and unbounded following) 先查询 后开窗 然后再统计

 

示例3.24:

下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告,按照manager_id分组

SQL>select manager_id, last_name, hire_date, salary,

Avg(salary) over (partition by manager_id) as c_mavg from employees;

示例3.25:下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告,该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来;

SQL>SELECT manager_id, last_name, hire_date, salary,

AVG(salary) OVER (PARTITION BY manager_id order by hire_date rows BETWEEN 1 PRECEDING and 3 FOLLOWING ) AS c_mavg

FROM employees;

示例3.27:下面例子中dept_max返回当前行所在部门的最大薪水值 SQL>SELECT department_id, last_name, salary, MAX(salary) OVER (PARTITION BY department_id) AS dept_max

FROM employees WHERE department_id in (10,20,30); 

实例3.28:下面例子中dept_min返回当前行所在部门的最小薪水值 SQL>SELECT department_id, last_name, salary, MIN(salary) OVER (PARTITION BY department_id) AS dept_min FROM employees WHERE department_id in (10,20,30); 

示例3.29 . DENSE_RANK 功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数

下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与RANK函数的区别)

SQL>SELECT d.department_id , e.last_name, e.salary, DENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_id IN ('60', '90'); 

示例3.30 RANK 功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序, 然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。 有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1, 则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。

下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别) SQL>SELECT d.department_id , e.last_name, e.salary, RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_id IN ('60', '90'); 

示例3.31  ROW_NUMBER 功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。

下例返回每个员工再在每个部门中按员工号排序后的顺序号 SQL>SELECT department_id, last_name, employee_id, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id FROM employees WHERE department_id < 50; 

示例3.32. SUM 功能描述:该函数计算组中表达式的累积和。

下例计算同一经理下员工的薪水累积值 SQL>SELECT manager_id, last_name, salary, SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary RANGE UNBOUNDED PRECEDING) l_csum FROM employees WHERE manager_id in (101,103,108); 

count分析函数对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全 相同的数据后出现的行数。 

示例3.26:下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水 例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行 没有,所以count计数值cnt3为2(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数

SQL>SELECT last_name, salary, COUNT(*) OVER () AS cnt1, COUNT(*) OVER (ORDER BY salary) AS cnt2, COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS cnt3 FROM employees; 

示例3.33: RATIO_TO_REPORT 功能描述:该函数计算expression/(sum(expression))的值,它给出相对于总数的百分比,即当前行对sum(expression)的贡献。

下例计算每个员工的工资占该类员工总工资的百分比 SQL>SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr FROM employees  WHERE job_id = 'PU_CLERK'; 

任务实训部分

1、 假设学校环境如下:

一个系有若干个专业,每个专业一年只招一个班,每个班有若干个学生。现要建立关于系、学生、班级的数据库,关系模式如下:

班级表class(班号classid,专业名subject,系名deptname,入学年份entertime,人数num)

学生表student(学号studentid,姓名name,年龄age,班号classid)

系department(系号departmentid,系名deptname)

要求用sql语句完成如下功能:  

(1)建表,并实现如下要求

A:每个表根据实际定义好主外键关系

B:系表中编号字段利用数据库自动化增长值实现

C:每个班级的人数不超过30人

D:学生年龄介于15到30之间

E:学生姓名不能为空,系名不能重复

(2)输入部分测试数据

department表:

1  数学

2 计算机

3 化学

4 中文

5 经济学

class表:

101 软件  计算机  1995  20

102 微电子  计算机  1996  30

111  无机化学  化学  1995   29

112 高分子化学  化学 1996  25

121  统计  数学  1995   20

131 现代语言  中文  1996  20

141 国际贸易  经济学  1997  30

142 国际金融  经济学   1998   14

student表:

8101 张三 18  101

8102 钱四 16  121

8103 王玲 17  131

8104 李飞  19  102

8105 王五  20  141

(3)完成下列查询:

A:列出所有人数大于等于28的系的编号和名称

B:列出所有开设超过两个专业的系的名字

C:显示每个学生的学号、姓名、专业、系名信息

 

2、oracle函数的使用

针对scott.emp表,实现如下查询操作:

(1) 把员工姓名和工作连接在一起,中间用“--”分隔显示。

(2) 分别显示工姓名的前三个字符和第四个字符后的内容

(3) 显示字母T在员工姓名中第一次和第二次出现的位置

(4) 显示12年前参加工作的员工信息

(5) 查询在当月倒数第三天参加工作的员工信息

(6) 显示每个员工的工作天数

(7) 按照每月30天,计算每个员工的日薪金

(8) 按照年和月的格式显示员工参加工作的时间(如  SMITH  1980  12)

(9) 查询在1987年2月到5月参加工作的员工信息(包括2月和5月)

(10) 显示每个员工的津贴信息,没有津贴就显示0

(11) 分别显示员工的总人数和津贴不为空的员工人数

(12) 显示部门最低工资大于900的部门和最低工资

(13) 显示每个部门工资在1400以上的所有员工的工资总额

(14) 显示部门名称以及该部门的员工总数,没有员工的以0显示

(15) 显示每个部门中最高工资的员工信息

(16) 计算每个部门的员工工资排名

(17) 计算每个部门的员工工资占整个部门的工资比例

(18) 计算同一部门员工的薪水累积值

 

3、员工培训系统的案例

Employee员工表:

EID       Name     Department     Job    Email    passWord

    10001      李明      SBB           EG

10003      李四      LUCK        ITM

11045      胡斐      SBB           EG

10044      张三      MTD         ETN

10023      王刚      MMM        ETN

Training 培训记录表:

CourseId    EID      Course     Grade     orders

1          10001     T-SQL     60

3          11045     java       71

2          10003     oracle     59

1          10003     T-SQL     90

3          10044     java       78

2          10001     oracle      69

2          10023     oracle      70

3          20001     Java       69

3          10078     Java       58

完成如下sql语句:

(1)建立两个表的表结构,自行分析,根据需要设置主键

(2)用sql语句进行册书数据的添加

(3)列出所有员工参加培训的情况,要求显示:EID,Name,department,course,grade用一条sql语句完成

(4)列出未参加培训的员工信息,显示格式如上

(5)列出所有各课成绩最高的员工信息,显示格式如上

(6)把所有表2有但表1没有的员工编号插入表1中,一条语句完成

(7)统计各部门的人数

(8)统计各部门中姓李的人数

 

 

巩固练习

1.Oracle返回“Hello World”的函数是:()

A.UPPER

B.LOWER

C. INITCAP

D.CONCAT

 

1. 下面哪个分析函数返回连续的重复的行编号()

A.ROW_NUMBER

B.RANK

C.DENSE_RANK

 

2. SELECT ROUND (164.1666,-2) FROM DUAL返回值()

A.100

B.150

C.200

D.160

 

4.Oracle分析函数的特征有()

A.可以带over(partition by..order ..)

B.分析函数用于计算基于组的某种聚合值

C.它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

D.over在每组中定义了一个滑动窗口

 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表