一驰唬、結果限制
關鍵字:
limit
limit...offset...
limit N,M
注意:
limit 3
表示顯示前3行镀赌;
limit 2 offset 1
表示從第1行開始婿滓,顯示其下面2行
limit 3,5
表示從第3行開始菜皂,顯示其下面5行
select prod_id from Products limit 2 offset 1; --從第1行開始顯示其下面2行
select prod_id from Products limit 5 offset 6; --從第6行開始顯示其下面5行
select prod_id from Products limit 3,5; --從第3行開始顯示其下面5行
說明:不同的RDBMS系統使用不同瘫析,比如SQL server使用top N。
二救巷、結果排序
1、按多列排序
注意: 多列排序句柠,順序完全按照規(guī)定來浦译,優(yōu)先order by 后第一個列。
--當價格相同時溯职,才按照名字排序精盅,即如果價格都是唯一的,則不會按照名字排序
select prod_id,prod_name,prod_price from Products order by prod_price,prod_name;
2谜酒、按列的位置排序
注意:
- 列位置指select語句后面的列名位置叹俏,從左到右依次1,2
- 按列位置排序優(yōu)點是不用重復寫列名,缺點容易按錯誤的列排序
- 如果排序的列不在select清單中僻族,則會報錯
- 如有必要可以混合使用按照列名和相對位置排序
--先按照商品價格排序粘驰,再按照商品名字排序
select prod_name,prod_price from Products order by 2,1;
--先按照商品價格屡谐,再按照商品名字,最后按照商品ID排序(商品ID不在select清單中蝌数,故使用列名)
select prod_name,prod_price from Products order by 2,1,prod_id;
3愕掏、指定排序方向
注意:
- 排序方向分為升序和降序,默認是升序顶伞,如從(A-Z饵撑,0-9)
- 按照降序排列需加關鍵字DESC(descending)
- DESC關鍵字只應用到直接位于其前面的列名,如果要在多列進行降序排列,則每一列都指定DESC關鍵字
--商品價格按降序排列(最貴最上面)唆貌,在每個價格內滑潘,商品名字按照默認升序排列
select prod_name,prod_price from Products order by prod_price desc,prod_name;
--商品價格和名字都按照降序排列
select prod_name,prod_price from Products order by prod_price desc,prod_name desc;
三、結果過濾
1锨咙、where子句
注意:通常order by子句和where子句一起使用時语卤,應讓order by位于where之后,否則將會產生錯誤蓖租!
where子句操作符:
操作符 | 說明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
> | 大于 |
!> 和 <= | 不大于 即 小于等于 |
< | 小于 |
!< 和 >= | 不小于 即 大于等于 |
BETWEEN | 在指定的兩個值之間 |
IS NULL | 為NULL值(空值) |
① 何時使用引號粱侣?
- 單引號用來限定字符串
- 如果將值與字符串類型的列進行比較,就需要加引號蓖宦,如vend_id為char類型
- 如果將值與數值類型的列進行比較齐婴,則不需要加引號,如prod_price為decimal數值類型
--查找價格小于等于10美元的商品
select prod_name, prod_price from Products where prod_price <= 10;
--查找不屬于DLL01供應商的商品
select vend_id,prod_name from Products where vend_id <> 'DLL01';
② 使用!=還是<>稠茂?
- 通常來說!=和<>是可以互換的
- 但并非所有的RDBMS系統都支持這兩種不等于操作符柠偶,如Microsoft Access支持<>,不支持!=
--查找不屬于BRS01供應商的商品,以下都可以
select vend_id,prod_name from Products where vend_id <> 'BRS01';
select vend_id,prod_name from Products where vend_id != 'BRS01';
③ 范圍過濾between...and
- 使用between時,必須指定兩個值表示范圍(低—>高)睬关,這兩個值必須用and分割
- between匹配范圍中所有的值诱担,包括指定的開始和結束值
--查找在5到10美元之間的商品
select prod_name,prod_price from Products where prod_price between 5 and 10;
--查找在5到10美元之間的商品并按照價格降序排列,最貴最上面
select prod_name,prod_price from Products where prod_price between 5 and 10 order by prod_price desc;
④ 空值匹配
- NULL表示無值电爹,和字段包含0蔫仙、空字符串或僅僅包含空格不同
- 確定是否為NULL,不能簡單的檢查是否等于NULL丐箩,而是IS NULL
- 注意:如果某一列中內容為null摇邦,不能直接使用is null來過濾
--查找email地址為空的客戶姓名
select cust_name,cust_email from Customers where cust_email is null;
/**以下是不對的寫法
select cust_name,cust_email from Customers where cust_email='null';
**/
--查找email地址非空的客戶姓名
select cust_name,cust_email from Customers where cust_email is not null;
2、高級數據過濾
① 組合where子句
- AND(where后and相連所有條件都必須同時滿足屎勘,多個and可以一起使用)
--查找供應商為BRS01并且價格小于等于4美元的商品信息
select vend_id,prod_name,prod_price from Products where vend_id='BRS01' and prod_price >=4;
- OR(where后or相連所有條件滿足其中一個即可施籍,多個or可以一起使用)
--查找供應商為DLL01或者為BRS01的商品信息
select vend_id,prod_name,prod_price from Products where vend_id='DLL01' or vend_id='BRS01';
--查找供應商為DLL01或者價格大于等于4美元的商品信息
select vend_id,prod_name,prod_price from Products where vend_id='DLL01' or prod_price >=4;
特別提醒:
1. 大部分RDBMS系統在where子句or操作符中,第一個條件滿足情況下概漱,不再計算第二個條件丑慎。
2. 在第一個條件滿足時,不管第二個條件是否滿足,相應的行都被檢索出來竿裂。
-
AND和OR組合后求值順序
思考:查找出價格為10美元及以上玉吁,并且有DLL01或者BRS01供應商的產品信息,如何實現铛绰?
--列出供應商為BRS01并且價格大于等于10的產品和供應商為DLL01的所有商品(不關心其價格)
select vend_id,prod_name,prod_price from Products where vend_id='DLL01' or vend_id='BRS01' and prod_price >=10;
--列出供應商為DLL01或BRS01的價格大于等于10的商品信息
select vend_id,prod_name,prod_price from Products where (vend_id='DLL01' or vend_id='BRS01') and prod_price >=10;
特別提醒:
1. AND和OR一起使用時會有優(yōu)先級之分诈茧,SQL優(yōu)先處理AND操作符
2. 為了避免條件錯誤組合,可以使用圓括號對操作符明確分組
3. 任何時候使用具有AND和OR操作符的where子句時捂掰,都應該使用圓括號明確地分組操作
4. 不要過分依賴默認求值順序敢会,即使結果如你所愿
5. 使用圓括號可以消除歧義,沒什么壞處
② in操作符
- IN操作符用來指定條件范圍这嚣,范圍中每個條件都可以匹配
- 條件范圍用圓括號包住并且每個值使用逗號分隔
--列出DLL01和BRS01供應商的所有商品并按照價格排序
select prod_name,prod_price from Products where vend_id in ('DLL01','BRS01') order by prod_price;
--列出DLL01和BRS01供應商的所有商品并按照價格排序
select prod_name,prod_price from Products where vend_id ='DLL01' or vend_id='BRS01' order by prod_price desc;
特別說明:IN和OR具有相同的功能鸥昏,但是IN有如下優(yōu)點:
1. 在有很多合法選項時,IN操作符語法更清晰姐帚,直觀
2. 在與其他AND和OR組合使用IN時吏垮,求值順序更容易管理和理解
3. IN操作符一般比一組OR操作符執(zhí)行更快
4. IN最大優(yōu)點是可以包含其他select語句,能夠更動態(tài)的建立where子句
③ not操作符
- where子句中not操作符僅用來否定其后所跟的任何條件
- 一般not和其他操作符一起使用罐旗,不單獨使用
--列出除了DLL01供應商以外的其他供應商的商品信息
select vend_id,prod_name,prod_price from Products where not vend_id = 'DLL01';
select vend_id,prod_name,prod_price from Products where vend_id != 'DLL01';
select vend_id,prod_name,prod_price from Products where vend_id <> 'DLL01';
select vend_id,prod_name,prod_price from Products where vend_id not in ('DLL01');
--列出商品價格不在5到10美元之間的信息
select vend_id,prod_name,prod_price from Products where prod_price not between 5 and 10;
特別說明:
1. 在更復雜的子句中膳汪,NOT是非常有用的,如在與IN操作符聯合使用時九秀,NOT可以非常簡單地找出與條件不匹配的行
2. Mariadb和mysql支持使用not否定in遗嗽、between和exists子句,大多數RDBMS允許使用not否定任何條件
3鼓蜒、通配符過濾
常見通配符 | 含義 | 示例 |
---|---|---|
百分號 % | 任意字符出現任意次數(0次痹换、1次或多次) | 'Fish%'表示以Fish開頭后面匹配任意字符; '%Fish%'表示包含Fish字符串都匹配; '%F%h'表示以F開頭以h結尾的字符串(如果以空格結尾不匹配); 特別注意:%不會匹配NULL |
下劃線 _ | 任意單個字符 | '_abc'匹配Xabc,X表示任意字符; '__abc%'匹配abc前面2個字符都弹,后面任意字符的字符串; |
select * from Vendors where vend_id like 'B%'; ---查找vend_id中以B開頭的供應商信息
select * from Vendors where vend_id like '%B%'; ---查找vend_id中包含B的供應商信息