天天看點

sql查詢大于某個日期_Part 4 SQL複雜查詢

sql查詢大于某個日期_Part 4 SQL複雜查詢

一、視圖

1.視圖

在資料庫中有很多表,表中存放的是實際資料,視圖中存放的是SQL查詢語句,當我們通過用戶端連接配接到資料庫開始使用視圖的時候,會先運作視圖裡面的SQL查詢語句,從表中查到資料儲存到一張臨時表中。這個臨時表會在資料庫與用戶端的連接配接斷開後被删除。是以視圖存放的不是資料,是SQL查詢語句。

sql查詢大于某個日期_Part 4 SQL複雜查詢
2.建立視圖

create view as語句 +SQL語句

視圖名字為:按性别彙總

sql查詢大于某個日期_Part 4 SQL複雜查詢
3.使用視圖

建立好的視圖直接在 from+視圖名 就可以用了

sql查詢大于某個日期_Part 4 SQL複雜查詢

删除視圖

sql查詢大于某個日期_Part 4 SQL複雜查詢
4.視圖作用

經常使用某些SQL語句,存為視圖就可以直接用,不用每次都寫一遍

視圖中的資料會随着原表的變化自動更新,可以保證資料的最新狀态,這是因為視圖存的是SQL語句,每次查的時候都是從原表之中去查

不需要儲存資料,可以節省資料存放的空間

5.使用視圖注意事項

避免在視圖内再建立視圖,多重視圖會降低SQL的性能和效率

不能往視圖裡面插入資料,會報錯

二、子查詢

1.子查詢

子查詢就是一次性的視圖,就是在from子句中直接寫定義視圖的SQL查詢語句

在一個select語句中嵌套另一個select語句

as 按性别彙總 就是子查詢的名稱

會先運作子查詢,再将第一步的結果當作外部查詢的一部分,運作外部的查詢

sql查詢大于某個日期_Part 4 SQL複雜查詢
2.使用子查詢

子查詢可以放在where當中,用in any all一起使用,使用方法就是在in,any,all後面加(子查詢)

IN

ANY ALL

與比較運算符一起使用

sql查詢大于某個日期_Part 4 SQL複雜查詢

ANY(子查詢)與SOME(子查詢)完全相同

sql查詢大于某個日期_Part 4 SQL複雜查詢
where中,列名1的資料大于ANY(子查詢)中的任意一個資料

例:哪些學生的成績比課程0002的全部成績裡的任意一個高呢?

分析思路:

課程0002的全部成績

某個學生的成績其中有一個高于上面的成績就行

sql查詢大于某個日期_Part 4 SQL複雜查詢

例:哪些學生的成績比課程0002的全部成績裡的全都高呢?

分析思路:

課程0002的全部成績

某個學生的成績要比上面的成績全都高

sql查詢大于某個日期_Part 4 SQL複雜查詢
3.子查詢的作用

偶爾使用——子查詢

經常使用——視圖

4.注意事項
sql查詢大于某個日期_Part 4 SQL複雜查詢

1.all後面是一個集合,不能寫成第一種形式

2.避免子查詢層層嵌套,很難看懂,不好維護,性能下降

3.子查詢後面AS 子查詢的名稱 這裡可以省略

4.運作順序

sql查詢大于某個日期_Part 4 SQL複雜查詢

三、标量子查詢

1.标量子查詢

例1:想知道大于平均成績學生的學号和成績

分析思路:

學生的學号和成績

要大于平均成績

sql查詢大于某個日期_Part 4 SQL複雜查詢

因為where中不能使用彙總函數,是以上面寫的是不對的

要用标量子查詢

标量子查詢:子查詢隻傳回一行一列的查詢結果
sql查詢大于某個日期_Part 4 SQL複雜查詢

算出總體的平均成績,總體的平均成績隻有一個數,是以是一個标量子查詢

圖檔中是将每一行的成績與平均成績比較,選出大于平均成績的行

此處的平均成績為

sql查詢大于某個日期_Part 4 SQL複雜查詢

例2:差生(成績<=60),優等生(成績>=80),問成績介于差生和優等生之間的學生有哪些

分析思路:

算出差生和優等生的平均成績

找到成績在差生的平均成績和優等生的平均成績之間的學生

sql查詢大于某個日期_Part 4 SQL複雜查詢
2.使用标量子查詢 任何使用單一值的地方都可以使用标量子查詢

甚至可以放在select後面

sql查詢大于某個日期_Part 4 SQL複雜查詢

3.标量子查詢的用途

是子查詢的一種

sql查詢大于某個日期_Part 4 SQL複雜查詢
因為是單一的值,是以可以和in,any,all,between這些比較運算符一起使用 如果傳回的不是單一的值,就不是标量子查詢,就不能和比較運算符一起使用,也不能放在select後面

四、關聯子查詢

1.關聯子查詢

例1:查找出每個課程中大于對應課程平均成績的學生

分析思路:

按課程分組求出每門課程的平均成績

按課程找出成績大于平均成績的學生,在每個分組裡面找,這裡需要用到關聯子查詢

同一個表使用兩遍

sql查詢大于某個日期_Part 4 SQL複雜查詢
sql查詢大于某個日期_Part 4 SQL複雜查詢
關聯條件一定要寫在子查詢裡面,s2隻在子查詢中有效 2.使用關聯子查詢 當每個組内進行比較的時候使用關聯子查詢
sql查詢大于某個日期_Part 4 SQL複雜查詢

例2:找出每門課程裡成績最低的學生的學号

思路:

先找出每門課程的最低成績,按課程号分組

再找出分數為最低分的學生的學号

sql查詢大于某個日期_Part 4 SQL複雜查詢
分組取每組最大值、最小值,每組最大的N條 這類問題可以使用關聯子查詢

例3:按課程号分組取成績最大值所在行的資料(學号、課程号、成績)

分析思路:

按課程号找到每門課程的最大成績

找到改行的資訊

第一步:按課程分組找到每門課最大成績

sql查詢大于某個日期_Part 4 SQL複雜查詢

第二步:使用關聯子查詢找到該行的資訊

使用關聯子查詢的時候,去掉分組部份,這裡用IN或者=都可以

sql查詢大于某個日期_Part 4 SQL複雜查詢

五、使用SQL解決業務問題

1.解決問題
sql查詢大于某個日期_Part 4 SQL複雜查詢

例如下面的問題

先将問題翻譯、拆解

sql查詢大于某個日期_Part 4 SQL複雜查詢

逐漸分析、實作

将問題分解到SQL語句當中,一條一條

sql查詢大于某個日期_Part 4 SQL複雜查詢

再分解第二步

sql查詢大于某個日期_Part 4 SQL複雜查詢

将兩步合并

sql查詢大于某個日期_Part 4 SQL複雜查詢
2.報錯 當子查詢中遇到報錯資訊時,不知道哪裡錯了可以逐條排查,先運作子查詢看有沒有錯,再運作外部的

六、各種函數

1.彙總函數
sql查詢大于某個日期_Part 4 SQL複雜查詢
2.算術函數

對數值進行計算

sql查詢大于某個日期_Part 4 SQL複雜查詢
3.字元串函數
sql查詢大于某個日期_Part 4 SQL複雜查詢
4.日期函數
sql查詢大于某個日期_Part 4 SQL複雜查詢

七、SQLZOO練習

1.查找符合下面條件的國家名稱和人口:國家的人口比加拿大(Canada)的多,但比波蘭(Poland)的少

sql查詢大于某個日期_Part 4 SQL複雜查詢
在運算符between裡使用标量子查詢,這裡用between查找出的範圍邊界值包括了邊界值,是以要+1,和-1去掉邊界值 這裡因為between是包含邊界值的,是以要去掉邊界值

2.德國(Germany)在歐洲(Europe)國家的人口最多。奧地利(Austria)擁有德國總人口的11%。

查找歐洲的國家名稱和每個國家的人口,其中人口以德國人口的百分比來顯示人口數

sql查詢大于某個日期_Part 4 SQL複雜查詢
這裡使用round()函數,round函數用于把數值字段舍入為指定的小數位數 用法: round(數值,傳回的小數位數),後面是0,意思為不取小數 concat()拼接函數,将數字和%拼接起來

3.哪些國家的GDP比歐洲(Europe)的全部國家都要高呢? (有些國家的記錄中,GDP是空值NULL,沒有填入資料)

sql查詢大于某個日期_Part 4 SQL複雜查詢
這裡使用GDP>0是為了去掉空值

4.在每一個州中找出最大面積的國家,查找出洲, 國家名字,面積。 (有些國家的記錄中,面試是空值NULL,沒有填入資料)

sql查詢大于某個日期_Part 4 SQL複雜查詢
這裡用到關聯子查詢,先找出每個州的面積,并且限制面積>0,這裡y.continent = x.continent 意味着以continent分組 然後用關聯子查詢,使用ALL 大于全部的

5.列出洲份名稱和國家名稱,其中每個洲隻取出一個國家(條件:該國家排序在這個洲的首位)

sql查詢大于某個日期_Part 4 SQL複雜查詢
這裡國家名字是字元串形式,直接>就是按照字母順序排列的 首先找出國家名稱,通過洲分組,再使用關聯子查詢取出大于(首字母排在首位)全部其他國家的名稱

6.找出符合條件的洲和國家名稱,條件:該洲中的全部國家人口都有少于或等于 25000000 人口)

sql查詢大于某個日期_Part 4 SQL複雜查詢
先将國家按照洲進行分組,再使用關聯子查詢讓25000000大于等于全部的國家,找出的即為人口小于25000000的

7.有些國家的人口是同洲份的所有其他國的3倍或以上。列出這些國家的名稱和洲

sql查詢大于某個日期_Part 4 SQL複雜查詢
先按照洲分組,計算出各個國家的3倍人口數,這裡x.name!= y.name等價于x.name<> y.name,意思為不等于,這裡就是排除自己 再找出大于3倍人口數的國家 all可以與=、>、>=、<、<=、<>結合起來使用,分别表示等于、大于、大于等于、小于、小于等于、不等于all裡面的所有資料