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;