www.129028.com金沙:sql中IN与EXISTS,NOT IN与NOT EXISTS的详细介绍

日期:2020-04-29编辑作者:数据库

在sql语名中,if not exists 即如果不存在,if exists 即如果存在。

本文章介绍一篇关于sql中IN与EXISTS,NOT IN与NOT EXISTS的详细介绍,有需要了解的同学可以参考一下。

下面学习下二者的用法。

强调下:在含有NULL值的列的时候,就要小心了,not exists与not in在逻辑上是不等价的--先创建2张表

a,判断数据库不存在时

代码如下复制代码

复制代码 代码如下:if not exists

use master;

b,判断表不存在时

if db_id('DbTest') is not null drop database DbTest;

复制代码 代码如下:if not exists (select * from sysobjects where id = object_id('table_name') and OBJECTPROPERTY(id, 'IsUserTable') = 1)

create database DbTest;go

c,判断列不存在

use DbTest;go

复制代码 代码如下:if not exists

--创建Customers表create table Customers( custid INT NOT NULL IDENTITY, companyname NVARCHAR(40) NOT NULL, country NVARCHAR(15) NOT NULL, constraint pk_customer primary key(custid));

当判断的表不存时,我可以执行创建数据库,创建表,增加列,可以执行相应的SQL语句;

--创建Orders表

而if exists同理判断,首先判断查询结果是否存在,如果存在执行判断后面的语句,查询的数据库,表,列的方法相同;

代码如下复制代码

mssql语法:

CREATE TABLE Orders( orderid INT NOT NULL IDENTITY, custid INT NULL, CONSTRAINT PK_Orders PRIMARY KEY(orderid), CONSTRAINT FK_Orders_Customers FOREIGN KEY(custid) REFERENCES Customers(custid),); set identity_insert Customers on;

复制代码 代码如下:if not exists (SELECT 1 FROM [t_Table] where [fName] = '张三')insert into [t_Table] ([fName]) values ('张三');

INSERT INTO Customers(custid, companyname,country) VALUES(1, N'大众', N'中国'); INSERT INTO Customers(custid, companyname,country) VALUES(2, N'宝马', N'美国'); INSERT INTO Customers(custid, companyname,country) VALUES(3, N'奔驰', N'中国'); INSERT INTO Customers(custid, companyname,country) VALUES(4, N'奇瑞', N'德国'); INSERT INTO Customers(custid, companyname,country) VALUES(5, N'福特', N'美国'); set identity_insert Customers off; set identity_insert Orders on;--custid代表员工号 INSERT INTO Orders(orderid, custid) VALUES(1,1); INSERT INTO Orders(orderid, custid) VALUES(2,2); INSERT INTO Orders(orderid, custid) VALUES(3,3); INSERT INTO Orders(orderid, custid) VALUES(4,4); INSERT INTO Orders(orderid, custid) VALUES(5,5);--查看表的数据select custid,companyname,country from Customers;select orderid,custid from Orders;--插入数据成功

sqlite语法:

--咱们回到正题,比较Exists与in,not exists与 not in

复制代码 代码如下:insert into [t_Table] ([fName]) select '张三'where not exists (SELECT 1 FROM [t_Table] where [fName] = '张三');

--查询来自中国,而且下过订单的所有客户

代码如下复制代码 select custid,companynamefrom Customers as Cwhere country=N'中国'and exists (select * from Orders as O where O.custid=C.custid);--返回--custid companyname--1 大众--3 奔驰

www.129028.com金沙,--外部查询返回来自中国的客户信息,对于这个客户,exists谓词在Orders表查找是否至少存在一个与外部客户行信息相同的custid订单行

--用IN查询刚刚的需求

代码如下复制代码 select custid,companynamefrom Customers as Cwhere country=N'中国'and custid in(select custid from Orders);

--结果跟上面的返回一样的值

--下面的知识点我们需要认识到:--当列表中有NULL时,in实际会产生一个UNKNOWN的结果,例如 a in(d,b,null)的结果是UNKNOWN,而a not in (d,b,null)返回的是not unknowd仍然是unknowd--而not in与not exists则结果会很不同,例如a in(a,b,null)返回的是TRUE,而a not in(a,b,null)返回的肯定是not true即为false--有了上面的认识,好继续开工了....--我们现在向Orders表插入一行数据

代码如下复制代码

set identity_insert Orders on;

insert into Orders(orderid,custid) values(6,null);

set identity_insert Orders off;

set identity_insert Customers on;

insert into Customers(custid,companyname,country) values(7,N'雷克萨斯',N'美国');

set identity_insert Customers off;

select * from Orders;select * from Customers;

--假设现在要返回来自美国且没有订单的客户

代码如下复制代码 select custid,companynamefrom Customers as Cwhere country=N'美国'and not exists (select * from Orders as O where O.custid=C.custid );--返回--custid companyname--7 雷克萨斯

--我们再用IN方法

代码如下复制代码 select custid,companyname from Customers as Cwhere country=N'美国'and custid not in(select custid from Orders);

本文由www.129028.com金沙发布于数据库,转载请注明出处:www.129028.com金沙:sql中IN与EXISTS,NOT IN与NOT EXISTS的详细介绍

关键词:

SQL Server 2000的安全配置

SQLserver2000数据库应用非常广泛,一旦出现安全问题,造成的损失往往难以估量!应提前预防,防患于未然。这里,我...

详细>>

如何查看某个查询用了多少TempDB空间www.129028.com金沙

DECLARE @read BIGINT, @write BIGINT; SELECT @read = SUM(num_of_bytes_read), @write = SUM(num_of_bytes_written) FROM tempdb.sys.database_files AS DBFJOI...

详细>>

浅析SQL语句中GROUP BY的用法

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想 你用了GROUP BY 按 ITEM.ITEMNUM这个字段分组,那其他字...

详细>>

微软总是试图使它的软件安装尽可能地简单顺www.129028.com金沙

如果你没有特意记录安装日期,那么有没有办法从SQL Server里查询到呢?想想我们在安装的时候,肯定会有Windows认证登...

详细>>