11級_Java_曹建波5.28 資料庫的查詢和檢視
資料庫的查詢和檢視
選擇(Selection)
選擇是單目運算,其運算物件是一個表。該運算按給定的條件,從表中選出滿足條件的行形成一個新表作為運算結果。
選擇運算的記號為sF(R)。
其中s是選擇運算子,下標F是一個條件表示式,R是被操作的表。
若要在學生情況表中找出學生表中性別為女的行形成一個新表,則運算式為:
sF(學生)
上式中F:性別=“女”,該選擇運算的結果如表4.2所示。
投影也是單目運算,該運算從表中選出指定的屬性值組成一個新表,記為:ÕA(R)。
其中A是屬性名(即列名)表,R是表名。
若在表4.1中對學號、姓名和總學分投影,運算式為:
Õ學號,姓名,總學分(學生)
該運算得到如表4.3所示的新表。
投影也是單目運算,該運算從表中選出指定的屬性值組成一個新表,記為:ÕA(R)。
其中A是屬性名(即列名)表,R是表名。
若在表4.1中對學號、姓名和總學分投影,運算式為:
Õ學號,姓名,總學分(學生)
該運算得到如表4.3所示的新表。
連線是把兩個表中的行按照給定的條件進行拼接而形成新表,記為:RS。
其中,R、S是被操作的表,F是條件。
F
若表A和B分別如表4.4和表4.5所示,則A B如表4.6所示,其中
F為:T1=T3。
兩個表連線最常用的條件是兩個表的某些列值相等,這樣的連線稱為等值連線,上面的例子就是等值連線。
資料庫應用中最常用的是“自然連線”。進行自然連線運算要求兩個表有共同屬性(列),自然連線運算的結果表是在參與操作兩個表的共同屬性上進行等值連線後再去除重複的屬性後所得的新表。自然連線運算記為:RS,其中R和S是參與運算的兩個表。
若A表和B表分別如表4.7和表4.8所示,則AB如表4.9所示。
資料庫的查詢
使用資料庫和表的主要目的是儲存資料以便在需要時進行檢索、統計或組織輸出,通過SQL語句的查詢可以從表或檢視中迅速方便地檢索資料。SQL的SELECT語句可以實現對錶的選擇、投影及連線操作。
SELECT語句可以從一個或多個表中選取特定的行和列,結果通常是生成一個臨時表。在執行過程中系統根據使用者的標準從資料庫中選出匹配的行和列,並將結果放到臨時的表中,這就是實現選擇和投影運算的一個形式。
下面介紹SELECT語句,它是SQL的核心。
語法格式:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name']
[FROM table_reference [ ,table_reference] …] /*FROM子句*/
[WHERE where_definition] /*WHERE子句*/
[GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] /* GROUP BY子句*/
[HAVING where_definition] /*HAVING 子句*/
[ORDER BY {col_name | expr | position} [ASC| DESC] , ...] /*ORDERBY子句*/
[LIMIT {[offset,] row_count | row_count OFFSET offset}] /*LIMIT子句*/
說明:
從這個基本語法可以看出,最簡單的SELECT語句是SELECTselect_expr,利用這個最簡單的SELECT語句,可以進行MySQL所支援的任何運算,例如,SELECT 1+1,它將返回2。
SELECT關鍵詞的後面可以使用很多的選項:
● ALL | DISTINCT | DISTINCTROW:這幾個選項指定是否重複行應被返回。如果這些選項沒有被給定,則預設值為ALL(所有的匹配行被返回)。DISTINCT 和 DISTINCTROW是同義詞,用於消除結果集合中的重複行。
● HIGH_PRIORITY,STRAIGHT_JOIN和以SQL_為開頭的選項都是MySQL相對於標準SQL的擴充套件,這些選項在多數情況下可以選擇不使用。
HIGH_PRIORITY:給予SELECT更高的優先權,使查詢立刻執行,加快查詢速度。
● STRAIGHT_JOIN:用於促使MySQL優化器把表聯合在一起,加快查詢速度。
● SQL_SMALL_RESULT:可以與GROUP BY或DISTINCT同時使用,來告知MySQL優化器結果集合是較小的。在此情況下,MySQL使用快速臨時表來儲存生成的表,不使用分類。
● SQL_BUFFER_RESULT:促使結果被放入一個臨時表中。這可以幫助MySQL提前解開表鎖定,在需要花費較長時間的情況下,也可以幫助把結果集合傳送到客戶端中。
● SQL_BIG_RESULT:可以與GROUP BY或DISTINCT同時使用,來告知MySQL優化器結果集合有很多行。在這種情況下,MySQL會優先進行分類,不優先使用臨時表。
● SQL_CACHE:告知MySQL把查詢結果儲存在查詢快取中。對於使用UNION的查詢或子查詢,本選項會影響查詢中的所有SELECT。
● SQL_NO_CACHE:告知MySQL不要把查詢結果儲存在查詢快取中。
● SQL_CALC_FOUND_ROWS:告知MySQL計算有多少行應位於結果集合中,不考慮任何LIMIT子句。
● SELECT…INTO OUTFILE 'file_name':這個語句可以將表中的行匯出到一個檔案中,這個檔案被建立在伺服器主機中,file_name為檔名。這個語句將會在第8章中具體介紹。
所有被使用的子句必須按語法說明中顯示的順序嚴格地排序。例如,一個HAVING子句必須位於GROUP BY子句之後,並位於ORDER BY子句之前。
下面具體介紹一下SELECT語句中包含的各個子句。
1. 選擇指定的列
使用SELECT語句選擇一個表中的某些列,各列名之間要以逗號分隔。
【例4.5】 (查詢前假設附錄A中資料已經存入資料庫)查詢XSCJ資料庫的XS表中各個同學的姓名、專業名和總學分。
USE XSCJ
SELECT 姓名,專業名,總學分
FROM XS;
說明:執行結果是XS表中全部學生的姓名、專業名和總學分列上的資訊。
注意:當在SELECT語句指定列的位置上使用*號時,表示選擇表的所有列。
2. 定義列別名
當希望查詢結果中的某些列或所有列顯示時且使用自己選擇的列標題時,可以在列名之後使用AS子句來更改查詢結果的列別名。語法格式為:
SELECT column_name [AS] column_alias
查詢XS表中計算機系同學的學號、姓名和總學分,結果中各列的標題分別指定為number、name和mark。
SELECT 學號 AS number, 姓名 AS name, 總學分 AS mark
FROM XS
WHERE 專業名= '計算機';
該語句的執行結果為:
注意,當自定義的列標題中含有空格時,必須使用引號將標題括起來。例如:
SELECT 學號 AS 'Student number', 姓名 AS 'Student name', 總學分 AS mark
FROM XS
WHERE 專業名= '計算機';
說明:不允許在WHERE子句中使用列別名。這是因為,執行WHERE程式碼時,可能尚未確定列值。例如,下述查詢是非法的:
SELECT 性別 AS SEX FROM XS WHERE SEX=0;
3. 替換查詢結果中的資料
在對錶進行查詢時,有時對所查詢的某些列希望得到的是一種概念而不是具體的資料。例如查詢XS表的總學分,所希望知道的是學習的總體情況,這時,就可以用等級來替換總學分的具體數字。
要替換查詢結果中的資料,則要使用查詢中的CASE表示式,格式為:
CASE
WHEN 條件1 THEN 表示式1
WHEN 條件2 THEN 表示式2
……
ELSE 表示式
END
查詢XS表中計算機系各同學的學號、姓名和總學分,對其總學分按以下規則進行替換:若總學分為空值,替換為“尚未選課”;若總學分小於50,替換為“不及格”;若總學分在50~52之間,替換為“合格”;若總學分大於52,替換為“優秀”。列標題更改為“等級”。
SELECT學號, 姓名,
CASE
WHEN 總學分 IS NULL THEN '尚未選課'
WHEN 總學分 < 50 THEN '不及格'
WHEN 總學分 >=50 and 總學分<=52 THEN '合格'
ELSE '優秀'
END AS 等級
FROM XS
WHERE 專業名='計算機';
該語句的執行結果為: