閱讀目錄
一:排序檢索數據
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 后 跟兩個任意字符的字符串。如下圖所示:
注意:使用通配符搜索比上面其他的搜索耗費的時間會更多。因此不到萬不得已的時候盡量不要使用。