什麼是 SQL (Structured Query Language)

TIP
某天跟一群工程師聚會時,聊到其中某位工程師去考資訊相關證照的考題,他說有一題問:「請問 SQL 是什麼的縮寫?」
常常工程師們西括西括的講,還真沒認真想過。我想了一下,回答:「Server Query Language?」
當下大家好像也沒有人能立刻回答出來。
後來我回家查了一下,原來 SQL 是 Structured Query Language 的縮寫。
我們可以將資料庫想像成是一個 Google Sheet 或是 Excel(事實上長相也差不多),其中的資料都是以行列的表格形式存儲,可以透過查詢、過濾、排序等操作來取得我們想要的資料。而 SQL 就是用來與這些資料庫進行互動的語言。
SQL 是一種用來管理和操作關聯式資料庫的標準語言。它允許用戶通過編寫語句來檢索、插入、更新和刪除資料、創建和修改資料庫結構、控制資料庫的存取權限等。
SQL 的基本語法包括以下幾個主要部分:
對資料庫結構進行操作
要操作資料庫,得先有資料表,SQL 提供了多種語句來創建、修改和刪除資料庫及其結構
資料庫結構操作(CREATE, ALTER, DROP):用於創建、修改和刪除資料庫和資料表。
sql-- 創建一個新的使用者資料表 CREATE TABLE users ( id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), age INT );修改資料表結構:
sql-- 向使用者資料表中添加一個新的欄位email ALTER TABLE users ADD COLUMN email VARCHAR(100);刪除資料表:
sql-- 刪除使用者資料表 DROP TABLE users;
控制資料庫存取權限
既然可以操作資料庫結構,當然也需要有辦法控制誰可以存取這些資料,不然隨便一個資料庫的帳號都可以隨意新增修改欄位、甚至是刪除欄位,要是一個不小心把資料庫整包刪掉,那就麻煩大了。
- 存取控制(GRANT, REVOKE):用於授予和撤銷使用者對資料庫的存取權限。sql
-- 授予使用者user1對使用者資料表的SELECT權限 GRANT SELECT ON users TO 'user1'; -- 撤銷使用者user1對使用者資料表的SELECT權限 REVOKE SELECT ON users FROM 'user1'; - 建立使用者:sql
-- 創建一個新的資料庫使用者user1,並設置密碼 CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password123'; - 刪除使用者:sql
-- 刪除資料庫使用者user1 DROP USER 'user1'@'localhost';
對資料表進行操作:
只要有了足夠的權限,我們就可以開始對資料表進行各種操作了,以下是 SQL 最常用的四種資料操作語句,也就是所謂的 CRUD(Create, Read, Update, Delete)
資料查詢(SELECT):用於從資料庫中檢索資料。
sql-- 查詢使用者資料表年齡大於18歲的使用者,且只取名字、姓氏和年齡欄位 SELECT first_name, last_name, age FROM users WHERE age > 18;資料插入(INSERT):用於向資料庫中添加新資料。
sql-- 向使用者資料表中插入一筆新資料 INSERT INTO users (first_name, last_name, age) VALUES ('John', 'Doe', 25);資料更新(UPDATE):用於修改資料庫中的現有資料。
sql-- 將使用者資料表中名字為John的使用者年齡更新為26歲 UPDATE users SET age = 26 WHERE first_name = 'John';資料刪除(DELETE):用於從資料庫中刪除資料。
sql-- 刪除使用者資料表中名字為John的使用者 DELETE FROM users WHERE first_name = 'John';
進階查詢功能
除了對單一資料表的基本操作外,SQL 還提供了許多進階的查詢功能,讓我們能夠更靈活地操作資料。比如說資料排序、分頁、分組、聯結等。
排序(ORDER BY):用於對查詢結果進行排序。
sql-- 查詢使用者資料表中的所有使用者,並按年齡從大到小排序 SELECT * FROM users ORDER BY age DESC;分頁(LIMIT, OFFSET):用於限制查詢結果的數量和起始位置。
sql-- 查詢使用者資料表中的前10筆資料 SELECT * FROM users LIMIT 10 OFFSET 0;分組(GROUP BY):用於將查詢結果按指定欄位進行分組。
sql-- 查詢使用者資料表中每個年齡段的使用者數量 SELECT age, COUNT(*) AS user_count FROM users GROUP BY age;聯結(JOIN):用於將多個資料表的資料進行關聯查詢。
sql-- 查詢使用者資料表和訂單資料表,取得每個使用者的訂單資訊 SELECT users.first_name, users.last_name, orders.order_id FROM users JOIN orders ON users.id = orders.user_id;子查詢(Subquery):把一個查詢結果當作一個資料集來使用。
sql-- 查詢使用者資料表中年齡大於所有使用者平均年齡的使用者 SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users);
總結來說,SQL 是一種功能強大且靈活的資料庫查詢語言,能夠幫助我們有效地管理和操作關聯式資料庫中的資料。無論是基本的資料操作還是進階的查詢功能,SQL 都提供了豐富的語法和工具,讓我們能夠輕鬆地與資料庫進行互動。
不過 SQL 只是操作資料庫的語言,資料庫這個東西本身還有很多值得探討的地方,比如說資料庫的種類(關聯式 vs 非關聯式)、資料庫的設計原則(正規化 vs 非正規化)、資料庫的效能優化(索引、查詢優化)、主鍵資料類型要用INT還是UUID、事務處理(ACID原則)、資料庫備份與還原等等,這些都是未來可以深入學習的方向。
