AS用做別名,若別名中希望區分大小寫,或其中包含空格,則必須用雙引號引起來。
where語句如果比較的是字符或者日期類型必須用單引號引起來。數字則可以引起來和不引起來。
查詢條件:>,<,>=,<=,!=,<>,= ,AND,OR,IN,Not IN,between.............and..............,is null,is not null
模糊查詢:Like 其中%表示0到多個字符,_表示一個字符。例如:select job from emp where ename like '_lk%';
使用any和all提交必須和(>=,>,<,<=)配合使用。
>any:大於最小
<any:小於最大
>all:大於最大
<all:小於最小
例如:select name from emp where sal>any(4000,4500,5000)
查詢條件中可以使用表達式和函數
distinct用於去掉重複的值。
排序:
order by column [asc|desc] 默認降序asc 升序排列,null值爲最大。 注意多列排序時每個列都必須設置排序方式。order by deptno asc, sal desc;
聚合函數:將表中的全部數據劃分爲幾組數據,每組數據統計出一個結果。(分組函數,多行函數,集合函數)
max()
min()
avg()
sum()
count()
聚合函數會忽略Null值,所以要與空值函數配合使用。例如:select avg(nvl(sal,0)) from emp
分組:
group by
having
order by
查詢優化:
from從右到左,數據量少的表放到後面
where從右到左,將能過濾掉最大數量的記錄條件寫在where子句中的最右。
group by 從左到右,在group by 之前最好將不需要的記錄過濾掉。
避免使用having
select 少用*號
關聯查詢:
笛卡爾積
等值連接:使用“=”連接相關的表
內連接:JOIN ON 返回所有滿足連接條件的記錄。
外連接:有時候返回那些不滿足連接條件的記錄,需要使用到外連接。(Left、Right、Full JOIN........ON...........)
其中full全外連接,返回滿足連接條件和不滿足連接條件的所有其他行。
自連接:來源於一個表,關聯關係爲單個表中的多個列。
高級查詢:
子查詢:是嵌入在其他SQL語句中的Select語句,大部分出現在Where子句中。
根據返回結果的不同,子查詢可以分爲單行子查詢、多行子查詢及多列子查詢。
例如:查找薪水比整個機構平均薪水高的員工。Select * from emp e where sal>(Select avg(sal) from emp);
如果子查詢返回多行,主查詢可以使用多行比較操作符包括IN、ALL、ANY。
例如:查詢部門中有SALESMAN但是職位不是SALSMAN的員工信息。
Select * From emp where deptno IN (Select deptno From emp where job='SALESMAN') AND job <> 'SALEMAN';
Exists
例如:列出那些有員工的部門信息。Select * From deptno d where exists(Select * From emp e where e.deptno=d.deptno);
子查詢在Having子句中。例如:查詢列出最低薪水高於部門30的最低薪水的部門信息。
Select * From dept d group by deptno having MIN(salary)>(Select salary from dept where deptno = 30);
子查詢在From部分。
子查詢在Select部分。可以認爲是外連接的另一種表現形式。
Oracle的分頁查詢:
Rownum僞列,用於返回標識行數據順序的數字。從1開始。
例子:利用Rownum截去結果集中的部分數據。Select * from(Select Rownum rn,e.* From emp e) Where rn Between 8 and 9;
Oracle的分頁語句:Select * From (Select Rownum rn,e.* From e)t Where t.rn Between ((n-1)*pageSize +1) AND (n*pageSize) ;
Decode函數:
Decode(expr,search1,result1[,result2][default]) 用於比較參數expr的值,如果匹配到哪一個search條件,就返回對應的result結果,如果沒有匹配到返回default結果或null
例如:Select job ,name ,sal Decode(job,
'MANAGER',sal*1.2,
'SALESMAN',sal*1.5,
sal
)bonus
From emp ;
Case的功能和decode類似:
Select ename job case job
when 'MANAGER' then sal*1.2
when 'ANALYST' then sal*1.1
ELSE sal END
bonus
From emp;
DECODE函數在分組查詢中的應用,
一:按字段內容分組:例如:計算職位的人數,analyst/manager屬於vip,其餘屬於operation
Select Decode(job,'ANALYST','vip','MANAGER','vip','operation') job, count(1) job_cn From emp group by Decode(job,'ANALYST','vip','MANAGER','vip','operation');
二:按字段內容排序:例如:Select * From dept Order By Decode(dname,'Operation','1','account','2');
排序函數:
Row_Number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序。
Rank() over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2給予等級標識。有重複值。
Rense_Rank() over( partition by col1 order by col2)不重複
集合操作:
UNION、UNION ALL、INTERSECT和MINUS
UNION合併,去重複記錄,排序
UNION ALL 合併,不去重複,不排序
INTERSECT,交集
MINUS,差集
高級分組:
Rollup、Cube、Groupting sets運算符是GROUP By 子句的擴展。
例如:假設表test 有a、b、c group by rollup(a,b,c)等價於group by a,b,c Union All group by a,b Union All group by a group by ..
例如:group by cube(a,b,c) 依次(a,b),(a,c),(b,c),(a),(b),(c),(a,b,c)
grouping sets可以生成與使用單個group by 、rollup或cube運算符所生成的結果集相同的結果集。