2016-12-30 77 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