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