Oracle 基础知识 + 函数总结

Oracle 基础知识

SQL语句分为以下三种类型:

DML: Data Manipulation Language 数据操纵语言
DDL: Data Definition Language 数据定义语言
DCL: Data Control Language 数据控制语言
DML用于查询与修改数据记录,包括如下SQL语句:

INSERT:添加数据到数据库中
UPDATE:修改数据库中的数据
DELETE:删除数据库中的数据
SELECT:选择(查询)数据
DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:

CREATE TABLE:创建数据库表
ALTER TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引
DCL用来控制数据库的访问,包括如下SQL语句:

GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定

注意:
SQL 语言大小写不敏感
SQL 可以写在一行或者多行
关键字不能被缩写也不能分行
各子句一般要分行写
使用缩进提高语句的可读性

null值:
空值是无效的,未指定的,未知的或不可预知的值
空值不是空格或者0
包含空值的数学表达式的值都为空值

列的别名:
紧跟列名
也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写
SELECT last_name “Name”, salary*12 “Annual Salary” FROM employees;
SELECT last_name AS name, commission_pct comm FROM employees;

连接符:
用 || 表示
把列与列,列与字符连接在一起
SELECT last_name || job_id AS “Employees” FROM employees

字符串:
字符串可以是 SELECT 列表中的一个字符,数字,日期
日期和字符只能在单引号中出现
每当返回一行时,字符串被输出一次
SELECT last_name ||’ is a '||job_id AS “Employee Details” FROM employees;

单行函数:

大小写控制函数:

 - LOWER    	//转小写				结果
		LOWER('SQL Course')         sql course
 - UPPER		//转大写
		UPPER('SQL Course')			SQL COURSE
 - INITCAP		//首字符大写
		INITCAP('SQL Course')		Sql Course

字符控制函数:

 - CONCAT		//拼接函数				    结果
 		CONCAT('Hello', 'World')			HelloWorld
 - SUBSTR		//截取
		 SUBSTR('HelloWorld',1,5)			Hello
 - LENGTH		//长度
		 LENGTH('HelloWorld')				10
  - INSTR			//下标
 		 INSTR('HelloWorld', 'W')			6
 - LPAD		//靠左补齐
		  LPAD(salary,10,'*')				*****24000
 - RPAD		//靠右补齐
		 RPAD(salary, 10, '*')				24000*****
 - TRIM		//去秒某个字符
		 TRIM('H' FROM 'HelloWorld')		elloWorld
 - REPLACE		//替换
		 REPLACE(‘abcd’,’b’,’m’)			amcd
		 

数字函数:

- ROUND: 	四舍五入					结果
		ROUND(45.926, 2)			45.93
- TRUNC:	截断
		TRUNC(45.926, 2)			45.92
- MOD: 		求余
		MOD(1600, 300)		        100
- 

日期函数:

1、在日期上加上或减去一个数字结果仍为日期
	 SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS FROM   employees
2、两个日期相减返回日期之间相差的天数
	 日期不允许做加法运算,无意义
3、可以用数字除24来向日期中加上或减去天数

- SYSDATE				返回当前日期时间

- MONTHS_BETWEEN		两个日期相差的月数
		MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')		19.6774194
- ADD_MONTHS			向指定日期中加上若干月数
		ADD_MONTHS ('11-JAN-94',6)						'11-JUL-94'
- NEXT_DAY				指定日期的下一个星期 * 对应的日期
		NEXT_DAY (‘01-12月-95’,‘星期一')					‘08-12月-95'	
- LAST_DAY				本月的最后一天
		LAST_DAY('01-FEB-95')							'28-FEB-95'
- ROUND					日期四舍五入
		Assume SYSDATE = '25-JUL-95';
		ROUND(SYSDATE,'MONTH')							01-AUG-95
		ROUND(SYSDATE ,'YEAR')							01-JAN-96
- TRUNC					日期截断
		TRUNC(SYSDATE ,'MONTH')							01-JUL-95	
		TRUNC(SYSDATE ,'YEAR')							01-JAN-95

转换函数:
隐式数据类型转换:

Oracle 自动完成下列转换:
源数据							目标数据
VARCHAR2 or CHAR				NUMBER
VARCHAR2 or CHAR				DATE
NUMBER							VARCHAR2
DATE							VARCHAR2

显式数据类型转换:

格式:
//必须包含在单引号中而且大小写敏感。
//可以包含任意的有效的日期格式。
//日期之间用逗号隔开。

- TO_CHAR(date, 'format_model')      	 //TO_CHAR 函数对日期的转换
	SELECT TO_CHAR(sysdate,‘yyyy-mm-dd hh:mi:ss’) FROM dual;
	SELECT last_name, TO_CHAR(hire_date, 'DD Month YYYY')  AS HIREDATE  FROM   employees;
	select employee_id,last_name,hire_date from employees where to_char(hire_date,’yyyy-mm-dd’) = ‘1987-09-17’
	SELECT TO_CHAR(salary, '$99,999.00') SALARY FROM   employees WHERE  last_name = 'Ernst';
	
- TO_DATE(char[, 'format_model'])        //TO_DATE 函数对字符的转换
	TO_DATE(‘2012年10月29日 08:10:21’,’yyyy“年”mm”月”dd“日”hh:mi:ss’) From dual
	
- TO_NUMBER(char[, 'format_model'])     //TO_NUMBER 函数对字符的转换	
	TO_NUMBER(‘¥1,234,567,890.00’,’L999,999,999,999.99’) from dual
	

日期格式元素:

YYYY 2014
YEAR TWO THOUSAND AND FOUR
MM 02
MONTH JULY
MON JUL
DY MON
DAY MONDY
DD 02

时间格式:
HH24:MI:SS AM —> 15:45:32 PM

使用双引号向日期中添加字符
DD “of” MONTH —> 12 of OCTOBER

TO_CHAR 函数中经常使用的几种格式:

9 数字
0
$ 美元符
L 本地货币符号
. 小数点
千位符

通用函数:

- NVL 函数			//将空值转换成一个已知的值
	NVL(commission_pct,0)
	NVL(hire_date,'01-JAN-97')
	NVL(job_id,'No Job Yet')
	SELECT last_name, salary, NVL(commission_pct, 0), (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL FROM employees
	
- NVL2 (expr1, expr2, expr3)		//expr1不为NULL,返回expr2;为NULL,返回expr3
	SELECT last_name,  salary, commission_pct, NVL2(commission_pct,  'SAL+COMM', 'SAL') income FROM  employees WHERE department_id IN (50, 80);

- NULLIF (expr1, expr2) :  相等返回NULL,不等返回expr1  		
	SELECT first_name, LENGTH(first_name) "expr1", last_name,  LENGTH(last_name)  "expr2", NULLIF(LENGTH(first_name), LENGTH(last_name)) result FROM  employees;

- COALESCE
//COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值。
//如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE 。
SELECT   last_name, COALESCE(commission_pct, salary, 10) comm FROM     employees ORDER BY commission_pct;

嵌套函数:
单行函数可以嵌套
嵌套函数的执行顺序是由内到外
SELECT last_name, NVL(TO_CHAR(manager_id), ‘No Manager’) FROM employees WHERE manager_id IS NULL;

分组函数(多行函数):

分组函数作用于一组数据,并对一组数据返回一个值。

组函数语法:

	SELECT	[column,] group_function(column), ...
	FROM	table
	[WHERE	condition]
	[GROUP BY	column]
	[ORDER BY	column];
	
实例:
	SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)
	FROM   employees
	WHERE  job_id LIKE '%REP%';

组函数:
- AVG		//平均值
- COUNT		//计数
	COUNT(*) 返回表中记录总数,适用于任意数据类型。
	COUNT(expr) 返回expr不为空的记录总数。
- MAX		//最大值
- MIN		//最小值	
	可以对任意数据类型的数据使用 MIN 和 MAX 函数
- SUM		//合计

组函数与空值:
	组函数忽略空值。
	Select avg(commission_pct),sum(commission_pct)/107,
	sum(commission_pct)/count(commission_pct)
	From employees;
	查看结果的不同。
	
	NVL函数使分组函数无法忽略空值。
	SELECT AVG(NVL(commission_pct, 0)) FROM  employees;

GROUP BY :

DISTINCT 关键字:
	COUNT(DISTINCT expr)返回expr非空且不重复的记录总数。
	SELECT COUNT(DISTINCT department_id) FROM   employees;

GROUP BY 分组数据语法:
	SELECT	column, group_function(column)
	FROM		table
	[WHERE	condition]
	[GROUP BY	group_by_expression]
	[ORDER BY	column];
	
	在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。
	SELECT   department_id, AVG(salary)
	FROM     employees
	GROUP BY department_id ;

	包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
	SELECT   AVG(salary)
	FROM     employees
	GROUP BY department_id ;

	在GROUP BY子句中包含多个列
	SELECT   department_id dept_id, job_id, SUM(salary)
	FROM     employees
	GROUP BY department_id, job_id ;
	
	不能在 WHERE 子句中使用组函数
	可以在 HAVING 子句中使用组函数```
	

HAVING:

HAVING 子句 过滤分组: 
	1.	行已经被分组。
	2.	使用了组函数。
	3.	满足HAVING 子句中条件的分组将被显示。
	
	语法:
	SELECT	column, group_function
	FROM		table
	[WHERE	condition]
	[GROUP BY	group_by_expression]
	[HAVING	group_condition]
	[ORDER BY	column];
	
	实例:
	SELECT   department_id, MAX(salary)
	FROM     employees
	GROUP BY department_id
	HAVING   MAX(salary)>10000 ;

嵌套组函数:
	SELECT   MAX(AVG(salary))
	FROM     employees
	GROUP BY department_id;

猜你喜欢

转载自blog.csdn.net/qq_40393187/article/details/88975732