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