2016-12-30 58 views
0

我是數據庫初學者,我有一個小問題。與2個SQL查詢混淆

這兩個查詢有什麼區別?

SELECT * 
FROM Products 
WHERE ProductName LIKE '[C-M]%'; 

SELECT * 
FROM Products 
WHERE ProductName BETWEEN 'C%' AND 'M%'; 
+1

這個問題看起來特定於特定的數據庫引擎。有人應該添加一個適當的標籤。 – Michas

回答

0

第一個返回名稱以字符串[C-M]開頭的產品。

第二個產品的名稱按照字母順序排列在C%M%之間。

+0

至少在SQL Server中,第一個返回以C和M之間的任何值開始的任何內容。很確定這適用於大多數其他SQL兼容的RDBMS。 –

+0

@GarethLyons https://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE只列出'_'和'%'作爲元字符。 ANSI SQL-92同意。 – melpomene

+0

@GarethLyons http://sqlite.org/lang_expr.html#like也只能理解'_'和'%'。 – melpomene

0
SELECT * FROM Products 
where ProductName Like '[C-M]%'; 

將產生的所有行ProductName開始與CM,包括那些像Mzzzzzz之間的任何信件。

select * from Products 
where ProductName between 'C%' And 'M%'; 

在此查詢中,%通配符。它只是另一個字符文字。因此,此查詢將生成行,其中ProductName在按字母順序排序時等於或大於(排序後)文字字符串C%且等於或小於(排序前)M%。它會不是產生像Mzzzzzz行。

它會產生排C&C%後排序),但會生產排C!(各種C%前),但它會產生排M!M%之前排序)

下面的腳本(SQL服務器)將說明:

declare @t table 
(prodName varchar(10) not null) 
insert @t(prodName)values 
    ('C(apy'), ('C!ewrrt'), ('[email protected]'), ('C#qww'), 
    ('C%tty'), ('C&asda'),('C+ASD'),('C-ert'),('C=xx'), 
    ('E(apy'), ('E!ewrrt'), ('[email protected]'), ('J#qww'), 
    ('G%tty'), ('N&asda'),('W+ASD'),('H-ert'),('J=xx'), 
    ('M(apy'), ('M!ewrrt'), ('[email protected]'), ('M#qww'), 
    ('M%tty'), ('M&asda'),('M+ASD'),('M-ert'),('M=xx') 

    select * from @t Where prodName like '[C-M]%' 
    select * from @t Where prodName between 'C%' and 'M%' 
    select * from @t order By prodName 
1

注:您沒有提及您正在使用的DBMS產品,以下信息適用於SQL Server

第一個查詢將返回所有ProductsProductName開始CM之間的任何信件。這個清單是包容性的。

Select * 
From Products 
Where ProductName Like '[C-M]%'; 

輸出示例:

C 
Charlie 
Delta 
Echo 
Foxtrot 
Golf 
Hotel 
... 
Lima 
M 
Mike 

的秒查詢將返回所有那些ProductNameC%之間並與字符串文字M%結束Products的。 (注意:M%而不是使用通配符。它是文字字符串M%)。此列表是而不是(含)。

Select * 
From Products 
Where ProductName Between 'C%' And 'M%'; 

輸出示例:

Charlie 
Delta 
Echo 
Foxtrot 
Golf 
Hotel 
... 
Lima 
M 
+0

@Downvoter - 謹慎提供評論? – Siyual

+0

我檢查了PostgreSQL和SQLite以及SQL-92,他們都同意'[C-M]%'應該匹配任何以'[C-M]開頭的字符串「。 – melpomene

+0

@melpomene然後,這可能是一些DBMS方差 - 在SQL Server中,'LIKE'[C-M]%'按字母順序將其視爲'LIKE C%'→'M%'。 – Siyual