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  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                  2000course表的数据:

        ID C_NAME               C_NO

---------- -------------------- --------

         1 数据库               data1

         2 数学                 month1

         3 英语                 english1select_course表的数据:

        ID STUDENT_ID  COURSE_ID

---------- ---------- ----------

         1          1          1

         2          1          2

         3          1          3

         4          2          1

         5          2          2

         6          3          21.查询选修了所有课程的学生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                   10002.查询没有选择所有课程的学生,即没有全选的学生。(存在这样的一个学生,他至少有一门课没有选),分析:只要有一个门没有选,即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 liter3.查询一门课也没有选的学生。(不存这样的一个学生,他至少选修一门课程),分析:如果他选修了一门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 liter4.查询至少选修了一门课程的学生。

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

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

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

sqlserver 中Group by 的用法

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

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) fo

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中order by 排序用法

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

sql 中 EXISTS用法

 语法 EXISTS subquery 参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字) 结果类型 Boolean 结果值 如果子查询包含行,则返回 TRUE. EXISTS(SELECT NULL)也返回True   NOT EXISTS NOT EXISTS 的作用与 EXISTS 正相反.如果子查询没有返回行,则满足 NOT EXISTS 中的 WHERE 子句.本示例查找不出版商业书籍的出版商的名称    代码如下 复制代码

MySQL关于exists的一个bug_Mysql

今天碰到一个关于exists很奇怪的问题 第一个语句如下: SELECT count(1) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD r WHERE t.APPLY_ID = r.APPLY_ID ); 产生的结果是:89584 第二个语句如下: SELECT count(1) FROM APPLY t WHERE EXISTS ( SELECT max(r.FINISH_TIME) FROM RECORD r WHERE

SQL查询中in和exists的区别分析_MsSql

select * from A where id in (select id from B); select * from A where exists (select 1 from B where A.id=B.id); 对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in. 1.select * from A where id in (select id from B); in()只执行一次,它查出B表中的所有id字段并缓存

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的性能区别: 如果子查询得出

SQL中exists的使用方法_MsSql

有一个查询如下: 复制代码 代码如下: SELECT c.CustomerId, CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerID = cu.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? E