函數

-----------------------------------基礎函數
1.lower函數用小寫形成替換字符串的大寫字符
2.upper函數用大寫形式替換字符串的小寫字符
3.initcap函數將字符串轉換爲首寫字母大寫的形式
4.concat函數連接兩個字符面值,列或者表達式從而生成一個更大的字符表達式
5.length函數返回組成字符串的字符數。空格,製表符和特殊字符都被length函數計算自啊內。
6.lpad rpad函數也被稱爲左填充和右填充函數,他們分別返回在給定字符串左邊或右邊填充固定數量的字符後形成的合成字符串。用於填充的字符串包括字符子面值,列值,表達式,空格,製表符和特殊字符。
   lpad(s,n,p)s表示源字符串,n表示返回字符串的最終長度,p指定用於填充的字符串。
7.trim函數從字符值的開頭或者結尾刪除一些字符,從而生成一個更簡短的字符項。
   trim(s)刪除輸入字符串兩邊的空格
   trim(trailing trimstring from s)從字符串s的結尾刪除所以trimstring(如果存在的話)
   trim(leading trimstring from s)從字符串s的開頭刪除所以trimstring(如果存在的話)
   trim(both trimstring from s)從字符串s的兩邊刪除所以trimstring(如果存在的話)
8.instr函數確定搜索字符串在在給定字符串的位置,它返回數字位置,在這個位置上,搜索字符串開始第n次出現(相對指定的起始位置而言)。如果搜索字符串不存在,那麼instr函數就返回零。
   select instr('1#3#5#7#9#','#',3,4) from dual;從位置3開始查找,查找字符串‘#’第4次出現的位置
9.substr函數從給定源字符串中給定的位置開始,提取指定長度的子字符串。如果起始位置大於源字符串的長度,就會返回null。如果從給定起始位置提取的字符數大於源字符串的長度,
   返回的部分就是從起始位置到字符串結尾的子字符串。
   select substr('1#3#5#7#9#',5,3) from dual;從位置5開始,在位置5開始後移3個位置裏面的字符串
10.replace函數用替換項取代源字符串中出現的所有搜索項。
   select replace('1#3#5#7#9#','#','*') from dual; #要被替換的字符,*替換成的字符
11.round函數依據指定的小數精度對數值進行舍入運算。返回依據有效數字以指定的小數精度進行上舍入或者下舍入的值。
   如果指定的小數精度爲n,則要舍入的有效數字在小數點右邊(n+1)的位置。
   如果n爲負數,則要舍入的有效數字在小數點左邊的位置。
   如果有效數值大於或者等於5,就進行“上舍入”,其他情況進行“下舍入”
   round(s,d)s參數表示任何數字值,d參數指定舍入的精度,它時可選的。如果沒有指定d參數,則舍入的默認精度是零,也就是說將源數字舍入爲最接近的整數。
   select round(1601.916,1) from dual;  1601.9
   select round(1601.916,2 ) from dual;  1601.92
   select round(1601.916,-3) from dual;  2000
   select round(1601.916) from dual;   1602
12.trunc函數依據指定的小數精度對數值執行截取運算。數字截取不同於舍入,因爲如果小數精度是正數的話,最後的值依據指定的小數精度刪除數字,並不進行向上或向下舍入。
   然而,如果指定的小數精度(n)爲負數,輸入值從小數點左邊第n個數位開始向後歸0.
   select trunc(1601.916,1) from dual;  1601.9
   select trunc(1601.916,2 ) from dual;  1601.91
   select trunc(1601.916,-3) fom dual;  1000
   select trunc(1601.916) from dual;   1601
13.mod函數返回除法運算的餘數。提供兩個數---被除數和除數,執行除法運算。
   如果除數時被除數的因數,mod就返回零,因爲沒有餘數。
   如果除數等於零,則返回no division by zero錯誤,mod函數也返回零。
   如果除數大於被除數,那麼mod函數返回被除數作爲結果。這是因爲它將除數除以零次,餘數等於被除數。
   select mod(6,2) from dual;  0
   select mod(5,3)   from dual; 2
   select mod(7,35) from dual;  7 用7除以35,因爲除數大於被除數,所以返回數字7作爲模板
   select mod(5.2,3) from dual; 2.2 小數作爲被除數。5.2除以3商爲1,餘數爲2.2
14.sysdate函數沒有參數,它返回數據庫服務器當前的系統日期和時間。
15.months_between函數返回表示兩個強制日期參數之間月數的數值。
16.add_months函數返回日期項,這個日期項通過將指定月數添加到給定日期值計算得出。
17.next_day函數返回的日期時星期內指定的日子下一次出現時的日期。
18.last_day函數返回指定日子所屬的月的最後一天的日期。
19.round日期round函數依據指定的日期精度格式對值進行舍入運算。
20.trunc日期trunc函數依據指定的日期精度格式對值進行截取運算。
21.使用to_char函數將數字轉換爲字符
22.使用to_char函數將日期轉化爲字符
23.使用to_date函數將字符轉換爲日期
24.使用to_number函數將字符轉換爲數字
25.nvl函數評估任何數據類型的列或者表達式是不是空值。如果原始項是空值,選擇備選的非空值;否則,返回原始項。
   nvl函數有兩個強制參數,其語法是nvl(original,ifnull),其中original表示要測試的項,如果origuanl項計算爲空,就返回ifnull;original和ifnull參數的數據類型必須一致。
   他們必須時相同的類型,或者可能將ifnull隱式轉換爲original參數的類型。nvl函數返回值的數據類型與original參數的數據類型相同。
26.nvl2函數評估任何數據類型的列火災表達式是不是空值,如果第一項不是空值,那麼返回第二個參數,否則返回第三個參數。注意,nvl函數不是這樣,因爲如果原始項不是空值,它就返回原始項。
   nvl2函數有3個強制參數,其語法時nvl(original,ifnotnull,ifnull),其中original表示被測試的項。如果original不是空值,就返回ifnotnull;如果original是空值就返回
   ifnull。ifnotnull和ifnull參數的數據類型必須一致,他們不能時long數據類型。
27.nullif函數廁所兩項的相等性。如果他們相等,函數就返回空值,否則返回這兩個測試項的第一項。
28.coalesce函數從參數列表中返回第一個非空值。如果所有參數爲空,那麼返回空值。
29.decode函數通過測試前兩項的相等性來實現if-then-else條件邏輯,如果他們相等,則返回地三個參數,如果他們不相等,可能返回另一項。decode函數至少使用三個強制參數。

-----------------------------------分組函數
1.count
count(*)
count(distinct expr)
count(all expr)
count(expr)
調用count(*)時,組中的所有行(包括具有空值和重複值的行)都計算在內。執行count(distinct expr)時,只計算每組總expr唯一出現的次數。all關鍵字是默認語法的一部分,因此
count(all expr)和count(expr)是等效的表達式。如果expr基於命名的列,就忽略空值,如果expr基於各種情況的列,將爲每一行進行計算,而不管行中是否有空值。expr的數據類型
number,date,char,varchar2
2.sum
sum(distinct expr)
sum(all expr)
sum(expr)
sum(distinct expr)提供在對組中每一行計算expr之後返回的唯一值進行相加得到的和。sum(expr)和sum(all expr)提供組中各行的expr相加的和,並且忽略空值。expr參數的數據類型必須時munber。
3.avg
avg(distinct expr)
avg(all expr)
avg(expr)
調用avg(distinct expr)時,將expr的不同值相加,併除以expr唯一出現的次數。avg(all expr)和avg(expr)將各行中expr的非空值相加,用求得的和除以組中的非空行數。expr參數的數據類型是mumer。
4.max min
5.group by
在select列表中不是分組函數的所有項必定是group by子句的分組特性。
使用group by子句將數據集劃分爲多個組。分組特性時各組成員共享的公共鍵。分組特性通常是單列,但也可能是多列或者一個不能基於分組函數的表達式。注意,當使用group by時,
只有分組特性和分組函數才能在select子句中出現。
6.having
having子句用來限制組級結果。
-----------------------------------------------------------------sql聯接
第一個表稱爲源表;第二個表稱爲目標表
使用三種可能的聯接子句實現自然聯接。natural join,using和on
當源表和目標表共享相同名稱的列時,就可以在它們之間執行自然聯接,而無須指定聯接列,這種聯接有時稱爲純自然鏈接。在這種情況下,在源表和目標表中具有相同名稱的列自動彼此關聯。

(1)natural join子句
select table1.column ,table2.column from table1 natural join table2;

(2)join using子句
select table1.column ,table2.column from table1  join table2 using (join_column1,join_column2....);
join using子句允許在using關鍵字之後在括號內顯示指定一個或者多個同等連接列。在using關鍵字之後只允許出現具有共享名稱的列。

(3)join on子句
select table1.column ,table2.column from table1  join table2 on (table1.column_name=table2.column_name);
純自然聯接和join using子句依賴具有相同列名的聯接列。join on子句允許顯示指定聯接列,不管他們的列名時什麼。這是聯接子句最靈活,最常用的形式。

[源表和目標表之間的左外聯接返回內聯接的結果,以及被該內聯接排除的源表的行;
源表和目標表之間的右外聯接返回內聯接的結果,以及被內聯接排除的目標表中的行;
如果聯接返回內聯接的結果以及被該內聯接排除的源表和目標表中的行,就實現了全外聯接]
(1)左外聯接left outer join
select table1.column,table2.column from table1 left outer join table2 on (table1.column=table2.column);
左外聯接依據在on關鍵字之後指定的條件實現table1和table2之間的內聯接。同時返回關鍵字左邊表中因爲不滿足聯接條件而被排除在外的行。

(2)右外聯接right outer join
select table1.column,table2.column from table1 right outer join table2 on (table1.column=table2.column);
右外聯接依據在on關鍵字之後指定的條件實現table1和table2之間的內聯接。同時返回關鍵字右邊表中因爲不滿足聯接條件而被排除在外的行。

(3)全外聯接full outer join
select table1.column,table2.column from table1 full outer join table2 on (table1.column=table2.column);
全外聯接返回左外聯接和右外聯接的結合結果。在將由聯接條件從兩個表中排除的行結合到結果集中之前,實現table1和table2的內聯接。

(4)使用交叉聯接創建笛卡爾乘積 cross join
select table1.column,table2.column from table1 cross join table2;

-------------------------------------------------------------子查詢
在from子句中,子查詢可以嵌套到無限級,但在where子句中只能嵌套到255級。可以在select列表中使用子查詢,也可以在查詢的from,where,和having子句中使用子查詢。
爲了將子查詢的結果傳遞給父查詢,必須在父查詢調用子查詢之前執行語句中的子查詢。
(1)將子查詢的結果集用於比較
select last_name from employees where salary<(select avg(salary) from employess);
select department_name from department where department_id in (select distinct(department_id) from employees);
查找所有實際上擁有一名或者多名員工的部門。子查詢被用作內聯接的一種替代方法。
select department_name from department join employees on employees.department_id=departments.departmnet_id group by department_name;
(2)生成對其執行select語句的表
查找一個國家中員工的平均薪水
select avg(salary),country_id from (select salary,department_id,location_id,l.country_id from employees join department d using (departmnet_id)join
locations l using (location_id)) group by country_id;
(3)生成投影值
如何確定最高薪水和最高佣金率?如果薪水最高的員工同時有最高佣金率,那麼支付的最大佣金率應該是多少?
select (select max(salary) from employees) * (select max(commission_pct)) from dual;
(4)生成傳遞給DML語句的值
insert into sales_hist select * from sales where date>sysdate-1;
update employees set salary=(select avg(salary)from employees);
delete from department where departmnet_id  not in (select department_id from employees);
insert into dates select sysdate from dual;
單行子查詢返回一行,它返回只有一列的一行。
多行子查詢返回行集合。這些查詢通常用來生成結果集,這些結果集被傳遞到DML或者SELECT語句用作進一步處理。

可應用於單行子查詢的比較運算符。
= > >= < <= <> !=
可應用於多行子查詢的運算符
in ;等於列表中的任何成員
not in;不等於列表中的任何成員
any;返回匹配列表中任意值的行
all返回匹配列表中所有值的行
any和all的等價含義
<any 小於最高
>any 大於最低
=any  等於in
>all  大於最高
<All  小於最低

-------------------------------------------------------------------集合運算符
所有select語句都返回一組行,集合運算符將2個或者更多select語句的結果作爲輸入,並從中生成一個結果集。這就是複合查詢。
複合查詢中的每個查詢都投影自己選中列的列表。這些列表的元素數量必須相同,排列順序必須相同,數據類型也必須大致相同。
組成複合查詢的查詢中的列可以有不同的名稱,但輸出結果集使用第一個查詢中列的名稱。
組成複合查詢的查詢中的相關列必須是相同的數據類型組。
union,minus,intersect總是合併輸入查詢的結果集,然後排序結果,刪除重複行。依據所有列,從左到右排序。

union返回兩個查詢的合併行,排序這些行刪除重複行。
unionall返回兩個查詢的合併行,不排序,也不刪除重複行。
intersect只返回同時出現在兩個查詢的結果集中的行,排序這些行,並刪除重複行
minus只返回第一個結果集中的行,這些行沒有出現在第二個結果集中,排序這些行並刪除重複行。

符合查詢會默認返回按所以列排序(從左到右)的行。唯一例外的是union all,在這種情況下不會對行進行排序。唯一允許使用order by子句的位置時複合查詢的結尾。

發佈了51 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章