Oracle学习笔记

 

常用设置

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     -- 差集(排序去重)

-- 自定义的排序操作要放在集合操作之后

 

你可能感兴趣的:(oracle学习)