【SQL】Sql基礎
- Sql基礎
- 過濾和排序
- Where字句過濾多條件過濾
- And,or
- 比較符
- > 大於
- >= 大於等於
- < 小於
- <= 小於等於
- <>:不等於
- !=:不等於
- IS NULL:是否為空值
- IS NOT NULL:不為空值
- NOT:條件為FALSE時返回TRUE
- BETWEEN x AND y:大於等於X,小於等於Y
- IN (集合):在這個集合中,或者講在這個列表中
- NOT IN(集合):不在這個集合中,或者講不在這個列表中
- LIKE:使用LIKE操作符來執行有效搜尋字串數值的萬用字元搜尋
- %:通配任意字元
- _:能配單個字元
- 日期和字串處理
- Order by 排序
-------自己具體實現
- SELECT查詢
- Select結構化查詢語言
- DDL:資料定義語言
- DCL:資料控制語言
- DQL:資料查詢語言
- DML:資料操縱語言
- sql的 特點
- 語句不區分大小寫
- Sql輸入可以是1行或者多行,已分號結尾
- 關鍵字無法整行縮寫或者分離
- 子句通常放在分開的行上
- 縮排可提高可讀性
- 每個sql用分號結尾(英文分號)
- SQL*PLUS特徵
- 字元日期左對齊
- 數字右對齊
- 列名預設大寫
- Sql plus自己的命令不需要用分號結尾
- Sql查詢時,數字和日期可用算術運算子
+ - * / ( )
- 空值
- 用NULL表示
- 與算術運算子運算時為null
- Null不與任何值相等
- 為空:is null
- 不為空:is not null
- Asc時null在最後,desc時null在最前
- 相關函式
- Nvl(表示式1,表示式2),測試表達式的值,如果表示式1為空,則返回表示式2的值;不為空,返回表示式1的值。
- nvl2(表示式1,表示式2,表示式3)測試表達式的值,表示式1不為空,返回表示式2的值,如果為空,則返回表示式3的值。
- nullif相等為空:nullif(表示式1,表示式2)比較表示式1和表示式2的值,如果兩個相等則返回為空,否則返回表示式1的值。
- coalesce找非空:coalesce(表示式1,表示式2,表示式3…表示式n)返回第一個不為空的值,如果所有的都為空,則返回NULL。
- 常用函式
- 函式分類
- 單行函式:基於單行的處理,一行產生一個結果
- 多行函式:基於多行的處理,對多行進行彙總,多行產生結果
- 函式形式:
Function_name [(arg1,arg2,…)]
- 常用的單行函式
- 字元函式
- lower(x) 轉小寫
- upper(x) 轉大寫
- initcap(x) 首字母轉大寫
- concat(x,y)字元連結,與||功能類似
- substr(x,start [,length])取子串
- length(x)取字串長度
- lpad | rpad(x,width [,pad_string])字元定長,不夠的話左 | 右填充
- trim(‘x’ from ‘xxx’)刪除首尾字串
- trim(leading ‘x’ from ‘xxx’)只刪首部
- trim(trailinhg ‘x’ from ‘xxx’)只刪尾部
- ltrim(x[,trim_string])從x右邊刪除字串,等價於使用trailing
- rtrim(x[,trim_string])從x左邊刪除字串,等價於使用leading
- instr 返回字元在字串中的位置instr(x,seach_string,substring,position,occurence)
- replace(x,seach_string,replace_string,)字元替換
- 數值函式
- round(x,[,y])四捨五入
- trunc(x,[,y])截斷
- mod(n,m)求餘
- ceil(x)返回特定的最小數(大於等於x的最小整數)
- floor(x)返回特定的最大值(小於等於x的最大整數)
- 日期函式:
- sysdate 返回系統當前日期
- 字元函式
實際上ORACLE內部儲存日期的格式是:世紀,年,月,日,小,分鐘,秒。
不管如何輸入都這樣
9i開始,預設的日期格式是:DD-MON-RR,之前是DD-MON-YY
RR 和YY 都是世紀後的兩位,但有區別
ORACLE的有效日期範圍是:公元前年月日-年月日
RR日期格式:
- 如果當前年份最後兩位是:-,並且指定年份的最後兩位也為-,
則返回本世紀
例:當前年:, 01--,表示2008 年
2、如果當前年份最後兩位是:-,指定年份最後兩位為50-
則返回上世紀。
例:當前年:,01--,表示1998
3、如果當前年最後兩位為:-,指定年份最後兩位為0-,
則返回下世紀。
例:當前年:,--表示的是年
4、如果當前年最後兩位是:-,指定年份最後兩位為:-
則返回本世紀。
例:當前年:,--表示的是年
-
-
- months_between(x,y) 兩個日期之間相差的月數
-
例:查詢最近個月入職的員工
-
-
- add_months(x,y) 返回x上加上y個月後的結果
- last_day(x) 返回指定日期所在月最後一天的日期
- next_day(x,day) 返回指定日期的下一day的時間值,day是一個文字串,比如SATURDAY
- extract 提取日期
-
select extract(day from sysdate) from dual
select extract(month from sysdate) from dual;
select extract(year from sysdate) from dual;
-
- 轉換函式:
- TO_DATE(char[, 'format_model']) TO_DATE函式將一個字串轉換成日期格式
- 轉換函式:
函式有個fx 修飾語。這個修飾語為TO_DATE函式的字元函
數中的獨立變數和日期格式指定精確匹配.
-
-
- TO_CHAR(date, 'format_model') 轉換為CHAR型別,
-
必須與單引號一起嵌入,區分大小寫,
用逗號把日期數值分開,有一個fm 移除填補空白或者阻止零開頭
-
-
- TO_CHAR(number, 'format_model')
- TO_NUMBER(char[, 'format_model']) TO_NUMBER 函式將一個字串轉換成一個數字格式:
- select to_date('1999-09-23','yyyy-mm-dd') from dual;
- 資料型別的轉換分為隱式資料型別轉換和顯式資料型別轉換在表示式中, Oracle伺服器能自動地轉換下列各項,即隱式轉換:
- VARCHAR2 or CHAR =====〉NUMBER
- VARCHAR2 or CHAR =====〉DATE
- 對錶達式賦值, Oracle伺服器能自動地轉換下列各項,即隱式轉換:
- NUMBER =======〉VARCHAR2 or CHAR
- DATE =======〉VARCHAR2 or CHAR
-
日期格式元素:
YYYY 數字年份
YEAR 英文年份
MM 數字月
MONTH 英文月
MON 英文縮寫
DD 數字日
DY 英文縮寫
DAY 英文
-
- 通用函式
- decode 條件判斷
- 通用函式
格式:decode (col|expression,search1,result1 [,search2,result2,...] [,default])判斷col|exporession的值,當search1匹配時,則返回,result1,與search2匹配時,返回result2 ... 如果都不匹配,返回default。
select EMPNO,ENAME,JOB,SAL,
decode(job,'CLERK',SAL*1.15,'SALESMAN',SAL*1.1,SAL*1.12) NEW_SAL
FROM SCOTT.EMP;
-
-
- if then else 條件判斷
-
case 表示式
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
- 分組與分組函式
- 分組:
分組函式可以對行集進行操作,並且為每組給出一個結果。
使用group by column1,column2,..按columm1,column2進行分組,即column1,column2組合相同的值為一個組
- 常用分組函式
- AVG([DISTINCT|ALL]n) -- 求平均值,忽略空值
- COUNT({*|[DISTINCT|ALL]expr}) -- 統計個數,其中expr用來判定非空值(使用*計算所有選定行,包括重複行和帶有空值的行)
- MAX([DISTINCT|ALL]expr) -- 求最大值,忽略空值
- MIN([DISTINCT|ALL]expr) -- 求最小值,忽略空值
- SUM([DISTINCT|ALL]n) -- 求和,忽略空值
- 分組函式語法
- SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
- 分組函式使用準則:
- DISTINCT 使函式只考慮非重複值,ALL則考慮包括重複值在內的所有值。預設為ALL,
- 帶有expr引數的函式的資料型別可以為CHAR,VARCHAR2,NUMBER,DATE,
- 所有分組函式都忽略空值。可以使用NVL,NVL2,或COALESCE函式代替空值
- 使用GROUP BY 時,Oralce伺服器隱式地按照升序對結果集進行排序。
- 可以使用ORDER BY 更改排序結果
- 可以使用NVL 函式強制分組函式包含空值,如:
select avg(nvl(comm,0)) from emp;
- GROUP BY 子句的語法:
- 使用GROUP BY 子句可以將表中的行分成更小的組,然後使用分組函式返回每一組的彙總資訊
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
-
- GROUP BY --group_by_expression 即為對哪些列進行分組
- GROUP BY 使用準則:
- SELECT 中出現的列,
- 如果未出現在分組函式中,則GROUP BY子句必須包含這些列,
- WHERE 子句可以某些行在分組之前排除在外,
- 不能在GROUP BY 中使用列別名,
- 預設情況下GROUP BY列表中的列按升序排列,
- GROUP BY 的列可以不出現在分組中
- SELECT 中出現的列,
- 分組過濾:
- 使用having子句
- having使用的情況
- 行已經被分組
- 使用了組函式
- 滿足having子句中條件的分組將被顯示
- having使用的情況
- 使用having子句
- 多表查詢
- 子查詢
- 集合運算
集合運算子可以將2個或者多個查詢返回的行組合起來,即集合屬於縱連結運算
Union all
Union
Intersect
Minus
- 層次化查詢
由根節點,父節點,子節點,葉節點組成
- 檢視
- ROLLUP與CUBE運算子實現資料彙總
Rollup:為每個分組返回小計記錄以及為所有的分組返回總計記錄
Cube:返回列中所有組合的小計記錄以及為所有分組返回總計記錄
- 建立表
- 序列sequence,同義詞synonym
- 約束constraint
- 資料處理(DML,RETURNIMNG,MERGE INTO)
- 常用的DML語句及事物處理
- Insert
- Undate
- Delete
- Merge
- Transaction
- 資料庫事物(TRANSACTION)
- 資料庫事物
資料庫事物是指作為單個邏輯單元執行的一系列操作,也可以認為事物就是一組不可分割的sql語句
- 資料庫事物的ACID屬性
- 原子性
資料要麼是修改之前的要麼是修改之後的,沒有中間結果
-
- 一致性
資料庫資料狀態不會改變
-
- 隔離性
併發時對其他執行緒不可見
-
- 永續性
事物完成後永久性改變,即使資料損毀後重新回覆也是修改後的狀態
- 事物組成
1/N個DML組成,1個DDL組成,1個DCL組成
開始:第一個DML語句的執行作為開始
結束:
Commit (提交)
Rollback (回滾)
Ddl語句或者dcl語句 (自動提交)
使用者會話正常結束 (自動提交)
系統異常終止 (自動回滾)
系統崩潰 (自動回滾)
- 事物提交或回滾
- 使用commit提交,robinson記錄被插到表
- 使用rollback回滾,更新將失效迴歸到開始之前的狀態
- 儲存點
- 設定儲存點
SAVEPOINT NAME
-
- 恢復至儲存點
ROLLBACK TO NAME
- 事物的開始與結束及不同時刻的狀態
- 併發事物
多個使用者與資料庫同時與資料庫互動,且每個使用者都可以同時訪問自己的事物,這就是併發事物。
對於同一個物件上執行的多個事物,僅當執行commit時才對彼此的查詢產生影響
- 利用autocommit進行事物控制
- SET AUTOCOMMIT ON
設定自動提交,每執行一條語句,就提交。