SQL Server中的EXISTS语法

        在SQL Server相关子查询中,难免会用到EXISTS。那么,EXISTS 与 IN 有什么区别呢?

我们先聊一聊 EXISTS 的应用场景。

        IN :主要用于不相关子查询中,即子查询可以单独运行。

        EXISTS:多用与不相关子查询中,当然相关子查询也可以使用

我们通过代码展示:

IN的例子:

--查询所有70分以上的学生姓名

--查询所有70分以上的学生姓名
select stu_name from student where stu_id not in 
	(select stu_id from StudentGrade 
	where Grade <70 or grade= Null)

        可以看出括号内的子查询语句是一个完整的查询语句,其运行顺序是先运行子查询,在运行父查询。

也可以写成:

--查询所有70分以上的学生姓名
select stu_name from student where exists 
	(select stu_id from StudentGrade 
	where Grade >=70 or grade= Null AND student.stu_id = StudentGrade.stu_id )

EXISTS的经典例子:

--查询选出所有课程的同学

--查询选出所有课程的同学
select *
from student
where not exists(
    select *
    from Course
    where not exists(select*
        from studentgrade
        where StudentGrade.stu_id=student.Stu_id and
            StudentGrade.Course_id=c.Course_id
        )		
)

        在这里,子查询调用到父查询中的表,子查询语句不能单独运行的,这段代码怎么理解呢?

这里可以理解成编程语言的多重循环遍历:

        1.打开Student表格,并查看第一元组(第一行)数据

        2.打开Course表格,并查看第一元组(第一行)数据

        3.打开StudentGrade表格,并查看第一、第二、第三......元组数据,直到结束,如果出现StudentGrade.stu_id=student.Stu_id 和 StudentGrade.Course_id=c.Course_id 则在末端子查询中返回True。

        由此,用Python语言描述可以这么写(程序仅为帮助理解用,与实际查询有所不同)

def select():
    for i in Student:
        for j in Course:
            for k in StudentGrade:
                if i == k and j == k:
                    print(f“找到该学生为{i}”)

        由于外面两层NOT EXISITS ,可以理解为“双重否定变肯定”,即“Student不存在有课程没有选的”。

总结:EXISTS 比 IN 使用范围更广,即EXISTS可以代替IN,而IN不能代替EXIST。在相关子查询中,先运行子查询,在不相关子查询中,程序是由外向内依次运行。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL Server ,`EXISTS` 是一个用于检查是否存在符合特定条件的记录的逻辑运算符。`EXISTS` 返回一个布尔值,即 `TRUE` 或 `FALSE`,表示查询结果集是否包含匹配条件的记录。下面是 `EXISTS` 的详细用法: 1. 基本语法: ```sql SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition); ``` 2. 示例: 假设有两个表,分别为 `customers` 和 `orders`, `customers` 表包含了所有客户的信息,而 `orders` 表包含了所有的订单信息。我们需要查询所有已经下过订单的客户的姓名和地址,可以使用以下 SQL 语句: ```sql SELECT customerName, address FROM customers WHERE EXISTS (SELECT * FROM orders WHERE orders.customerID = customers.customerID); ``` 在上面的 SQL 语句,`EXISTS` 子查询的条件是查找 `orders` 表的所有记录,其 `orders.customerID = customers.customerID` 表示连接两个表的条件,即匹配两个表的 `customerID` 列。如果 `EXISTS` 子查询返回 `TRUE`,则 `customerName` 和 `address` 列的值会被返回。 3. 注意事项: - `EXISTS` 子查询必须包含一个 `SELECT` 语句,该语句必须返回一个结果集。 - `EXISTS` 子查询的条件必须使用外部查询的列或表。 - `EXISTS` 子查询的 `SELECT` 语句可以是任何有效的 T-SQL 查询语句,包括 `SELECT *`。 - `EXISTS` 子查询的条件可以包含任何有效的 T-SQL 表达式和运算符。 - `EXISTS` 的性能比使用 `JOIN` 进行连接查询要高,特别是在查询大型数据集时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值