1. 使用ORDER BY排序
(1) ORDER BY 子句的作用是什么?
用ORDER BY子句排序。
用于对结果集进行排序处理,提供了升序排序(ASC)与降序排序(DESC)如果不指定排序规则默认为升序排序。在排序中也可以使用没有包括在SELECT子句中的列排序。如果未使用ORDER BY子句,排序次序就未定义,并且Oracle服务器可能对于相同查询的两次执行回行的顺序不同。
ORDER BY子句在SELECT语句的最后。
(2) 如何指定升序排序?
ACS:升序排序,默认
(3) 如何指定降序排序?
DESC:降序排序
(4) 升序的规则是什么?
对于数字值,小的值在前面显示--例如,1-999.
对于日期,早的日期在前面显示--例如,01-1-92在01-1-95前面。
对于字符值,依字母顺序显示--例如,A第一,Z最后。
对于空值,升序排序时显示在最后,降序排序时显示在最前面。
查询时起别名要用双引号“Employee”。查询日期,字符串的值时用单引号’01-2月-09’
2. 函数介绍
(1) 什么是函数?
是数据库产品中提供的能够处理查询结果的方法。
函数可以:执行数据计算;修改单个数据项;格式化显示的日期和数字;转换列数据类型;函数有输入参数,并且总有一个返回值。
函数语法:
Function_name(arg1,arg2,...)
Function_name:是函数的名字。
Arg1,arg2是有函数使用的任意参数。参数可以是一个列名、用户提供的常数、变量值、或者一个表达式。
(2) 函数有哪些类型?
单行函数:这些函数仅对单个行进行运算,并且每行返回一个结果;
多行函数(聚合函数):这些函数能够操纵成组的行,每个行组给出一个结果,这些函数也被称为组函数。
(3) 单行函数的特点是?
单行函数是对每一行来计算。
(4) 多行函数的特点是什么?
多行函数是根据多行数据为计算基础来进行运算的。比如计算平均工资。
3. 单行函数介绍
(1) 单行函数有什么特性?
作用域每一个返回行,每行返回一个结果;
可能需要一个或多个参数;
可以修改结果集的数据类型;
可以嵌套;
可能返回一个与参数不同类型的数据值;
能够用在SELECT WHERE 和 ORDER BY子句中。
(2) Oracle中的单行函数分为几大类?每一类的作用是什么?
字符:接受字符输入,可以返回字符或者数字值;
数字:接受数字输入,返回数字值;
日期:对DATE数据类型的值进行运算(除了MONTHS BETWEEN函数返回一个数字,所有日期函数都返回一个DATE数据类型的值。)
转换:从一个数据类型到另一个数据类型转换一个值。
通用:NVL NVL2 NULLIF COSLSECE CASE DECODE
4. 大小写处理函数
(1) 在Oracle中能够处理字符大小的函数有哪些?
LOWER (‘SQL Course’) 返回 sql course 转换大小写混合的字符串为小写字符串
UPPER(‘SQL Course’) 返回 SQL COURSE 转换大小写混合的字符串为大写字符串
INITCAP(‘SQL Course’) 返回Sql Course首字母大写。将每个单词的首字母转换为大写,其他字母小写。大小写处理函数需要一个参数,参数类型为字符串类型,返回一个字符串。
实例:查询员工表,使用“The Job id for”连接转换为大写格式后的员工姓名,并使用“is”字符串连接他们工作ID,要求将工作ID转换为小写格式。修改列名为“EMPLOYEE DETAILS”。
SQL> select 'The Job id for '||upper(last_name)||' is '||lower(job_id) as "EMPLOYEE DETAILS" from employees;
显示员工higgins的雇员号、姓名和部门号。
SQL> select employee_id,last_name,department_id from employees where lower(last_name) = 'higgins';
或者将字符串首字母大写
SQL> select employee_id,last_name,department_id from employees where last_name = initcap('higgins');
5. 字符处理函数
(1) Oracle中的DUAL表时什么表?作用是什么?
DUAL是一张只有一个字段,一行记录的表。DUAL表也称为‘伪表’,因为他不存储主题数据。如果我们不需要从具体的表来取得表中数据,而是单纯的为了得到一些我们想要得到的信息,并要通过select完成时,就要借助DUAL表来满足结构化查询语言的格式。
(2) Oracle中能够处理字符的函数有哪些?
CONCAT(‘Hello’,’World’) 返回 HelloWorld 字符串拼接
SUBSTR(‘HelloWorld’,1,5) 返回 Hello
LENGTH()返回字符串长度
INSTR(‘HelloWorld’,’W’) 返回6 索引从1开始
LPAD(salary,10,’*’) 返回 *****24000 用指定字符自动填充,填充在前
RPAD(salary,10,’*’) 返回 24000***** 用指定字符自动在后填充指定长度
TRIM(‘H’ FROM ‘HelloWorld’) 返回elloWorld 删除指定字符串
(3) 每个字符函数的作用是什么?
CONCAT(arg1,arg2) 做两个字符串的拼接。多个字符串需要嵌套。一次只能操作两个字符串。
SUBSTR(arg1,arg2,arg3):截取子串。
Arg1:字符串类型。原字符串。
Arg2:整数类型。开始位置(开始位置可以是一个负数,-1表示原串的最后一位,-2则表示倒数第二位,以此类推)
Arg3:整数类型。截取个数。
SUBSTR(arg1,arg2,arg3):截取子串。
Arg1:字符串类型。原字符串。
Arg2:开始位置(开始位置可以是一个负数,-1表示原串的最后一位,-2则表示倒数第二位,以此类推)截取到末尾。
LENGTH(arg1):以数字值显示一个字符串的长度。
Arg1:字符串类型。计算字符串的长度。
INSTR(arg1,arg2):找到一个给定字符的数字位置。
Arg1:字符串类型,原字符串。
Arg2:字符串类型。查找内容。
INSTR(arg1,arg2,arg3,arg4):指定查找位置以及出现的次数。
Arg1:字符串类型。原字符串。
Arg2:字符串类型。查找内容。
Arg3:整数类型。开始位置。
Arg4:整数类型。第几次出现。
LPAD(arg1,arg2,arg3):用给定的字符左填充字符串到给定的长度。
Arg1:字符串类型。原字符串。
Arg2:整数类型。总长度。
Arg3:字符串类型。填充的子字符串。
RPAD(arg1,arg2,arg3):用给定的字符串右填充字符串到给定的长度。
Arg1:字符串类型。原字符串。
Arg2:整数类型。总长度。
Arg3:字符串类型。填充的子字符串。
TRIM(arg1):从一个字符串中去除头(leading)或尾(trailing)或头尾两侧(both)的字符(默认为头尾两侧)如果trim_character 或 trim_source是一个文字字符,必须放在单引号中。
Arg1需要操作的字符串。from为关键字。
格式1:需要去掉的内容 from原字符串。
格式2:leading|trailing|both 需要去掉的内容from原字符串。
SQL> select trim('h' from 'helloworld') from dual;
SQL> select trim(trailing 'H' from 'HelloWorldH') from dual;
Replace(arg1,arg2,arg3):replace函数是用另外一个值来替代串中的某个值
Arg1:字符串类型。原字符串。
Arg2:字符串类型。需要替换的子串。
Arg3:字符串类型。要替换成的子串。
SQL> select replace('We are happy',' ','%20') from dual;
实例:显示所有工作岗位名称从第4个字符位置开始包含字符串REP的雇员的信息,将雇员的姓和名连接显示在一起,还显示雇员名的长度,以及名字中字母a的位置。
SQL> select concat(first_name,last_name) as name,length(last_name),instr(last_name,'a') from employees where substr(job_id,4,3)='REP';
显示所有名字以n结尾的雇员的信息,将雇员的姓和名连接显示在一起,还显示雇员名的长度,以及名字中字母a的位置。
select concat(first_name,last_name) as name,length(last_name),instr(last_name,'a') from employees where substr(last_name,-1)='n';
将手机号的中间四位用*号代替。
SQL> select replace('13811326546',substr('13811326546',4,4),'****') from dual;
6. 数字函数
(1) Oracle中能够处理数字的函数有哪些?
Round:四舍五入指定小数的值。
Trunc:截断指定小数的值。
Mod:返回除法的余数。
(2) 每个处理数字的函数的作用是什么?
Round(arg1,arg2):四舍五入指定小数的值。
Arg1:数字类型。原数字。
Arg2:整数类型。小数点保留的位数,可以是一个负数。负数则表示指定整数的位置。
ROUND(arg1)四舍五入保留整数。
Round(arg1):四舍五入保留整数。
Arg1:数字类型。原数字。
Arg2:整数类型。小数点保留的位数。
Trunc(arg1,arg2):截断指定小数的值,不做四舍五入处理。
Arg1:数字类型。原数字。
Arg2:整数类型。小数点保留的位数,可以是一个负数。负数则表示指定整数的位置。
TRUC(arg1):取整
MOD(arg1,arg2):取余函数。
Arg1:被除数。
Arg2:除数。
实例:计算所有是销售代表(SA_REP)工资对5000取余的余数。
SQL> select last_name,salary,mod(salary,5000) from employees where job_id = 'SA_REP';
7. 日期的使用
(1) 在Oracle中如何获取系统当前时间?
SYSDATE是一个日期函数,它返回当前数据库服务器的日期和时间。
SQL> select sysdate from dual;
(2) 在Oracle中做日期计算有哪些特点?
从日期加或者减一个数,结果是一个日期值。
两个日期相减,得到两个日期之间的天数。
用小时除以24,可以加小时到日期上。
实例:显示所有在部门90中的雇员的名字和从业的周数。雇员的总工作时间以周计算。
SQL> select last_name,round((sysdate-hire_date)/7) from employees where department_id=90;
8. 日期函数
(1) 在Oracle中能够处理日期的函数有哪些?
MONTHS_BETWEEN 两个日期之间的月数;
MONTHS_BETWEEN(date1,date2):计算date1和date2之间的月数。其结果可以是正的也可以是负的。如果date1大于date2,结果是正的。反之结果是负的。
ADD_MONTHS 加日历月到日期;
ADD_MONTHS(date,n):添加n个日历月到date。n的值必须是整数,但可以是负的。
Date:日期类型。
Date:日期类型。
NEXT_DAY 下个星期几是几号;
NEXT_DAY(date,’char’):计算在date之后的下一个周(‘char’)的指定天的日期。char的值可能是一个表示一天的数或者是一个字符串。如果使用数字表示星期,1是从星期日开始。数字范围1-7。
LAST_DAY 指定月的最后一天;
LAST_DAY(date):计算包含date的月的最后一天的日期。
Date:日期类型。
SQL> select last_day(sysdate) from dual;
ROUND 四舍五入日期;
ROUND(date,’fmt’):返回用格式化模式fmt四舍五入到指定单位的date,如果格式模式fmt被忽略,date被四舍五入到最近的天。
Date:日期类型
Fmt:字符串类型
SQL> select round(sysdate,'yy') from dual;
SQL> select round(sysdate,'mm') from dual;
TRUNC 截断日期
TRUNC(date,’fmt’):返回用格式化模式fmt截断到指定单位的带天的。如果格式模式fmt被忽略,date被截断到最近的天。
Date:日期类型。 fmt:字符串类型。
实例:查询所有受雇在15年(180个月)以内的雇员的employee_id,hire_id,显示他们已被雇佣的月,从受雇日期开始加6个月的试用期后的日期,受雇日期后的第一个星期五是几号,以及受雇月的最后一天是几号。
SQL> select employee_id,hire_date,round(months_between(sysdate,hire_date)),add_months(hire_date,6),next_day(hire_date,'星期五') from employees where months_between(sysdate,hire_date)<180;
实例:查询受雇日期,找出2002年开始工作的那些人。用ROUND和TRUNC函数显示开始的月份。
SQL> select employee_id,last_name,round(hire_date,'mm'),trunc(hire_date,'mm') from employees where hire_date like '%02';
9. 隐式数据类型转换
(1) 在Oracle中什么是隐式数据类型转换?
当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
(2) 哪些数据类型支持隐式类型转换?
对于直接赋值的隐式转换:
从VARCHAR2 OR CHAR 到 NUMBER
从VARCHAR2 OR CHAR 到 DATE
从NUMBER到VARCHAR2
从DATE到VARCHAR2
对于表达式赋值的隐式转换:
从VARCHAR2 OR CHAR 到 NUMBER
从VARCHAR2 OR CHAR 到 DATE
(3) 隐式数据类型转换有哪些问题?
1-性能影响:隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,会产生很大的性能问题。比如说,VARCHAR2和NVARCHAR2隐式数据类型转换导致的性能问题。
2-不便于阅读:由于隐式转换使得数据库编程人员和DBA难以了解到究竟发生了怎样的类型转换,而且如果代码很多很长的话要查出错误就需要消耗很大的精力。
(4) 什么是显示数据类型转换?
通过数据库中的转换函数完成数据类型的转换。
10. 日期到字符的转换
(1) Oracle中提供了哪些转换函数?
TO_NUMBER
TO_DATE
TO_CHAR
(2) 每个转换函数的作用是什么?
TO_CHAR(arg1,’fmt’):将一个日期或者数字转换为字符类型。带格式化样式fmt。
Arg1:数字或者日期类型。需要转换的数据。
Fmt:转换格式。
(3) 在Oracle中将日期转换成字符使用什么函数完成?
TO_CHAR
(4) 日期格式的模板元素有哪些?
YYYY 数字全写年
YEAR 数字全写年
MM 月的两数字值
MONTH 月的全名
MON 月的三字母缩写
DY 周中天的三字母缩写
DAY 周中天的全名
DD 月的数字天
SCC或CC 世纪,带-服务器前缀B.C. 日期
日期中的年YYYY或SYYYY 年,带-服务器前缀B.C. 日期
YYY或YY或Y 年的3、2或1个数字
Y,YYY 年,在这个位置带逗号
IYYY,IYY,IY,I 基于ISO标准的4、3/2或1位数字年
SYEAR或YEAR 拼写年;带-服务器前缀B.C.日期
BC或AD B.C.A.D指示器
B. C. 或 A.D. 带周期的B.C./A.D.指示器
Q 四份之一年
MM 月:两位数字值
MONTH 9位字符长度的带空格填充的月的名字
MON 3字母缩写的月的名字
RM 罗马数字月
WW或W 年或月的周
时间格式模板
AM或PM 正午指示
A. M或P.M 带句点的正午指示
HH或HH12或HH24 天的小时,或小时(1-12),或小时(0-23)
MI 分钟(0-59)
SS 秒(0-59)
SSSSS 午夜之后的秒(0-86399)
日期的时间部分,时间元素格式
HH24:MI:SS:AM 15:45:32 PM
加字符串,将他们括在双引号中
DD “OF” MONTH 12 OF OCTOBER
数字前缀拼出数字
Ddspth fourteenth
其他格式
/. 在结果中使用标点符号
“of the” 在结果中使用引文串
指定后缀来影响数字显示
TH 序数(例如,DDTH显示为4TH)
SP 拼写出数字(例如,DDSP显示为FOUR)
SPTH OR THSP 拼写出序数(例如,DDSPTH显示为FOURTH)
实例:显示所有雇员的名字和受雇日期,受雇日期以2007年8月10日 12:00:00AM显示。
SQL> select last_name,to_char(hire_date,'yyyy"年"mm"月"dd"日" hh:mi:ss am') from employees;
11. 数字到字符的转换
(1) 在Oracle中讲数字转换为字符的函数是什么?
To_char
(2) 数字格式模板有哪些?
9 表示一个数
0 强制显示为0,如果有数字不改变,如果没数字则用0填充
$ 放置一个浮动美元符号
L 使用浮动本地货币符号
. 打印一个小数点
, 打印一个千分号
FM:代表去掉返回结果中的前后空格和0
模板的长度一定要大于等于实际数字的长度。
实例:查询雇员Whalen,显示他的薪水,在薪水前添加美元符号与千位符。
SQL> select last_name,to_char(salary,'fm$999,999,999.00') from employees where last_name = 'Whalen';
12. 字符到数字的转换
(1) 在Oracle中将字符转换为数字的函数是什么?
To_number
TO_NUMBER(‘arg1’,fmt):将字符串转换为数值型的格式。带格式化样式fmt。
Arg1:字符串类型。需要转换的数据。
Fmt:转换格式。模板与数字转字符格式模板一致。
(2) 将¥34,346.56转换为数字类型。
SQL> select to_number('¥34,346.56','L999,999.99') from dual;