關聯式資料庫IndexKey資料正規化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 筆資料」。

關聯式資料庫IndexKey資料正規化SQL (1)SQL (2)SQL (4)SQL (5)