SQL語句檢索數據排序及過濾


閱讀目錄

一:排序檢索數據

1.1 排序數據

比如查詢數據庫中表數據的時候,我們使用如下語句:

select * from user;

如下所示:

但是上面查詢出來的數據並沒有排序過的,因此如果我們想讓數據進行排序,我們可以使用 order by子句。order by 子句會以字母順序排序數據的。如下排序代碼:

select * from user order by username;

如上的含義是:查詢user表,以username這個字段進行字母排序。然后結果如下所示:

1.2 按多個列排序

比如說我這個user表中,不僅僅按照username這個字段進行排序,還會按照password這個字段進行排序。首先我們會先按照username這個字段進行排序,排序完成后,然后再會按照password這個這段進行排序。如果按照多個列進行排序的話,那么多個列之間是用逗號分開即可。如下基本語法:

select * from user order by username, password;

1.3 按列位置排序

order by 還支持按相對位置進行排序。

比如我們先用 select * from user; 使用該語句查詢 user表中所有的數據,結果如下:

如上是在數據庫中默認排序的。我們現在要按照數字位置進行排序,如下基本代碼:

select * from user order by 2,1;

如上代碼的含義是:先按照列位置2進行排序,然后再按照列位置1進行排序。因此排序結果如下所示:

如上,我們的位置2,1其實就是按照user表中的字段username字段進行排序,再安裝user表中的id字段進行排序。也就是說username字段排序完成后(username字段是按照字母的順序排序的),然后我們再按照id進行排序(id是按照數字大小順序排序的。)

1.4 指定排序方向

1.4.1 對單個字段進行降序排序

數據排序我們默認的是按照字母順序排序的(從A到Z), 我們也可以使用order by 按照字母的降序排序(從Z到A進行排序)。
如果為了進行降序排序,我們必須需要指定DESC這個關鍵字。

比如如下語法:

select * from user order by id DESC;

如上代碼的含義是 查詢user表中的所有數據,然后按照id進行降序排序,如下圖所示:

1.4.2 對多個字段進行降序排序

如上只是對單個字段進行降序排序,那如果對多個字段進行降序排序呢?比如如下基本語法:

select * from user order by username DESC, password;

注意:desc關鍵字只應用到直接位於其前面的列名。

上面sql語句的含義是:先按照username這個字段的值進行降序排序,然后再按照password這個值進行升序排序。比如如下所示:

那如果我們需要對username和password這個字段都進行排序呢?那就需要在每個字段后面都加上 desc這個關鍵字了,SQL語句如下所示:

select * from user order by username DESC, password DESC;

如下所示:

注意:對字段進行升序排序,該關鍵字就是 ASC了。默認就是按照升序排序的。

二:過濾數據

2.1 使用where子句

數據庫表中一般會包含很多數據的,為了查找速度更快,我們需要根據某個條件去查找。因此搜索條件也屬於過濾條件的一種。

基本語法如下:

select * from user where username = 'cccc';

如上語法的基本含義是:我們會查詢user表中所有的數據,然后我們根據條件username='cccc' 這個條件去查找數據的。
如下圖所示:

2.2 where子句操作符。

什么是子句操作符呢?比如 =(等於),!=(不等於),<(小於),<=(小於等於),!<(不小於),>(大於),>=(大於等於),!>(不大於), between(在指定的兩個值之間),IS NULL(為NULL值)。

下面我們來使用下上面的操作符,下面我們來查詢數據庫表user表中的數據,然后我們查找 password這個字段的值大於500的。如下基本語法所示:

select * from user where password > 500;

2.3 范圍值檢查

要檢查某個范圍的值,我們可以使用 between 這個操作符,其基本語法如下:

select * from user where password between 200 and 500;

如上代碼的含義是:我們查詢user表,然后我們根據password這個字段進行查詢,查詢到該值是在200到500范圍之內的,它是不包括500的。

如下圖所示:

2.4 空值檢查

在創建表的時候,我們會設置某個字段為null的時候,那么我們不能簡單的檢查是否等於null, select語句有一個特殊的where子句,可用來檢查具有null值的列,這個where子句就是 is null子句。其基本語法如下:

select * from user where password is null;

上面語法的含義是:查詢user表中的所有字段,其中password這個字段為null的值。

三:高級數據過濾

組合where子句

SQL允許給出多個where子句。這些子句有兩種使用方式,即以and子句或or子句的方式使用。

1. AND 操作符

如下基本語法:

select * from user where username = 'cccc' and password > 200; 

如上語句的含義是:查詢user這張表中的所有數據,然后根據 username='cccc' 和 password 大於200 這個條件進行查詢,如下所示:

2. OR 操作符

or操作符和and操作符相反,它匹配的含義是:只要匹配上任意一個條件即可。如下基本語法:

select * from user where username = 'cccc' or password > 200; 

如上代碼的含義是:查詢user這張表,如果這張表username='cccc' 的話,就會把數據查詢出來,或者 說 password > 200 的這種情況下,也會把對應的數據查詢出來,如下圖所示:

3. in 操作符
in操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。in取一組由逗號分隔,括在圓括號中的合法值。
如下基本語法:

select * from user where password in (234, 456, 123);

如上代碼的含義是:查詢user這張表,並且根據password這個字段中的值是 234, 456, 123 會把所有的數據查詢出來,如下所示:

使用in操作符,優點如下:

1. 在有很多合法選項時候,in操作符的語法更清楚,更直觀。
2. 在與其他and和or操作符組合使用in時,求值順序更容易管理。
3. in操作符一般比一組or操作符執行更快。

4. not操作符

該操作符有且只有一個功能,那就是否定其后所跟的任何條件。如下基本語法:

select * from user where not username='cccc';

如上代碼的含義是:查詢user這張表,並且username 不等於 cccc 這個值的所有條件。如下所示:

四:用通配符進行過濾

1. like操作符

我們前面介紹的所有的都是針對已知值進行過濾的。不管是匹配一個值還是多個值。檢索大於還是小於已知值,或者檢查某個范圍的值,他們的共同點就是過濾中使用的值都是已知的。

但是有時候我們需要進行模糊搜索,比如說我們要搜索字符串中 'kongzhi' 含有字符 'kong' 這個字符的所有值。因此我們這里需要使用通配符進行搜索。

1.1 百分號(%) 通配符

該通配符的含義是:%(百分號) 表示任何字符出現任意次數。如下基本語法:

select * from user where username like 'kong%';

如上代碼含義是:查詢user這張表中的所有數據,並且該表中的username字段值以 字符 'kong' 開頭的所有匹配的值。

如下圖所示:

百分號('kong%') 通配符的含義是:匹配以字符 'kong' 開頭的字符,不管它后面有多少個字符都匹配。

注意:通配符可在搜索模式中的任意位置上使用,並且可以使用多個通配符。比如可以使用兩個通配符,它在字符的兩端。如下語法:

select * from user where username like '%kongzhi%';

該代碼的含義是匹配user這張表中的字段 username,該字符中包含kongzhi這個字符,不管該字符之前或之后出現什么字符。如下所示:

通配符也可以出現在搜索模式的中間,比如找出以kong開頭的字符,以zhi字符結尾的;如下代碼:

select * from user where username like 'kong%zhi';

如上代碼的含義是:查詢user表中的字段以kong字符開頭的,以字符zhi結尾的所有匹配到的數據,如下圖所示:

1.2 下划線(_) 通配符

下划線 _ 通配符的用途和%通配符一樣,但是它只匹配單個字符,而我們上面的百分號(%)可以匹配0個,1個或多個字符。

select * from user where username like 'kongzhixxx__';

如上代碼,是匹配user這張表中的username字段中的字符 kongzhixxx 后 跟兩個任意字符的字符串。如下圖所示:

注意:使用通配符搜索比上面其他的搜索耗費的時間會更多。因此不到萬不得已的時候盡量不要使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM