無廢話SQL語法--4.第一大將SELECT(2)

SELECT基礎語法

  請直接進入SSMSE管理工具的Northwind的SQLQuery查詢。然後將實例中的語法使用「複製/貼上」的方法,然後在工具中按「F5」執行,看其結果。以下為簡省畫面,除特別結果,不再截圖,請自行測試。

  複習:

  SELECT 欄位名稱
  FROM 資料表名稱
  WHERE 條件

  實例一:取得Products資料表中所有產品的明細資料

  SELECT *
  FROM Products

  在欄位方面我們使用星號「*」時,代表我要取出FROM資料表中所有的欄位,不過在實際進行程式設計時很少用到這個方式,因為這個方法會對程式效率產生影響,所以建議盡量能指定明確且你所需要的欄位名稱。這個SELECT語法中沒有使用到WHERE條件,沒有條件就是代表「我要取出全部資料」。

  實例二:從Products資料表取出ProductName(產品名稱)及UnitPrice(單價)

  SELECT ProductName,UnitPrice
  FROM Products

  指定明確欄位名稱。

  實例三:從Products資料表取出ProductID,ProductName,UnitsOnOrder,UnitsInStock,UnitPrice(欄位順序要一樣)

  SELECT ProductID,ProductName,UnitsOnOrder,UnitsInStock,UnitPrice
  FROM Products

  取出欄位的顯示安排是可以依照你的規劃來設計,而寫出明確欄位名稱及順序的好處是可以增加語法的可讀性,你可以知道取出了什麼資料,另外可以排除一些不必要錯誤,例如,如果你在欄位名稱使用「*」,但如果有人變更了資料表的欄位結構,你將很難查出錯誤。原則就是:你需要什麼那就取出什麼。

  實例四:從Products資料表取出商品單價(UnitPrice)大於50元的ProductName,UnitPrice

  SELECT ProductName,UnitPrice
  FROM Products
  WHERE UnitPrice > 50

  WHERE是一種「過濾」的動作,絕大部份的情況下,我們很少要取出資料表中全部的資料,而是要資料表中「特定」的資料,而WHERE就是在幫我們過濾不必要的資料,找出我們需要的資料。WHERE後的條件可以使用數值的比較運算子,常用的運算子有:> 大於、< 小於、>= 大於等於、<= 小於等於、= 等於、<>、!= 不等於(SQL Server支援這兩種不等於的語法),還可以使用邏輯運算子來結合多個條件(AND、OR),例如將上述的WHERE修改為:「WHERE (UnitPrice > 50) AND (UnitPrice <> 50) OR (UnitsInStock > 50)

  實例六:從Employees資料表取出City(城市)是在London(倫敦)同事的FirstName

  SELECT FirstName
  FROM Employees
  WHERE City = 'London'

  這個實例要說明的是當比較的資料型態為「字串」時,字串必須使用「'」到「'」單引號符號之間,而不是我們常在撰寫程式時使用的「"」雙引號符號,請小心注意,你可以移除「'」或是換上「"」測試看看。而這個「'」也就是SQL語法常被SQL Injection攻擊的起點,所以如果在撰寫動態網頁程式時,一定要非常小心處理這個「'」,有關「SQL Injection攻擊」我們有機會再聊聊。

  實例七:從Products資料表取出產品名稱中有含有「Anton」的ProductName,UnitPrice

  SELECT ProductName,UnitPrice
  FROM Products
  WHERE ProductName LIKE '%Anton%'

  LIKE是一種「模糊搜尋」,它必須使用如百分號(%)或底線(_)合作使用。%代表0個或以上的任意字元。_則是只能有1個字元。另外注意,LIKE在搜尋是不會分字母大小寫,當然中文不會有大小寫的問題。所以'%Anton%'表示Anton之前與之後有任意幾個字元都符合條件。例如:

  LIKE 'ANTON%' :以ANTON開頭的字串將符合條件。
  LIKE '%anton%'  :含有anton字串將符合條件。
  LIKE '%Anton'  :以Anton結束的字串將符合條件。
  LIKE 'C___'  :(C後面是三個底線)表示以C開頭且只含三個字元將符合條件。

  如果你只知道要找一個'kkbruce'字串,但不知道在那一個欄位,尤其是在程式設計時常會進行多個欄位的模糊搜尋,只要使用OR來連接LIKE條件即可,例如:Field1 LIKE '%kkbruce%' OR Field2 LILE '%kkbruce%' OR Field3 LIKE '%kkbruce%' …,將資料表中所有的資料欄位全部用OR起來,那就可以查詢全部欄位。

  LIKE在資料查詢的條件設定時是很重要的使用方式,我們在深入一點點。想想,如果我們要查詢百分比'%'符號時,那要如何下這個LIKE語法?LIKE '%%%'嗎?如果我們要查詢底線'_'時,是下LIKE '%_%'嗎?

  如果單從「字面上」來看,這樣寫法是沒有錯,但SQL Server會將「%」解釋為「0個或以上的任意字元」,「_」底線解釋為「只能有1個字元」,這不是我們要的結果。這時我們就要借助ESCAPE關鍵字的幫助,ESCAPE原意是「逃脫」,也可是我們可以指定一個「跳脫」的符號,當我們在LIKE使用中使用跳脫符號時,跳脫符號後的符號將以原意來解釋。我們用實例來說明:

  LIKE '%\%%' ESCAPE '\'
  LIKE '%\_%' ESCAPE '\'

  先指定'\'為跳脫符號,然後在LIKE中使用\%來代示\後面的%要使用原意(百分比)來解釋,第二個一樣,將\後面的_使用底線來解釋,這樣了解嗎。

  SQL Server中LIKE會使用到的萬用符號:

  %:任何含有零或多個字元的字串。
  _:任何單一字元。
  []:在指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單一字元。
  [^]:不在指定範圍 ([^a-f]) 或集合 ([^abcdef]) 中的任何單一字元。

  最後在介紹一個SQL Server的CHARINDEX()的函數,它的語法是:

  CHARINDEX('要尋找之字元', [欄位名稱] )

  如果CHARINDEX找到你要的字元,會傳回一個大於零的值,沒有就傳回值零,所以上面的例子也可以改寫成:「WHERE CHARINDEX('%', ProductName) > 0」,一樣,可以使用OR來連接多個欄位的查詢,而且CHARINDEX()效率比LIKE還好,LIKE很重要,請好好了解。還有不了解,請查詢SQL Server線上叢書。
  
註:CHARINDEX()會傳回字串在資料欄位中的位置,所以當欄位內容有資料時,傳回的值就會大於零。
註:CHARINDEX()不屬於SQL語法,是SQL Server的函數。

  實例八:從Orders資料表取出1996年8月份(OrderDate )的訂單資料

  SELECT *
  FROM Orders
  WHERE OrderDate >= '1996/8/1' AND OrderDate <= '1996/8/31'

  日期的比較運算和數值一樣,另外還有一種用法是使用「BETWEEN~AND~」,本例中的WHERE可以寫成:   WHERE OrderDate BETWEEN '1996/8/1' AND '1996/8/31'   不過資料庫軟體在執行時還是會自動轉換為>=、<=的運算方式。
(NOT)IN的使用方法

  實例九:從Products資料表取出CategoryID(類別編號)為1,2,3的ProductName

  SELECT ProductName
  FROM Products
  WHERE CategoryID IN (1,2,3)

  IN括弧內的值為「其中任一個值符合」即可,而IN也可以轉換成OR的運算式,例如:

  WHERE CategoryID =1 OR CategoryID =2 OR CategoryID =3

  那我們使用OR就好了,為什要使用IN呢?那是因為OR這種運算式你只能使用在「清楚、明確」知道「個數」的地方,如我知道要取出1,2,3時使用,但如果我根本不知道會取出多少個值,那就要使用IN了,這我們後面會交代。

  我們也可以令IN的條件相反,也就是除了1,2,3其他的資料我都要,那就可以使用「NOT IN」,那WHERE敘述如下:

  WHERE CategoryID NOT IN (1,2,3)

  而OR敘述:

  WHERE NOT (CategoryID =1 OR CategoryID =2 OR CategoryID =3)

  NOT就是將整個結果相反的意思,原本成立變不成立,不成立變成立,這樣了解嗎!

NULL的概念(IS使用)

  實例十:從Suppliers資料表取出沒有HomePage(網頁)的CompanyName(公司名稱),也就是HomePage內容為NULL的公司。

  SELECT CompanyName
  FROM Suppliers
  WHERE HomePage = NULL

  如果你已經執行了,嗯,怎麼會是錯誤的?在SQL當中NULL代表一種「未定」或「不明」的狀態,而你不能拿「未定、不明」的值來比較(=、<、>、…)運算,當然也不使用NULL = NULL的比較,因為「未定不會等於未定」,這時我們必須使用IS這個比較運算子:

  WHERE HomePage IS NULL

  也就是明確的跟WHERE說,我要的是(IS)NULL這個值。IS也可以使用NOT,來使整個結果相反:

  WHERE HomePage IS NOT NULL

  IS NOT(不是),就是請找出其他不是NULL的資料。

結合資料表(INNER JOIN)及別名(Alias)

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。