MySQL(7)数据库中的高级(进阶)语句:VIEW视图、联集和常见计算
文章目錄
- 一、VIEW(視圖)
- 1.1 概念
- 1.2 創建、查看和刪除視圖
- 二、聯集
- 2.1 UNION
- 2.2 UNION ALL
- 三、交集值
- 3.1 兩表沒有單獨重復的行,并且確實有交集的時候用
- 3.2 取兩個SQL語句結果的交集,且沒有重復
- 三、無交集值
- 四、CASE的用法
- 五、排名的計算
- 六、中位數的計算
- 七、累積總計的計算
- 八、總合百分比的計算
- 九、累積總合百分比的計算
- 十、空值(NULL)和無值(“”)的區別
一、VIEW(視圖)
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.2 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)測試
總結
以上是生活随笔為你收集整理的MySQL(7)数据库中的高级(进阶)语句:VIEW视图、联集和常见计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL(6)数据库中的高级(进阶)
- 下一篇: MySQL(8)数据库中的高级(进阶)正