天天看點

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

本文要點:

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

一.視圖

1.概念:通過定義 SELECT 語句以檢索将在視圖中顯示的資料來建立視圖。

注:基表中存放的是實際資料

,使用視圖時,會運作視圖裡的sql查詢語句建立出一張

臨時表,視圖中存放的是sql語句

2.操作步驟

語句格式:

create view 視圖名稱(<視圖列名1>,<視圖列名2>,····)

as

<select 查詢語句>

執行個體:

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

3.視圖的作用

1)對于資料龐大且使用頻繁的表,尤其在複雜的查詢條件和資料彙總時,建立視圖可提高資料分析的效率。

2)建立完視圖後,可以随着基表的資料變化自動更新,保證最新的資料狀态。

3)視圖不需要儲存資料,可以節省存放資料裝置空間

4.注意事項

1)避免在視圖的基礎上再建立視圖,這樣會降低sql的性能和效率

2)不能在視圖中插入資料,否則會報錯

二.子查詢

1.概念:簡單來講,在一個select 語句中嵌套另一個select語句

注:一次性暫存,在sql運作後,表中的資料無法調用。

2.sql運作順序--先運作子查詢

執行個體:按性别彙總人數

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

除了執行個體中在from 中插入子查詢,在in/any/all 後面也可以插入子查詢

注:any/all 的子查詢隻能和運算符一起使用

# in(子查詢)

執行個體:找出每個課程裡成績最低的學号

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

# any(子查詢)=some(子查詢)

select 列名1

from 表名1

where 列名1>any(子查詢)

執行個體:哪些學生的成績比課程0002所有成績中任意一個成績高?

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

#all(子查詢)

執行個體:哪些學生的成績比課程0002的所有成績中任何一個都高?

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

3.子查詢的作用:存放不經常隻用的sql語句

4.注意事項

1)如比較數字 : a>3*all(b) --error

a/3>all(b) --√

因為

all() 得到的是一個集合

,是無數行的結果,

不能進行運算

2)子查詢可以層層嵌套,但随着嵌套的數量增加,後期維護難度會越來越大,所有要盡量避免子查詢的多層嵌套

3)select ....from... 子查詢 as 子查詢名稱 ,其中( as 子查詢名稱 )這部分可以省略,但平時最好不要省略,養成良好習慣,也友善檢視

三.标量子查詢

由于在sql語句中

where 語句中不能使用彙總函數進行比較邏輯的運算

,需要嵌套一層select句使其傳回值為一個确切數字後再運作where子句

執行個體1:大于平均成績的學生學号和成績

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

執行個體2:查找出成績介于差生平均成績和優等生平均成績之間的學生的學号和成績

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

注:标量子查詢運作結果是單一值,多是多行資料值,會出現報錯,如下:

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

四.關聯子查詢

當需要

在每個組裡進行比較時

,用關聯子查詢。

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

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

五.用sql解決業務問題

步驟:

1.翻譯成大白話

2.寫出分析思路

3.寫出對應的sql子句

執行個體:

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

六.各種函數

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢

七.課後練習

題目來源:

SELECT within SELECT Tutorial​zh.sqlzoo.net

sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢
sql 子查詢傳回的值不止一個_MySQL很難嗎?DML-複雜查詢