SQL函数的介绍
单行函数和多行函数
单行函数
----initcap(ename)首字母大写 ,upper(大写),lower(小写)----
select a.* from emp a where initcap(a.ename)= ‘James’ and upper(a.ename) = ‘JAMES’
例子:
----名字中有A的全部替换0----
select replace(a.ename,‘A’,‘0’) ename from emp a
----薪水为5位,若不够5位从左边开始用0添加----
select lpad(a.sal,‘5’,‘0’) sal from emp a
- DUAL 是一个‘伪表’,可以用来测试函数和表达式
----round:四舍五入----
select round(45.625, 2) from dual; -->45.63
----trunc:截断----
select trunc(45.625, 2) from dual; -->45.62
![](/qrcode.jpg)
----mod:求余----
select mod(500, 300) from dual; -->200
- Oracle 中的日期型数据实际含有两个值: 日期和时间。
- 函数SYSDATE 返回:日期,时间 例如:select sysdate from dual; --> 2020/3/12 00:00:00
- 日期函数
5,转换函数
-
Oracle 自动完成下列转换(隐式数据类型转换)
例如:select ‘11’+2 from dual; -->13; -
显示转换
----to_char日期转字符串,数字转字符串----
select to_char(sysdate,‘yyyy-MM-dd’),to_char(2121.13,‘L000,999.99’) from dual; --> 2020-03-12, ¥002,121.13
----to_date字符串转日期----
select to_date(‘2020-03-12’,‘yyyy-MM-dd’) from dual; --> 2020/3/12
----to_date字符串转数字----
select to_number(‘¥002,121.13’,‘L000,999.99’) from dual; --> 2121.13
-
日期格式元素
6,通用函数 -
NVL (expr1, expr2) -----> 如果expr1为空,则选择expr2的值,否则选择自身
----查询员工表中没有部门号的员工,部门号写没有部门----
select a.ename,nvl(to_char(a.mgr),‘没有部门’) job from emp a;
- NVL2 (expr1, expr2, expr3) -----> 若expr1不为空选择expr2,若为空选择expr3
----查询部门中无奖金的奖金为1,有奖金的加0.5----
select a.ename,nvl2(a.comm,a.comm+0.5,1) from emp a
- NULLIF (expr1, expr2) -----> 相等返回NULL,不等返回expr1
- COALESCE (expr1, expr2, …, exprn) -----> COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值。如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE
- 在 SQL 语句中使用IF-THEN-ELSE 逻辑
- 使用两种方法:
CASE 表达式
DECODE 函数
-----查询部门号为10,20,30的员工信息,部门为10打印1.1倍工资,其他部门打印1.2倍工资(CASE)----
select a.ename,a.deptno,case a.deptno when 10 then a.sal * 1.1 else a.sal * 1.2 end new_sal from emp a ;
-----(DECODE)----
select a.ename,a.deptno,decode(a.deptno,10,a.sal * 1.1,a.sal * 1.2) new_sal from emp a ;
- 练一练
----1,打印出 “2020年03月12日 09:05:08” 格式的当前系统的日期和时间(注意: 使用双引号向日期中添加字符)
select to_char(sysdate, ‘YYYY"年"MM"月"DD"日" HH:MI:SS’) from dual; ----> 2020年03月12日 09:05:08
----2,格式化数字: 1234567.89 为 1,234,567.89
select to_char(1234567.89, ‘999,999,999.99’) from dual;
----3,字符串转为数字时,若字符串中没有特殊字符, 可以进行隐式转换:
select ‘1234567.89’ + 100 from dual;
----4,若字符串中有特殊字符, 例如 ‘1,234,567.89’, 则无法进行隐式转换, 需要使用 to_number() 来完成
select to_number(‘1,234,567.89’, ‘999,999,999.99’) + 100 from dual; ----> 1234667.89
----5,对于把日期作为查询条件的查询, 一般都使用 to_date() 把一个字符串转为日期, 这样可以不必关注日期格式
select a.ename,a.hiredate from emp a where a.hiredate = to_date(‘1981-2-20’,‘yyyy-mm-dd’);
----6,查询每个月月末倒数第 2 天入职的员工的信息
select a.* from emp a where a.hiredate = last_day(a.hiredate) - 2;
----7,计算公司员工的年薪
select a.*,a.sal * 12 + nvl(a.comm,0) 年薪 from emp a;
多表查询
-
表EMPLOYEES (20行),表DEPARTMENTS (8行),笛卡尔集:20x8=160行
-
笛卡尔集会在下面条件下产生:
省略连接条件
连接条件无效
所有表中的所有行互相连接
- 如何避免笛卡尔集:
可以在 WHERE 加入有效的连接条件。
- 使用别名可以简化查询。使用表名前缀可以提高执行效率。
如:
SELECT e.employee_id,
e.last_name,
e.department_id,
d.department_id,
d.location_id
FROM employees e, departments d
WHERE e.department_id = d.department_id
- 连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
- 查询员工表(emp)中的员工的工资属于工资级别表(sal_grades)中的第几档:
select a.ename, a.sal, b.level
from emp a, sal_grades b
where a.sal between b.low_sal and hight_sal;
-
内连接:
合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行 -
外连接:
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+)
例(右外连接):
select * from emp a, dept b where a.deptno(+) = b.deptno;
- NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。在表中查询满足等值条件的数据。如果只是列名相同而数据类型不同,则会产生错误。
- 自然连接中是以具有相同名字的列为连接条件的。可以使用 ON 子句指定额外的连接条件。这个连接条件是与其它条件分开的。ON 子句使语句具有更高的易读性。
- 使用 ON 子句创建多表连接
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
- 自己连接自己
例如:
select m.*
from employees e, employees m
where e.manager_id = m.employee_id and e.last_name = 'Chen'
-
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右) 外连接。
-
两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为满 外连接。