1,exists和in的理解(参考 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,对所有行汇总
推荐整理分享sqlserver 数据库学习笔记(sqlserver数据库版本号怎么查),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:sqlserver数据库和mysql区别,sqlserver数据库安装步骤,sqlserver数据库恢复挂起状态,sqlserver数据库端口号怎么查看,sqlserver数据库怎么导出,sqlserver数据库安装步骤,sqlserver数据库备份,sqlserver数据库恢复,内容如对您有帮助,希望把文章链接给更多的朋友!
SQL对时间处理的语句小结 --获取当前时间Selectgetdate()--获取当前年月日YY代表年,MM代表月,DD代表日,hh代表时,ss代表秒/*yearyy--quarterqq1--4monthmm1--dayofyeardy1--daydd1--weekwk1--we
动态给表添加删除字段并同时修改它的插入更新存储过程 有一个表,用户需要在后台操作它,希望能对它动态进行添加删除字段。这个功能也许没有问题,但是它原有插入与更新的两个存储过程,也需要一起
SQL 比较一个集合是否在另一个集合里存在的方法分享 DECLARE@cINTDECLARE@c2INTSELECT@c=COUNT(1)FROMdbo.SplitToTable('1|2|3|4','|')SELECT@c2=COUNT(1)FROMdbo.SplitToTable('1|2|3|4','|')aINNERJOINdbo.SplitToTable('1|2|3|','|')bONa.value=b.valueIF@c=@c2SELE