sqlserver exists,not exists的用法_MsSql

学生表:create table student( id number(8) primary key, name varchar2(10),deptment number(8))
选课表:create table select_course(  ID         NUMBER(8) primary key,  STUDENT_ID NUMBER(8) foreign key (COURSE_ID) references course(ID),  COURSE_ID  NUMBER(8) foreign key (STUDENT_ID) references student(ID))
课程表:create table COURSE(  ID     NUMBER(8) not null,  C_NAME VARCHAR2(20),  C_NO   VARCHAR2(10))
student表的数据:        ID NAME            DEPTMENT_ID---------- --------------- -----------         1 echo                   1000         2 spring                 2000         3 smith                  1000         4 liter                  2000
course表的数据:        ID C_NAME               C_NO---------- -------------------- --------         1 数据库               data1         2 数学                 month1         3 英语                 english1
select_course表的数据:        ID STUDENT_ID  COURSE_ID---------- ---------- ----------         1          1          1         2          1          2         3          1          3         4          2          1         5          2          2         6          3          2
1.查询选修了所有课程的学生id、name:(即这一个学生没有一门课程他没有选的。)
分析:如果有一门课没有选,则此时(1)select * from select_course sc where sc.student_id=ts.id 
and sc.course_id=c.id存在null,
这说明(2)select * from course c 的查询结果中确实有记录不存在(1查询中),查询结果返回没有选的课程,
此时select * from t_student ts 后的not exists 判断结果为false,不执行查询。
SQL> select * from t_student ts where not exists	 (select * from course c where not exists  		(select * from select_course sc where sc.student_id=ts.id and sc.course_id=c.id));        
        ID NAME            DEPTMENT_ID---------- --------------- -----------         1 echo                   1000
2.查询没有选择所有课程的学生,即没有全选的学生。(存在这样的一个学生,他至少有一门课没有选),
分析:只要有一个门没有选,即select * from select_course sc where student_id=t_student.id and course_id=course.id 有一条为空,即not exists null 为true,此时select * from course有查询结果(id为子查询中的course.id ),
因此select id,name from t_student 将执行查询(id为子查询中t_student.id )。
SQL> select id,name from t_student where exists
	(select * from course where not exists
		(select * from select_course sc where student_id=t_student.id and course_id=course.id));
        ID NAME---------- ---------------         2 spring         3 smith         4 liter
3.查询一门课也没有选的学生。(不存这样的一个学生,他至少选修一门课程),
分析:如果他选修了一门select * from course结果集不为空,not exists 判断结果为false;
select id,name from t_student 不执行查询。
SQL> select id,name from t_student where not exists
	(select * from course where exists
		(select * from select_course sc where student_id=t_student.id and course_id=course.id));
        ID NAME---------- ---------------         4 liter
4.查询至少选修了一门课程的学生。SQL> select id,name from t_student where exists
	(select * from course where  exists
		(select * from select_course sc where student_id=t_student.id and course_id=course.id));
        ID NAME---------- ---------------         1 echo         2 spring         3 smith

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sqlserver
, exists
not_exists
mssql not exists、mssql if not exists、sqlserver exists用法、not exists 用法、sql not exists用法,以便于您获取更多的相关知识。

时间: 2024-07-31 21:13:42

sqlserver exists,not exists的用法_MsSql的相关文章

IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结_MsSql

1. EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ) 可以理解为: 复制代码 代码如下: for x in ( select * from t1 ) loop if ( exists ( select null from t2 where y = x.x ) then OUTPUT THE RECORD end if end loop 对于in 和 exists的性能区别: 如果子查询得出

sqlserver 中Group by 的用法

问题描述 sqlserver 中Group by 的用法 当我们根据某些字段进行分类汇总的时候,比如使用group by A, B, C 的时候.具体的分组过程是怎么样的呢??

sqlserver中if exists和if not exists关键字用法

在sql语名中,if not exists 即如果不存在,if exists 即如果存在. 下面学习下二者的用法. a,判断数据库不存在时   if not exists(select * from sys.databases where name = 'database_name') b,判断表不存在时   if not exists (select * from sysobjects where id = object_id('table_name') and OBJECTPROPERTY(

sqlserver exists,not exists的用法

学生表:create table student (  id number(8) primary key,  name varchar2(10),deptment number(8) )选课表:create table select_course (   ID         NUMBER(8) primary key,   STUDENT_ID NUMBER(8) foreign key (COURSE_ID) references course(ID),   COURSE_ID  NUMBE

sql not in 与not exists使用中的细微差别_MsSql

上面两个简单的Sql,我们从表面理解,查询的最终结果应该是一样的,但实际结果却和我们想象的不一样 第一条sql查询的结果有一条数据 第二条sql查询的结果却为空  原因: not exists的子查询,对于子查询不返回行和子查询返回行的查询结果是有区别的 这些细小的差别千万不要被我们所忽视,一旦项目庞大了,想跟踪到具体的错误所花费的时间也是可观的.尽量把这些不必要的错误扼杀在摇篮里. 啰嗦了,呵呵. 上面两个简单的Sql,我们从表面理解,查询的最终结果应该是一样的,但实际结果却和我们想象的不一样

sqlserver 临时表的用法_MsSql

用法: 用于复杂查询时可以用临时表来暂存相关记录,能够提高效率.提高程序的可读性,类似于游标中的 my_cursor declare my_cursor cursor scroll for select 字段 from tablename 临时表分为:用户临时表和系统临时表. 系统临时表和用户临时表的区别: 1)用户临时表:用户临时表的名称以#开头; 用户临时表的周期只存在于创建这个表的用户的Session,对其他进程是不可见. 当创建它的进程消失时此临时表自动删除. 2)系统临时表:系统临时表

总结下sqlserver group by 的用法_MsSql

今天用实例总结一下group by的用法. 归纳一下:group by:ALL ,Cube,RollUP,Compute,Compute by 创建数据脚本 Create Table SalesInfo (Ctiy nvarchar(50), OrderDate datetime, OrderID int ) insert into SalesInfo select N'北京','2014-06-09',1001 union all select N'北京','2014-08-09',1002

SQLSERVER 表分区操作和设计方法_MsSql

一 .聚集索引 聚集索引的页级别包含了索引键,还包含数据页,因此,关于 除了键值以外聚集索引的叶级别还存放了什么的答案就是一切,也就是说,每行的所有字段都在叶级别种.另一种说话是:数据本身也是聚集索引的一部分,聚集索引基于键值保持表中的数据有序.SQL SERVER 中,所有的聚集索引都是唯一的,如果在创建聚集索引时没有指定UNIQUE 关键字,SQL SERVER 会在需要时通过往记录中添加一个唯一标识符(Uniqueifier)在内部保证索引的唯一性,该唯一标识符是一个4字节的值,作为附加在

sqlserver中order by 排序用法

排序可以是升序的 (ASC),也可以是降序的 (DESC).如果未指定是升序还是降序,就假定为 ASC. 下面的查询返回按 ProductID 升序排序的结果:  代码如下 复制代码  USE AdventureWorks2008R2; GO SELECT ProductID, ProductLine, ProductModelID FROM Production.Product ORDER BY ProductID; 如果 ORDER BY 子句中指定了多个列,则排序是嵌套的.下面的语句先按产