SQL中的IN运算符
IN
运算符允许您在WHERE
子句中指定多个值,它是多个OR
条件的简写。
示例:获取您自己的SQL Server
返回所有来自’Germany’、'France’或’UK’的客户:
SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');
语法:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
演示数据库:
以下是示例中使用的Customers
表的部分选择:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
NOT IN
通过在IN
运算符前使用NOT
关键字,您可以返回列表中任何值都不是的所有记录。
示例:返回所有不来自’Germany’、'France’或’UK’的客户:
SELECT * FROM Customers
WHERE Country NOT IN ('Germany', 'France', 'UK');
IN(SELECT)
您还可以在WHERE
子句中使用带有子查询的IN
。使用子查询,您可以返回主查询结果中存在于子查询结果中的所有记录。
示例:返回所有在Orders表中有订单的客户:
SELECT * FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders);
NOT IN(SELECT)
上面的示例返回了74条记录,这意味着有17个客户没有下过任何订单。让我们使用NOT IN
运算符来验证是否正确。
示例:返回在Orders表中没有下过订单的所有客户:
SELECT * FROM Customers
WHERE CustomerID NOT IN (SELECT CustomerID FROM Orders);
通过练习测试自己:
练习: 使用IN
运算符选择所有Country
为"Norway"或"France"的记录。
SELECT * FROM YourTableName
WHERE Country IN ('Norway', 'France');
SQL BETWEEN运算符
BETWEEN
运算符用于选择给定范围内的值,可以是数字、文本或日期。这是一个包容性的运算符,包括开始和结束值。
示例:获取您自己的SQL Server
选择所有价格在10和20之间的产品:
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;
语法:
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
演示数据库:
以下是示例中使用的Products
表的部分选择:
ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
---|---|---|---|---|---|
1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
4 | Chef Anton’s Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
5 | Chef Anton’s Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
NOT BETWEEN
要显示在前面示例范围之外的产品,请使用NOT BETWEEN
:
示例:
SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;
BETWEEN与IN结合使用
以下SQL语句选择所有价格在10和20之间的产品。此外,CategoryID
必须是1、2或3:
示例:
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID IN (1,2,3);
BETWEEN文本值
以下SQL语句选择所有ProductName
在’Carnarvon Tigers’和’Mozzarella di Giovanni’之间的产品:
示例:
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
以下SQL语句选择所有ProductName
在’Carnarvon Tigers’和’Chef Anton’s Cajun Seasoning’之间的产品:
示例:
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Chef Anton''s Cajun Seasoning'
ORDER BY ProductName;
NOT BETWEEN文本值
以下SQL语句选择所有ProductName
不在’Carnarvon Tigers’和’Mozzarella di Giovanni’之间的产品:
示例:
SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
BETWEEN日期
以下SQL语句选择所有OrderDate
在’01-July-1996’和’31-July-1996’之间的订单:
示例:
SELECT * FROM Orders
WHERE OrderDate BETWEEN #07/01/1996# AND #07/31/1996#;
或者:
SELECT * FROM Orders
WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31';
示例表
以下是示例中使用的Orders
表的部分选择:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10248 | 90 | 5 | 7/4/1996 | 3 |
10249 | 81 | 6 | 7/5/1996 | 1 |
10250 | 34 | 4 | 7/8/1996 | 2 |
10251 | 84 | 3 | 7/9/1996 | 1 |
10252 | 76 | 4 | 7/10/1996 | 2 |
SQL别名
SQL别名用于为表或表中的列提供临时名称,通常用于使列名更易读。别名仅在查询的持续时间内存在,使用AS
关键字创建别名。
示例:获取您自己的SQL Server
SELECT CustomerID AS ID
FROM Customers;
AS是可选的
实际上,在大多数数据库语言中,您可以省略AS
关键字并获得相同的结果:
SELECT CustomerID ID
FROM Customers;
语法
在列上使用别名时:
SELECT column_name AS alias_name
FROM table_name;
在表上使用别名时:
SELECT column_name(s)
FROM table_name AS alias_name;
演示数据库
以下是示例中使用的Customers
和Orders
表的部分选择:
Customers表
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
Orders表
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10248 | 90 | 5 | 7/4/1996 | 3 |
10249 | 81 | 6 | 7/5/1996 | 1 |
10250 | 34 | 4 | 7/8/1996 | 2 |
列的别名
以下SQL语句为CustomerID
列创建两个别名,一个是ID
,另一个是CustomerName
:
SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers;
在使用空格字符的别名中使用别名
如果要使别名包含一个或多个空格,比如"My Great Products",请用方括号或双引号括起别名。
使用方括号括起带有空格字符的别名的示例:
SELECT ProductName AS [My Great Products]
FROM Products;
使用双引号括起带有空格字符的别名的示例:
SELECT ProductName AS "My Great Products"
FROM Products;
注意:某些数据库系统允许使用方括号和双引号,而有些只允许其中之一。
连接列
以下SQL语句创建一个名为"Address"的别名,该别名组合了四列(Address、PostalCode、City和Country):
SELECT CustomerName, Address + ', ' + PostalCode + ' ' + City + ', ' + Country AS Address
FROM Customers;
注意:要使MySQL中的上述SQL语句工作,请使用以下内容:
SELECT CustomerName, CONCAT(Address,', ',PostalCode,', ',City,', ',Country) AS Address
FROM Customers;
注意:要使Oracle中的上述SQL语句工作,请使用以下内容:
SELECT CustomerName, (Address || ', ' || PostalCode || ' ' || City || ', ' || Country) AS Address
FROM Customers;
表的别名
当您想要为表使用别名时,适用相同的规则。
将Customers
表称为Persons
:
SELECT * FROM Customers AS Persons;
在表的查询中使用两个表别名时,可能会显得没用,但是当您在查询中使用多个表时,可以使SQL语句更短。
以下SQL语句选择所有CustomerID
为4(Around the Horn)的客户的订单。我们使用"Customers"和"Orders"表,并分别给它们命名为"c"和"o":
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName='Around the Horn' AND c.CustomerID=o.CustomerID;
以下SQL语句与上面相同,但没有别名:
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Customers, Orders
WHERE Customers.CustomerName='Around the Horn' AND Customers.CustomerID=Orders.CustomerID;
当:
- 查询涉及多个表
- 查询中使用函数
- 列名较大或不太易读
- 两个或更多列合并在一起时
别名可能很有用。
最后
为了方便其他设备和平台的小伙伴观看往期文章:公众号搜索Let us Coding
,或者扫描下方二维码,关注公众号,即可获取最新文章。
看完如果觉得有帮助,欢迎点赞、收藏和关注