|
|關聯式資料庫|Index|Key|資料正規化|SQL (1)|SQL (2)|SQL (4)|SQL (5)| |
|
資料庫簡介 |
|
SQL:檢索資料
|
|
以下將繼續介紹部份 MySQL 所支援的 SQL 敘述,其中有些用法可能不適用於其它的資料庫產品。 |
SELECT 語法 |
|
SELECT 被用來取得我們所要的資料。它是 SQL 中最常用,也是最複雜的指令。 |
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...
[HAVING where_definition]
[ORDER BY
{unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name]
[FOR UPDATE | LOCK IN SHARE MODE]] |
|
我們將語法中最常用的部份取出,可以簡化成為以下這種形式: |
|
SELECT column_list |
要檢索哪些欄位 |
|
FROM table_list |
要以哪些資料表為目標 |
|
WHERE primary_constraint |
必須滿足哪些條件 |
|
GROUP BY grouping_columns |
如何產生 group |
|
ORDER BY sorting_columns |
如何對結果排序 |
|
HAVING secondary_constraint |
其次要滿足哪些條件 |
|
LIMIT count |
限制資料輸出的筆數 |
|
|
以實例來看: |
|
例一,讀取所有資料,但不設定條件: |
|
SELECT * FROM friend |
|
例二,讀取部份欄位的資料,且指定條件: |
|
SELECT realname, address FROM friend WHERE age > 20 |
SELECT 進階 |
|
ORDER BY |
|
如果我們希望查詢所得的資料能依序排列的話,可以使用 ORDER BY 來達成目的。 |
|
例一,升冪排序(這是預設的排列方式,因此 ASC 可以省略不寫): |
|
SELECT first_name, address FROM friend ORDER BY city ASC |
|
例二,降冪排序: |
|
SELECT first_name, address FROM friend ORDER BY city DESC |
|
例三,同時對兩個欄位排序(前者優先): |
|
SELECT first_name, address FROM friend ORDER BY city DESC, age |
GROUP BY |
|
我們可以使用 GROUP BY 來指定某個特定欄位,以便將查詢結區分為若干個群組,然後對這些群組進行計算。 |
|
例一,從通訊錄中列出所有親友居住的縣市名稱,並求出各地居住的人數: |
|
SELECT city, COUNT(*) FROM friend GROUP BY city |
|
例二,依親友所居住的縣市來區分,並求出各地親友的平均年齡: |
|
SELECT city, AVG(age) FROM friend GROUP BY city |
|
例三,依親友所居住的縣市來區分,並求出各地親友家中成員的總數: |
|
SELECT city, SUM(member) FROM friend GROUP BY city |
HAVING |
|
HAVING 的功能類似於 WHERE,可以用來規範資料被讀取的條件,但它必須與 GROUP BY 搭配,不能用來取代 WHERE。而且 HAVING 是在資料被取出之後,才再次進行篩選的動作。 |
|
例如,以學生的分組為單位,列出測驗平均成績高於 60 分的各組與其成績: |
SELECT group_num, AVG(score) FROM exam
GROUP BY group_num HAVING AVG(score) > 60 |
DISTINCT |
|
假如我們在意的是「某個欄位裡是否有某些特定的值」,而不在乎它出現多少次的話,我們可以使用 DISTINCT 來剔除欄位中重複的值。 |
|
例如,從通訊錄中列出所有親友居住的縣市名稱: |
|
SELECT DISTINCT city FROM friend |
LIMIT |
|
如果在某項查詢結果中,我們想要的僅是其中一部份時,可以使用 LIMIT 來限制資料被讀取的筆數。 |
|
例如,找出座號最前面的五位學生姓名: |
|
SELECT realname FROM student ORDER BY num LIMIT 0, 5 |
|
在此例中,LIMIT 後方的 0 代表「從第 0 筆資料開始」,5 表示「取出 5 筆資料」。 |
|
|
|關聯式資料庫|Index|Key|資料正規化|SQL (1)|SQL (2)|SQL (4)|SQL (5)| |