2.5逻辑条件关系
逻辑条件:逻辑条件组合两个比较条件的结果来产生一个基于这些条件的单个的结果,或者逆转一个单个条件的结果。当所有条件的结果为真时,返回行。SQL 的三个逻辑运算符是:AND 、OR 、NOT 。
2.5.1AND
AND:AND 要求两个条件同时为真。
2.5.1.1 示例
查询工作岗位包含字符串 MAN 并且收入大于等于$10,000 的那些雇员的编号、工作ID、名字以及薪水。
![10a1f22e862e03b81a0de2a487c7fa8d.png](https://img-blog.csdnimg.cn/img_convert/10a1f22e862e03b81a0de2a487c7fa8d.png)
2.5.2OR
OR:OR 操作要求两者之一为真即可。
2.5.2.1 示例
查询任何 job ID 中包含 MAN 或者收入大于等于$10,000 的雇员编号、工作 ID、名字以及薪水.
![6e7ddac057fa0c9737204984fb81228b.png](https://img-blog.csdnimg.cn/img_convert/6e7ddac057fa0c9737204984fb81228b.png)
2.5.3NOT
NOT:取反。NOT 运算符也可以用于另一个 SQL 运算符,例如,BETWEEN、LIKE、IN 和 NULL。
2.5.3.1 示例
查询那些工作岗位不是 IT_PROG、ST_CLERK 或 SA_REP 的雇员的名字和工作岗位。
![584c87945e64c80b209b6a5fa8b744eb.png](https://img-blog.csdnimg.cn/img_convert/584c87945e64c80b209b6a5fa8b744eb.png)
2.6优先规则
![3a3b7a70ada4d89efc9b698871a82b69.png](https://img-blog.csdnimg.cn/img_convert/3a3b7a70ada4d89efc9b698871a82b69.png)
优先规则:优先规则定义表达式求值和计算的顺序,表中列出了默认的优先顺序。你可以用圆括号括住你想要先计算的表达式来覆盖默认的优先顺序。
2.6.1示例一
查询工作岗位是 SA_REP 或者工作岗位是 AD_PRES 并且薪水大于 15000 的员工姓名、工作 ID 以及薪水。
![62bdc8a0090d6df24983c6d0240138b5.png](https://img-blog.csdnimg.cn/img_convert/62bdc8a0090d6df24983c6d0240138b5.png)
2.6.2示例二
查询工作岗位是 SA_REP 或者是 AD_PRES 并且他们的薪水大于 15000 的员工姓名、工作 ID 以及薪水。
![320afbef4205072290f93c7b79bb87e3.png](https://img-blog.csdnimg.cn/img_convert/320afbef4205072290f93c7b79bb87e3.png)
2.7使用 ORDER BY 排序
2.7.1ORDER BY 子句作用
用 ORDER BY 子句排序
ASC: 升序排序,默认
DESC: 降序排序
ORDER BY 子句:用于对结果集进行排序处理,提供了升序排序(ASC)与降序排序
(DESC)如果不指定排序规则默认为升序排序。在排序中也可以使用没有包括在 SELECT 子
句中的列排序。如果未使用 ORDER BY 子句,排序次序就未定义,并且 Oracle 服务器可
能对于相同查询的两次执行取回行的顺序不同。
2.7.2ORDER BY 语法
ORDER BY 子句在 SELECT 语句的最后
ORDER BY 后侧指定需要排序列
ASC 以升序排序行 (这是默认排序)
DESC 以降序排序行
2.7.3升序规则
对于数字值,小的值在前面显示—例如,1–999。
对于日期,早的日期在前面显示—例如,01-1-92 在 01-1-95 前面 。
对于字符值,依字母顺序显示—例如,A 第一,Z 最后。
对于空值,升序排序时显示在最后,降序排序时显示在最前面
2.7.3.1 示例
对于空值,升序排序时显示在最后,降序排序时显示在最前面
![9301e57cc97531759e239a538e96f689.png](https://img-blog.csdnimg.cn/img_convert/9301e57cc97531759e239a538e96f689.png)
![92099bf22ee2ad25f28f80f0267734f3.png](https://img-blog.csdnimg.cn/img_convert/92099bf22ee2ad25f28f80f0267734f3.png)
2.7.4列号排序
可以使用投影的列的序号指定排序列,但是不推荐此种做法。
2.7.4.1 示例
![1e95a334c329a134c4184227b0583b52.png](https://img-blog.csdnimg.cn/img_convert/1e95a334c329a134c4184227b0583b52.png)
2.7.5用列别名排序
可以使用列的别名指定排序列。
2.7.5.1 示例
![d589f22f6c038e566707c101affd43f7.png](https://img-blog.csdnimg.cn/img_convert/d589f22f6c038e566707c101affd43f7.png)
2.7.6多列排序
多列排序:可以用多列排序查询结果。在 ORDER BY 子句中,多个指定的列名之间用逗号分开。如果想要对某个列倒序排序需则在该列名后面指定 DESC。
2.7.6.1 示例:
![5b4c09ebee1645f096e24e041be2d5c2.png](https://img-blog.csdnimg.cn/img_convert/5b4c09ebee1645f096e24e041be2d5c2.png)
2.7.7SELECT 语句的执行顺序如下:
FROM 子句
WHERE 子句
SELECT 子句
ORDER BY 子句
2.8约束与排序小节练习
2.8.1创建一个查询,显示收入超过 $12,000 的雇员的名字和薪水。
![08d1614cfcc5a94bc383db121257ccf4.png](https://img-blog.csdnimg.cn/img_convert/08d1614cfcc5a94bc383db121257ccf4.png)
2.8.2 创建一个查询,显示雇员号为 176 的雇员的名字和部门号。
![923efb6642045b8897a561b511670259.png](https://img-blog.csdnimg.cn/img_convert/923efb6642045b8897a561b511670259.png)
2.8.3显示所有薪水不在 5000 和 12000 之间的雇员的名字和薪水。
![8bed2e564c680e088ea2637f73f4c6ac.png](https://img-blog.csdnimg.cn/img_convert/8bed2e564c680e088ea2637f73f4c6ac.png)
2.8.4显示受雇日期在 2002 年 2 月 20 日 和 2007 年 5 月1 日 之间的雇员的名字、岗位和受雇日期。按受雇日期顺序排序查询结果。
![0752ca8b64085bb5801cd4214d42a45c.png](https://img-blog.csdnimg.cn/img_convert/0752ca8b64085bb5801cd4214d42a45c.png)
2.8.5显示所有在部门 20 和 50 中的雇员的名字和部门号,并以名字按字母顺序排序。
![ab79ea36d840b5f339e89d973ee5602d.png](https://img-blog.csdnimg.cn/img_convert/ab79ea36d840b5f339e89d973ee5602d.png)
2.8.6 列出收入在 $5,000 和 $12,000 之间,并且在部门 20或 50 工作的雇员的名字和薪水。将列标题分别显示为Employee 和 Monthly Salary。
![927fdbef36131b149b073f2b9ce18dbb.png](https://img-blog.csdnimg.cn/img_convert/927fdbef36131b149b073f2b9ce18dbb.png)
2.8.7显示每一个在 2004 年受雇的雇员的名字和受雇日期。
![728d87bd632481900b5649e1dc8905a1.png](https://img-blog.csdnimg.cn/img_convert/728d87bd632481900b5649e1dc8905a1.png)
2.8.8显示所有没有主管经理的雇员的名字和工作岗位。
![c4f1c7041a2b758e874b4b812b697880.png](https://img-blog.csdnimg.cn/img_convert/c4f1c7041a2b758e874b4b812b697880.png)
2.8.9显示所有有佣金的雇员的名字、薪水和佣金。以薪水和佣金的降序排序数据。
![368aebc6c5b082abe5c4a83c0732c792.png](https://img-blog.csdnimg.cn/img_convert/368aebc6c5b082abe5c4a83c0732c792.png)
2.8.10 显示所有名字中第三个字母是 a 的雇员的名字。
![430d25520a29bdffbced3d11835b0f32.png](https://img-blog.csdnimg.cn/img_convert/430d25520a29bdffbced3d11835b0f32.png)
2.8.11 显示所有名字中有一个 a 和一个 e 的雇员的名字。
![239dd9500efdc2b2d8f136580b092111.png](https://img-blog.csdnimg.cn/img_convert/239dd9500efdc2b2d8f136580b092111.png)
2.8.12 显示所有工作是销售代表(SA_REP)或者普通职员(ST_CLERK),并 且薪水不 等于 $2,500、$3,500 或$7,000 的雇员的名字、工作和薪水。
![570702557e0e7a99e95056d6a8da02fc.png](https://img-blog.csdnimg.cn/img_convert/570702557e0e7a99e95056d6a8da02fc.png)
2.8.13 显示所有佣金总计为 20% 的雇员的名字、薪水和佣金。
答案:
法一:select last_name,salary,commission_pct
from employees where commission_pct = 0.2;
![cd4b87a5e130e4d418a75379c8563d80.png](https://img-blog.csdnimg.cn/img_convert/cd4b87a5e130e4d418a75379c8563d80.png)
法二:select last_name,salary,commission_pct
from employees where commission_pct = .20;
![038d679d4f3f4408ad0f5dfae4c3199a.png](https://img-blog.csdnimg.cn/img_convert/038d679d4f3f4408ad0f5dfae4c3199a.png)
3 Oracle 函数
3.1函数介绍
3.1.1什么是函数
函数:是数据库产品中提供的能够处理查询结果的方法。
函数能够用于下面的目的:
• 执行数据计算
• 修改单个数据项
• 格式化显示的日期和数字
• 转换列数据类型
• 函数有输入参数,并且总有一个返回值。
![a38b93e1a301bbd644962d7e857968af.png](https://img-blog.csdnimg.cn/img_convert/a38b93e1a301bbd644962d7e857968af.png)
3.1.2函数类型
单行函数:这些函数仅对单个行进行运算,并且每行返回一个结果。
多行函数(聚合函数):这些函数能够操纵成组的行,每个行组给出一个结果,这些函数也被称为组函数
![04a9d271080c4b6debae40ae1e834df2.png](https://img-blog.csdnimg.cn/img_convert/04a9d271080c4b6debae40ae1e834df2.png)
3.1.3函数语法
function_name(arg1,arg2,.....)function_name:是函数的名字。
arg1, arg2:是由函数使用的任意参数。参数可以是一个列名、用户提供的常数、变量值、或者一个表达式。
3.2单行函数
3.2.1单行函数的特性包括:
• 作用于每一个返回行,每行返回一个结果
• 可能需要一个或多个参数
• 可以修改结果集的数据类型
• 可以嵌套
• 可能返回一个与参数不同类型的数据值
• 能够用在 SELECT、WHERE 和 ORDER BY 子句中
3.2.2单行函数分类
![40812fdf36c381035213809beaa08576.png](https://img-blog.csdnimg.cn/img_convert/40812fdf36c381035213809beaa08576.png)
字符函数:接受字符输入,可以返回字符或者数字值
数字函数:接受数字输入,返回数字值
日期函数:对 DATE 数据类型的值进行运算 (除了 MONTHS_BETWEEN 函数返回一个数字,所有日期函数都返回一个 DATE 数据类型的值。)
转换函数:从一个数据类型到另一个数据类型转换一个值
通用函数:
− NVL
− NVL2 − NULLIF − COALSECE
− CASE
− DECODE
3.3字符函数
字符函数:单行字符函数接受字符数据作为输入,既可以返回字符值也可以返回数字值。
3.3.1字符函数分类
• 大小写处理函数
• 字符处理函数
![242e219e1c24d32d6af6cd101572ea19.png](https://img-blog.csdnimg.cn/img_convert/242e219e1c24d32d6af6cd101572ea19.png)
3.3.2大小写处理函数
![cc53d660e8fd1c4b077c5db7f5be4e05.png](https://img-blog.csdnimg.cn/img_convert/cc53d660e8fd1c4b077c5db7f5be4e05.png)
LOWER:转换大小写混合的字符串为小写字符串。
UPPER:转换大小写混合的字符串为大写字符串。
INITCAP:将每个单词的首字母转换为大写,其他字母为小写。大小写处理函数需要一个参数,参数类型为字符串类型,返回一个字符串。
3.3.3示例一
查询员工表,使用 “ The Job id for ”链接转换大写格式后的员工姓名,并使用“ is ”字符串链接他们工作 ID,要求将工作 ID 转换小写格式。修改列名为“EMPLOYEE DETAILS”。
![6e672aed12205da8aec158f6ccee83d9.png](https://img-blog.csdnimg.cn/img_convert/6e672aed12205da8aec158f6ccee83d9.png)
3.3.4示例二
显示雇员 higgins 的雇员号、姓名和部门号
![d0c13fb493125e8336bfe1dab5ade142.png](https://img-blog.csdnimg.cn/img_convert/d0c13fb493125e8336bfe1dab5ade142.png)
![a27fc929742027bdf22f8a65a89b5712.png](https://img-blog.csdnimg.cn/img_convert/a27fc929742027bdf22f8a65a89b5712.png)
3.4字符处理函数
dual 表:dual 是一张只有一个字段,一行记录的表。dual 表也称之为'伪表',因为他不
存储主题数据。如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们
想得到的信息,并要通过 select 完成时,就要借助 dual 表来满足结构化查询语言的格式
CONCAT(arg1,arg2):连接值在一起 (CONCAT 函数有两个输入参数)
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:字符串类型。填充的子字符串。
![516ff7d600db25b08c8e5bbd4c29c7c4.png](https://img-blog.csdnimg.cn/img_convert/516ff7d600db25b08c8e5bbd4c29c7c4.png)
3.4.1示例一
显示所有工作岗位名称从第 4 个字符位置开始包含字符串 REP 的雇员的信息,将雇员的姓和名连接显示在一起,还显示雇员名的长度,以及名字中字母 a 的位置。
![17b2906ec4a559a7ad203eddebbf4cda.png](https://img-blog.csdnimg.cn/img_convert/17b2906ec4a559a7ad203eddebbf4cda.png)
3.4.2示例二
显示名字是以 n 结束的雇员的数据,将雇员的姓和名连接显示在一起,还显示雇员名的长度,以及名字中字母 a 的位置。
![67433d85ac9d1d344bb780fb1a601551.png](https://img-blog.csdnimg.cn/img_convert/67433d85ac9d1d344bb780fb1a601551.png)
3.4.3示例三
将手机号中间四位用星号代替。
![b9d737ac57936e37ee51ea3b54a90275.png](https://img-blog.csdnimg.cn/img_convert/b9d737ac57936e37ee51ea3b54a90275.png)
3.5数字函数
ROUND(arg1,arg2):四舍五入指定小数的值。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数,可以是一个负数。负数则表示指定整数的位置。
ROUND(arg1):四舍五入保留整数。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数。
TRUNC(arg1,arg2):截断指定小数的值,不做四舍五入处理。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数,可以使一个负数。负数则表示指定整数的位置。
TRUNC(arg1):四舍五入保留整数。
arg1:数字类型。原数字。
arg2:整数类型。小数点保留的位数。
MOD(arg1,arg2):取余。
arg1:数字类型。被除数。
arg2:数字类型。除数。
3.5.1示例一
计算所有是销售代表(SA_REP)的雇员的工资被 5000 除后的余数。
![8f4b061f8da4bc42ce2fafb7931e18ce.png](https://img-blog.csdnimg.cn/img_convert/8f4b061f8da4bc42ce2fafb7931e18ce.png)
3.6日期处理
3.6.1日期的使用
3.6.1.1 SYSDATE 函数
SYSDATE 是一个日期函数,它返回当前数据库服务器的日期和时间。
3.6.1.2 用日期计算
• 从日期加或者减一个数,结果是一个日期值
• 两个日期相减,得到两个日期之间的天数
• 用小时数除以 24,可以加小时到日期上
3.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:日期类型。
![9284dfe4680df8f20f25d9c4bb29ada9.png](https://img-blog.csdnimg.cn/img_convert/9284dfe4680df8f20f25d9c4bb29ada9.png)
ROUND(date,‘fmt’):返回用格式化模式 fmt 四舍五入到指定单位的 date ,如果格式模
式 fmt 被忽略,date 被四舍五入到最近的天。
date:日期类型。
fmt:字符串类型。
TRUNC(date, ‘fmt’):返回用格式化模式 fmt 截断到指定单位的带天的。如果格式模式
fmt 被忽略,date 被截断到最近的天。
date:日期类型。
fmt:字符串类型。
3.6.2.1.1示例一
查询所有受雇在 15 年 (180 个月) 以内的雇员的 employee_id,hire_date,显示他们已被雇用的月,从受雇日期开始加 6 个月的试用期后的日期,受雇日期后的第一个星期五是几号,以及受雇月的最后一天是几号。
![b7b9a133fce68ac8fe99254b39de23a2.png](https://img-blog.csdnimg.cn/img_convert/b7b9a133fce68ac8fe99254b39de23a2.png)
3.6.2.1.2示例二
查询受雇日期,找出 2002 年开始工作的哪些人。用 ROUND 和 TRUNC 函数显示开始的月份。
![2eccdc6db87c1844d0242af241308bb8.png](https://img-blog.csdnimg.cn/img_convert/2eccdc6db87c1844d0242af241308bb8.png)
3.7数据类型装换
![85d8856f2f209d015dc7a0356f5832fd.png](https://img-blog.csdnimg.cn/img_convert/85d8856f2f209d015dc7a0356f5832fd.png)
3.7数据类型装换
3.7.1隐式数据类型转换
隐式转换:当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
3.7.1.1 对于直接赋值转换
![7fc263370c721def35062dd3402efc43.png](https://img-blog.csdnimg.cn/img_convert/7fc263370c721def35062dd3402efc43.png)
3.7.1.2 对于表达式赋值
![64e5ef156c543a2d8520f39e0351fda1.png](https://img-blog.csdnimg.cn/img_convert/64e5ef156c543a2d8520f39e0351fda1.png)
3.7.1.3 隐式转换的问题
1.影响性能 2不便于阅读
3.7.2显示数据类型转换
通过数据库中的转换函数完成数据类型的转换
3.7.3转换函数
![07536a59ad0adef95176df28e96d8e1f.png](https://img-blog.csdnimg.cn/img_convert/07536a59ad0adef95176df28e96d8e1f.png)
TO_CHAR(arg1,’fmt’):将一个日期或者数字转换为字符类型。带格式化样式 fmt。
arg1:数字或者日期类型。需要转换的数据。
fmt:转换格式。
3.7.3.1 to_char 日期转换
日期格式模板的元素
![a4e6052bef3a0c0b8298191d65967ebd.png](https://img-blog.csdnimg.cn/img_convert/a4e6052bef3a0c0b8298191d65967ebd.png)
示例:
显示所有雇员的名字和受雇日期,受雇日期以 2007 年 8 月 10 日 12:00:00 AM 显示。
select last_name,to_char(hire_date,'yyyy" 年 "MM" 月"DD"日" HH:MI:SS AM') from employees;
3.7.3.2 to_char 数字转换
数字格式模板
![8ff655ba9c6f76f3a49f6b47eba6befe.png](https://img-blog.csdnimg.cn/img_convert/8ff655ba9c6f76f3a49f6b47eba6befe.png)