【數據庫查詢的基礎】
數據庫查詢 建立在 “關系運算” 的基礎之上,數據庫定義了一套專門的關系運算規則:選擇、投影、連接運算 , 這三種運算的運算對象和運算結果都是表;
1、選擇(Selection)
選擇是單目運算,其運算對象是一個表。該運算按給定的條件,從表中選出滿足條件的行形成一個新表作為運算結果。
選擇運算的記號為sF(R)。其中s是選擇運算符,下標F是一個條件表達式,R是被操作的表。
學生表
學 號 |
姓 名 |
專 業 名 |
性 別 |
出 生 日 期 |
總 學 分 |
備 注 |
081101 |
王林 |
計算機 |
男 |
1990-02-10 |
50 |
|
081102 |
程明 |
計算機 |
男 |
1991-02-01 |
50 |
|
081103 |
王燕 |
計算機 |
女 |
1989-10-06 |
50 |
若要在學生情況表中找出學生表中性別為女的行形成一個新表,則運算式為:
sF(學生),上式中F:性別=“女”,該選擇運算的結果如表
學 號 |
姓 名 |
專 業 名 |
性 別 |
出 生 日 期 |
總 學 分 |
備 注 |
081103 |
王燕 |
計算機 |
女 |
1989-10-06 |
50 |
2、投影(Projection)
投影也是單目運算,該運算從表中選出指定的屬性值(即列)組成一個新表,記為:ÕA(R)。
其中A是屬性名(即列名)表,R是表名。若在表中對學號、姓名和總學分投影,運算式為:
Õ學號,姓名,總學分(學生) , 該運算得到如表
學 號 |
姓 名 |
總 學 分 |
081101 |
王林 |
50 |
081102 |
程明 |
50 |
081103 |
王燕 |
50 |
3、連接(JOIN)
上面講的兩種運算分別是在行和列的方向上對表進行分割,而連接操作是對整張表的操作
① 等值連接
兩個表連接最常用的條件是兩個表的某些列值相等,這樣的連接稱為等值連接
②自然連接
數據庫應用中最常用的是“自然連接”。進行自然連接運算要求兩個表有共同屬性(列),自然連接運算的結果表是在參與操作兩個表的共同屬性上進行等值連接后再去除重復的屬性后所得的新表
【數據庫查詢語句——Select 語句語法】
1、使用數據庫和表的主要目的是存儲數據以便在需要時進行檢索、統計或組織輸出,通過SQL語句的查詢可以從表或視圖中迅速方便地檢索數據。
2、SQL的SELECT語句可以實現對表的選擇、投影及連接操作。
3、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] , ...] /*ORDER BY子句*/ [LIMIT {[offset,] row_count | row_count OFFSET offset}] /*LIMIT子句*/
解釋:
SELECT關鍵詞的后面可以使用很多的選項:
● ALL | DISTINCT | DISTINCTROW:這幾個選項指定是否重復行應被返回。如果這些選項沒有被給定,則默認值為ALL(所有的匹配行被返回)。DISTINCT 和 DISTINCTROW是同義詞,用於消除結果集合中的重復行。
● SELECT…INTO OUTFILE 'file_name':這個語句可以將表中的行導出到一個文件中,這個文件被創建在服務器主機中,file_name為文件名。
●以SQL_為開頭的選項都是MySQL相對於標准SQL的擴展,這些選項在多數情況下可以選擇不使用。
●所有被使用的子句必須按語法說明中顯示的順序嚴格地排序。例如,一個HAVING子句必須位於GROUP BY子句之后,並位於ORDER BY子句之前。
【常用的Select選擇語句】
下面我們首先將幾張表錄入數據庫中,之后的操作都在這幾張表的基礎上完成
一、【列操作】
1. 選擇指定的列
使用select語句選擇一個表中的某些列,各列名之間要以逗號分隔。
查詢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 專業名='計算機';
4. 計算列值
使用SELECT對列進行查詢時,在結果中可以輸出對列值計算后的值,即SELECT子句可使用表達式作為結果,格式為:
SELECT expression [ , expression ]
按120分計算成績,顯示XS_KC表中學號為081101的學生課程信息。
SELECT 學號, 課程號 , 成績*1.20 AS 成績120 FROM XS_KC WHERE 學號= '081101';
5. 消除結果集中的重復行
對表只選擇其某些列時,可能會出現重復行。例如,若對XSCJ數據庫的XS表只選擇專業名和總學分,則出現多行重復的情況。可以使用DISTINCT或DISTINCTROW關鍵字消除結果集中的重復行,其格式是:
SELECT DISTINCT | DISTINCTROW column_name [ , column_name…]
其含義是對結果集中的重復行只選擇一個,保證行的唯一性。
對XSCJ數據庫的XS表只選擇專業名和總學分,消除結果集中的重復行。
SELECT DISTINCT 專業名,總學分 FROM XS;
6. 聚合函數(aggregation function)
SELECT子句的表達式中還可以包含所謂的聚合函數。聚合函數常常用於對一組值進行計算,然后返回單個值。除COUNT函數外,聚合函數都會忽略空值。聚合函數通常與GROUP BY子句一起使用。如果SELECT語句中有一個GROUP BY子句,則這個聚合函數對所有列起作用,如果沒有,則SELECT語句只產生一行作為結果。
下表列出了一些常用的聚合函數。
(1)COUNT函數
聚合函數中最經常使用的是COUNT()函數,用於統計組中滿足條件的行數或總行數,
返回SELECT語句檢索到的行中非NULL值的數目,若找不到匹配的行,則返回0。
語法格式為:
COUNT ( { [ ALL | DISTINCT ] expression } | * )
其中,expression是一個表達式,其數據類型是除BLOB或TEXT之外的任何類型。ALL表示對所有值進行運算,DISTINCT表示去除重復值,默認為ALL。使用COUNT(*)時將返回檢索行的總數目,不論其是否包含 NULL值。
例如:求學生的總人數。
SELECT COUNT(*) AS '學生總數' FROM XS;
例如:統計備注不為空的學生數目。
SELECT COUNT(備注)AS '備注不為空的學生數目' FROM XS;
例如:統計總學分在50分以上的人數。
SELECT COUNT(總學分) AS '總學分50分以上的人數' FROM XS WHERE 總學分>50;
(2)MAX和MIN
MAX和MIN分別用於求表達式中所有值項的最大值與最小值,語法格式為:
MAX / MIN ( [ ALL | DISTINCT ] expression )
其中,expression是常量、列、函數或表達式,其數據類型可以是數字、字符和時間日期類型。
例如: 求選修101課程的學生的最高分和最低分。
SELECT MAX(成績), MIN(成績) FROM XS_KC WHERE 課程號 = '101';
注意:當給定列上只有空值或檢索出的中間結果為空時,MAX和MIN函數的值也為空。
(3)SUM函數和AVG函數
SUM和AVG分別用於求表達式中所有值項的總和與平均值,語法格式為:
SUM / AVG ( [ ALL | DISTINCT ] expression )
其中,expression是常量、列、函數或表達式,其數據類型只能是數值型數據。
例如:求學號081101的學生所學課程的總成績。
SELECT SUM(成績) AS '課程總成績' FROM XS_KC WHERE 學號 = '081101';
例如:求選修101課程的學生的平均成績。
SELECT AVG(成績) AS '課程101平均成績' FROM XS_KC WHERE 課程號 = '101';
(4)VARIANCE和STDDEV(STD)函數
VARIANCE和STDDEV函數分別用於計算特定的表達式中的所有值的方差和標准差。語法格式:
VARIANCE / STDDEV ( [ ALL | DISTINCT ] expression )
例如: 求選修101課程的成績的方差。
SELECT VARIANCE(成績) FROM XS_KC WHERE 課程號= '101';
(5)GROUP_CONCAT函數
MySQL支持一個特殊的聚合函數GROUP_CONCAT函數。該函數返回來自一個組指定列的所有非NULL值,這些值一個接着一個放置,中間用逗號隔開,並表示為一個長長的字符串。這個字符串的長度是有限制的,標准值是1024。
語法格式為:
GROUP_CONCAT ( { [ ALL | DISTINCT ] expression } | * )
例如: 求選修了206課程的學生的學號。
SELECT GROUP_CONCAT(學號) FROM XS_KC WHERE 課程號= '206';
(6)BIT_AND、BIT_OR和BIT_XOR
與二進制運算符|(或)、&(與)和^(異或)相對應的聚合函數分別是BIT_OR 、BIT_AND、BIT_XOR。例如,函數BIT_OR在一列中的所有值上執行一個二進制OR。
語法格式為:
BIT_AND | BIT_OR | BIT_XOR( { [ ALL | DISTINCT ] expression } | * )
例如: 有一個表BITS,其中有一列bin_value上有3個INTEGER值:1、3、7,獲取在該列上執行BIT_OR的結果,使用如下語句:
SELECT BIN(BIT_OR(bin_value)) FROM BITS;
說明:MySQL在后台執行如下表達式:(001|011)|111,結果為111。 其中BIN函數用於將結果轉換為二進制位。