SQL IN运算符
SQL IN 是一个逻辑运算符,允许我们在 WHERE 子句中指定多个值或子查询。
它返回指定列与列表中的任一值匹配的所有行。值列表或子查询必须在括号内指定,例如IN (select查询) 或IN (Value1, Value2, Value3, …) 。
IN运算符可以与SQL中的任何数据类型一起使用。它用于基于指定值从数据库表中过滤数据。
在某些情况下,我们可以使用多个OR语句在SELECT、DELETE、UPDATE或INSERT语句中包含多个条件。而不是多个OR语句,我们可以使用IN运算符。
当您想选择与特定一组值匹配的所有行时,IN运算符非常有用。而当您想选择与多个条件中的任何一个匹配的所有行时,OR运算符非常有用。
语法
指定多个值的SQL IN运算符的基本语法如下−
WHERE column_name IN (value1, value2, value3, ...);
其中,
- value1,value2,value3,… 是要针对表达式进行测试的列表中的值。如果在列表中找到任何这些值,则IN运算符返回TRUE,否则返回FALSE。
在SELECT语句中使用IN运算符
我们可以使用 SQL IN 运算符在WHERE子句中指定多个值,并且我们还可以在SELECT语句中使用它来检索与任何指定值匹配的数据。
在这里,我们使用IN运算符在SELECT语句中指定多个值。
示例
为了更好地理解,让我们考虑包含顾客个人详细信息的CUSTOMERS表,包括他们的姓名、年龄、地址和薪水等,如下所示 –
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在,使用INSERT语句将值插入到这个表中,操作如下:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );
下面的表格将被创建如下:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
假设根据上表,我们想要显示名称等于’Khilan’、’Hardik’和’Muffy’(字符串值)的记录。可以使用 IN 运算符实现如下 –
select * from CUSTOMERS WHERE NAME IN ('Khilan', 'Hardik', 'Muffy');
输出
获得的结果如下所示-
+----+--------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+--------+-----+---------+----------+
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+--------+-----+---------+----------+
注意 −我们不能在字符串值中使用通配符字符’%’,’_’等。可以使用OR运算符执行上述查询,如下所示−
select * from CUSTOMERS WHERE NAME = 'Khilan' OR NAME = 'Hardik' OR NAME = 'Muffy';
输出
+----+--------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+--------+-----+---------+----------+
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+--------+-----+---------+----------+
在UPDATE语句中使用IN操作符
我们还可以在UPDATE语句中使用SQL IN操作符,以便更新符合WHERE子句中指定的任何值的行。UPDATE语句用于修改数据库表中的现有数据。
示例
在这个示例中,我们使用IN操作符在UPDATE语句中指定多个值,并更新之前创建的CUSTOMERS表。在这里,我们将年龄为’25’或’27’的客户记录更改为’30’。
update customers set AGE = 30 where AGE IN (25, 27);
输出
我们得到以下结果。我们可以观察到3位客户的年龄已被修改 –
(3 rows affected)
验证
我们可以通过使用SELECT语句检索其内容来验证表中的更改是否反映出来。以下是显示Customers表中记录的查询:
select * from customers;
表格显示如下:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 30 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 30 | Mumbai | 6500.00 |
| 5 | Hardik | 30 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
如我们在上表中看到的,’Khilan’、’Chaitali’和’Hardik’的年龄已更新为’30’。
使用NOT运算符和IN运算符
为了否定一个条件,我们使用NOT运算符。SQL的IN运算符可以与NOT运算符结合使用,在WHERE子句中排除特定的值。换句话说,将检查表达式中列表的缺席。
语法
下面是NOT IN运算符的基本语法:
WHERE column_name NOT IN (value1, value2, …);
示例
现在,我们试图显示CUSTOMERS表中所有不等于’25’、’23’和’22’的记录 –
select * from CUSTOMERS
WHERE AGE NOT IN (25, 23, 22);
输出
我们得到的结果如下所示:
+----+--------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+--------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+--------+-----+-----------+----------+
使用IN运算符与列名
我们也可以使用SQL的IN运算符与列名一起,比较一个列的值与另一个列的值。它用于选择给定列中存在特定值的行。
示例
在下面的查询中,我们试图选择具有thSALARY列的值的行-
select * from CUSTOMERS
WHERE 2000 IN (SALARY);
输出
这将产生以下结果−
+----+---------+-----+-----------+---------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+---------+-----+-----------+---------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
+----+---------+-----+-----------+---------+
使用IN运算符的子查询
我们可以使用带有IN运算符的子查询来返回来自单个列的记录。这意味着在子查询中不能包含SELECT列列表中的多个列。
语法
指定查询的IN运算符的基本语法如下:
WHERE column_name IN (subquery);
这里,
- 子查询 − 这是一个SELECT语句,它有一个结果集用于与表达式进行测试。如果任何这些值与表达式匹配,则IN条件评估为true。
示例
在下面给出的查询中,我们显示所有来自CUSTOMERS表的记录,其中客户的姓名是通过工资大于2000获得的 –
select * from CUSTOMERS
WHERE NAME IN (SELECT NAME from CUSTOMERS WHERE SALARY > 2000);
输出
这将产生以下结果−
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+