一、視圖
1.視圖在資料庫中有很多表,表中存放的是實際資料,視圖中存放的是SQL查詢語句,當我們通過用戶端連接配接到資料庫開始使用視圖的時候,會先運作視圖裡面的SQL查詢語句,從表中查到資料儲存到一張臨時表中。這個臨時表會在資料庫與用戶端的連接配接斷開後被删除。是以視圖存放的不是資料,是SQL查詢語句。
2.建立視圖create view as語句 +SQL語句
視圖名字為:按性别彙總
3.使用視圖建立好的視圖直接在 from+視圖名 就可以用了
删除視圖
4.視圖作用經常使用某些SQL語句,存為視圖就可以直接用,不用每次都寫一遍
視圖中的資料會随着原表的變化自動更新,可以保證資料的最新狀态,這是因為視圖存的是SQL語句,每次查的時候都是從原表之中去查
不需要儲存資料,可以節省資料存放的空間
5.使用視圖注意事項避免在視圖内再建立視圖,多重視圖會降低SQL的性能和效率
不能往視圖裡面插入資料,會報錯
二、子查詢
1.子查詢子查詢就是一次性的視圖,就是在from子句中直接寫定義視圖的SQL查詢語句
在一個select語句中嵌套另一個select語句
as 按性别彙總 就是子查詢的名稱
會先運作子查詢,再将第一步的結果當作外部查詢的一部分,運作外部的查詢
2.使用子查詢子查詢可以放在where當中,用in any all一起使用,使用方法就是在in,any,all後面加(子查詢)
IN
ANY ALL
與比較運算符一起使用
ANY(子查詢)與SOME(子查詢)完全相同
where中,列名1的資料大于ANY(子查詢)中的任意一個資料例:哪些學生的成績比課程0002的全部成績裡的任意一個高呢?
分析思路:
課程0002的全部成績
某個學生的成績其中有一個高于上面的成績就行
例:哪些學生的成績比課程0002的全部成績裡的全都高呢?
分析思路:
課程0002的全部成績
某個學生的成績要比上面的成績全都高
3.子查詢的作用偶爾使用——子查詢
經常使用——視圖
4.注意事項1.all後面是一個集合,不能寫成第一種形式
2.避免子查詢層層嵌套,很難看懂,不好維護,性能下降
3.子查詢後面AS 子查詢的名稱 這裡可以省略
4.運作順序
三、标量子查詢
1.标量子查詢例1:想知道大于平均成績學生的學号和成績
分析思路:
學生的學号和成績
要大于平均成績
因為where中不能使用彙總函數,是以上面寫的是不對的
要用标量子查詢
标量子查詢:子查詢隻傳回一行一列的查詢結果算出總體的平均成績,總體的平均成績隻有一個數,是以是一個标量子查詢
圖檔中是将每一行的成績與平均成績比較,選出大于平均成績的行
此處的平均成績為
例2:差生(成績<=60),優等生(成績>=80),問成績介于差生和優等生之間的學生有哪些
分析思路:
算出差生和優等生的平均成績
找到成績在差生的平均成績和優等生的平均成績之間的學生
2.使用标量子查詢 任何使用單一值的地方都可以使用标量子查詢甚至可以放在select後面
3.标量子查詢的用途
是子查詢的一種
因為是單一的值,是以可以和in,any,all,between這些比較運算符一起使用 如果傳回的不是單一的值,就不是标量子查詢,就不能和比較運算符一起使用,也不能放在select後面四、關聯子查詢
1.關聯子查詢例1:查找出每個課程中大于對應課程平均成績的學生
分析思路:
按課程分組求出每門課程的平均成績
按課程找出成績大于平均成績的學生,在每個分組裡面找,這裡需要用到關聯子查詢
同一個表使用兩遍
關聯條件一定要寫在子查詢裡面,s2隻在子查詢中有效 2.使用關聯子查詢 當每個組内進行比較的時候使用關聯子查詢例2:找出每門課程裡成績最低的學生的學号
思路:
先找出每門課程的最低成績,按課程号分組
再找出分數為最低分的學生的學号
分組取每組最大值、最小值,每組最大的N條 這類問題可以使用關聯子查詢例3:按課程号分組取成績最大值所在行的資料(學号、課程号、成績)
分析思路:
按課程号找到每門課程的最大成績
找到改行的資訊
第一步:按課程分組找到每門課最大成績
第二步:使用關聯子查詢找到該行的資訊
使用關聯子查詢的時候,去掉分組部份,這裡用IN或者=都可以
五、使用SQL解決業務問題
1.解決問題例如下面的問題
先将問題翻譯、拆解
逐漸分析、實作
将問題分解到SQL語句當中,一條一條
再分解第二步
将兩步合并
2.報錯 當子查詢中遇到報錯資訊時,不知道哪裡錯了可以逐條排查,先運作子查詢看有沒有錯,再運作外部的六、各種函數
1.彙總函數 2.算術函數對數值進行計算
3.字元串函數 4.日期函數七、SQLZOO練習
1.查找符合下面條件的國家名稱和人口:國家的人口比加拿大(Canada)的多,但比波蘭(Poland)的少
在運算符between裡使用标量子查詢,這裡用between查找出的範圍邊界值包括了邊界值,是以要+1,和-1去掉邊界值 這裡因為between是包含邊界值的,是以要去掉邊界值2.德國(Germany)在歐洲(Europe)國家的人口最多。奧地利(Austria)擁有德國總人口的11%。
查找歐洲的國家名稱和每個國家的人口,其中人口以德國人口的百分比來顯示人口數
這裡使用round()函數,round函數用于把數值字段舍入為指定的小數位數 用法: round(數值,傳回的小數位數),後面是0,意思為不取小數 concat()拼接函數,将數字和%拼接起來3.哪些國家的GDP比歐洲(Europe)的全部國家都要高呢? (有些國家的記錄中,GDP是空值NULL,沒有填入資料)
這裡使用GDP>0是為了去掉空值4.在每一個州中找出最大面積的國家,查找出洲, 國家名字,面積。 (有些國家的記錄中,面試是空值NULL,沒有填入資料)
這裡用到關聯子查詢,先找出每個州的面積,并且限制面積>0,這裡y.continent = x.continent 意味着以continent分組 然後用關聯子查詢,使用ALL 大于全部的5.列出洲份名稱和國家名稱,其中每個洲隻取出一個國家(條件:該國家排序在這個洲的首位)
這裡國家名字是字元串形式,直接>就是按照字母順序排列的 首先找出國家名稱,通過洲分組,再使用關聯子查詢取出大于(首字母排在首位)全部其他國家的名稱6.找出符合條件的洲和國家名稱,條件:該洲中的全部國家人口都有少于或等于 25000000 人口)
先将國家按照洲進行分組,再使用關聯子查詢讓25000000大于等于全部的國家,找出的即為人口小于25000000的7.有些國家的人口是同洲份的所有其他國的3倍或以上。列出這些國家的名稱和洲
先按照洲分組,計算出各個國家的3倍人口數,這裡x.name!= y.name等價于x.name<> y.name,意思為不等于,這裡就是排除自己 再找出大于3倍人口數的國家 all可以與=、>、>=、<、<=、<>結合起來使用,分别表示等于、大于、大于等于、小于、小于等于、不等于all裡面的所有資料