最近看sql的书,这里自己举个例子来温故知新一遍常用常见的sql查询。好了,code is cheap,代码来了。
下面对上面新建表的字段稍微介绍一下:
接着在相应表里插入一些记录:
最后就是要按条件查询结果了:
1 回答关于”否定“的问题
问题(1): 找到没有选择sql server课程的学生
分析:上述问题的结果集应该是包含没有选任何课程的学生和选择了除sql server之外的任何其他课程的学生,但是第一种查询返回的结果集是“选取了不是sql server课程的学生“而不是”没有选sql server的学生“。
结论:真正的否定需要两步操作,即要找出”谁不在“,先找出”谁在“,然后排除它们。
问题(2):找到选取sql server或者my sql课程(但不是两者都选)的学生。
分析:从正确的查询语句我们可以看到这里也采取了问题一里的解决方案,并通过使用自联接查找选取sql server和my sql课程的学生,然后使用子查询,选出选取sqlserver或者mysql的学生。
问题(3):选取了sqlserver而且未选取其他课程的学生
分析:正确的查询通过子查询找到所有没有选sqlserver的学生,外层查询通过not in就找到了选择sqlserver或者没有选择任何一门课程的学生,然后表Student和StudentTakeCourses之间的联结会筛选掉未选择任何课程的学生。
2 回答有关”至多“的问题
问题(4):找到选取了课程并且至多选取两门课程的学生
分析:通过聚集函数count可以查找到选取课程不多于两门的学生。下面给出一种使用多次自联接的解决方案:
总结:上述子查询的where判断可以这样理解,对于某个特定学生,返回满足下述条件的结果集:他的第一个课程id小于第二个课程id,而且第二个课程id小于第三个课程id。如果学生选择的课程小于三门,则该表达式永远不会为真,因为并不存在第三个课程id。子查询查到了选取三门以上课程的学生,外层查询not in加上学生表和学生选择的课程表联接查询一下就找到了至少选取一门课程且不多于两门的学生。
问题(5):找到至多比另外两名学生大的学生。
分析:问题换一种说法就是“找到比0个学生、1个学生、2个学生大的那些学生。”
通过窗口函数DENSE_RANK,我们可以非常方便地找到所要选取的结果集。其实,不使用dbms的函数,同样可以取到结果,思路如下: 先找到不比三个以上学生大的学生,然后排除他们。
未完待续。
本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/04/05/1429437.html,如需转载请自行联系原作者