1.1 概念
可以被當作是虛擬表或儲存查詢
檢視跟表格的不同是,表格中有實際儲存資料,而檢視是建立在表格之上的一個架構,它本身並不實際儲存資料。
臨時表在使用者退出或同資料庫的連線斷開後就自動消失了,而檢視不會消失。
檢視不含有資料,只儲存它的定義,它的用途一般可以簡化複雜的查詢。比如你要對幾個表進行連線查詢,而且還要進行統計排序等操作,寫SQL語句會很麻煩的,用檢視將幾個表聯結起來,然後對這個檢視進行查詢操作,就和對一個表查詢一樣,很方便。
1.2 建立、檢視和刪除檢視
建立兩張表,欄位資料如下,後面測試用:
CREATE VIEW "視圖表名" AS "SELECT 語句"; #建立視圖表
SELECT * FROM 'V_NAME_VALUE'; #檢視視圖表
DROP VIEW V_NAME_VALUE; #刪除視圖表
例項:
CREATE VIEW V_NAME_VALUE AS SELECT A.name NAME,SUM(B.value) VALUE FROM club A INNER JOIN football B ON A.name = B.name GROUP BY NAME;
二、聯集
將兩個SQL語句的結果合併起來,兩個SQL語句所產生的欄位需要是同樣的資料種類
2.1 UNION
生成結果的資料值將沒有重複,且按照欄位的順序進行排序
語法:[SELECT 語句 1] UNION [SELECT 語句 2];
示例:
SELECT name FROM club UNION SELECT name FROM football;
2.1 UNION ALL
將生成結果的資料值都列出來,無論有無重複
語法:[SELECT 語句 1] UNION ALL [SELECT 語句 2];
示例:
SELECT name FROM club UNION ALL SELECT name FROM football;
三、交集值
取兩個SQL語句結果的交集
SELECT A.name FROM club A INNER JOIN football B ON A.name = B.name;
SELECT A.name FROM club A INNER JOIN football B USING(name);
示例:
3.1 兩表沒有單獨重複的行,並且確實有交集的時候用
SELECT A.name FROM (SELECT name FROM club UNION ALL SELECT name FROM football ) A GROUP BY A.name HAVING COUNT(*) > 1;
這裡的A表示派生表
示例:
3.2 取兩個SQL語句結果的交集,且沒有重複
SELECT A.name FROM (SELECT B.name FROM club B INNER JOIN football C ON B.name = C.name ) A GROUP BY A.name;
SELECT DISTINCT A.name FROM club A INNER JOIN football B USING(name);
SELECT DISTINCT name FROM club WHERE (name) IN (SELECT name FROM football);
SELECT DISTINCT A.name FROM club A LEFT JOIN football B USING(name) WHERE B.name IS NOT NULL;
示例:
三、無交集值
顯示第一個SQL語句的結果,且與第二個SQL語句沒有交集的結果,且沒有重複
SELECT DISTINCT name FROM club WHERE (name) NOT IN (SELECT name FROM football);
例項:
四、CASE的用法
是SQL用來作為IF-THEN-ELSE之類邏輯的關鍵字
語法格式:
SELECT CASE (欄位名)
WHEN "條件1" THEN "結果1"
WHEN "條件2" THEN "結果2"
……
ELSE "結果N"
END
FROM "表名"
#條件可以是一個數值或是公式。ELSE子句不是必須的。
示例:
select case area #選擇area欄位
when 'America' then value + 10000000 #如果球員是America的就加一千萬
when 'Europe' then value + 10000000 #如果球員是Europe的就減一千萬
else value / 2 #其他情況除2
end #結束此case
result,name,area #別名為result,顯示name和area欄位
from football; #以上操作對於football表進行
五、排名的計算
表格自我連線(self join),然後將結果依序列出,算出每一行之前(包括那一行本身)有多少行數
示例:
select A1.name,A1.value,count(A2.value) rank from football A1,football A2 where A1.value < A2.value OR (A1.value=A2.value and A1.name=A2.name) group by A1.name order by A1.value desc;
原理解釋:
欄位中的每個值跟所有的值進行比較,最大的值跟所有值比較後,大於或等於的只有一個,排名第二的值跟所有的值比較後,大於或等於的有兩個,以此類推。
六、中位數的計算
## 求出中位數,顯示姓名,value和排名
select * from (select A1.name,A1.value,count(A2.value) rank from football A1,football A2 where A1.value < A2.value OR (A1.value=A2.value and A1.name=A2.name) group by A1.name order by A1.value desc) A3 where A3.rank = (select (count(*)+1) DIV 2 from football);
## 求出中位數,僅顯示value值
select value mid from (select A1.name,A1.value,count(A2.value) rank from football A1,football A2 where A1.value < A2.value OR (A1.value=A2.value and A1.name=A2.name) group by A1.name order by A1.value desc) A3 where A3.rank = (select (count(*)+1) DIV 2 from football);
示例:
七、累積總計的計算
同欄位後面中的值都是前面所有值累計而成的
例:
## 計算value的累積總計
select A1.*,sum(A2.value) sum_socore from football A1,football A2 where A1.value < A2.value or(A1.value=A2.value and A1.name=A2.name) group by A1.name order by A1.value desc;
八、總合百分比的計算
每個值佔總和的比例
例:
## 計算每位球員value值佔整個value值的比例
select A1.*,A1.value/(select sum(value) from football) z_sum from football A1,football A2 where A1.value < A2.value or (A1.value=A2.value and A1.name=A2.name) group by A1.name;
九、累積總合百分比的計算
同欄位後面中的值對應的百分比都是前面所有值的百分比累計而成的
示例:
##計算value的累積總計百分比
select A1.name,A1.value,sum(A2.value),sum(A2.value)/(select sum(value) from football) Z from football A1,football A2 where A1.value < A2.value or (A1.value=A2.value and A1.name=A2.name) group by A1.name order by A1.value desc;
##計算value的累積總計百分比並用%表示出來
select A1.name,A1.value,sum(A2.value),TRUNCATE(sum(A2.value)/(select sum(value) from football),2) ||'%' Z from football A1,football A2 where A1.value < A2.value or (A1.value=A2.value and A1.name=A2.name) group by A1.name order by A1.value desc;
十、空值(NULL)和無值(“”)的區別
無值的長度為0,不佔用空間;而空值null 的長度是null,是佔用空間的;
IS NULL或者IS NOT NULL,是用來判斷欄位是不是NULL或者不是NULL,是不能查出是不是無值的;
無值的判斷使用=’‘或者<>’'來處理。<>代表不等於;
在通過count()指定欄位統計又多少行數時,如果遇到NULL值會自動忽略掉,遇到空值會自動加入記錄中進行計算。
## 建立表
create table SITE(site varchar(20));
insert into SITE values('jiangsu');
insert into SITE values('anhui');
insert into SITE values('');
insert into SITE values('shandong');
insert into SITE values('');
insert into SITE values();
insert into SITE values('heilongjiang');
## 測試
select length(site) from SITE;
select * from SITE where site is NULL;
select * from SITE where site is not NULL;
select * from SITE where site ='';
select * from SITE where site <> '';
1)新建SITE表
2)測試