SQLServer 数据库学习笔记 exists:假如子查询中包括某一行,那么就为 TRUE in:假如操作数为 TRUE 等于表达式列表中的一个,那么就为 TRUE exists 总是搞得不太明白 select 。。。from。。。where 。。。 where 就相当于一个推断条件,只有 where 后面的表达式运算结果为 TRUE,前面的才能 select 出来 EXISTS 用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值 True 或 False 1: SELECT c.CustomerId, CompanyName 2: FROM Customers c 3: WHERE EXISTS( 4: SELECT OrderID FROM Orders o 5: WHERE o.CustomerID = cu.CustomerID) 像这样的 EXISTS 子查询中的 SELECT 什么根本不重要,因为子查询只是检查这个表中有没有满足 WHERE 后条件的行, 有就返回 TRUE,没有就 FALSE,所以很多 EXISTS 后都是 SELECT的`* 一行行的去判定,EXISTS 返回的是 TRUE,就是存在,则把这行的相关信息输出 1: select distinct 姓名 from xs 2: where not exists ( 3: select * from kc 4: where not exists ( 5: select * from xs_kc 6: where 学号=xs.学号 and 课程号=kc.课程号 ) 分析下上面的查询语句: 把最外层的 xs 表里的记录一行一行的同中层一行一的笛卡尔乘积后拿到里面去检验 在最里层,假如 xs_kc 表里的某行有拿来检验的这行的学号,同时有中层拿来检验的课程号 就返回 TRUE,说明这个这个学生选了这门课 中层假如某门课程没有收到返回的 TRUE 信息,说明这个名字和课程的搭配在 xs_kc 表中没有,或者说中层 select 出来的是没有被这个学生选择的课程信息,假如有这样的课程,就向最外层返回个 TRUE 最外层在返回信息上加了 not,即最外层找的是这样的一种学生: 他选择了所有的课程 最外层一行行的去检测,假如他满足这个条件,就输出他的姓名且只输出一次 我这是一层层的分析,还有么有什么别的办法? 2,select。。。into @。。。 和 select @。。。 = 。。。应该是相同的吧 3,用 AS 为列重命名似乎比=更好点,和赋值区分开 4,用 compute 汇总的时候,假如是根据某列汇总的,先要order by 此列,然后在 compute 相应信息,最后 by 此列 group 或者 compute 的时候,假如 by 了某列,select 里都要出现相同的列 区别是 group 的聚合函数在 select 行中(称为选择列表),而 compute 的聚合函数在 compute 行中,同时 compute 可以不带 by,对所有行汇总