SQL語法教學:從基礎到進階,深入解析5個常用的SQL指令
在探索SQL語法的旅程中,了解不同類型的SQL語句及其用途是非常重要的。資料庫並不能使用程式語言直接溝通,必須透過資料庫語言才能與資料庫說話,舉凡資料的查詢、資料表的建立、資權限的變動均是如此,這個資料庫語言稱之為SQL (而微軟的資料庫產品,剛好也叫做SQL資料庫)。
SQL語法分類
SQL語法可以大致分為三類,分別是:資料操作語言(DML)、資料控制語言(DCL)和資料定義語言(DDL)。這些分類幫助我們明確知道每種語句在資料庫管理和操作中所扮演的角色和功能。
DML(資料操作語言)
DML涉及資料的查詢、新增、更新和刪除資料庫中資料的操作。它是與資料庫互動時最頻繁使用的SQL語言類型,是日常資料操作的核心,使用者透過它來處理和分析資料。
-
SELECT:
查詢資料庫中的資料。
-
INSERT:
向資料庫表中插入新的資料行。
-
UPDATE:
更新資料庫表中的現有資料。
-
DELETE:
從資料庫表中刪除資料。
DCL(資料控制語言)
DCL包含用於配置資料庫使用者權限和連接控制的語句。資料庫管理員能夠透過DCL控制誰可以做什麼操作,可以細部管理對資料庫的操作,確保資料的安全性和完整性。
-
GRANT:
賦予使用者或角色某種特定的操作權限。
-
REVOKE:
移除使用者或角色的操作權限。
DDL(資料定義語言)
DDL則是SQL語言用於定義和修改資料庫的結構,例如資料表、索引鍵和其它資料庫物件的建立和變更,讓我們能夠建立和修改資料庫的架構,以符合應用程式的需求和效能的優化。
-
CREATE:
建立新的資料庫物件,如資料表、檢視表、索引等。
-
ALTER:
修改現有資料庫物件的結構。
-
DROP:
刪除資料庫物件。
-
TRUNCATE:
快速刪除表中的所有資料行,但保留資料表的結構。
DML資料操作語法
本篇內容著重於DML資料操作語言,讓大家快速理解在應用程式開發過中,我們所接觸到最頻繁的SQL語言類型。
1. 資料的查詢
SELECT 是SQL語法中最常用的操作之一,允許從一個或多個資料表中選擇並篩選資料。語法中涉及到資料表及欄位,基本句型為
SELECT Code, Name FROM Course;
其中from後面接的是資料表名稱,而select後面接的是欄位名稱,整句的意思是從學員資料表中選擇編號及姓名資料。
指定條件查詢(WHERE),多數的查詢通常會帶有一定的查詢條件,特別是資料量較大的功能,要為資料的查詢加上條件只需要在後面加上 where 與條件比較關鍵字即可,例如下列範例表示查詢課程分類是Database的資料。
SELECT Code, Name FROM Course WHERE Category = 'Database';;
當有多個查詢條件時,則可以使用 and 或 or 關鍵字來進行組合,and表示所有條件必須符合,而or 則是其1個條件符合即可,例如下列範例表示查詢課程分類是Database並且課程時數是小於等於30小時的課。
SELECT Code, Name FROM Course WHERE Category = 'Database' and Times<=30;
最後如果我們希望資料是有排序的,則可以再加上order by 句子,例如希望用課程時數排序
SELECT Code, Name FROM Course WHERE Category = 'Database' and Times<=30 order by Times;
2. 資料的新增
向資料表插入新的資料行記錄,使用INSERT INTO語句。這個範例會在Course資料表中新增一筆
Microsoft SQL SERVER入門的課程資料,而課程時數則為18小時。
INSERT INTO Course (Code, Name, Times) VALUES ('DB001', N'Microsoft SQL SERVER入門', 18);
3. 資料的更新
允許修改資料表中的現有資料時,要特別注意,在不指定條件的情況下,是全部資料都會被修改。當資料有外部關聯鍵時,資料庫會檢查必須符合關聯鍵的檢查,以避免資料的不一致性。
UPDATE Course SET Times = 26 WHERE Code = 'DB001';
若為多個欄位的更新,則可以使用逗點符號區分多個個欄位的更新,例如同時更新時數及名稱。
UPDATE Course SET Name=N'Microsoft SQL SERVER',Times = 26 WHERE Code = 'DB001';
4. 資料的刪除
允許刪除資料表中的現有資料,要特別注意當資料有外部關聯鍵時,資料庫會檢查符合關聯鍵的檢查,以避免資料的不一致性。相同的,在不指定條件的情況下,則是全部資料都會被刪除。
DELETE FROM Course WHERE Code = 'DB001';
在DML裡除了常見的SQL語法SELECT、INSERT、UPDATE、DELETE之外,另一部份常見的就是JOIN語法了,在開始說明JOIN之前,讓我們先快速複習一下關聯式資料庫的特色。
關聯式資料庫是什麼?
關聯式資料庫是一種以表格形式組織資料的資料庫。每張資料表由資料行(紀錄)和資料列(欄位)所構成,資料表中的資料可以通過主鍵(Primary Key)和外部關聯鍵(Foreign Key)進行關聯。
這意謂,當我們把一筆完整的記錄放入到關聯式資料庫時,事實上在關聯式資料庫裡是把資料拆開,並且儲存在經過正規化後的不同資料表中,因此當我們要把資料從關聯式資料庫取出時,也就必須從不同的資料表中,把資料庫進行組合。這個組合的程序就稱之為JOIN。
JOIN的操作是關聯式資料庫的核心特性之一,在查詢句中大量被使用,特別是執行復雜的查詢和報表,同時也考驗著查詢效能,它允許從兩個或兩個以上的資料表,基於資料表之間的主鍵和外部關聯鍵所建立的關聯性結合相關聯的欄位。
SQL語法:JOIN的運作原理
當執行一個JOIN查詢時,關聯式資料庫管理系統(RDBMS)會根據JOIN語法中所指定的連接條件欄位,進行二個資料表間資料的串接。例如課程資料表與開課資料表,共同基於課程代碼(Code)欄位進行JOIN。
SELECT
Course.Code,Course.Name,CourseSchedule.Sdate,CourseSchedule.EdateFROM Course
INNER JOIN CourseSchedule ON Course.Code = CourseSchedule.CourseCode
常見的JOIN類型
首先我們假設擁有以下二張資料表,分別表示課程基本資料與開課資料
Code |
Name |
Times |
DB001 |
SQL資料庫入門 |
30 |
PG001 |
ASP.NET 程式設計 |
72 |
AI001 |
ChatGPT應用 |
18 |
CourseCode |
StartDate |
EndDate |
Location |
DB001 |
2024/01/08 |
2024/05/30 |
高雄 |
PG001 |
2024/03/01 |
2024/07/15 |
高雄 |
PG001 |
2024/04/08 |
2024/09/10 |
台北 |
1. INNER JOIN:
只取得兩個資料表中都有匹配的資料,當join語法中不特別指定join類型時,預設是以inner join 做為查詢。
SELECT
Course.Code,Course.Name,CourseSchedule.Sdate,CourseSchedule.Edate, CourseSchedule.Location
FROM Course
INNER JOIN CourseSchedule ON Course.Code = CourseSchedule.CourseCode
上述語法使用INNER JOIN查詢課程代碼、名稱和對應的開課日期、結束日期及上課地點,只會取得Course和CourseSchedule表中都存在的記錄,因此課程AI001便不會出現在查詢結果記錄裡。
Code |
Name |
StartDate |
EndDate |
Location |
DB001 |
SQL資料庫入門 |
2024/01/08 |
2024/05/30 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/03/01 |
2024/07/15 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/04/08 |
2024/09/10 |
台北 |
2. LEFT JOIN(或LEFT OUTER JOIN):
取得左表(Course)中的所有資料行,即使右表(CourseSchedule)中沒有匹配的資料。
SELECT
Course.Code,Course.Name,CourseSchedule.Sdate,CourseSchedule.Edate, CourseSchedule.Location
FROM Course
LEFT JOIN CourseSchedule ON Course.Code = CourseSchedule.CourseCode
上述語法使用LEFT JOIN查詢課程代碼、名稱和對應的開課日期、結束日期及上課地點,會取得Course資料中所有的資料,包含尚未有開課記錄的AI001課程,此時AI001在查詢結果中的開課日期、結束日期及上課地點均會顯示為NULL值。
Code |
Name |
StartDate |
EndDate |
Location |
DB001 |
SQL資料庫入門 |
2024/01/08 |
2024/05/30 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/03/01 |
2024/07/15 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/04/08 |
2024/09/10 |
台北 |
AI001 |
ChatGPT應用 |
NULL |
NULL |
NULL |
3. RIGHT JOIN(或RIGHT OUTER JOIN):
取得右表(CourseSchedule)中的所有資料,即使左表(Course)中沒有匹配的資料。
SELECT
Course.Code,Course.Name,CourseSchedule.Sdate,CourseSchedule.Edate, CourseSchedule.Location
FROM Course
RIGHT JOIN CourseSchedule ON Course.Code = CourseSchedule.CourseCode
Code |
Name |
StartDate |
EndDate |
Location |
DB001 |
SQL資料庫入門 |
2024/01/08 |
2024/05/30 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/03/01 |
2024/07/15 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/04/08 |
2024/09/10 |
台北 |
NULL |
NULL |
2024/05/18 |
2024/09/23 |
台北 |
注意:從資料正規化的角度來看,本例不應該有這種資料的存在
4. FULL JOIN(或FULL OUTER JOIN):
返回左右兩個資料表中至少有一邊有匹配的所有資料,如果某一邊資料表沒有匹配的資料,則該邊的相關聯欄位將返回NULL。
SELECT
Course.Code,Course.Name,CourseSchedule.Sdate,CourseSchedule.Edate, CourseSchedule.Location
FROM Course
FULL JOIN CourseSchedule ON Course.Code = CourseSchedule.CourseCode
Code |
Name |
StartDate |
EndDate |
Location |
DB001 |
SQL資料庫入門 |
2024/01/08 |
2024/05/30 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/03/01 |
2024/07/15 |
高雄 |
PG001 |
ASP.NET 程式設計 |
2024/04/08 |
2024/09/10 |
台北 |
NULL |
NULL |
2024/05/18 |
2024/09/23 |
台北 |
AI001 |
ChatGPT應用 |
NULL |
NULL |
NULL |
JOIN操作可使資料庫中的相關聯資料從兩個或多個表中結合。在實際應用中,JOIN非常靈活,可應付各種複雜的查詢,包括多個資料表連接、條件過濾和聚合操作,像是CROSS JOIN、SELF JOIN等,甚至與子查詢相結合等進階應用,可以說是在關聯式資料庫中,您一定會使用到的語法之一。
總結
透過以上的基本範例,大家是不是都學會如何使用SQL語法跟資料庫說話了呢?當然實務運用上還會有相當多的變化,特別是查詢語法,包含像是子查詢、彙總運算、分群運算以及效能調校等議題。面對人工智慧的時代,資料庫是基礎支撐人工智慧的一環,可以說是相當重要的且必學的,如果您想要對資料庫有更深入的認識,推薦您可透過
SQL線上課程 | 微軟 SQL Server 資料庫認證系列 | 巨匠電腦線上直播課程 (pcschool.com.tw)獲取更深的資料庫知識及技巧喔!
陳葵懋 老師
巨匠電腦 - 程式設計、資料庫、雲端及人工智慧講師
專長:微軟.NET、Azure雲端、MS SQL資料庫,並連續12年獲選微軟最有價值技術專家。
免費學習資源不漏接