SQL EXISTS函数
这篇文章将为您提供关于SQL中exists函数工作原理的详细解释,包括许多示例。首先,让我们了解exists函数是什么,以及它的语法。
EXISTS()函数用于检查子查询中是否存在任何记录。如果子查询至少包含一条记录,则返回true。以下是SQL EXISTS()函数的语法列表。它通常与SELECT、UPDATE、DELETE语句同时使用,还可以与WHERE子句一起使用。
语法:
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name(s) FROM table_name WHERE condition);
存在关键字出现在语法中子查询之前,子查询用括号括起来。之后,它有一个返回通过评估的行的子查询。EXIST函数根据子查询返回true或false,如果子查询生成至少一个记录,EXIST函数返回true,否则返回false。
EXIST函数可以用于筛选结果,也可以与其他逻辑运算符(如NOT,AND和OR)一起使用,以构建更多的筛选条件。例如,您可以根据另一个表中相关数据的存在性更新数据库中的所有记录,或者您可以使用EXIST函数查找在过去一个月内有购买记录的所有客户。
使用EXIST函数的方法
- 在多对多关系中搜索记录: EXIST函数可用于识别多对多关系中加入表中存在的记录。例如,查找所有在特定部门学习的学生。
- 根据相关记录的存在性获取记录: 此SQL函数可用于获取基于另一个表中相关记录的存在性的记录。例如,查找所有有相关订单明细的订单。
- 增强查询: EXIST函数通过仅显示所需数据来增强查询的处理。假设我们想找出每个员工的第一个工作日而不使用自连接。
请考虑以下示例以了解SQL EXISTS()函数的运行方式。
1. 使用SELECT语句和EXIST函数
考虑以下学生和学生加入表,以了解EXIST()函数的运行方式。
Roll_no | name | department |
---|---|---|
134 | Anish | CSE |
135 | Rahul | ECE |
136 | Smitha | IT |
137 | Ganesh | Mechanical |
138 | Arun | EEE |
表格:学生
Roll_no | Admission_no | joining_date |
---|---|---|
134 | AS123 | 23-11-2020 |
136 | AS126 | 21-08-2021 |
137 | AS127 | 21-08-2021 |
表格:Student_joining
现在让我们从学生表中提取所有在Student_joining表中至少有一条与学生学号相同的记录。
SELECT * FROM Student WHERE EXISTS(SELECT * FROM Student_joining WHERE Student.Roll_no = Student_joining.Roll_no);
以上查询的输出:
Roll_no | name | department |
---|---|---|
134 | Anish | CSE |
136 | Smitha | IT |
137 | Ganesh | Mechanical |
这也是一个使用SELECT语句和EXISTS函数的另一个例子。让我们看一下以下的员工和部门表。
emp_id | emp_name | salary |
---|---|---|
45 | Ramesh | 25000 |
46 | Rahim | 20000 |
47 | Sruthi | 30000 |
48 | Swetha | 35000 |
表:employee
emp_id | department_name | department_id |
---|---|---|
45 | HR | 33 |
47 | Development | 35 |
48 | marketing | 36 |
表: department
现在,我们将使用以下查询根据同时存在于两列中的emp_id,从employee表中获取所有记录。
SELECT * FROM employee table WHERE EXISTS(SELECT * FROM department WHERE employee.emp_id = department.emp_id);
输出:
emp_id | emp_name | salary |
---|---|---|
45 | Ramesh | 25000 |
47 | Sruthi | 30000 |
48 | Swetha | 35000 |
2. 使用UPDATE语句与EXISTS函数
考虑以下产品表,以了解EXISTS函数与UPDATE语句的功能。
product_id | product_name | category_id |
---|---|---|
1 | Laptop | 22 |
2 | Shirt | 24 |
3 | Jeans | 24 |
4 | Mobile | 22 |
5 | Book | 25 |
表:product
在这里,我们将通过使用UPDATE和EXISTS函数组合来更新图书的category_id
UPDATE product SET category_id = 23 WHERE EXISTS(SELECT * FROM product WHERE product_id = 5);
SELECT * FROM product;
输出:
product_id | product_name | category_id |
---|---|---|
1 | Laptop | 22 |
2 | Shirt | 24 |
3 | Jeans | 24 |
4 | Mobile | 22 |
5 | Book | 23 |
3. 使用NOT与EXISTS
考虑下面的两个表(employee, department),以了解当将EXISTS函数与NOT函数组合使用时的功能。
emp_id | emp_name | salary |
---|---|---|
452 | Dhanush | 30000 |
453 | Vennela | 25000 |
454 | Hari | 40000 |
455 | Priyanka | 35000 |
456 | Karun | 12000 |
表:员工
emp_id | department_name | department_id |
---|---|---|
452 | Development | 33 |
454 | HR | 35 |
455 | R&D | 36 |
表:department
在这里,我们将提取所有在employee表中存在而在department表中不存在的记录。
SELECT * FROM employee WHERE NOT EXISTS (SELECT * FROM department WHERE employee.emp_id = department.emp_id;
输出:
emp_id | emp_name | salary |
---|---|---|
453 | Vennela | 25000 |
456 | Karun | 12000 |
4. 使用DELETE语句与EXISTS
考虑两个表product和product_category。这两个表用于展示如何使用EXISTS函数与DELETE语句结合使用。
product_id | product_name | category_id |
---|---|---|
1 | Laptop | 22 |
2 | Shirt | 24 |
3 | Jeans | 24 |
4 | Mobile | 22 |
5 | Book | 25 |
表格:产品
product_id | category |
---|---|
1 | Electronics |
2 | Clothing |
3 | Clothing |
4 | Electronics |
5 | Stationary |
表格:product_category
在这里,我们将删除所有产品表中产品为Electronics的记录。
DELETE FROM product WHERE EXISTS(SELECT * FROM product_category WHERE product.product_id = product_category.product_id AND product_category.category = "Electronics");
SELECT * FROM product;
输出:
product_id | product_name | category_id |
---|---|---|
2 | Shirt | 24 |
3 | Jeans | 24 |
5 | Book | 25 |