1.SQL中的逻辑条件关系
逻辑条件:逻辑条件组合两个比较条件的结果来产生一个基于这些条件的单个的结果,或者逆转一个单个条件的结果。当所有条件的结果为真时,返回行。SQL 的三个逻辑运算符是:AND 、OR 、NOT 。
1.1AND
AND:AND 要求两个条件同时为真。
示例
查询工作岗位包含字符串 MAN 并且收入大于等于$10,000 的那些雇员的编号、工作ID、名字以及薪水。
select employee_id,job_id,last_name,salary from employees where job_id like '%MAN%' and salary >= 10000;
1.2 OR
OR:OR 操作要求两者之一为真即可。
示例
查询任何 job ID 中包含 MAN 或者收入大于等于$10,000 的雇员编号、工作 ID、名字以及薪水。
select employee_id,job_id,last_name,salary from employees where job_id like '%MAN%' or salary >= 10000;
1.3 NOT
NOT:取反。NOT 运算符也可以用于另一个 SQL 运算符,例如,BETWEEN、LIKE、IN 和 NULL。
示例
查询那些工作岗位不是 IT_PROG、ST_CLERK 或 SA_REP 的雇员的名字和工作岗位。
select last_name,job_id from employees where job_id not in('IT_PROG', 'ST_CLERK','SA_REP');
2.优先规则
优先规则:优先规则定义表达式求值和计算的顺序,表中列出了默认的优先顺序。你可以用圆括号括住你想要先计算的表达式来覆盖默认的优先顺序。
示例一
查询工作岗位是 SA_REP 或者工作岗位是 AD_PRES 并且薪水大于 15000 的员工姓名、工作 ID 以及薪水。
select last_name,job_id,salary from employees where job_id = 'SA_REP' or job_id='AD_PRES' and salary > 15000;
示例二
查询工作岗位是 SA_REP 或者是 AD_PRES 并且他们的薪水大于 15000 的员工姓名、工作 ID 以及薪水。
select last_name,job_id,salary from employees where (job_id = 'SA_REP' or job_id='AD_PRES') and salary > 15000;
3. 使用 ORDER BY 排序
3.1ORDER BY 子句作用
用 ORDER BY 子句排序
ASC: 升序排序,默认
DESC: 降序排序
ORDER BY 子句:用于对结果集进行排序处理,提供了升序排序(ASC)与降序排序(DESC)如果不指定排序规则默认为升序排序。在排序中也可以使用没有包括在 SELECT 子句中的列排序。如果未使用 ORDER BY 子句,排序次序就未定义,并且 Oracle 服务器可能对于相同查询的两次执行取回行的顺序不同。
3.2 ORDER BY 语法
ORDER BY 子句在 SELECT 语句的最后
ORDER BY 后侧指定需要排序列
ASC 以升序排序行 (这是默认排序)
DESC 以降序排序行
3.3 升序规则
对于数字值,小的值在前面显示—例如,1–999。
对于日期,早的日期在前面显示—例如,01-1-92 在 01-1-95 前面 。
对于字符值,依字母顺序显示—例如,A 第一,Z 最后。
对于空值,升序排序时显示在最后,降序排序时显示在最前面
示例
select last_name,hire_date,salary,commission_pct from employees order by commission_pct;
3.3.1 列号排序
可以使用投影的列的序号指定排序列,但是不推荐此种做法。
示例
select last_name,hire_date,salary,commission_pct from employees order by 2;
3.3.2 用列别名排序
可以使用列的别名指定排序列。
示例
select last_name as name,hire_date,salary,commission_pct from employees order by name;
3.3.3 多列排序
多列排序:可以用多列排序查询结果。在 ORDER BY 子句中,多个指定的列名之间用逗号分开。如果想要对某个列倒序排序需则在该列名后面指定 DESC。
示例:
select hire_date,salary from employees order by hire_date,salary desc;
3.4 SELECT 语句的执行顺序如下:
FROM 子句
WHERE 子句
SELECT 子句
ORDER BY 子句
4. Oracle 函数
4.1函数介绍
4.1.1什么是函数
函数:是数据库产品中提供的能够处理查询结果的方法。
函数能够用于下面的目的:
• 执行数据计算
• 修改单个数据项
• 格式化显示的日期和数字
• 转换列数据类型
• 函数有输入参数,并且总有一个返回值。
4.1.2函数类型
单行函数:这些函数仅对单个行进行运算,并且每行返回一个结果。
多行函数(聚合函数):这些函数能够操纵成组的行,每个行组给出一个结果,这些函数
也被称为组函数。
4.1.3函数语法
function_name(arg1,arg2,.....)
function_name:是函数的名字。
arg1, arg2:是由函数使用的任意参数。参数可以是一个列名、用户提供的常数、变量值、或者一个表达式。
4.2单行函数
4.2.1单行函数的特性包括:
• 作用于每一个返回行,每行返回一个结果
• 可能需要一个或多个参数
• 可以修改结果集的数据类型
• 可以嵌套
• 可能返回一个与参数不同类型的数据值
• 能够用在 SELECT、WHERE 和 ORDER BY 子句中
4.2.2单行函数分类
字符函数:接受字符输入,可以返回字符或者数字值
数字函数:接受数字输入,返回数字值
日期函数:对 DATE 数据类型的值进行运算 (除了 MONTHS_BETWEEN 函数返回一个数字,所有日期函数都返回一个 DATE 数据类型的值。)
转换函数:从一个数据类型到另一个数据类型转换一个值
通用函数:
− NVL
− NVL2 − NULLIF − COALSECE
− CASE
− DECODE
4.3字符函数
字符函数:单行字符函数接受字符数据作为输入,既可以返回字符值也可以返回数字值。
4.3.1字符函数分类
• 大小写处理函数
• 字符处理函数
4.3.2大小写处理函数
LOWER:转换大小写混合的字符串为小写字符串。
UPPER:转换大小写混合的字符串为大写字符串。
INITCAP:将每个单词的首字母转换为大写,其他字母为小写。
大小写处理函数需要一个参数,参数类型为字符串类型,返回一个字符串。
示例一
查询员工表,使用 “ The Job id for ”链接转换大写格式后的员工姓名,并使用“ is ”
字符串链接他们工作 ID,要求将工作 ID 转换小写格式。修改列名为“EMPLOYEE
DETAILS”。
select ' The job id for '||upper(last_name)||' is '|| lower(job_id) "EMPLOYEE DETAILS" from employees;
示例二
显示雇员 higgins 的雇员号、姓名和部门号
select employee_id,last_name,department_id from employees where last_name =initcap('higgins');
4.4 字符处理函数
dual 表:dual 是一张只有一个字段,一行记录的表。dual 表也称之为'伪表',因为他不存储主题数据。如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们
想得到的信息,并要通过 select 完成时,就要借助 dual 表来满足结构化查询语言的格式。
CONCAT(arg1,arg2):连接值在一起 (CONCAT 函数有两个输入参数)
arg1:字符串类型。字符拼接的值。
arg2:字符串类型。字符拼接的值。
SUBSTR(arg1,arg2,arg3):截取子串。
arg1:字符串类型。原字符串,
arg2:整数类型。开始位置(开始位置可以是一个负数,-1 表示原串的最后一位,-2 则表示倒是第二位以此类推),
arg3:整数类型。截取个数。
SUBSTR(arg1,arg2):截取子串。
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 原字符串。
去掉头尾两侧方法一:
select trim('H from HelloWorldH') from dual;
去掉头尾两侧方法二:
select trim(both 'H' from 'HelloWorldH') from dual;
去掉头:
select trim(leading 'H' from 'HelloWorldH') from dual;
去掉尾:
select trim(trailing 'H' from 'HelloWorldH') from dual;
REPLACE(arg1,arg2,arg3):REPLACE 函数是用另外一个值来替代串中的某个值。
arg1:字符串类型。原字符串。
arg2:字符串类型。需要替换的子串。
arg3:字符串类型。替换的内容。
示例一
显示所有工作岗位名称从第 4 个字符位置开始包含字符串 REP 的雇员的信息,将雇
员的姓和名连接显示在一起,还显示雇员名的长度,以及名字中字母 a 的位置。
select concat(first_name,last_name),length(last_name),instr(last_name,'a') from employees wheresubstr(job_id,4)='REP';
示例二
显示名字是以 n 结束的雇员的数据,将雇员的姓和名连接显示在一起,还显示雇员名的长度,以及名字中字母 a 的位置。
select concat(first_name,last_name),length(last_name),instr(last_name,'a') from employees wheresubstr(last_name,-1)='n';
示例三
将手机号中间四位用星号代替。
selectreplace('13622329860',substr('13622329860',4,4),'****') from dual;
4.5 数字函数
ROUND(arg1,arg2):四舍五入指定小数的值。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数,可以是一个负数。负数则表示指定整数的位置。
ROUND(arg1):四舍五入保留整数。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数。
TRUNC(arg1,arg2):截断指定小数的值,不做四舍五入处理。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数,可以使一个负数。负数则表示指定整数的位置。
TRUNC(arg1):四舍五入保留整数。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数。
MOD(arg1,arg2):取余。
arg1:数字类型。被除数。
arg2:数字类型。除数。
示例一
计算所有是销售代表(SA_REP)的雇员的工资被 5000 除后的余数。
select last_name,salary,mod(salary,5000) from employees where job_id ='SA_REP';
4.6 日期处理
4.6.1日期的使用
1)SYSDATE 函数
SYSDATE 是一个日期函数,它返回当前数据库服务器的日期和时间。
2) 用日期计算
• 从日期加或者减一个数,结果是一个日期值
• 两个日期相减,得到两个日期之间的天数
• 用小时数除以 24,可以加小时到日期上
3)用日期做算术运算
示例
显示所有在部门 90 中的雇员的名字和从业的周数。雇员的总工作时间以周计算。
select last_name, (sysdate-hire_date)/7 from employees where department_id = 90;
4.6.2 日期函数
MONTHS_BETWEEN(date1,date2):计算 date1 和 date2 之间的月数。其结果可以是正的也可以是负的。如果 date1 大于 date2,结果是正的。反之,结果是负的。
date1:日期类型。
date2:日期类型。
ADD_MONTHS(date, n):添加 n 个日历月到 date。n 的值必须是整数,但可以是负的。
date:日期类型。
n:整数
NEXT_DAY(date, ‘char’):计算在 date 之后的下一个周(‘char’)的指定天的日期。char 的
值可能是一个表示一天的数或者是一个字符串。如果使用数字表示星期,1 是从星期日开始。
数字范围为:1-7。
date:日期类型。
char:数字或字符串。
LAST_DAY(date):计算包含 date 的月的最后一天的日期。
date:日期类型。
ROUND(date,‘fmt’):返回用格式化模式 fmt 四舍五入到指定单位的 date ,如果格式模式 fmt 被忽略,date 被四舍五入到最近的天。
date:日期类型。
fmt:字符串类型。
TRUNC(date, ‘fmt’):返回用格式化模式 fmt 截断到指定单位的带天的。如果格式模式fmt 被忽略,date 被截断到最近的天。
date:日期类型。
fmt:字符串类型。
示例一
查询所有受雇在 15 年 (180 个月) 以内的雇员的 employee_id,hire_date,显示他们已被雇用的月,从受雇日期开始加 6 个月的试用期后的日期,受雇日期后的第一个星期五是几号,以及受雇月的最后一天是几号。
select employee_id ,hire_date,months_between(sysdate,hire_date),add_months(hire_date,6),next_day(hire_date,' 星 期 五 '),last_day(hire_date) from employees where months_between(sysdate,hire_date) < 180;
示例二
查询受雇日期,找出 2002 年开始工作的哪些人。用 ROUND 和 TRUNC 函数显示开始的月份。
select round(hire_date,'month'),trunc(hire_date,'month') from employees where hire_date like '%02';
4.7数据类型装换
4.7.1隐式转换的问题
1)性能影响:
隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,产生会很大的性能问题。比如说,VARCHAR2 和 NVARCHAR2 隐式数据类型转换导致的性能问题。
2)不便于阅读:
由于隐式转换使得数据库编程人员和 DBA 难以了解到究竟发生了怎样的类型转换,而
且如果代码很多很长的话要查出错误就需要费很大的劲。
4.7.2显示数据类型转换
通过数据库中的转换函数完成数据类型的转换。