《Mysql實例MySQL進階SELECT語法篇》要點:
本文介紹了Mysql實例MySQL進階SELECT語法篇,希望對您有用。如果有疑問,可以聯系我們。
MySQL中SELECT語句的基本語法是:?
SELECT?[STRAIGHT_JOIN]?[SQL_SMALL_RESULT]?[SQL_BIG_RESULT]?[HIGH_PRIORITY]?[DISTINCT|DISTINCTROW|ALL]?select_list?[INTO?{OUTFILE|DUMPFILE}?'file_name'?export_options]?[FROM?table_references?[WHERE?where_definition]?[GROUP?BY?col_name,...]?[HAVING?where_definition]?[ORDER?BY?{unsighed_integer|col_name|formura}?[ASC|DESC],...]?[LIMIT?[offset,]?rows]?[PROCEDURE?procedure_name]]??
STRAIGHT_JOIN、SQL_SMALL_RESULT、SQL_BIG_RESULT、HIGH_PRIORITY是MySQL對ANSI?SQL92的擴展.如果優化器以非最佳次序聯結表,使用STRAIGHT_JOIN可以加快查詢.?
SQL_SMALL_RESULT和SQL_BIG_RESULT是一組相對的關鍵詞.它們必須與GROUP?BY、DISTINCT或DISTINCTROW一起使用.SQL_SMALL_RESULT告知優化器結果會很小,要求MySQL使用臨時表存儲最終的表而不是使用排序;反之,SQL_BIG_RESULT告知優化器結果會很小,要求MySQL使用排序而不是做臨時表.?
HIGH_PRIORITY將賦予SELECT比一個更新表的語句更高的優先級,使之可以進行一次優先的快速的查詢.?
以上四個關鍵詞的使用方法的確比較晦澀.幸運的是,在絕大多數情況下,在MySQL中我們完全可以選擇不使用這四個關鍵詞.?
DISTINCT、DISTINCTROW對查詢返回的結果集提供了一個最基本但是很有用的過濾.那就是結果集中只含非重復行.在這里要注意的是,對關鍵詞DISTINCT、DISTINCTROW來說,空值都是相等的,無論有多少NULL值,只選擇一個.而ALL的用法就有畫蛇添足之嫌了.它對結果集的產生沒有任何影響.?
INTO?{OUTFILE|DUMPFILE}?'file_name'?export_options,將結果集寫入一個文件.文件在服務器主機上被創建,并且不能是已經存在的.語句中的export_options部分的語法與用在LOAD?DATAINFILE語句中的FIELDS和LINES子句中的相同,我們將在MySQL進階_LOAD?DATA篇中詳細討論它.而OUTFILE與DUMPFILE的關鍵字的區別是:后前只寫一行到文件,并沒有任何列或行結束.?
select?list:其中可以包含一項或多項下列內容:?
1、“*”,表示按照create?table的順序排列的所有列.?
2、按照用戶所需順序排列的列名的清單.?
3、可以使用別名取代列名,形式如下:column?name?as?column_heading.?
4、表達式(列名、常量、函數,或以算術或逐位運算符連接的列名、常量和函數的任何組合).?
5、內部函數或集合函數.?
6、上述各項的任何一種組合.?
FROM:決定SELECT命令中使用哪些表.一般都要求有此項,除非select_list中不含列名(例如,只有常量、算術表達式等).如果表項中有多個表,用逗號將之分開.在關鍵詞FROM后面的表的順序不影響結果.?
表名可以給出相關別名,以便使表達清晰.這里的語法是tbl_name?[AS]?alias_name.例如:?
select?t1.name,t2.salary?from?employee?as?t1,info?as?t2?where?t1.name=t2.name與select?t1.name,t2.salary?from?employee?t1,info?t2?where?t1.name=t2.name是完全等價的.?
所有對該表的其他引用,例如在where子句和having子句中,都要用別名,別名不能以數字開頭.?
where子句設置了搜索條件,它在insert,update,delete語句中的應用方法也與在select語句中的應用方法完全相同.搜索條件緊跟在關鍵詞where的后面.如果用戶要在語句中使用多個搜索條件,則可用and或or連接.搜索條件的基本語法是[not]?expression?comparison_operator?expression;[not]?expression?[not]?like?“match_string”;[not]?expression?is?[not]?null;[not]?expression?[not]?between?expression?and?expression;[not]?column_name?join_operator?column_name;[not]?boolean_expression.?
and:用來聯結兩個條件,并在兩個條件都是TRUE的時候返回結果.當在同一語句中使用多個邏輯運算符時,and運算符總是最優先,除非用戶用括號改變了運算順序.?
or:用來聯結兩個條件,當兩個條件中有任一條件是TRUE的時候返回結果.當在同一語句中使用多個邏輯運算符時,運算符or通常在運算符and之后進行運算.當然用戶可以使用括號改變運算的順序.?
between:用來標識范圍下限的關鍵詞,and后面跟范圍上限的值.范圍where?@val?between?x?and?y包含首尾值.如果between后面指定的第一個值大于第二個值,則該查詢不返回任何行.?
column_name:在比較中使用的列名.在會產生歧義時,一定要指明列所在的表名.?
comparison_operator:比較運算符.見下表:?
符號?意義?
=??等于?
>??大于?
<??小于?
>=??大于等于?
<=??小于等于?
!=??不等于?
<>??不等于?
在比較char,varchar型數據時,“<”的意思是更接近字母表頭部,“>”代表更接近字母表尾部.一般來說,小寫字母大于大寫字母,大寫字母大于數字,但是這可能依賴于服務器上操作系統的比較順序.?
在比較時,末尾的空格是被忽略的.例如,“Dirk”等于“Dirk?”.?
在比較日期時,“<”表示早于,“>”表示晚于.?
在使用比較運算符比較character和datetime數據時,需用引號將所有數據引起來.?
expression:可能是列名、常數、函數或者是列名或常數的任意組合,以及以算術運算符或逐位運算符連接的函數.算術運算符如下表所示:?
符號???意義?
+????加號?
-????減號????
*????乘號?
/????除號?
is?null:在搜索一個NULL值時使用.?
like:關鍵詞,對char、varchar和datetime(不包括秒和毫秒)可以使用like,在MySQL中like也可以用在數字的表達式上.?
當用戶在搜索datetime型數據時,最好是使用關鍵詞like,因為完整的datetime記錄包含各種各樣的日期組件.例如用戶在列arrival_time中加入一個值“9:20”,而子句where?arrival_time=“9:20”卻沒有發現它,因為MySQL把錄入的數據轉換成了“Jan?1,1900?9:20AM”.然而子句where?arrival_time?like“%9:20%”就能找到它.?
boolean_expression:返回“true”或“false”值的表達式.?
match_string:由字符和通配符組成的串,用單引號或雙引號引起來,是匹配模式.通配符如下表所示:?
符號??意義?
%????0或多個字符的字符串?
_????任何一單個字符?
not:否定任何邏輯表達式,或是關鍵詞,如like,null,between等.?
group?by和having子句在select語句中使用,可以將表劃分成組并返回匹配having子句條件的組.?
語法:select語句開頭?
?????group?by?[all]?aggregate_free_expression?[,aggregate_free_expression]*?
?????[having?search_conditions]?
?????select語句結尾?
group?by:指定表將劃分的組群,如果在select表項中包含集合函數,則為各組計算一個總計值.這些總計值的結果以新的列顯示,而不是新的行.在having子句中用戶可以引用這些新的總計列.在group?by之前的select_list中可以使用avg、count、max、min和sum等集合函數.表可以被任意列的組合分組.?
all:在結果中包含所有組群的Transact-SQL擴展,這里的所有組群甚至包括那些被where子句所排除的組群.如果同時使用having子句,將對all的意義進行否定.?
aggregate_free_expression:不包含集合函數的表達式,Transact-SQL擴展允許在用列名稱分組的同時,用無集合函數的表達式分組.?
having:為group?by子句設置條件,類似于where為select語句設置條件的方法.having的查找條件可以包括集合函數表達式.除此之外,它的查找條件與where查找條件相同.?
order?by:按列排列結果.對select輸出的列可以用列名、列別名或列位置來引用.例如:select?id?as?myid,name?as?myname?from?mytable?group?by?id、select?id?as?myid,name?as?myname?from?mytable?group?by?myid、select?id?as?myid,name?as?myname?from?mytable?group?by?1這三句是完全等價的.當然,我們不贊成用第三種用法,這將給程序的可讀性帶來不好的影響.?為了以降序排列,把DESC關鍵詞加到order?by子句中你要排序的列名前.缺省是升序,你也可以用ASC關鍵詞明確指定.?
limit?子句:用來限制select語句返回的行數.limit取1個或2個數字參數,如果給定2個參數,第一個指定要返回的第一行的偏移量,第二個指定返回行的最大數目.初始行的偏移量是0(不是1).如果給定一個參數,它指出偏移量為0的返回行的最大數目.也就是說limit?5和limit?0,5完全等價.?
至于procedure關鍵詞的含義,我也沒搞得太清楚,好象是對存儲過程的支持,而MySQL本身不支持存儲過程,看來是為了將來擴充的需要而保留的吧.?
《Mysql實例MySQL進階SELECT語法篇》是否對您有啟發,歡迎查看更多與《Mysql實例MySQL進階SELECT語法篇》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9833.html