SQL-基礎學習3--通配符:LIKE,%,(_); 拼接:+,||,concat;


第六課 用通配符進行過濾
6.1  LIKE操作符
通配符本身實際上是SQL的WHERE子句中有特殊含義的字符,SQL支持幾種通配符。為在搜索子句中使用通配符,必須使用LIKE操作符。LIKE指示DBMS,后跟的搜索模式利用通配符匹配而不是簡單的相等匹配進行比較。
 
通配符搜索只能用於文本字段(串),非文本數據類型字段不能使用通配符搜索。
 
6.1.1 百分號(%)通配符
最常使用的通配符是百分號(%)。在搜索串中,%表示任何字符出現任意次數。
 
例如,為了找出所有以詞Fish起頭的產品,可發布以下SELECT語句:
輸入▼
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
 
輸出▼
prod_id     prod_name
-------     ------------------   
BNBG01      Fish bean bag toy
分析▼
此例子使用了搜索模式'Fish%'。在執行這條子句時,將檢索任意以Fish起頭的詞。%告訴DBMS接受Fish之后的任意字符,不管它有多少字符。
 
注意:通配符可在搜索模式中的任意位置使用,並且可以使用多個通配符。
特別注意:除了能匹配一個或多個字符外,%還能匹配0個字符。%代表搜索模式中給定位置的0個、1個或多個字符。
 
說明:請注意后面所跟的空格
包括Access在內的許多DBMS都用空格來填補字段的內容。例如,如果某列有50個字符,而存儲的文本為Fish bean bag toy(17個字符),則為填滿該列需要在文本后附加33個空格。這樣做一般對數據及其使用沒有影響,但是可能對上述SQL語句有負面影響。子句WHERE prod_name LIKE 'F%y'只匹配以F開頭、以y結尾的prod_name。如果值后面跟空格,則不是以y結尾,所以Fish bean bag toy就不會檢索出來。簡單的解決辦法是給搜索模式再增加一個%號:'F%y%'還匹配y之后的字符(或空格)。更好的解決辦法是用函數去掉空格。請參閱第8課。
 
警告:請注意NULL
通配符%看起來像是可以匹配任何東西,但有個例外,這就是NULL。子句WHERE prod_name LIKE '%'不會匹配產品名稱為NULL的行。
 
6.1.2 下划線(_)通配符
另一個有用的通配符是下划線(_)。下划線的用途與%一樣,但它只匹配單個字符,而不是多個字符。
 
說明:DB2通配符
DB2不支持通配符_。
說明:Access通配符
如果使用的是Microsoft Access,需要使用?而不是_。
 
6.1.3 方括號([ ])通配符
方括號([])通配符用來指定一個字符集,它必須匹配指定位置(通配符的位置)的一個字符。但是MySQL是不支持方括號通配符的;那么可以使用AND, OR邏輯操作符來實現;
例如:找出所有名字以J或者M起頭的聯系人,可進行如下查詢:
輸入▼
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE 'J%' OR cust_contact LIKE 'M%'
ORDER BY cust_contact;
 
輸出▼
cust_contact
-----------------
Jim Jones
John Smith
Michelle Green
注意:使用AND , OR 等邏輯操作符時,后面要接完整的條件語句,而不能和前面共用列名,或者其他字符;
如上面 WHERE 語句寫成:WHERE cust_contact LIKE 'J%' OR 'M%' 或者 WHERE cust_contact LIKE 'J%' OR LIKE 'M%' 都是錯誤的;
 
6.2 使用通配符的技巧
使用通配符是有代價的,即通配符搜索一般比前面討論的其他搜索要耗費更長的處理時間。這里給出一些使用通配符時要記住的技巧:
  • 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
  • 在確實需要使用通配符時,也盡量不要把它們用在搜索模式的開始處。把通配符置於開始處,搜索起來是最慢的。
  • 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數據。
 
第七課 創建計算字段
7.1 計算字段
存儲在數據庫表中的數據一般不是應用程序所需要的格式,下面舉幾個例子。
  • 需要顯示公司名,同時還需要顯示公司的地址,但這兩個信息存儲在不同的表列中。
  • 城市、州和郵政編碼存儲在不同的列中(應該這樣),但郵件標簽打印程序需要把它們作為一個有恰當格式的字段檢索出來。
  • 列數據是大小寫混合的,但報表程序需要把所有數據按大寫表示出來。
  • 物品訂單表存儲物品的價格和數量,不存儲每個物品的總價格(用價格乘以數量即可)。但為打印發票,需要物品的總價格。
  • 需要根據表數據進行諸如總數、平均數的計算。
 
在上述每個例子中,存儲在表中的數據都不是應用程序所需要的。我們需要直接從數據庫中檢索出轉換、計算或格式化過的數據,而不是檢索出數據,然后再在客戶端應用程序中重新格式化。
 
這就是計算字段可以派上用場的地方了。與前幾課介紹的列不同,計算字段並不實際存在於數據庫表中。計算字段是運行時在SELECT語句內創建的。
 
字段(field)
基本上與列(column)的意思相同,經常互換使用,不過數據庫列一般稱為列,而術語字段通常與計算字段一起使用。
 
特別注意:只有數據庫知道SELECT語句中哪些列是實際的表列,哪些列是計算字段。從客戶端(如應用程序)來看,計算字段的數據與其他列的數據的返回方式相同。
 
7.2 拼接字段
在SQL中的SELECT語句中,可使用一個特殊的操作符來拼接兩個列。根據你所使用的DBMS,此操作符可用加號(+)或兩個豎杠(||)表示。在MySQL和MariaDB中,必須使用特殊的函數。
 
說明:是+還是||?
Access和SQL Server使用+號。DB2、Oracle、PostgreSQL、SQLite和Open Office Base使用||。詳細請參閱具體的DBMS文檔。
下面是使用加號的例子(多數DBMS使用這種語法):
輸入▼
SELECT vend_name + ' (' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
輸出▼
-----------------------------------------------------------
Bear Emporium                                (USA        )
Bears R Us                                   (USA        )
Doll House Inc.                              (USA        )
Fun and Games                                (England    )
Furball Inc.                                 (USA        )
Jouets et ours                               (France     )
 
分析▼
上面兩個SELECT語句拼接以下元素:
存儲在vend_name列中的名字;
包含一個空格和一個左圓括號的
存儲在vend_country列中的國家;
包含一個右圓括號的字符串。
 
從上述輸出中可以看到,SELECT語句返回包含上述四個元素的一個列(計算字段)。
 
再看看上述SELECT語句返回的輸出。結合成一個計算字段的兩個列用空格填充。許多數據庫(不是所有)保存填充為列寬的文本值,而實際上你要的結果不需要這些空格。為正確返回格式化的數據,必須去掉這些空格。這可以使用SQL的RTRIM()函數來完成,如下所示:
 
輸入▼
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;
輸出▼
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France) 
分析▼
RTRIM()函數去掉值右邊的所有空格。通過使用RTRIM(),各個列都進行了整理。
 
使用別名
 
從前面的輸出可以看到,SELECT語句可以很好地拼接地址字段。但是,這個新計算列的名字是什么呢?實際上它沒有名字,它只是一個值。如果僅在SQL查詢工具中查看一下結果,這樣沒有什么不好。但是,一個未命名的列不能用於客戶端應用中,因為客戶端沒有辦法引用它。
為了解決這個問題,SQL支持列別名。別名(alias)是一個字段或值的替換名。別名用AS關鍵字賦予。請看下面的SELECT語句:
輸入▼
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
       AS vend_title
FROM Vendors
ORDER BY vend_name;
輸出▼
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
下面是MySQL和MariaDB中使用的語句:
輸入▼
SELECT Concat(vend_name, ' (', vend_country, ')')
       AS vend_title
FROM Vendors
ORDER BY vend_name;
 
7.3 執行算術計算
Orders表包含收到的所有訂單,OrderItems表包含每個訂單中的各項物品。下面的SQL語句檢索訂單號20008中的所有物品:
輸入▼
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
輸出▼
prod_id        quantity        item_price
----------     -----------     ---------------------
RGAN01         5               4.9900
BR03              5               11.9900
BNBG01         10              3.4900
BNBG02         10              3.4900
BNBG03         10              3.4900
 
item_price列包含訂單中每項物品的單價。如下匯總物品的價格(單價乘以訂購數量):
輸入▼
SELECT prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
輸出▼
prod_id        quantity        item_price       expanded_price
----------     -----------     ------------     -----------------
RGAN01         5               4.9900           24.9500
BR03              5               11.9900          59.9500
BNBG01         10              3.4900           34.9000
BNBG02         10              3.4900           34.9000
BNBG03         10              3.4900           34.9000
分析▼
輸出中顯示的expanded_price列是一個計算字段,此計算為quantity*item_price。客戶端應用現在可以使用這個新計算列,就像使用其他列一樣。
 


免責聲明!

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



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