使用頻率最高的SQL語句應該就是select語句了,它的用途就是從一個或多個表中檢索信息,使用select檢索表數據必須給出至少兩條信息:想選擇什么,以及從什么地方選擇
一、檢索數據
1、檢索單個列
select column from table;
該SQL語句的檢索結果將返回表中的所有行,數據沒有過濾(過濾將得出結果集的一個子集),也沒有排序(如沒有明確排序查詢結果,則返回數據的順序沒有特殊意義,只要返回相同數目的行,就是正確的)
MySQL如同大多數DBMS一樣,不需要單條SQL語句后加分號,但特定DBMS可能必須在單條SQL語句后加分號;如果是多條SQL語句必須加分號(;),如果使用的是MySQL命令行,則必須用分號結束SQL語句
SQL語句不區分大小寫(對所有SQL關鍵字使用大寫,對所有列和表明使用小寫,這樣更易於閱讀和調試)
2、檢索多個列
select column1,column2,column3 from table;
在檢索多個列時,要在列名之間加上逗號(,),最后一個列名不用加
SQL語句一般返回原始的、無格式的數據,數據的格式只是一個表示問題,而不是檢索問題;因此表示方式一般在顯示該數據的應用程序中規定,一般很少使用實際檢索出的原始數據(沒有應用程序提供的格式)
3、檢索所有列
select * from table;
給定通配符*,則檢索數據時返回表中所有列
一般除非確實需要檢索表中的每個列,否則最好別使用*通配符;雖然使用*可能自己比較省事,但檢索不需要的列通常會降低檢索和應用程序的性能
優點在於:由於不明確指定列名,所以可以檢索出名字未知的列
4、檢索不同的行
select distinct column from table;
distinct告訴MySQL只返回不同的值;它必須直接放在列名的前面(distinct作用於所有列)
5、限制結果
select column from table limit N;
limit告訴MySQL只返回它指定值的第一行或前幾行,N表示行的數量
select column from table limit X,Y;
limit X, Y告訴MySQL返回從行X開始的Y行;X為開始位置,Y為要檢索的行數(limit帶一個值總是從第一行開始,給出的數為返回的行數;帶兩個值可以指定從行號為第一個值的位置開始)
檢索出來的第一行為行0而不是行1,因此,limit1,1將檢索出第二行而不是第一行(在行數不夠時,MySQL將只返回能返回的最大行數)
6、使用完全限定的表名
select table.column from database.table;
該SQL語句中檢索的表名以及列名是完全限定的
二、排序檢索數據
子句(clause):SQL語句由子句構成,有些子句是必需的,有些是可選的;一個子句通常由一個關鍵字和所提供的數據組成
1、排序單個列
order by子句:取一個或多個列的名字,據此對輸出進行排序(order by位於from子句之后;如果使用limit,它必須位於order by 之后)
select column from table order by column;
該列指示MySQL對column進行排列(通常order by子句中使用的列將是為顯示所選擇的列)
2、按多個列排序
select column1,column2,column3 from table order by column1,column2;
僅在多個行具有相同的column1時才對column2進行排序,如果指定的column1是唯一的,則不會按照column2排序
3、指定排序方向
select column1,column2,column3 from table order by column1 desc;
desc:desc關鍵字只應用到直接位於其前面的列名,作用是使其按照降序排列(與其相反的是asc關鍵字,在升序排序時可以用到,但一般情況下升序是默認的)
如果想在多個列上進行降序排序,則必須對每個列指定desc關鍵字
4、檢索最高或最低值
select column from table orderby column desc limit 1;
column desc告訴MySQL按照降序排列,limit 1告訴MySQL只返回一行的數據
三、過濾數據
數據庫包含大量的數據,很少需要檢索表中所有航,通常會根據特定操作或報告需要提取表數據的子集;
只檢索所需數據需要指定搜索條件(search criteria),搜索條件你也被稱為過濾條件(filter condition)
1、where子句
select語句中,數據根據where子句中指定的搜索條件進行過濾,where子句在表名(from子句)之后給出
select column from table where column = N;
該語句的意思為從table表中篩選出column=N的行;采用了最簡單的相等測試,檢查一個列是否具有指定的值據此進行過濾
如果同時使用order by和where子句,order by位於where之后(否則會出錯)
2、where子句操作符
=:等於 <>:不等於 !=:不等於 <:小於 <=:小於等於 >:大於 >=:大於等於 between:在指定的兩個值之間
3、不匹配檢查
select column from table where column <> N;
select column from table where column != N;
where子句中,對過濾的值,有的用單引號,有的不用,原因在於:單引號用於限定字符串,如果將值與串類型的列進行比較,則需要,如用來與數值列比較,則不用引號
3、范圍值檢查
select column from table where column between X and Y;
為了檢查某個范圍的值,可以使用between操作符。使用between操作符需要兩個值:范圍的開始值和結束值(上面例子中X和Y就是開始和結束值)
between匹配范圍內的所有的值,包括指定的開始值和結束值
4、空值檢查
select column from table where column1 is null;
建表時,設計人員可以指定其中的列是否可以不包含值,在一個列不包含值時,稱其為包含空值NULL(無值{no value}:它與字段包含0、空字符串或僅僅包含空格不同)
is null子句就是用來檢查表中具有null值的列(在過濾數據選擇出不具有特定值的行時,一定要驗證返回數據中確實給出了被過濾列具有null的行)
四、使用操作符過濾數據
操作符(operator):用來聯結或改變where子句中的子句的關鍵字。也稱為邏輯操作符(logical operator)
1、and操作符
select column1, column2,column3 from table where column1 = X and column <=Y;
and,用在where子句中的關鍵字,用來指示檢索滿足所有給定條件的行;即:and指示DBMS只返回滿足所有給定條件的行(可添加多個過濾條件,每添加一條就要使用一個and)
2、or操作符
select column1, column2 from table where column1 = X or column <=Y;
or,用在where子句中的關鍵字,用來表示檢索匹配任一給定條件的行;即:or告訴DBMS匹配任一條件而不是同時匹配兩個條件
3、計算次序
select column1,column2 from table where column1 =X or column1 = Y and column2 >= N;
該SQL語句的意思是從table表中過濾出column2為N(含)以上且column1=X或Y的的所有行(實際中是先計算column1 = Y and column2 >= N然后計算column1 =X)
where可包含任意數目的and和or操作符;允許兩者結合以進行復雜和高級的過濾(需要說明的是:and在計算次序中優先級高於or)
如果希望and和or之間計算次序不被錯誤組合,可將or操作符所對應的子句使用圓括號()括起來,以明確的分組相應的操作符
圓括號具有較and或or更高的計算次序,DBMS首先過濾圓括號內的條件
PS:任何時候使用具有and和or操作符的where子句,都應該使用圓括號明確的分組操作符!
4、in操作符
select column1, column2 from table where column1 in (X,Y) order by column2;
該SQL語句的意思是從table表中檢索所有column=X和Y的column2的行(in操作符用來指定匹配值的清單的關鍵字,功能和or相當)
圓括號在where子句中還有另一種用法,in操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配;in取合法值的由逗號分隔的清單,全都括在圓括號中;
in操作符優點如下:
①使用長的合法選項清單時,in操作符的語法更清楚且更直觀
②使用in操作符,計算的次序更容易管理(使用的操作符更少)
③in操作符一般比or操作符清單執行更快
④in最大的優點是可以包含其他select語句,使得能夠更動態的建立where子句
5、not操作符
select column1, column2 from table where column1 not in (X,Y) order by column2;
該SQL語句的意思是從table表中列出除column1為X,Y之外的所有column2的行(not操作符用來否定后跟條件的關鍵字)
not操作符有且只有一個功能,就是否定它之后所跟的任何條件
MySQL支持使用not對in、between和exists子句取反,這與其他多數DBMS允許使用not對各種條件取反有很大差別
五、使用通配符過濾數據
通配符(wildcard):用來匹配值的一部分的特殊字符,利用通配符可以創建比較特定數據的搜索模式(實際上是SQL的where子句中帶有特殊含義的字符)
搜索模式(search pattern):由字面值、通配符或兩者組合構成的搜索條件
為在搜索子句中使用通配符,必須使用like操作符;like指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較
1、百分號(%)通配符
在搜索串中,%表示任何字符出現任意次數;通配符可以在搜索模式中任意位置使用,並且可以使用多個通配符
select column1, column2 from table where column1 like ‘test%’
上面的SQL語句表示任意以test起頭的詞;%告訴MySQL接受test之后的任意字符,不管它有多少字符
test%:所有以test起頭的值/ %test%:匹配任何包含test的值/ te%st:所有以te開頭以st結尾的值
PS:%通配符不可以匹配null
2、下划線(_)通配符
select column1, column2 from table where column1 like ‘_test ’
下划線通配符作用和%一樣,但下划線通配符只匹配單個字符而不是多個字符(與%能匹配0個字符不一樣,總是匹配一個字符)
3、使用通配符的技巧
①不要過度使用通配符(如果其他操作符能達到同樣目的,應使用其他操作符)
②在確實需要使用通配符時,除非絕對有必要,否則不要把通配符用在搜索模式開始處(這樣做是最慢的)
③注意通配符所在的位置