1、4.3 数据库视图4.4 格式化输出结果Select * from xsbwhere not exists ( select * from kcb cWhere not exists (select * from cjbwhere xsb.xh=xh and kch=c.kch);Select * from xsbWhere xh not in (select s.xhFrom xsb s,kcb cWhere(s.xh,c.kch) not in(select xh,kch from cjb) ;select xh,kch from cjb返回所有 有效的(学号,课程号)组合;中间的子查询使
2、用了学生表和课程表的笛卡尔积, 除掉 有效的(学号,课程号)组合,剩下虚构的(学号,课程号)组合;最外层的查询从表中返回:学号不属于中间子查询返回的值在子查询中 ,NOT IN子句将执行一个内部的排序和合并 ,无论哪种情况下 ,都低效 .因为要全表遍历 .建议改成外连接或NOT EXISTS.若 NOT IN后面的列表小 ,还是可以使用 NOT IN子查询的 .窗口函数的调用格式 :count(*) over().对于查询返回的每一行,它返回了表中所有行的计数。窗口函数都是最后一步执行,仅位于 ORDERBY子句之前。分区子句的结果是为每个学生执行count,同一分区(同个学生)的每门课程的个
3、数相同。分区的优点是同一个 select中,一个窗口函数的计算独立于其他窗口函数的计算Partition by :定义行的分区或组,以完成聚集计算。类似GROUPBY。请问表示什么含义?select xh,xmFrom(select s.xh,s.xm,count(t.kch) over (partition by s.xh) as cnt,count(distinct c.kcm)over() as total,row_number() over(partition by s.xh order by c.kch) as rnfrom kcb cleft join cjb t on(c.kch=t.kch)left join xsb s on(t.xh=s.xh) xwhere cnt=total and rn=1;