• SQL语句中in not in exits not exits用法比较


    exists (sql 如果返回结果集为真)

    not exists (sql 如果没有返回结果集为真)

    如下:

    表A

    ID NAME

    1 A1

    2 A2

    3 A3

    表B

    ID AID NAME

    1 1 B1

    2 2 B2

    3 2 B3

    表A和表B是1对多的关系 A.ID => B.AID

    SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)

    执行结果为

    1 A1

    2 A2

    原因可以按照如下分析

    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=)

    --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据

    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)

    --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据 

    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)

    --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据

    NOT EXISTS 就是反过来

    SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)

    执行结果为

    3 A3

    ===========================================================================

    EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因

    SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)

    NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别

    SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)

    SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别:

    IN:确定给定的值是否与子查询或列表中的值相匹配。

    IN 关键字使您得以选择与列表中的任意一个值匹配的行。

    当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:

    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR CategoryID = 5

    然而,如果使用 IN,少键入一些字符也可以得到同样的结果:

    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)

    IN 关键字之后的项目必须用逗号隔开,并且括在括号中。

    下列查询在 titleauthor 表中查找在任一种书中得到的版税少于 50% 的所有作者的 au_id,然后从 authors 表中选择 au_id 与

    titleauthor 查询结果匹配的所有作者的姓名:

    SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper < 50)

    结果显示有一些作者属于少于 50% 的一类。

    NOT IN:通过 NOT IN 关键字引入的子查询也返回一列零值或更多值。

    以下查询查找没有出版过商业书籍的出版商的名称。

    SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type = 'business')

    使用 EXISTSNOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集

    两个集合的交集包含同时属于两个原集合的所有元素。

    差集包含只属于两个集合中的第一个集合的元素。

    EXISTS:指定一个子查询,检测行的存在。

    本示例所示要查找出版商业书籍(类型为business)的出版商的名称:

    SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')
    
    SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')

    两者的区别:

    EXISTS:后面可以是整句的查询语句如:SELECT * FROM titles

    IN:后面只能是对单列:SELECT pub_id FROM titles

    NOT EXISTS:

    例如,要查找不出版商业书籍的出版商的名称:

    SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')

    下面的查询查找已经不销售的书的名称:

    SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)
  • 相关阅读:
    编码问题,编码到吐血
    dz验证码
    奇葩之mysql【四】找不到表了
    EntityFramework 使用Mysql数据库
    Create a custom output cache prodiver in asp.net4
    WPF一个很炫的控件
    yield grammar
    最大公约数的故事
    新人
    学习笔记 简单的amob A%B Problem
  • 原文地址:https://www.cnblogs.com/phpfans/p/4648539.html
Copyright © 2020-2023  润新知