課程名稱:資料庫系統 授課老師:李春雄 博士 第 七 章 SQL的查詢語言 課程名稱:資料庫系統 授課老師:李春雄 博士 各位同學大家好,我是李春雄老師,本學期所開設的課程名稱為「資料結構」, 今天所要為各位介紹的是第一章「資料結構導論」
本章學習目標 1.讓讀者瞭解SQL語言的各種使用方法。 2.讓讀者瞭解SQL語言的進階查詢技巧。 開始: 本章學習目標 有二項:
本章內容 7-1 單一資料表的查詢 7-2 常用的函數 7-3 使用Select子句 7-4 使用「比較運算子條件」 7-1 單一資料表的查詢 7-2 常用的函數 7-3 使用Select子句 7-4 使用「比較運算子條件」 7-5 使用「邏輯比較運算子條件」 7-6 使用「模糊條件與範圍」 7-7 使用「算術運算子」 7-8 使用「聚合函數」 7-9 使用「排序及排名次」 7-10 使用「群組化」 7-11 使用「刪除重覆」 1-1 認識資料與資訊的關係: 其中,「資料」轉換成「資訊」必須要經過一連串處理過程,而這一連串的處理過程就是透過「程式」來處理。 1-2 何謂資料結構? 「資料結構」(Data Structures)主要是探討如何將資料更有組織地存放到電腦記憶體中,以提昇程式之執行效率的一 門學問。 1-3 何謂演算法?演算法就是「解決問題的方法」 1-4 程式設計概念: 步驟1. 分析所要解決的問題 步驟2. 設計解題的步驟 步驟3. 編寫程式 步驟4. 上機測試、偵測錯誤 步驟5. 編寫程 式說明書 1-5 結構化程式設計 利用「由上而下」的技巧,將程式分解成許多個獨立功能的模組。並且每一個模組都是由三種結構所組成。分別為循序結構、選擇結構及重複結構。 1-6 演算法的效率評估 指用來計算某些演算法所撰寫的程式,在經過編譯之後,實際執行所需要的時間。
7-1 單一資料表的查詢 在SQL語言所提供三種語言(DDL,DML,DCL)中,其中第二種為資料操作語言(Data Manipulation Language; DML),主要是提供給使用者對資料庫進行異動(新增、修改、刪除)操作及「查詢」操作等功能。 而在異動操作方面比較單純,已經在第六章有詳細介紹了,但在「查詢」操作方面是屬於比較複雜且變化較大的作業,因此,筆者特別將資料庫的查詢單元,利用本章節介紹。
7-1.1 SQL的基本語法 【說明】 1. Select後面要接所要列出的欄位名稱。 SELECT [* | DISTINCT | Top n] <欄位串列> FROM (資料表名稱{<別名>} | JOIN資料表名稱) [WHERE <條件式>] [GROUP BY <群組欄位> ] [HAVING <群組條件>] [ORDER BY <欄位> [ASC | DESC]] 【說明】 1. Select後面要接所要列出的欄位名稱。 2. [* / Distinct|Topn]中括號的部份可以省略。 (1) ”*” 表示列印出所有的欄位(欄位1,欄位2,……,欄位n) (2) Distinct代表從資料表中選擇不重複的資料。 它是利用先排序來檢查是否有重複,因此,已經內含order by的功能。 所以,如果使用Distinct時,就不須要再撰寫order by。 (3) Top n指在資料表中取出名次排序在前的n筆記錄。
7-1.1 SQL的基本語法<續> 【說明】 3.From後面接資料表名稱,它可以接一個以上的資料表。 SELECT [* | DISTINCT | Top n] <欄位串列> FROM (資料表名稱{<別名>} | JOIN資料表名稱) [WHERE <條件式>] [GROUP BY <群組欄位> ] [HAVING <群組條件>] [ORDER BY <欄位> [ASC | DESC]] 【說明】 3.From後面接資料表名稱,它可以接一個以上的資料表。 4.Where後面要接條件式(它包括了各種運算子)
7-1.1 SQL的基本語法<續> 【說明】 5. Group By欄位1,欄位2,…,欄位n [Having 條件式] SELECT [* | DISTINCT | Top n] <欄位串列> FROM (資料表名稱{<別名>} | JOIN資料表名稱) [WHERE <條件式>] [GROUP BY <群組欄位> ] [HAVING <群組條件>] [ORDER BY <欄位> [ASC | DESC]] 【說明】 5. Group By欄位1,欄位2,…,欄位n [Having 條件式] (1)Group By 可單獨存在,它是將數個欄位組合起來,以做為每次動作的依據。 (2) [Having 條件式]是將數個欄位中加以有條件的組合。它不可以單獨存在。
7-1.1 SQL的基本語法<續> 【說明】 6. Order By 欄位1,欄位2,…,欄位n [Asc|Desc] SELECT [* | DISTINCT | Top n] <欄位串列> FROM (資料表名稱{<別名>} | JOIN資料表名稱) [WHERE <條件式>] [GROUP BY <群組欄位> ] [HAVING <群組條件>] [ORDER BY <欄位> [ASC | DESC]] 【說明】 6. Order By 欄位1,欄位2,…,欄位n [Asc|Desc] 它是依照某一個欄位來進行排序。 例如:(1) ORDER BY 成績 Asc 可以省略(由小至大) (2) ORDER BY成績 Desc 不可以省略(由大至小)
7-1.2 建立學生選課資料庫 在本單元中,為了方便撰寫SQL語法所須要的資料表,我們以「學生選課系統」的資料庫系統為例,建立資料庫關聯圖,以便後續的查詢分析之用,如右圖所示。 檔案名稱:ch7-1-2.accdb
因此我們利用Access建立七個資料表,分別為:
7-2 SQL常用的函數 一、輸出函數 二、字串函數 三、數學函數
7-2.1 輸出函數 【語法】Select 字串|運算式 【說明】利用Select指令來輸出某一段字串或運算式的結果。 7-2.1 輸出函數 【語法】Select 字串|運算式 【說明】利用Select指令來輸出某一段字串或運算式的結果。 【舉例1】輸出某一段字串<加單引號> 【舉例2】輸出運算式的結果<不加單引號> 【舉例3】同時輸出字串與運算式的結果<項目之間利用「,」隔開> 撰寫SQL指令 輸出結果 Select ‘資料庫' 資料庫 撰寫SQL指令 輸出結果 Select 1+2 3 撰寫SQL指令 輸出結果 SELECT '資料庫', 1+2, '學分' 資料庫 3 學分
7-2.2 字串函數 【語法】 WHERE [Left|Right|Mid|Len(字串)] 7-2.2 字串函數 【語法】 WHERE [Left|Right|Mid|Len(字串)] 【說明】利用Where 指令來傳回字串指定數量的字元或長度 常見的字串函數如下所示: 字串函數 功能 Left 取出「左邊」指定數量的字元 Right 取出「右邊」指定數量的字元 Mid 取出「中間」指定數量的字元 Len 取出某一字串的「長度」 InStr( ) 尋找字串的最先出現位置 InStrRev( ) 反向尋找字串的最先出現位置 LCase( ) 與 UCase 轉換小寫與大寫字母 LTrim( ) 與 Trim( ) 與 RTrim( ) 刪除字串中的空白字元 Replace( ) 將字串中某些特定字串取代成另一字串 Space( ) 傳回重複空白的字串字元 String( ) 顯示重複某一字元
一、 Left( )函數 【定義】傳回字串左邊指定數量的字元 【實例】在「學生資料表」中查詢學生姓名是姓’李’字開頭的名單 【解答】 【查詢結果】 SQL指令 SELECT * FROM 學生資料表 WHERE Left(姓名,1)='李' SQL指令
二、 Right( ) 函數 【定義】傳回字串右邊指定數量的字元 【實例】在「學生資料表」中查詢學生姓名的最後一個字是’安’的學生 【解答】 【查詢結果】 SQL指令 SELECT * FROM 學生資料表 WHERE Right(姓名,1)='安' SQL指令
三、 Mid( )函數 【定義】傳回字串中間指定數量的字元。 【實例】在「科系代碼表」中,查詢是「管理」學院的系主任 【解答】 【查詢結果】 注意:此功能SQL Server沒有提供,但Access有。 SQL指令 SELECT * FROM 科系代碼表 WHERE Mid(系名,2,1)=‘管' SQL指令
四、 Len( ) 函數 【定義】傳回字串的長度。 【實例】在「選課資料表」中,查詢學生成績是三位數(也就是100分) 的學生的「學號、課號及成績」 【解答】 【查詢結果】 注意:由於沒有同學考100分,以上的查詢沒有記錄顯示。 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE Len(成績)=3
五、 InStr( ) 函數 【舉例】 【定義】尋找字串的最先出現位置。 【語法1】SELECT InStr(Str1,Str2) 【語法2】SELECT InStr(n,Str1,Str2) //指從Str1字串的左邊開始往右邊第n個字元找起,找出Str2首次出現的位置 【舉例】 SQL指令 SELECT InStr("Visual Basic 2010", "s") //印出 3 SELECT InStr(5, “Visual Basic 2010”, “s”) //印出10 SELECT InStr(1, "Visual Basic 2010", "w") //印出 0
六、 InStrRev ( ) 函數 【定義】反向尋找字串的最先出現位置。 【說明】 1.InStrRev函數與InStr相同,只不過InStrRev是從右邊開始往左邊反向的搜尋。 2. 如果找不到字串時,則傳回0 【舉例】 SQL指令 SELECT InStrRev(“Visual Basic 2010”, “s”) //印出 10 SELECT InStrRev("Visual Basic 2010", "w",1) //印出 0
七、 LCase( ) 與 UCase 函數 【定義】轉換小寫與大寫字母 【語法1】SELECT LCase(Str) //指將Str字串轉成小寫字母 【語法2】SELECT UCase(Str) //指將Str字串轉成大寫字母 【舉例】 SQL指令 SELECT LCase("Visual Basic 2010"); //印出「visual basic 2010」 SELECT UCase("Visual Basic 2010"); //印出「VISUAL BASIC 2010」
八、 LTrim( ) 與 Trim( ) 與 RTrim( ) 函數 【定義】刪除字串中的空白字元 【語法1】SELECT LTrim(Str) //顯示Str字串左邊的不含空白字元的字串 【語法2】SELECT Trim(Str) //顯示Str字串左右兩邊的不含空白字元的字串 【語法3】SELECT RTrim(Str) //顯示Str字串右邊的不含空白字元的字串 【說明】Trim(Str)與RTrim(LTrim(Str))功能一樣,都是刪除字串前後的空白字元 【舉例】 SQL指令 SELECT LTrim(" Visual Basic 2010 "); //印出「Visual Basic 2010△△△」 SELECT Trim(" Visual Basic 2010 "); //印出「Visual Basic 2010」 SELECT RTrim(" Visual Basic 2010 "); //印出「△△△Visual Basic 2010」
九、 Replace( ) 函數 【定義】將字串中某些特定字串取代成另一字串 【語法】SELECT Replace(Str, A,B) 【說明】將Str字串中的A字串取代成為B字串,若B字串為空字串, 則Str字串中的A字串將被刪除。 【舉例1】 【舉例2】請利用ch7-2.accdb資料庫中的學生資料表,將學號開頭S取代為A SQL指令 SELECT Replace("Visual Basic 2010", "i", "") // Vsual Basc 2010 SELECT Replace("Visual Basic 2010", "Basic", "C#") // Visual C# 2010 SQL指令 SELECT Replace(學號,"S","A") AS 學生學號 FROM 學生資料表;
十、 Space( ) 函數 【定義】傳回重複空白的字串字元 【語法】Space(正整數 ) 【舉例】請在ch7-2.accdb資料庫中,找出「客戶資料表」中, 將城市與區域合併顯示,並在中間空二個空白格。 【解答】 【執行結果】 SQL指令 SELECT 客戶姓名,城市+SPACE(2)+區域 AS 城市區域名稱 FROM 客戶資料表
十一、 String()函數 【定義】顯示重複某一字元 【語法】String(重複次數,字元) 【舉例】 SQL指令 SELECT String (3,'球'); //球球球
7-2.3 數學函數 【語法】Select 數學運算式 【說明】利用Select指令來輸出數學運算式的結果。 函數名稱 功能 Abs 取絕對值 Sin ( ) 、Cos ( ) 、Tan ( ) 正三角函數 Exp () 指數函數 Log ( ) 自然對數函數 Int( ) 取≦X的最大整數值 Fix ( ) 取X的整數部份 Rnd ( ) 亂數函數 Sgn ( ) 取正負符號 Sqr ( ) 取平方根 Round( ) 四捨五入
一、Abs(x) 【定義】取x的絕對值 【實例】Abs(-3.14) 【舉例】 撰寫SQL指令 輸出結果 圓周率 3.14 SELECT Abs(-3.14) AS 圓周率 圓周率 3.14
二、Sin ( ) 、Cos ( ) 、Tan ( ) 函數 【定義】正三角函數 【語法1】SELECT Sin(X) //傳回X數值的正弦值 【語法2】SELECT Cos(X) //傳回X數值的餘弦值 【語法3】SELECT Tan(X) //傳回X數值的正切值 【說明】將角度轉成徑度的計算公式如下所示: 徑度=角度*PI / 180 , 其中PI是指圓週率3.14159265358979 【舉例】 撰寫SQL指令 SELECT Sin(30 * 3.14 / 180) as [Sin(30)] //Sin(30)=0.5 SELECT Cos(30 * 3.14 / 180) as [Cos(30)] //Cos(30)=0.867 SELECT Tan(45 * 3.14 / 180) as [Tan(45)] //Tan(45)=1.0
三、Exp () 函數 【定義】指數函數 【語法】SELECT Exp(x) //傳回e的x次方,也就是ex 當x>709.782712893時,將會產生溢位。因為超出Double( 雙精準度)的表示範圍。 【舉例】 Ps:程式中的Exp(2)在數學上是寫成e2 撰寫SQL指令 輸出結果 SELECT Exp(1) as [Exp(1)] SELECT Exp(2) as [Exp(2)] Exp(1)=2.71828182845905 Exp(2)=7.38905609893065
四、Log ( ) 函數 【定義】自然對數函數 【語法】SELECT Log (x); 【說明】取x以e為底數的對數值,而Log與Exp互為反函數Exp(Log(x))=Log(Exp(x)) 在數學上的ex =Y 則LogeY=x ,也就是說: 如果Y= Exp(x)時,則x= Log(Y) 【舉例】 撰寫SQL指令 輸出結果 SELECT Exp(Log(100)) as [Exp(Log(100))] Exp(Log(100))=100
五、Int( ) 函數 【定義】Int(X)取≦X的最大整數值 【語法】SELECT Int(X) ‘傳回X的整數部份 【舉例】 撰寫SQL指令 輸出結果 SELECT Int(99.9) SELECT Int(-99.9) SELECT Int(1.99) Int(99.9)=99 Int(-99.9)=-100 Int(1.99)=1
六、Fix ( ) 函數 【定義】Fix (X)取X的整數部份,直接刪除小數點部份 【語法】SELECT Fix(X) ‘傳回X的整數部份 【說明】 1.Fix(X)是取X的整數部份,直接刪除小數點部份 2.當X是正數時,則Int(X)與Fix(X)的值是相同。 【舉例】 撰寫SQL指令 輸出結果 SELECT Fix(99.9) SELECT Fix(-99.9) Fix(99.9)=99 Fix(-99.9)=-99
七、Rnd ( ) 函數 【定義】亂數函數 【語法】SELECT Rnd( ) ' 傳回一個小於1,大於等於0 的亂數值。 【說明】 Rnd()亂數的值是:0≦Rnd_Value<1,亦即0~1之間的值。 如果我們要取得某一特定範圍的亂數時,我們可以套用以下的公式: 如果我們拿投擲骰子的每一個點當作 1 到 6 的亂數,其上限值=6 ; 下限值=1 則我們可以套用上面的公式得: Point_Num = Int((6 - 1 + 1) * Rnd + 1) 或化簡為:Point_Num = Int(Rnd*6 + 1) 公式 亂數 =Int(Rnd()* ( 上限 - 下限 + 1) + 下限) 撰寫SQL指令 輸出結果 SELECT Rnd(); SELECT Int(Rnd*6 + 1); 產生0<=X<1的亂數 產生1~6的亂數值
八、 Sgn ( ) 函數 【定義】取正負符號 【語法】SELECT Sgn(x); 【說明】取x的正負符號,當X>0時,則Sgn_value= 1 當X=0時,則Sgn_value= 0 當X<0時,則Sgn_value= -1 【舉例】 撰寫SQL指令 輸出結果 SELECT Sgn(100) as [Sign(100)] SELECT Sgn(100-100) as [Sign(100-100)] SELECT Sgn(100-200) as [Sign(100-200)] 1 -1
九、 Sqr ( ) 函數 【定義】取平方根 【語法】SELECT sqr(x); 【說明】取x的平方根,x必須≧0,否則程式會產生錯誤。 【舉例】 撰寫SQL指令 輸出結果 SELECT Sqr(2) SELECT Sqr(4) SELECT Sqr(8); Sqrt(2)=1.41421 Sqrt(4)=2 Sqrt(8)=2.82843
十、 Round( )函數 【定義】可依照指定所求出X的小數點位數並四捨五入 【語法】Round(X,n ) --求X數值到小數點右邊保留n個位元數, 並取四捨五入 【實例】假設有兩個科目,分別為60與59,請計算兩科成績的分均, 並取整數。 【解答】 撰寫SQL指令 輸出結果 SELECT Round((60+59)/2,0) AS 平均成績 平均成績60
7-3 使用Select子句 【定義】 Select是指在資料表中,選擇全部或部份欄位顯示出來,這就是所謂的「投影運算」。 【格式】 From 資料表名稱
7-3.1 查詢全部欄位 【定義】 是指利用SQL語法來查詢資料表中的資料時,可以依照使用者的權限及需求來查詢所要看的資料。如果沒有指定欄位的話,我們可以直接利用星號「*」代表所有的欄位名稱。 【優點】不需輸入全部的欄位名稱。 【缺點】 1.無法隱藏私人資料。 2.無法自行調整欄位順序。 3.無法個別指定欄位的別名。
[實例] 在「學生資料表」中顯示「所有學生基本資料」《參見7-1.2 》 【解答】 【查詢結果】 SQL指令1 SELECT * [實例] 在「學生資料表」中顯示「所有學生基本資料」《參見7-1.2 》 【解答】 【查詢結果】 SQL指令1 SELECT * FROM 學生資料表 SQL指令2與SQL指令1有相同的結果 SELECT 學號,姓名,系碼 FROM 學生資料表
【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示學生成績表中的全部記錄。 【解答】 【執行結果】 SQL指令 SELECT * FROM 學生成績表
7-3.2 查詢指定欄位(垂直篩選) 【定義】 由於上一種方法,只能直接選擇全部的欄位資料,無法顧及隱藏私人 7-3.2 查詢指定欄位(垂直篩選) 【定義】 由於上一種方法,只能直接選擇全部的欄位資料,無法顧及隱藏私人 資料及自行調整欄位順序的問題,因此,我們利用指定欄位來查詢資 料。 【優點】 1.顧及私人資料。 2.可自行調整欄位順序。 3.可以個別指定欄位的別名。 【缺點】 如果確定要顯示所有欄位,則必須花較多時間輸入。
[實例] 在「學生資料表」中查詢所有學生的「姓名及系碼」 《參見7-1.2 》 【解答】 【查詢結果】 [實例] 在「學生資料表」中查詢所有學生的「姓名及系碼」 《參見7-1.2 》 【解答】 【查詢結果】 說明:在「學生資料表」中將「姓名」及「系碼」投射出來。 SQL指令 SELECT 姓名, 系碼 FROM 學生資料表 欄位與欄位名稱之間,必須要以逗號「,」隔開
【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示學生的「姓名」、「資料庫」及「程式設計」三個欄位的所有記錄。 【解答】 【執行結果】 SQL指令 SELECT 姓名, 資料庫, 程式設計 FROM 學生成績表
7-3.3 使用「別名」來顯示 【定義】 使用AS運算子之後,可以使用不同名稱顯示原本的欄位名稱。 【表示式】原本的欄位名稱 AS 別名 7-3.3 使用「別名」來顯示 【定義】 使用AS運算子之後,可以使用不同名稱顯示原本的欄位名稱。 【表示式】原本的欄位名稱 AS 別名 《AS可省略不寫,只寫「別名」》 【舉例】系碼 AS 科系代碼 或寫成 系碼 科系代碼 【注意】 AS只是暫時性地變更列名,並不是真的會把原本的名稱覆蓋過去。 【適用時機】1.欲「合併」的資料表較多並且名稱較長時。 2.一個資料表扮演多種不同角色(自我合併)。 3.暫時性地取代某個欄位名稱(系碼 AS 科系代碼) 【替代欄位名稱字串】 替代字元 功能 語法 AS 設定別名 Select 系碼 AS 系所班別 + 結合兩個欄位字串 SELECT 學號+姓名 AS 資料
[實例] 在「學生資料表」中將所有學生的「系碼」設定別名為「科系代碼」之後,再顯示「姓名、科系代碼」 《參見7-1.2 》 【解答】 [實例] 在「學生資料表」中將所有學生的「系碼」設定別名為「科系代碼」之後,再顯示「姓名、科系代碼」 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 姓名, 系碼 AS 科系代碼 FROM 學生資料表 利用AS來設定 欄位的別名 設定別名
【隨堂練習1】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來將成績表中的「姓名」欄位改為「學生姓名」、「資料庫」欄位改為「資料庫成績」。 【解答】 【執行結果】 SQL指令 SELECT 姓名 AS 學生姓名, 資料庫 AS 資料庫成績 FROM 學生成績表
【隨堂練習2】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來將成績表中的「姓名」及三科目的「總平均成績」。 【解答】 【執行結果】 SQL指令 SELECT 姓名, (資料庫+資料結構+程式設計)/3 AS 總平均成績 FROM 學生成績表;
【隨堂練習3】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來將成績表中的「姓名」及三科目的「總平均成績」。 (利用Round函數來表示到小數第1點數) 【解答】 【執行結果】 SQL指令 SELECT 姓名,Round((資料庫+資料結構+程式設計)/3,1) AS 總平均成績 FROM 學生成績表; Round函數
【隨堂練習4】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來將成績表中的「姓名」及三科目的「總平均成績」。 (利用Round函數來表示到小數第1點數,並且如果是整數,則小數第1位以0表示。 【解答】 【執行結果】 SQL指令 SELECT 姓名, Format(Round((資料庫+資料結構+程式設計)/3,1),"#.0") AS 總平均成績 FROM 學生成績表; Round + Format 函數
7-4 使用「比較運算子條件」 如果我們所想要的資料是要符合某些條件,而不是全部的資料時,那就必須要在Select子句中再使用Where條件式即可。並且也可以配合使用「比較運算子條件」來搜尋資料。若條件式成立的話則會傳回「True(真)」,若不成立的話則會傳回「False(假)」。 比較運算子表(註:設A代表「成績欄位名稱」,B代表「字串或數值資料」) SQL指令 Select 欄位集合 From 資料表名稱 Where 條件式 運算子 功能 例子 條件式說明 = (等於) 判斷A與B是否相等 A=B 成績=60 <> (不等於) 判斷A是否不等於B A<>B 成績<>60 < (小於) 判斷A是否小於B A<B 成績<60 <= (小於等於) 判斷A是否小於等於B A<=B 成績<=60 > (大於) 判斷A是否大於B A>B 成績>60 >= (大於等於) 判斷A是否大於等於B A>=B 成績>=60
7-4.1 查詢滿足條件的值組(水平篩選) 【定義】 當我們所想要的資料是要符合某些條件,而不是全部的資料時,那就 7-4.1 查詢滿足條件的值組(水平篩選) 【定義】 當我們所想要的資料是要符合某些條件,而不是全部的資料時,那就 必須要在Select子句中再使用Where條件式即可。 【優點】1.可以依照使用者的需求來查詢。 2.資訊較為集中。
[實例] 在「選課資料表」中查詢修課號為「C005」的學生的「學號及成績」 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 [實例] 在「選課資料表」中查詢修課號為「C005」的學生的「學號及成績」 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 學號, 成績 FROM 選課資料表 WHERE 課號='C005'
【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示「資料庫」剛好”及格”的學生之「學號」、「姓名」及「資料庫」成績。 【解答】 【執行結果】 SQL指令 SELECT 學號, 姓名, 資料庫 FROM 學生成績表 WHERE 資料庫=60;
7-4.2 查詢比較大小的條件 【定義】 當我們所想要的資料是要符合某些條件,例如:顯示出及格或不及格的學生名單等情況。此時,我們就必須要在Where 條件式中使用「比較運算子」來篩選。
[實例] 在「選課資料表」中查詢任何課程成績「不及格60」的學生的「學號、課程代號及成績」 《參見7-1.2 》 【解答】 【查詢結果】 [實例] 在「選課資料表」中查詢任何課程成績「不及格60」的學生的「學號、課程代號及成績」 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績<60 「60分」是數值資料不須要加「左右單引號」
【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示「資料庫」不及格的學生之「學號」、「姓名」 及「資料庫」成績。 【解答】 【執行結果】 SQL指令 SELECT 學號, 姓名, 資料庫 FROM 學生成績表 WHERE 資料庫<60;
7-5 使用「邏輯比較運算子條件」 在Where條件式中除了可以設定「比較運算子」之外,還可以設定「邏輯運算子」來將數個「比較運算子」條件組合起來,成為較複雜的條件式。其常用的邏輯運算子如表6-6所示: 註:設A代表「左邊條件式」,B代表「右邊條件式」 運算子 功能 條件式說明 And(且) 判斷A且B兩個條件式是否皆成立 成績>=60 And 課程代號='C005' Or(或) 判斷A或B兩個條件式是否有一個成立 課程代號='C004' Or 課程代號='C005' Not(反) 非 A的條件式 Not 成績>=60
7-5.1 And(且) 【定義】判斷A且B兩個條件式是否皆成立。 【實例】 在「選課資料表」中查詢修課號為「C001」且成績是「及格60分」的學生的「學號及成績」 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 學號,成績 FROM 選課資料表 WHERE成績>=60 And 課號='C005'
【隨堂練習1】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習1】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示「資料結構」與「程式設計」兩科同時及格的學生 之「學號」、「姓名」及這兩科成績。 【解答】 【執行結果】 SQL指令 SELECT 學號, 姓名, 資料結構, 程式設計 FROM 學生成績表 WHERE 資料結構>=60 AND 程式設計>=60;
7-5.2 Or(或) 【定義】判斷A或B兩個條件式是否至少有一個成立。 【實例】 在「選課資料表」中查詢學生任選一科「課程代號為C004 或 課程代號為C005」的學生的「學號、課程代號及成績」 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 學號,課號,成績 FROM 選課資料表 WHERE 課號='C004' Or 課號='C005'
【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習】 檔案名稱: ch7-Score.accdb 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示「資料結構」與「程式設計」兩科之中至少有一科”不及格”的學生之「學號」、「姓名」及這兩科成績。 【解答】 【執行結果】 SQL指令 SELECT 學號, 姓名, 資料結構, 程式設計 FROM 學生成績表 WHERE 資料結構<60 OR 程式設計<60;
7-5.3 Not(反) 【定義】當判斷結果成立時,則變成不成立。而判斷結果不成立時, 則變成成立。 【實例】 在「選課資料表」中,查詢有修課程代號為C001且成績不及格的學生的「學號及成績」。《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 學號,成績 FROM 選課資料表 WHERE 課號='C001’ And Not 成績>=60
7-5.4 IS NULL(空值) 【定義】NULL值是表示沒有任何的值(空值),在一般的資料表中有些欄位中並 【實例1】 沒有輸入任何的值。例如:學生月考缺考,使用該科目成績是空值。 【實例1】 在「選課資料表」中查詢那些學生「缺考」的「學號、課號及成績」。 《參見7-1.2 》 【解答】 【查詢結果】 注意:這裡的「IS」不能用等號(=)代替它。 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績 IS NULL 設定IS NULL條件,其回傳的值True或False
[實例2] 在「選課資料表」中查詢那些學生「沒有缺考」的「學號、課號及成績」 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 [實例2] 在「選課資料表」中查詢那些學生「沒有缺考」的「學號、課號及成績」 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績 IS NOT NULL 設定 IS NOT NULL條件
7-6 使用「模糊條件與範圍」 【定義】 在Where條件式中除了可以設定「比較運算子」與「邏輯運算子」之外,還可以設定「模糊或範圍條件」來查詢。 【例如】奇摩的搜尋網站,使用者只要輸入某些關鍵字,就可以即時查詢出相關的資料。其常用的模糊或範圍運算子如表6-7所示: 運算子 功能 條件式 1. Like 模糊相似條件 Where 系所 LIKE '資管%' 2. IN 集合條件 Where課程代號IN('C001','C002') 3. Between……And 範圍條件 Where成績 Between 60 And 80
7-6.1 Like模糊相似條件 【定義】 LIKE運算子利用萬用字元(%及 _ )來比較相同的內容值。 (1)萬用字元(%)百分比符號代表零個或一個以上的任意字元; (2)萬用字元( _ )底線符號代表單一個數的任意字元。 【注意事項】Like模糊相似條件的萬用字元之比較 撰寫SQL 語法環境 Access SQL Server 比對一個字元 「?」 「_」 比對多個字元 「*」 「%」 比對一個數字 「#」 包含指定範圍 [A-C]代表包含A到C的任何單一字元 排除包含指定範圍 [^A-C]代表排除A到C的任何單一字元
【以Access的環境為例】 1.Select * 意義:「*」 代表在資料表中的所有欄位 2. WHERE 姓名 Like '李*' 意義:查詢姓名開頭為 '李' 的所有學生資料 3. WHERE 姓名 Like '*李' 意義:查詢姓名結尾為 '李' 的所有學生資料 4. WHERE 姓名 Like '*李*' 意義:查詢姓名含有為 '李' 的所有學生資料 5. WHERE 姓名 Like '李??' 意義:查詢姓名中姓 '李'且3個字的學生資料
【實例1】 在「學生資料表」中查詢姓名開頭姓”李”的學生基本資料。 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT * FROM 學生資料表 WHERE 姓名 Like '李*'
【實例2】 在「學生資料表」中查詢姓名開頭姓「李」或「王」的學生基本資料。 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT * FROM 學生資料表 WHERE 姓名 Like '[李王]*';
【實例3】 在「學生資料表」中查詢姓名開頭不是姓「李」或「王」的學生基本資料。 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT * FROM 學生資料表 WHERE 姓名 NOT Like '[李王]*';
7-6.2 IN集合條件 【定義】IN為集合運算子,只要符合集合之其中一個元素,將會被選取。 【使用時機】篩選的對象是兩個或兩個以上。 【實例 1】 在「選課資料表」中查詢學生任選一個「課程代號為C004 或 課程代號為C005」的學生的「學號、課號及成績」 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 課號 In ('C004','C005')
7-6.2 IN集合條件<續> 註:以上的WHERE 課號 In ('C004','C005') 亦可寫成如下: SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 課號 In ('C004','C005') 註:以上的WHERE 課號 In ('C004','C005') 亦可寫成如下: WHERE 課號='C004’ OR 課號='C005'
請在「學生資料表」中,列出 學號為S0001~S0003的同學之「學號,姓名及系碼」 【實例2】 請在「學生資料表」中,列出 學號為S0001~S0003的同學之「學號,姓名及系碼」 【解答 】 【查詢結果】 SQL指令 SELECT 學號,姓名,系碼 FROM 學生資料表 WHERE 學號 In ('S0001', 'S0002', 'S0003')
請在「學生資料表」中,列出 系碼不是「D001」及「D002」的同學之「學號,姓名及系碼」 【實例3】 請在「學生資料表」中,列出 系碼不是「D001」及「D002」的同學之「學號,姓名及系碼」 【解答 】 SQL指令 SELECT 學號,姓名,系碼 FROM 學生資料表 WHERE NOT 系碼 In ('D001', 'D002') 【查詢結果】
7-6.3 Between/And範圍條件 【定義】 Between/And是用來指定一個範圍,表示資料值必須在最小值(含)與最大值(含)之間的範圍資料。註:等同於「大於最小值 And 小於最大值」 【實例】在「選課資料表」中查詢成績60到90 之間的學生的「學號、 課號及成績」 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績 Between 60 And 90 等同於 成績>=60 And成績<=90
【隨堂練習1】 在「選課資料表」中查詢修課號為C004或C005的成績60到90之間的 學生的「學號、課號及成績」 <利用Between/And> 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 課號 In ('C004','C005') AND 成績 Between 60 And 90
【隨堂練習2】 在「選課資料表」中查詢修課號為C004或C005的成績60到90之間的 學生的「學號、課號及成績」<利用比較運算式> 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 課號 In ('C004','C005') AND 成績>=60 And 成績<=90;
【隨堂練習3】 在「選課資料表」中查詢不是介於成績60到90之間的學生的「學號、課號及成績」 【解答 】 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績 NOT Between 60 And 90; 【查詢結果】
7-7 使用「算術運算子」 【定義】 在Where條件式中還提供算術運算的功能,讓使用者可以設定某些欄位的數值作四則運算。其常用的算術運算子如表6-8所示: 運算子 功能 例子 執行結果 ┼ (加) A與B兩數相加 14+28 42 ─ (減) A與B兩數相減 28-14 14 * (乘) A與B兩數相乘 5*8 40 / (除) A與B兩數相除 10/3 3.33333333…. % (餘除) A與B兩數相除後,取餘數 10 % 3 1
【實例】在「選課資料表」中查詢學生成績乘1.2倍後還尚未達70分的學生顯示「學號、課程代號及成績」 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績*1.2<70
7-8 使用「聚合函數」 【定義】 在SQL中提供聚合函數來讓使用者統計資料表中數值資料的最大值、最小值、平均值及合計值等等。其常用的聚合函數的種類如表6-9所示: 聚合函數 說明 Count(*) 計算個數函數 Count(欄位名稱) 計算該欄位名稱之不具NULL值列的總數 Avg 計算平均函數 Sum 計算總合函數 Max 計算最大值函數 Min 計算最小值函數 First 列出某一欄位的第一筆資料 Last 列出某一欄位的最後筆資料
7-8.1 記錄筆數(Count) 【定義】COUNT函數是用來計算橫列記錄的筆數。 【實例1 】 在「學生資料表」中查詢目前選修課程的全班人數 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT Count(*) AS 全班人數 FROM 學生資料表
【隨堂練習1】 在「選課資料表」中查詢己經選課的「筆數」 【解答 】 【查詢結果】 SQL指令 SELECT Count(*) AS 全班人數 FROM 選課資料表; 【查詢結果】
【隨堂練習2】 在「選課資料表」中查詢己經的「成績」記錄的筆數 【解答 】 【查詢結果】 SQL指令 SELECT Count(成績) AS 有成績總筆數 FROM 選課資料表; 【查詢結果】 註: Count(欄位名稱)計算該欄位名稱之不具NULL值列的總數
7-8.2 平均數(AVG) 【定義】AVG函數用來傳回一組記錄在某欄位內容值中的平均值。 【實例】在「選課資料表」中查詢有選修「課程代號為C005」的全班 平均成績 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT AVG(成績) AS 資料庫平均成績 FROM 選課資料表 WHERE 課號='C005'
【隨堂練習1】 【實例】在「選課資料表」中查詢「學號為S0001」的各科總平均成績 【解答 】 【查詢結果】 SQL指令 SELECT AVG(成績) AS 平均成績 FROM 選課資料表 WHERE 學號='S0001'; 【查詢結果】
【隨堂練習2】 在「選課資料表」中計算每一位同學所修之科目的平均成績 《參見7-1.2 》 【查詢結果】
【隨堂練習2】 在「選課資料表」中計算每一位同學所修之科目的平均成績 【解答】 《參見7-1.2 》 【查詢結果】 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, AVG(成績) AS 平均成績 FROM 選課資料表 GROUP BY 學號 說明:本題必須要使用到分群的技術,請參考CH7-10.1 Group By 欄位
【隨堂練習3】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的總平均成績。 【隨堂練習3】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的總平均成績。 【執行結果】 檔案名稱: ch7-Score.accdb
【隨堂練習3】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示各科目的總平均成績。 【解答】 【隨堂練習3】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示各科目的總平均成績。 【解答】 【執行結果】 檔案名稱: ch7-Score.accdb SQL指令 SELECT AVG(資料庫) AS 資料庫平均成績, AVG(資料結構) AS 資料結構平均成績, AVG(程式設計) AS 程式設計平均成績 FROM 學生成績表;
【隨堂練習4】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習4】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示「一心、二聖、三多」三位同學之「資料庫」的總平均成績。 【解答】 【執行結果】 檔案名稱: ch7-Score.accdb SQL指令 SELECT AVG(資料庫) AS 三位同學的資料庫平均成績 FROM 學生成績表 WHERE 姓名 IN('一心','二聖','三多');
7-8.3 總和(Sum) 【定義】SUM函數是用來傳回一組記錄在某欄位內容值的總和。 【實例】在「選課資料表」中查詢有選修「課程代號為C005」的全班 總成績 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT SUM(成績) AS 資料庫總成績 FROM 選課資料表 WHERE 課號='C005'
【隨堂練習1】 【實例】在「選課資料表」中查詢「學號為S0001」的各科總成績 【解答 】 【查詢結果】 SQL指令 SELECT SUM(成績) AS 總成績 FROM 選課資料表 WHERE 學號='S0001'; 【查詢結果】
【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的總成績。 【執行結果】 【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的總成績。 【執行結果】 檔案名稱: ch7-Score.accdb
【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的總成績。 【解答】 【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的總成績。 【解答】 【執行結果】 檔案名稱: ch7-Score.accdb SQL指令 SELECT SUM(資料庫) AS 資料庫總成績 FROM 學生成績表;
7-8.4 最大值(Max) 【定義】MAX函數用來傳回一組記錄在某欄位內容值中的最大值。 【實例】在「選課資料表」中查詢有選修「課程代號為C005」的全班成績最高分 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT MAX(成績) AS 資料庫最高分 FROM 選課資料表 WHERE 課號='C005'
【隨堂練習1】 【實例】在「選課資料表」中查詢「成績介於60~80」中最高分為何? 【解答 】 【查詢結果】 SQL指令 SELECT MAX(成績) AS 資料庫成績介於60至80之最高分 FROM 選課資料表 WHERE 成績 Between 60 And 80; 【查詢結果】
7-8.5 最小值(Min) 【定義】MIN函數用來傳回一組記錄在某欄位內容值中的最小值。 【實例】在「選課資料表」中查詢有選修「課程代號為C005」的全班成績最低分 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT MIN(成績) AS 資料庫最低分 FROM 選課資料表 WHERE 課程代號='C005'
【隨堂練習1】 【實例】在「選課資料表」中查詢「及格成績」中最低分為何? 【解答 】 【查詢結果】 SQL指令 FROM 選課資料表 SELECT MIN(成績) AS 「及格成績」中最低分 FROM 選課資料表 WHERE 成績 Between 60 And 100; 【查詢結果】
【老師上課動態展示】 【解答】在附書光碟的範例程式中,檔名為:ch7-8/ch7-8.sln
7-9 使用「排序及排名次」 【定義】 雖然撰寫SQL指令來查詢所須的資料非常容易,但如果顯示的結果筆數非常龐大而沒有按照某一順序及規則來顯示,可能會顯得非常混亂。還好SQL指令還有提供排序的功能。 其常用的排序及排名次的子句種類如表6-10所示: [註]ASC:Ascending(遞增) DESC:Descending(遞減) 排序及排名次指令 說明 ORDER BY成績 Asc Asc 可以省略(由小至大) <預設模式> ORDER BY成績 Desc Desc 不可以省略(由大至小) Top N 取排名前N名 Top N Percent 取排名前N%名
7-9.1 Asc遞增排序 【定義】資料記錄的排序方式是由小至大排列。 【實例】在「選課資料表」中查詢全班成績由低到高分排序 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 ORDER BY 成績 Asc
【隨堂練習1】 在「選課資料表」中查詢全班成績由低到高分排序,但缺考的除外。 《參見7-1.2 》 【查詢結果】
【隨堂練習1】 在「選課資料表」中查詢全班成績由低到高分排序,但缺考的除外。 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績 IS NOT NULL ORDER BY 成績;
【隨堂練習2】 在「選課資料表」中查詢有選修「課號為C005」的全班成績由低到高分排序 《參見7-1.2 》 【查詢結果】
【隨堂練習2】 在「選課資料表」中查詢有選修「課號為C005」的全班成績由低到高分排序 【解答 】 《參見7-1.2 》 【查詢結果】 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 課號='C005' ORDER BY 成績 Asc
【隨堂練習3】 在「選課資料表」中查詢有選修「課號為C005」的全班成績由低到高分排序,但缺考的除外。《參見7-1.2 》 【查詢結果】
【隨堂練習3】 在「選課資料表」中查詢有選修「課號為C005」的全班成績由低到高分排序,但缺考的除外。 【解答 】 《參見7-1.2 》 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 課號='C005' AND 成績 IS NOT NULL ORDER BY 成績 Asc
7-9.2 Desc遞減排序 【定義】資料記錄的排序方式是由大至小排列。 【實例】在「選課資料表」中查詢的全班成績由高到低分排序 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 ORDER BY 成績 DESC
【隨堂練習1】 在「選課資料表」中查詢全班成績由高到低分排序,但缺考的除外。 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 成績 IS NOT NULL ORDER BY 成績 DESC
【隨堂練習2】 在「選課資料表」中查詢「學號為S0004」的同學成績由高到低分排序 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 學號='S0004' ORDER BY 成績 DESC
7-9.3 比較複雜的排序 【定義】指定一個欄位以上來做排序時,則先以第一個欄位優先排序, 7-9.3 比較複雜的排序 【定義】指定一個欄位以上來做排序時,則先以第一個欄位優先排序, 當資料相同時,則再進行第二個欄位進行排序,依此類堆。 【實例】在「選課資料表」中查詢結果按照學號昇冪排列之後,再依 成績昇冪排列。 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 ORDER BY 學號,成績 欄位名稱之間必須要以「,(逗點)來做區隔」 依成績 低高 依學號 低高 未依成績 依學號
【隨堂練習1】 在「選課資料表」中查詢結果按照「學號」昇冪排列之後,再依「成績」降冪排列(亦即由高分到低分) 《參見7-1.2 》 【查詢結果】 依學號 低高 依成績 高低
【隨堂練習1】 在「選課資料表」中查詢結果按照「學號」昇冪排列之後,再依「成績」降冪排列(亦即由高分到低分) 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 ORDER BY 學號 ASC, 成績 DESC; 依學號 低高 依成績 高低
【隨堂練習2】 在「選課資料表」中查詢有選修「學生為S0003與S0004」二位同學其結果按照「學號」昇冪排列之後,再依「成績」昇冪排列(亦即由低分到高分)《參見7-1.2 》 【查詢結果】 依成績 依學號
【隨堂練習2】 在「選課資料表」中查詢有選修「學生為S0003與S0004」二位同學其結果按照「學號」昇冪排列之後,再依「成績」昇冪排列(亦即由低分到高分)《參見7-1.2 》【解答 】 【查詢結果】 SQL指令 SELECT 學號, 課號, 成績 FROM 選課資料表 WHERE 學號 IN('S0003','S0004') ORDER BY 學號, 成績; 依成績 依學號
7-9.4 Top N 【定義】資料記錄在排序之後,取排名前N名。 【使用時機】總筆數已知,例如:全班10人中取前三名 【實例】在「選課資料表」中查詢有選修「課程代號為C005」的5個同學中成績前二名的同學 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT TOP 2 * FROM 選課資料表 WHERE 課號='C005' ORDER BY 成績 DESC
【隨堂練習1】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習1】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為前三名的同學名單。 【執行結果】 檔案名稱: ch7-Score.accdb 前三名
【隨堂練習1】 【解答】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習1】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為前三名的同學名單。 【執行結果】 【解答】 檔案名稱: ch7-Score.accdb 前三名 SQL指令 SELECT TOP 3 * FROM 學生成績表 ORDER BY 資料庫 DESC;
【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為後三名的同學名單。 【執行結果】 檔案名稱: ch7-Score.accdb 後三名 共四筆,因為倒數第3名二位
【隨堂練習2】 【解答】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為後三名的同學名單。 【執行結果】 【解答】 檔案名稱: ch7-Score.accdb 後三名 共四筆,因為倒數第3名二位 SQL指令 SELECT TOP 3 * FROM 學生成績表 ORDER BY 資料庫 ASC;
7-9.5 Top N Percent 【定義】資料記錄在排序之後,取排名前N%名。 【使用時機】總筆數未知,例如:全班中的前30%是高分群學生 【實例】在「選課資料表」中查詢有選修「課程代號為C005」的5個同學中成績前30%的同學 【解答 】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT TOP 30 PERCENT * FROM 選課資料表 WHERE 課號='C005' ORDER BY 成績 DESC 若未指明ASC或DESC則系統自動選用ASC
【隨堂練習1】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習1】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為高分群(前30%)的同學名單。 【執行結果】 檔案名稱: ch7-Score.accdb 前30%
【隨堂練習1】 【解答】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習1】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為高分群(前30%)的同學名單。 【執行結果】 【解答】 檔案名稱: ch7-Score.accdb 前30% SQL指令 SELECT TOP 30 PERCENT * FROM 學生成績表 ORDER BY 資料庫 DESC;
【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為低分群(後30%)的同學名單。 【執行結果】 檔案名稱: ch7-Score.accdb 後30%
【隨堂練習2】 【解答】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 【隨堂練習2】 假設有一個「學生成績表」,其目前的欄位名稱及內容如下所示: 請撰寫一段SQL指令來顯示全班「資料庫」的成績為低分群(後30%)的同學名單。 【執行結果】 【解答】 檔案名稱: ch7-Score.accdb 後30% SQL指令 SELECT TOP 30 PERCENT * FROM 學生成績表 ORDER BY 資料庫 ASC
7-10 使用「群組化」 【定義】 利用SQL語言,我們可以將某些特定欄位的值相同的記錄全部組合起來,以進行群組化,接著就可以在這個群組內求出各種統計分析。 【語法】 Group By欄位1,欄位2,…,欄位n [Having 條件式] (1)Group By 可單獨存在,它是將數個欄位組合起來,以做 為每次動作的依據。 (2) [Having 條件式]是將數個欄位中以有條件的組合。 它不可以單獨存在。 (3) WHERE子句與HAVING子句之差別 WHERE子句 HAVING子句 執行順序 GROUP BY之前 GROUP BY之後 聚合函數 不能使用聚合函數 可以使用
(4) SQL的執行順序 SELECT [* | DISTINCT | Top n] <欄位串列> FROM (資料表名稱{<別名>} | JOIN資料表名稱) [WHERE <條件式>] [GROUP BY <群組欄位> ] [HAVING <群組條件>] [ORDER BY <欄位> [ASC | DESC]]
7-10.1 Group By 欄位 【定義】 Group By 可單獨存在,它是將數個欄位組合起來,以做為 每次動作的依據。 【語法】 說明:在Select的非聚合函數內容一定要出現在Group By中,因為 先群組化才能Select。 Select 欄位1,欄位2,聚合函數運算 From 資料表 Where 過濾條件 Group By 欄位1,欄位2
[實例1] 在「選課資料表」中,查詢每一位同學各選幾門科目。 《參見7-1.2 》 【解答】 【註】在Select所篩選的非聚合函數。 [實例1] 在「選課資料表」中,查詢每一位同學各選幾門科目。 《參見7-1.2 》 【解答】 【註】在Select所篩選的非聚合函數。 例如:學號,一定會在 Group By後出現。 【查詢結果】 SQL指令 SELECT 學號, Count(*) AS 選科目數 FROM 選課資料表 GROUP BY 學號
[實例2] 在「選課資料表」中計算每一位同學所修之科目的平均成績 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 [實例2] 在「選課資料表」中計算每一位同學所修之科目的平均成績 【解答】 《參見7-1.2 》 【查詢結果】 SQL指令 SELECT 學號, AVG(成績) AS 平均成績 FROM 選課資料表 GROUP BY 學號
[實例3] 在「選課資料表」中,將每個課程的選修人數印出來,印出之結果並按課程代號由大到小排序 《參見7-1.2 》 【解答】 【查詢結果】 [實例3] 在「選課資料表」中,將每個課程的選修人數印出來,印出之結果並按課程代號由大到小排序 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 課號, Count(*) AS 選課學生人數 FROM 選課資料表 GROUP BY 課號 ORDER BY 課號 DESC
[實例4] 在「選課資料表」中,將每個課程的選修人數及該科最高分數印出來,印出之結果並按課程代號由小到大排序 《參見7-1.2 》 【解答】 [實例4] 在「選課資料表」中,將每個課程的選修人數及該科最高分數印出來,印出之結果並按課程代號由小到大排序 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 課號, Count(*) AS 選課學生人數, MAX(成績) AS 最高分成績 FROM 選課資料表 GROUP BY 課號 ORDER BY 課號
[實例5] 在「選課資料表」中,將每個課程的選修人數及該科平均分數印出來,印出之結果並按課程代號由小到大排序 《參見7-1.2 》 【解答】 [實例5] 在「選課資料表」中,將每個課程的選修人數及該科平均分數印出來,印出之結果並按課程代號由小到大排序 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 課號, Count(*) AS 選課學生人數, AVG(成績) AS 平均成績 FROM 選課資料表 GROUP BY 課號 ORDER BY 課號
7-10.2 Having 條件式 【定義】Having 條件式是將數個欄位中以有條件的組合。 它不可以單獨存在。 【實例1 】在「選課資料表」中,計算所修之科目的平均成績,大於等 於70者顯示出來。 【解答】 【查詢結果】 SQL指令 SELECT 學號, AVG(成績) AS 平均成績 FROM 選課資料表 GROUP BY 學號 HAVING AVG(成績)>=70
[實例2] 在「選課資料表」中,將選修課程在二科及二科以上的學生學號資料列出來。 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 [實例2] 在「選課資料表」中,將選修課程在二科及二科以上的學生學號資料列出來。 《參見7-1.2 》 【解答】 【查詢結果】 SQL指令 SELECT 學號, Count(*) AS 選修數目 FROM 選課資料表 GROUP BY 學號 HAVING COUNT(*)>=2
Where子句與 HAVING子句之差異 1. Where子句是針對尚未群組化的欄位來進行篩選。
7-11 使用「刪除重覆」 【定義】 利用Distinct指令來將所得結果有重覆者,去除重覆。 7-11 使用「刪除重覆」 【定義】 利用Distinct指令來將所得結果有重覆者,去除重覆。 例如:若有一學生選了3門課程,其學號只能出現一次。
7-11.1 ALL(預設)使查詢結果的 記錄可能重複 【定義】沒有利用Distinct指令 【實例】在「選課資料表」中,將有選俢課程的學生之學號、課程代號 印出來。 【解答】 【查詢結果】 SQL指令 SELECT 學號, 課號 FROM 選課資料表 註:沒有利用Distinct指令時,產生重覆出現的現象。
7-11.2 DISTINCT使查詢結果的 記錄不重複出現 【定義】 如果使用DISTINCT子句,則可以將所指定欄位中重複的資料去除掉之後再顯示。指定欄位的時候,可以指定一個以上的欄位,但是必須使用「,(逗點)」來區隔欄位名稱。 【DISTINCT的注意事項】 ①不允許配合COUNT(*)使用 ②允許配合COUNT(屬性)使用 ③對於MIN()與MAX()是沒有作用的
【實例】 在「選課資料表」中,將有選俢課程的學生之「學號」印出來。 【解答】 【查詢結果】 註:利用Distinct指令時,刪除重覆的現象。 【實例】 在「選課資料表」中,將有選俢課程的學生之「學號」印出來。 【解答】 【查詢結果】 註:利用Distinct指令時,刪除重覆的現象。 如果沒有指定Distinct指令時,則預設值為ALL,其查詢結果會重複。 SQL指令 SELECT DISTINCT 學號 FROM 選課資料表 SELECT 學號 GROUP BY 學號; 相同