常用设置
set verify on/off ------ 使用替代变量时是否显示旧值和新值 set heading on/off ----- 列头 set feedback on/off ---- 结果集数量 spool a.txt -- 输出查询结果到文件 spool off ----- 终止输出到文件 define _EDITOR = vim ----- sqlplus使用的编辑器
GROUP 子句不能使用列别名:
SELECT --------------- 5 FROM ----------------- 1 WHERE ---------------- 2 GROUP BY ------------- 3 HAVING --------------- 4 ORDER BY ------------- 6
特殊字符
'''' ------------------- 单引号(最外侧的单引号之内,每两个单引号表示一个单引号) q'[.*]' ---------------- []可替换为任意单个字符,中间的内容保持原样 'S\_%' escape '\' ------- 使用通配符时,如果要匹配的字符串中包含通配符,使用转义
替代变量
&var ----- 数字等 '&var' ---- 字符串、日期等 &&var --- 替代变量,同时有隐式define where name = '&var' ---- 如果name包含&字符,则此处将失败 set define "&" ----------- 默认 set define off ------------ 禁用&的定义 set define on ------------ 启用&的定义 set define # ------------- 定义为其他字符(off、on之后恢复为&) where name = '&'||'var' ---- 通过拼接来实现把&当作普通字符
关于null
IN -------------- = ANY(100,null) => 结果正确 NOT IN ----- <> ALL(100,null) => 始终 no rows selected order by 1 asc ------------------------ null 显示在最后 order by 1 asc nulls first ---------- null 显示在最前 order by 1 desc ---------------------- null 显示在最前 order by 1 desc nulls last -------- null 显示在最后
字符串函数
lower ---- 小写 upper ---- 大写 initcap --- 单词首字母大写 concat --- 连接 substr ---- 取子串 length ---- 求长度 instr ------- 找位置 lpad ------- 左填充 rpad ------- 右填充 trim -------- 去空字符/指定字符 replace --- 替换
数字函数
round -- 四舍五入 trunk --- 截断 mod ---- 取余
日期函数
sysdate --- 系统当前日期 round ------ 四舍五入 trunk ------- 截断 months_between(date1, date2) --- date1 - date2转换为月 add_months next_day --- 指定日期之后的下一个星期 last_day ---- 指定日期的月份的最后一天
关于星期的说明:
星期的第一天默认是周日,要把周一当作星期的第一天,可以转换之前把日期减1
select to_char(sysdate, 'Day'); => select to_char(sysdate - 1, 'Day');
单行函数
nvl ----- 为空返回指定的值 nvl2 --- 为空返回指定的值,否则返回另一个指定的值 nullif -- 两值是否相等,相等返回null,否则返回第一个值 COALESCE -- 返回第一个非空值
条件表达式
case expr when ... then ... when ... then ... else ... end decode (col|expr, search1, result1, search2, result2, default) -- 行列转换 select name, decode(course, 'yuwen', grade) yuwen, decode(course, 'math', grade) math, decode(course, 'english', grade) english from test; NAME YUWEN MATH ENGLISH ---------- ---------- ---------- ---------- zs 10 zs 20 zs 30 ls 40 ls 50 ls 60 ww 70 ww 80 ww 90 select name,max(yuwen) yuwen,max(math) math,max(english) english from (select name, decode(course, 'yuwen', grade,'') yuwen, decode(course, 'math', grade,'') math, decode(course, 'english', grade,'') english from test) a group by name; NAME YUWEN MATH ENGLISH ---------- ---------- ---------- ---------- ls 40 50 60 zs 10 20 30 ww 70 80 90
组函数 (多条记录返回一个值,忽略空值)
count sum min max avg count(*), count(1), count(0) --总行数(记录中的所有信息为空也计算在内) count(null) -- 0行 count(col) -- 不为空的行数 -- 计算有提成的人数 select count(case when COMMISSION_PCT is not null then 1 else null end) from employees; select count(COMMISSION_PCT) from employees; -- 对有空值的列求平均值 select avg(nvl(COMMISSION_PCT, 0)) from employees;
说明: select目标列中只能出现group by中的列和组函数
rownum 分页
-- 不带排序的分页 rownum select * from ( select rownum rn, last_name, salary from employees where rownum <= &n * 10) a where rn > (&n - 1) * 10; -- 排序的分页 rownum select * from ( select rownum rn, last_name, salary from ( select last_name, salary from employees order by last_name) a where rownum <= &n * 10) b where rn > (&n - 1) * 10; -- 排序的分页 分析函数: row_number() select * from ( select row_number() over(order by last_name) rn, last_name, salary from employees) where rn between (&n - 1) * 10 and &n * 10; A 1 A 2 B 3
分析函数: row_number()
-- 不分组编号(相同的值编号递增) select row_number() over(order by salary) rn, salary from employees -- 在分组内编号(同一分组内相同的值编号递增) select department_id, row_number() over(partition by department_id order by salary) rn, salary from employees; A 1 A 2 B 1
分析函数: rank()
-- 不分组编号(相同的值编号不递增,计数) select department_id, rank() over(order by salary) rn, salary from employees; -- 在分组内编号(同一分组内相同的值编号不递增,计数) select department_id, rank() over(partition by department_id order by salary) rn, salary from employees; A 1 A 1 B 3
分析函数: dense_rank()
select department_id, dense_rank() over(order by salary) rn, salary from employees; -- 在分组内编号(同一分组内相同的值编号不递增,不计数) select department_id, dense_rank() over(partition by department_id order by salary) rn, salary from employees; A 1 A 1 B 2
注意: 分析函数不能出现在WHERE子句中
多表连接
nature join -- 两表中列名相同的进行自然连接 using (column_name) -- 指定两表中相同列名的公共列进行自然连接 on () LEFT [OUTER] JOIN: 保留左侧表中的记录 -- oracle中把(+)放在右边 RIGHT [OUTER] JOIN: 保留右侧表中的记录 -- oracle中把(+)放在左边 FULL [OUTER] JOIN: 保留两侧表中的记录 CROSS JOIN: 笛卡尔积 (不含关联条件或关联条件无效的连接) -- SQL 1999 t1 join t2 on () join t3 on () ... -- Oracle t1, t2, t3, ... where ...
集合操作
union all -- 并集(不排序不去重) union -- 并集(排序去重) intersect -- 交集(排序去重) minus -- 差集(排序去重) -- 自定义的排序操作要放在集合操作之后