二、檢索語句 SELECT、ORDER BY、WHERE


介紹如何使用SELECT語句從表中檢索一個或多個數據列
 
第二章: SELECT語句
SQL語句可以在一行給出,也可以分成許多行,分成多行更容易調試。
多條SQL語句必須以分號 分隔。多數DBMS不需要在單條SQL語句后加分號。但特定的DBMS可能必須在單條SQL語句后加上分號。
SQL語句不區分大小寫
 
舉例:kedou_jifen.jf_adjust
檢索單個列:
SELECT member_id FROM jf_adjust; ---》從city表中檢索name列
 
檢索多個列:
從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT關鍵字后給出多個列名,列名之間必須以逗號分隔。
在選擇多個列時,一定要在列名之間加上逗號,最后一個列名后不加,最后一個列名后加上了逗號,將出現錯誤。
 
SELECT member_id,member_name,type
FROM jf_adjust;
 
SQL語句一般返回原始的,無格式的數據。數據的格式化是一個表示問題,而不是一個檢索問題。
因此"表示"一般在顯示該數據的應用程序中規定。
一般很少使用實際檢索出的數據(沒有應用程序提供的格式)
 
檢索所有列
除了指定所需的列外(如上所述,一個或多個列),SELECT語句還可以檢索所有的列而不必逐個列出它們。
可以通過在實際列名的位置使用星號(*)通配符來達到。
SELECT * FROM jf_adjust;
給定一個通配符則返回表中所有列。列的順序一般是列在表定義中出現的物理順序。
但SQL數據很少這樣(通常,數據返回給一個根據需要進行格式化或表示的應用程序)
 
第三章:排序檢索數據
介紹如何使用SELECT語句的ORDER BY子句,根據需要排序檢索出的數據。
3.1 排序數據
SELECT member_id
FROM jf_adjust;
這條SQL語句檢索返回某個數據庫表的單個列,輸出沒有特定的順序。
檢索出的數據並不是以純粹的隨機方式顯示的。如果不排序數據一般將以它在底層表中出現的順序顯示。
這可以是數據最初添加到表中的順序。但是,如果數據后來進行過更新或刪除,則此順序將會受到DBMS重用回收存儲空間的影響。
因此,如果不明確控制的話,不能(也不應該)依賴該排序順序。
關系數據庫設計理論認為,如果不明確規定排序順序,則不應該假定檢索出的數據順序有意義。
 
 子句:SQL語句由子句構成,有些子句是必須的,而有的可選。一個子句通常由一個關鍵字加上所提供的數據組成。
例如:SELECT 語句的FROM子句
為了明確的排序用SELECT語句檢索出的數據,可使用ORDER BY子句
ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。
SELECT member_name FROM jf_adjust ORDER BY member_name;
這條語句除了指示DBMS軟件對 member_name 列以字母順序排序數據的 ORDER BY 子句外,與前面的語句相同。
 
ORDER BY子句的位置:在指定一條ORDER BY 子句時,應保證它是SELECT語句中最后一條子句。該子句的次序不對將會出現錯誤消息。
通過非選擇列進行排序 :通常 ORDER BY 子句中使用的列將是為顯示所選擇的列,但是,實際上並不一定要這樣,用非檢索的列排序數據是完全合法的e
 
3.2 按多個列排序
經常需要按不止一個列進行數據排序。
例如,如果要顯示雇員清單,可能希望按姓和名排序(首先按姓排序,然后在每個姓中再按名排序)。
如果多個雇員具有相同的姓,這樣做很有用。
為了按多個列排序,簡單指定列名,列名之間用逗號分開即可(就像選擇多個列時所做的那樣)
SELECT order_no,member_name,expend_date FROM expend_goods ORDER BY member_name, expend_date;
 
此行代碼檢索三個列,並按其中兩個列對結果進行排序------首先按會員名稱,然后再按消費日期排序。
重要的是理解在按多個列排序時,排序的順序完全按所規定的進行。
對於上述例子中的輸出,僅在多個行都是一個會員名時才對訂單按expend_date消耗日期進行排序。
如果 member_name 列中所有的值都是唯一的,則不會按 expend_date 排序。
 
 3.3 按列位置排序
除了能用列名指定排序順序外,ORDER BY還支持按相對列位置進行排序。
SELECT order_no,member_name,expend_date FROM expend_goods ORDER BY 2, 3;
這行代碼的輸出與上面的查詢相同。不同在於ORDER BY子句。SELECT清單中指定的是選擇列的相對位置而不是列名。
ORDER BY 2表示按SELECT清單中SELECT order_no,member_name,expend_date第二個列member_name 進行排序。
ORDER BY 2, 3 表示先按 member_name,再按 expend_date 進行排序。
此技術的主要好處在於不用重新輸入列名。缺點是:
首先不明確給出列名增加了錯用列名排序的可能性。
其次,在對SELECT清單進行更改時容易錯誤地對數據進行排序
最后,如果進行排序的列不在SELECT清單中,顯然不能使用這項技術
 
3.4 指定排序方向
數據排序不限於升序排序(從A到Z)。這只是默認的排序順序,還可以使用 ORDER BY子句以降序(從Z到A)順序排序。
為了進行降序排序,必須指定DESC關鍵字。
SELECT order_no,member_name,expend_date FROM expend_goods ORDER BY expend_date DESC;
此SQL語句按照消耗日期降序排序
 
多列降序排序:
SELECT order_no,member_name,expend_date FROM expend_goods ORDER BY expend_date DESC,member_name;
DESC關鍵字只應用到直接位於其前面的列名。只對 expend_date 列以降序排序,而member_name列(在相同的日期內)仍然按標准的升序排序
在多個列上降序排序:如果想在多個列上進行降序排序,必須對每個列指定DESC關鍵字。
DESC 為 DESCENDING 的縮寫,這兩個關鍵字都可以使用。
DESC的反面是ASC(或ASCENDING),在升序排序時可以指定它。但實際上,ASC沒有多大用處,因為升序是默認的
 
區分大小寫和排序順序:
在字典排序順序中,A被視為與a相同,這是大多數數據庫管理系統的默認行為。
但是許多DBMS允許數據庫管理員在需要時改變這種行為(如果你的數據庫包含大量外語字符,可能必須這樣做)
如果確實急需要改變這種排序順序,用簡單的ORDER BY子句做不到。必須請求數據庫管理員幫助。
 
切記:ORDER BY 子句必須是SELECT語句中的最后一條子句。
 
第四章:過濾數據
介紹如何使用SELECT語句中WHERE子句指定搜索條件
 
4.1 使用WHERE子句
只檢索所需數據需要制定搜索條件,搜索條件也稱為過濾條件。
在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)之后給出。
SELECT order_no,member_name,expend_date FROM expend_goods WHERE member_name='lvyuping';
 
SQL過濾與應用過濾:數據也可以在應用層過濾。SQL的SELECT語句為客戶機應用檢索出超過實際所需的數據,然后客戶機代碼對返回數據進行循環,
以提取出需要的行。這種實現讓客戶機應用處理數據庫的工作將會極大地影響應用的性能,並且使所創建的應用完全不具備可伸縮性。
此外,如果在客戶機上過濾數據,服務器不得不通過網絡發送多余的數據,這將導致網絡帶寬的浪費。
 
在同時使用ORDER BY 和 WHERE 子句時,應該讓ORDER BY位於 WHERE之后,否則將會產生錯誤。
 
4.2 WHERE子句操作符
SQL的WHERE子句中支持下列列出的所有條件操作符:
 
 
檢查單個值:
SELECT order_no,member_name,expend_date FROM expend_goods WHERE expend_date> 2017-10-27;
列出訂單日期大於'2017-10-27 10:36:26的所有訂單
不匹配檢查:
SELECT order_no,member_name,expend_date FROM expend_goods WHERE member_name!='kedou';
SELECT order_no,member_name,expend_date FROM expend_goods WHERE member_name<>'kedou';
列出訂單會員名部位“kedou”的所有訂單
單引號:單引號用來限定字符串,如果是數值不用引號
 
范圍值檢查:
檢索某個范圍的值可以用 BETWEEN 操作符。
SELECT order_no,member_name,expend_date FROM expend_goods WHERE expend_date BETWEEN '2016-07-18 19:20:23' AND '2016-07-19 10:45:36';
檢索SQL語句匯總該時間段內的所有訂單
 
空值檢查:
在創建表時,表設計人員可以指定其中的列是否可以不包含值。在一個列不包含值時,稱其為包含空值NULL
NULL:無值,與字段包含0、空字符串或僅僅包含空格不同
WHERE 子句的 IS NULL 子句可以用來檢查具有NULL值的列
SELECT order_no,member_name,success_date FROM expend_goods WHERE success_date IS NULL;
檢索出 success_date IS NULL 字段為空的列
 
第五章:高級數據過濾
介紹如何組合WHERE子句以建立功能更強更高級的搜索條件,學習如何使用NOT和IN操作符
5.1 組合WHERE子句
為了進行更強的過濾,SQL允許給出多個WHERE子句。這些子句以兩種方式使用,以AND子句的方式和OR子句的方式使用。
 
操作符:用來聯結或改變WHERE子句中的子句的關鍵字。也稱為邏輯操作符
5.1.1 AND操作符:
為了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件
SELECT order_no,member_name,expend_date FROM expend_goods WHERE member_name='kedou' AND expend_date='2016-07-16 17:14:25';
 
5.1.2 OR操作符:
WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。
許多DBMS在OR WHERE 子句的第一個條件滿足的情況下,不在計算第二個條件(在第一個條件滿足時,不管第二個條件是否滿足,相應的行都將被檢索出來)
SELECT member_name,goods_name,success_date FROM expend_goods WHERE member_name='kedou' OR goods_name='實物類積分+金額';
第一個條件滿足時,不管第二個條件是否滿足,相應的行都將被檢索出來
 
5.1.3 計算次序:
WHERE子句可包含任意數目的AND和OR操作符。允許兩者結合以進行復雜和高級的過濾。
 
SQL在處理OR操作符前,優先處理AND操作符。由於AND在計算次序中優先級更高,操作符被錯誤的組合。
要以圓括號明確地分組相應的操作符
 
任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。
 
5.2 IN操作符
IN---》WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當
IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。IN取合法值的由逗號分隔的清單,全都擴在圓括號中。
SELECT activity_id,activity_name,member_name FROM user_activity WHERE member_name IN ('lvyuping','lvyupinglxx')ORDER BY activity_id;
 
 
IN操作符與OR操作符完成的功能相同,使用IN操作符的優點:
在使用長的合法選項清單時,IN操作符的語法更清楚且更直觀。
在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。
IN操作符一般比OR操作符清單執行更快。
IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。
 
5.3 NOT操作符
NOT--》WHERE子句中用來否定后跟條件的關鍵字
SELECT activity_id,activity_name,member_name FROM user_activity WHERE NOT member_name IN ('lvyuping','lvyupinglxx')ORDER BY activity_id;
列出除了lvyuping','lvyupinglxx 兩個用戶外的所有用戶活動的活動id,活動名稱,用戶名稱,並按照活動id進行排序
 
MYSQL不支持這種NOT的格式,在MYSQL中,NOT只用來否定EXISTS(如 NOT EXISTS)
 
第六章 用通配符進行過濾
本章介紹什么是通配符、如何使用通配符以及怎樣使用LIKE操作符進行通配搜索,以便對數據進行復雜過濾
 
6.1 LIKE操作符
利用通配符可創建比較特定數據的搜索模式。
通配符:用來匹配值的一部分的特殊字符
搜索模式:由字面值、通配符或兩者組合構成的搜素條件
 
通配符本身實際是SQL的WHERE子句中有特殊含義的字符,SQL支持幾種通配符。為在搜索子句中使用通配符,必須使用LIKE操作符
LIKE指示DBMS,后跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較
謂詞:LIKE是謂詞而不是操作符。操作符在作為謂詞的時候就不是操作符
通配符搜索只能用於文本字段,非文本數據類型字段不能使用統配符搜索
 
6.1.1 百分號(%)通配符
最常使用的通配符是百分號(%)。在搜索串中,%表示任何字符出現任意次數。
SELECT activity_id,activity_name,member_name FROM user_activity WHERE member_name LIKE 'lv%';
檢索任意lv起頭的用戶名
 
區分大小寫:根據DBMS的不同及其配置,搜索可以是區分大小寫的。
通配符可在搜索模式中任意位置使用,並且可以使用多個通配符。
SELECT activity_id,activity_name,member_name FROM user_activity WHERE member_name LIKE '%l%';
--》LIKE '%l%'; 表示匹配任何位置包含文本 l 的值,不論之前或之后出現什么字符
 
6.1.2 下划線(_)通配符
下划線通配符與%一樣,但下划線只匹配單個字符而不是多個字符。
 
SELECT activity_id,activity_name,member_name FROM user_activity WHERE member_name LIKE '___upinglxx';
LIKE '___upinglxx'; 一個下划線_ 匹配一個字符,此處匹配三個字符
 
6.1.3 方括號【】通配符
 方括號【】通配符用來指定一個字符集,它必須匹配指定位置(通配符的位置)的一個字符。
  
 
注意事項:
不要過分使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。
 
 
第七章 創建計算字段
7.1 計算字段
存儲在表中的數據都不是應用程序鎖需要的。我們需要直接從數據庫中檢索出轉換、計算或格式化過得數據;而不是檢索出數據,然后再在客戶機
應用程序中重新格式化。
這就是計算字段發揮作用的所在了。計算字段並不實際存在於數據庫表中。計算字段是運行時在SELECT語句內創建的。
 
客戶機與服務器的格式 :可在SQL語句內完成的許多轉換和格式化工作都可以直接在客戶機應用程序內按成。但一般來說,在數據庫服務器上完成這些操作比在客戶機中
完成要快得多,因為DBMS是設計來快速有效地完成這種處理的。
 
7.2 拼接字段
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

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



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