SQL NOT IN运算符
本文将通过多个示例清晰演示SQL NOT IN运算符。在进入示例之前,让我们了解一下SQL NOT IN运算符及其SQL语法。
SQL NOT IN是什么?
SQL NOT IN运算符用于根据预定义的值集合从SQL查询中排除行。它经常在SELECT语句的WHERE子句中使用。NOT IN运算符的一般语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);
如果IN运算符指定的VALUES不满足条件,则会使用NOT IN SQL查询或NOT IN运算符对结果进行过滤。这意味着NOT IN SQL查询将VALUES与提供的表达式或列名进行比较。如果找到匹配项,则SELECT语句将不会将该特定记录包括在SQL查询的结果中。
SQL中的NOT IN运算符正好与IN运算符相反。此外,SQL中还存在逻辑运算符NOT,可用于选择条件语句为假的行。与此类似,当将WHERE子句和NOT IN运算符组合时,WHERE子句中指定的VALUES不会包含在NOT IN SQL查询的输出中。
参考下面的示例以清楚地了解SQL NOT IN运算符的工作原理以及将其与诸如WHERE的各种条件子句一起使用时的工作方式。
例子1:
为了首先应用NOT IN运算符,让我们创建一个名为Player_info的表,其中包含与球员相关的基本信息,并将VALUES插入其中。
CREATE TABLE Player_info(ID INT(10),
First_Name VARCHAR(255),
Last_Name VARCHAR(255),
Year_Of_Birth INT,
Place_Of_Birth VARCHAR(255),
Country VARCHAR(255),
);
现在,我们将使用INSERT INTO语句将值插入到此表中。
INSERT INTO Player_info VALUES(1, 'MS', 'Dhoni', 1981, 'Ranchi', 'India');
INSERT INTO Player_info VALUES(2, 'FAF', 'Duplessis', 1979, 'CapeTown', 'SouthAfrica');
INSERT INTO Player_info VALUES(3, 'Ruturaj', 'Gaikwad', 1994, 'Mumbai', 'India');
INSERT INTO Player_info VALUES(4, 'Virat', 'Kohli', 1990, 'Delhi', 'India');
INSERT INTO Player_info VALUES(5, 'Karn', 'Sharma', 1987, 'Haryana', 'India');
INSERT INTO Player_info VALUES(6, 'Ravindra', 'Jadeja', 1988, 'Nagpur', 'India');
INSERT INTO Player_info VALUES(7, 'Sam', 'Curran', 1998, 'Manchester', 'England');
表格将是这样的:
select * FROM Player_info;
ID | First_Name | Last_Name | Year_Of_Birth | Place_Of_Birth | Country |
---|---|---|---|---|---|
1 | MS | Dhoni | 1981 | Ranchi | India |
2 | FAF | Duplessis | 1979 | CapeTown | SouthAfrica |
3 | Ruturaj | Gaikwad | 1994 | Mumbai | India |
4 | Virat | Kohli | 1990 | Delhi | India |
5 | Karn | Sharma | 1987 | Haryana | India |
6 | Ravindra | Jadeja | 1988 | Nagpur | India |
7 | Sam | Curran | 1998 | Manchester | England |
现在,我们将应用NOT IN操作符来通过特定条件排除表中的一些记录。
SELECT * FROM Player_info WHERE Place_Of_Birth NOT IN('Manchester');
此查询将排除出出生地为曼彻斯特的行。因此,最后一条记录将被排除,而其余所有记录都将由select语句返回。
输出:
ID | First_Name | Last_Name | Year_Of_Birth | Place_Of_Birth | Country |
---|---|---|---|---|---|
1 | MS | Dhoni | 1981 | Ranchi | India |
2 | FAF | Duplessis | 1979 | CapeTown | SouthAfrica |
3 | Ruturaj | Gaikwad | 1994 | Mumbai | India |
4 | Virat | Kohli | 1990 | Delhi | India |
5 | Karn | Sharma | 1987 | Haryana | India |
6 | Ravindra | Jadeja | 1988 | Nagpur | India |
将多个值传递给NOT IN运算符,以便排除更多记录。
观察下面的查询:
SELECT * FROM Player_info WHERE Country NOT IN('SouthAfrica', 'England');
输出:
ID | First_Name | Last_Name | Year_Of_Birth | Place_Of_Birth | Country |
---|---|---|---|---|---|
1 | MS | Dhoni | 1981 | Ranchi | India |
3 | Ruturaj | Gaikwad | 1994 | Mumbai | India |
4 | Virat | Kohli | 1990 | Delhi | India |
5 | Karn | Sharma | 1987 | Haryana | India |
6 | Ravindra | Jadeja | 1988 | Nagpur | India |
3 | Ruturaj | Gaikwad | 1994 | Mumbai | India |
示例2:
让我们看另一个使用NOT IN操作符的例子
考虑一个名为product_desc的表,其中包含产品的销售价格和购买价格。
CREATE TABLE Product_desc(
Product_id INT(10),
Product_name VARCHAR(100),
Buying_price INT(20),
Selling_price INT(10),
);
现在,我们要向其中插入VALUES。
INSERT INTO Product_desc VALUES (1, 'Wireless mouse', 5000, 6000);
INSERT INTO Product_desc VALUES (2,'Laptop', 60000, 65000);
INSERT INTO Product_desc VALUES (3, 'Tablet', 40000, 50000);
INSERT INTO Product_desc VALUES (4, 'Speaker', 2000, 2500);
INSERT INTO Product_desc VALUES (5, 'Earphones', 1000, 1200);
INSERT INTO Product_desc VALUES (6, 'SSD_disk', 7500, 9000);
所以,这个表格的形式将是:
SELECT * FROM Product_desc;
Product_id | Product_name | Buying_price | Selling_price |
---|---|---|---|
1 | Wireless_mouse | 5000 | 6000 |
2 | Laptop | 60000 | 65000 |
3 | Tablet | 40000 | 50000 |
4 | Speaker | 2000 | 2500 |
5 | Earphones | 1000 | 1200 |
6 | SSD_disk | 7500 | 9000 |
在这里,我们将使用NOT IN运算符来排除产品Speaker和SSD_disk的记录。
SELECT * FROM Product_desc WHERE Product_ name NOT IN('Speaker', 'SSD_disk');
输出:
Product_id | Product_name | Buying_price | Selling_price |
---|---|---|---|
1 | Wireless_mouse | 5000 | 6000 |
2 | Laptop | 60000 | 65000 |
3 | Tablet | 40000 | 50000 |
5 | Earphones | 1000 | 1200 |
示例3:
考虑下面显示的具有记录的员工表:
emp_id | emp_name | City | Age | salary |
---|---|---|---|---|
1 | Suresh | Hyderabad | 30 | 20000 |
2 | Shreya Singh | Lucknow | 27 | 25000 |
3 | Kavitha Kulkarni | Delhi | 33 | 60000 |
4 | Raj Pawar | Amritsar | 30 | 50000 |
5 | Jay Sharma | Bangalore | 25 | 40000 |
6 | Sravan Kumar | Chennai | 30 | 20000 |
在这里,我们将删除名为Shreya Singh和Raj Pawar的员工的记录:
SELECT * FROM employee WHERE emp_name NOT IN('Shreya Singh', 'Raj Pawar');
输出:
emp_id | emp_name | City | Age | salary |
---|---|---|---|---|
1 | Suresh | Hyderabad | 30 | 20000 |
3 | Kavitha Kulkarni | Delhi | 33 | 60000 |
5 | Jay Sharma | Bangalore | 25 | 40000 |
6 | Sravan Kumar | Chennai | 30 | 20000 |
示例 4:
考虑下面的Subscription表,使用NOT IN运算符排除几条记录。
Customer_name | Subscription_name | purchasetime |
---|---|---|
Krishna | Gold | 03:13:20 |
Abrar | Basic | 02:23:39 |
Ali | Premium | 05:45:30 |
Mahesh | Basic | 06:30:32 |
Hafeez | Gold | 11:25:35 |
Joseph | Premium | 10:32:50 |
Ramya | Premium | 11:42:53 |
让我们排除掉”Subscription_name”列中所有包含”Premium”值的记录:
select * FROM Subscription WHERE Subscription_name NOT IN('Premium');
输出:
Customer_name | Subscription_name | purchasetime |
---|---|---|
Krishna | Gold | 03:13:20 |
Abrar | Basic | 02:23:39 |
Mahesh | Basic | 06:30:32 |
Hafeez | Gold | 11:25:35 |