MySQL中純數值的記錄在程序中可以不加單引號;如果字符型的記錄中只有數字則也可以不加單引號;as 語句後面的記錄加不加單引號都一樣。 1.語法格式: select [all | distinct | distinctrow ] [high_priority] www.2cto.com [straight_join] [sql_small_result] [sql_big_result] [sql_buffer_result] [SQL_cache | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr, ... [into outfile 'name' export_options | INTO dumpfile 'name'] [from table_reference [ ,table_reference] …] /*FROM子句*/ [wherewhere_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子句*/ [limt {[offset,] row_count | row_count OFFSET offset}] /*LIMIT子句*/ 說明: www.2cto.com 從這個基本語法可以看出,最簡單的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:可以與GROUPBY或DISTINCT同時使用,來告知MySQL優化器結果集合有很多行。在這種情況下,MySQL會優先進行分類,不優先使用臨時表。 www.2cto.com ● SQL_cache:告知MySQL把查詢結果存儲在查詢緩存中。對於使用UNION的查詢或子查詢,本選項會影響查詢中的所有SELECT。 ● SQL_NO_CACHE:告知MySQL不要把查詢結果存儲在查詢緩存中。 ● SQL_CALC_FOUND_ROWS:告知MySQL計算有多少行應位於結果集合中,不考慮任何LIMIT子句。 ● SELECT…INTO OUTFILE 'name':這個語句可以將表中的行導出到一個文件中,這個文件被創建在服務器主機中,name為文件名。 所有被使用的子句必須按語法說明中顯示的順序嚴格地排序。例如,一個HAVING子句必須位於GROUP BY子句之後,並位於ORDER BY子句之前。 2. 消除結果集中的重復行 對表只選擇其某些列時,可能會出現重復行。例如,若對XSCJ數據庫的XS表只選擇專業名和總學分,則出現多行重復的情況。可以使用distinct或distinctrow關鍵字消除結果集中的重復行,其格式是:select distinct|distinctrow 字段名1 [ , 字段名2…] 其含義是對結果集中的重復行只選擇一個,保證行的唯一性。 例:對XSCJ數據庫的XS表只選擇專業名和總學分,消除結果集中的重復行。 select distinct 專業名,總學分 from xs; 2. 聚合函數(aggregationfunction)(分組:分類匯總) SELECT子句的表達式中還可以包含所謂的聚合函數。聚合函數常常用於對一組值進行計算,然後返回單個值。除COUNT函數外,聚合函數都會忽略空值。聚合函數通常與GROUP BY子句一起使用,但是不能與where語句一起使用。如果SELECT語句中有一個GROUP BY子句,則這個聚合函數對所有列起作用,如果沒有,則SELECT語句只產生一行作為結果。 www.2cto.com 函 數 名 說 明 COUNT 求組中項數,返回int類型整數 MAX 求最大值 MIN 求最小值 SUM 返回表達式中所有值的和 AVG 求組中值的平均值 STD或STDDEV 返回給定表達式中所有值的標准差 VARIANCE 返回給定表達式中所有值的方差 GROUP_CONCAT www.2cto.com 返回由屬於一組的列值連接組合而成的結果 BIT_AND 邏輯或 BIT_OR 邏輯與 BIT_XOR 邏輯異或 (1)COUNT函數 聚合函數中最經常使用的是COUNT()函數,用於統計組中滿足條件的行數或總行數,返回SELECT語句檢索到的行中非NULL值的數目,若找不到匹配的行,則返回0。 語法格式為:COUNT ( { [ ALL | DISTINCT ] expression } | * ) 其中,expression是一個表達式,其數據類型是除BLOB或TEXT之外的任何類型。ALL表示對所有值進行運算,DISTINCT表示去除重復值,默認為ALL。使用COUNT(*)時將返回檢索行的總數目,不論其是否包含 NULL值。 count(*):統計記錄的條數(包括null); count(字段名):統計字段中有值的記錄個數(不包括null); count(distinct 字段名):去掉重復後再統計字段中有值的記錄個數(也不包括null) 例1:求學生的總人數。 SELECT COUNT(*) AS '學生總數' FROMXS; 例2. 統計備注不為空的學生數目。 SELECT COUNT(備注)AS '備注不為空的學生數目' FROM XS; 注意:這裡COUNT(備注)計算時備注為NULL的行被忽略 例3: 統計總學分在50分以上的人數。 SELECT COUNT(總學分) AS '總學分50分以上的人數' FROM XS WHERE 總學分>50; (2)MAX和MIN MAX和MIN分別用於求表達式中所有值項的最大值與最小值,語法格式為:MAX / MIN ( [ ALL | DISTINCT ] expression )其中,expression是常量、列、函數或表達式,其數據類型可以是數字、字符和時間日期類型。 www.2cto.com 例:求選修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'; (4)variance和stddev(STD)函數 variance和stddev函數分別用於計算特定的表達式中的所有值的方差和標准差。語法格式: VARIANCE / STDDEV ( [ ALL | DISTINCT ]expression ) 說明:方差的計算按照以下幾個步驟進行。 ① 計算相關列的平均值; ② 求列中的每一個值和平均值的差; ③ 計算差值的平方的總和; ④ 用總和除以(列中的)值得結果。 STDDEV函數用於計算標准差。標准差等於方差的平均根。所以,stddev(…)和sqrt(VARIANCE(…))這兩個表達式是相等的。 STDDEV可以縮寫為STD,這對結果沒有影響。 (5)group_concat函數 MySQL支持一個特殊的聚合函數group_concat函數。該函數返回來自一個組指定列的所有非NULL值,這些值一個接著一個放置,中間用逗號隔開,並表示為一個長長的字符串。這個字符串的長度是有限制的,標准值是1024。 語法格式為:GROUP_CONCAT({[ALL|DISTINCT] expression }| * ) (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的結果,使用如下語句: www.2cto.com SELECT BIN(BIT_OR(bin_value)) FROM BITS; 說明:MySQL在後台執行如下表達式:(001|011)|111,結果為111。 其中BIN函數用於將結果轉換為二進制位。 3. 范圍比較 用於范圍比較的關鍵字有兩個:between和in。 當要查詢的條件是某個值的范圍時,可以使用between關鍵字。BETWEEN關鍵字指出查詢范圍,格式為: expression [ NOT ] between expression1 andexpression2 當不使用NOT時,若表達式expression的值在表達式expression1與expression2之間(包括這兩個值,相反,使用not時,不包括這兩個值),則返回TRUE,否則返回FALSE;使用NOT時,返回值剛好相反。 注意:expression1的值不能大於expression2的值。 使用IN關鍵字可以指定一個值表,值表中列出所有可能的值,當與值表中的任一個匹配時,即返回TRUE,否則返回FALSE。使用IN關鍵字指定值表的格式為:expression IN ( expression [,…n]) 例:前面那個求1900年出生的學生的第三種做法; SELECT 學號, 姓名, 專業名, 出生日期 FROM XS WHERE 出生日期 NOT BETWEEN '1990-01-01'and '1990-12-31'; 例:查詢XS表中專業名為“計算機”、“通信工程”或“無線電”的學生的情況。 SELECT * FROM XS WHERE 專業名 IN ('計算機', '通信工程', '無線電'); 該語句與下列語句等價: SELECT * FROM XS WHERE 專業名 ='計算機' OR 專業名 = '通信工程' OR 專業名 = '無線電'; 說明:IN關鍵字最主要的作用是表達子查詢。 4. 空值比較 當需要判定一個表達式的值是否為空值時,使用IS NULL關鍵字,格式為: expression IS [ NOT ] NULL 當不使用NOT時,若表達式expression的值為空值,返回TRUE,否則返回FALSE;當使用NOT時,結果剛好相反。 例: 查詢XSCJ數據庫中總學分尚不定的學生情況。 www.2cto.com SELECT * FROM XS WHERE 總學分 IS NULL; 本例即查找總學分為空的學生,結果為空。 5. group by子句主要用於根據字段對行分組。 例如,根據學生所學的專業對XS表中的所有行分組,結果是每個專業的學生成為一組。group by子句的語法格式如下:group by {col_name | expr| position} [ASC | DESC], ... [WITH ROLLUP] 說明: group by子句後通常包含列名或表達式。MySQL對GROUP BY子句進行了擴展,可以在列的後面指定ASC(升序)或DESC(降序)。GROUP BY可以根據一個或多個列進行分組,也可以根據表達式進行分組,經常和聚合函數一起使用。 例1:將XSCJ數據庫中各專業名輸出。 SELECT 專業名 FROM XS GROUP BY 專業名; 例2: 求XSCJ數據庫中各專業的學生數。 SELECT 專業名,COUNT(*) AS '學生數' FROM XS GROUP BY 專業名; 使用帶rollup操作符的GROUP BY子句: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。 例: 在XSCJ數據庫上產生一個結果集,包括每個專業的男生人數、女生人數、總人數,以及學生總人數。 SELECT 專業名, 性別, COUNT(*) AS '人數' FROM XS GROUP BY 專業名,性別 with rollup; 使用了ROLLUP操作符後,將對GROUP BY子句中所指定的各列產生匯總行,產生的規則是:按列的排列的逆序依次進行匯總。如本例根據專業名和性別將XS表分為4組,使用ROLLUP後,先對性別字段產生了匯總行(針對專業名相同的行),然後對專業名與性別均不同的值產生了匯總行。所產生的匯總行中對應具有不同列值的字段值將置為NULL。 6. having子句(使用分組後在進行挑選) 使用having子句的目的與where子句類似,having與where的區別:WHERE子句是用來在FROM子句之後選擇行,where是對原始記錄進行挑選;而HAVING子句用來在GROUP BY子句後選擇行,對分組後的記錄進行挑選。 www.2cto.com 語法格式: having 選擇條件; 條件的定義和WHERE子句中的條件類似,不過HAVING子句中的條件可以包含聚合函數,而WHERE子句中則不可以。 SQL標准要求HAVING必須引用GROUP BY子句中的列或用於聚合函數中的列。不過,MySQL支持對此工作性質的擴展,並允許HAVING引用SELECT清單中的列和外部子查詢中的列。 例: 查找XSCJ數據庫中平均成績在85分以上的學生的學號和平均成績。 SELECT 學號, AVG(成績) AS '平均成績' FROM XS_KC GROUP BY 學號 HAVING AVG(成績) >=85; 7. order by字句 在一條SELECT語句中,如果不使用order by子句,結果中行的順序是不可預料的。使用ORDER BY子句後可以保證結果中的行按一定順序排列。 語法格式:ORDER BY {col_name | expr | position} [ASC | DESC] , ... 說明:ORDER BY子句後可以是一個列、一個表達式或一個正整數。正整數表示按結果表中該位置上的列排序。關鍵字asc表示升序排列,desc表示降序排列,系統默認值為ASC。 例: 將通信工程專業的學生按出生日期先後排序。 SELECT 學號,姓名,專業名,出生日期 FROM XS WHERE 專業名 = '通信工程' ORDER BY 出生日期; 注意:當對空值排序時,ORDER BY子句將空值作為最小值對待,按升序排列的話將空值放在最上方,降序放在最下方。 如果是按多個字段排序,先按第一個字段排,當第一個字段的值相同時,再按第二個排;如果第一個字段都不相同,則第二個字段用不著;order by語句在limit語句之前。 8. limit字句 LIMIT子句是SELECT語句的最後一個子句,主要用於限制被SELECT語句返回的行數。 語法格式:LIMIT {[offset,]row_count | row_count OFFSET offset} 說明:如果記錄特別多可以用limit語句分頁! 語法格式中的offset和row_count都必須是非負的整數常數,offset指定返回的第一行的偏移量,row_count是返回的行數。例如,“LIMIT 5”表示返回SELECT語句的結果集中最前面5行,而“LIMIT3,5”則表示從第4行開始返回5行。 www.2cto.com 值得注意的是初始行的偏移量為0而不是1。 例: 查找XS表中學號最靠前的5位學生的信息。 SELECT 學號, 姓名, 專業名, 性別, 出生日期, 總學分 FROM XS ORDER BY 學號 LIMIT 5; 為了與PostgreSQL兼容,MySQL也支持LIMIT row_count OFFSET offset語法。所以將上面例子中的LIMIT子句換成“limit 5 offset 3”,結果一樣。 作者 tianyazaiheruan