CREATE TABLE STUDENT(
STU_ID INT PRIMARY KEY,
STU_NAME CHAR(10) NOT NULL,
STU_AGE SMALLINT UNSIGNED NOT NULL,
STU_SEX CHAR(2) NOT NULL
);
CREATE TABLE GRADE(
STU_ID INT NOT NULL,
STU_SCORE INT,
FOREIGN KEY(STU_ID) REFERENCES STUDENT(STU_ID)
);
-- 插入 20 筆學生與成績測試數據(略)
SELECT 屬性列表
FROM 表名或視圖列表
[WHERE 條件表達式1]
[GROUP BY 屬性名1 [HAVING 條件表達式2]]
[ORDER BY 屬性名2 [ASC|DESC]];
SELECT * FROM STUDENT;IN、BETWEEN、邏輯 AND/OR/NOT、模糊 LIKE(%/_)、空值 IS NULL。GROUP BY 分組,GROUP_CONCAT 查看組內明細。MAX/MIN/SUM/AVG/COUNT。HAVING 過濾分組:SELECT dept, AVG(sal) FROM emp GROUP BY dept HAVING AVG(sal) >= 6000;| 類型 | 語法 | 結果集 |
|---|---|---|
| 隱式內連接 | FROM a,b WHERE a.id=b.id | 匹配行 |
| 顯式內連接 | FROM a INNER JOIN b ON a.id=b.id | 匹配行 |
| 左外連接 | FROM a LEFT JOIN b ON a.id=b.id | 左表全保留 |
| 右外連接 | FROM a RIGHT JOIN b ON a.id=b.id | 右表全保留 |
| 全外連接 | MySQL 不支援,用 UNION 模擬 | 兩表全保留 |
範例:SELECT s.*, g.score FROM student s LEFT JOIN grade g ON s.id=g.stu_id;
IN:SELECT * FROM student WHERE id IN (SELECT stu_id FROM grade WHERE score>85);EXISTS:SELECT * FROM student WHERE EXISTS (SELECT 1 FROM grade WHERE score>=100);ANY/SOME/ALL:SELECT * FROM student WHERE id >= ANY (SELECT stu_id FROM grade WHERE score<67);UNION 去重合並,UNION ALL 直接合並(效能更好)。ORDER BY col ASC|DESC,ORDER BY RAND() 隨機。LIMIT [offset,] count:LIMIT 5 前 5,LIMIT 10,5 第 11-15。SELECT stu_id AS '學號', score AS '分數' FROM grade;SELECT s.name, g.score FROM student s JOIN grade g ON s.id=g.stu_id;| 模式 | 含義 | 範例 |
|---|---|---|
| ^abc | 以 abc 開頭 | WHERE name REGEXP '^abc' |
| abc$ | 以 abc 結尾 | WHERE name REGEXP 'abc$' |
| . | 任意單字元 | WHERE name REGEXP '^a...$' |
| [abc] | 含 a/b/c 任一 | WHERE name REGEXP '[abc]' |
| [a-z0-9] | 字母數字範圍 | WHERE name REGEXP '[a-z0-9]' |
| [^abc] | 不含 a/b/c | WHERE name REGEXP '[^abc]' |
| {n} | 前字元重複 n 次 | WHERE name REGEXP 'ab{2}' |
| {m,n} | 重複 m~n 次 | WHERE name REGEXP 'ab{1,3}' |
| + | 前字元至少 1 次 | WHERE name REGEXP '(fa)+' |
| * | 前字元 0 或多次 | WHERE name REGEXP 'ab*c' |
| | | 或關係 | WHERE name REGEXP 'cat|dog' |
插入測試數據 '12wef','faf_23','woop89' 等驗證上述模式。