sql查询复习笔记-小技巧,大智慧

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

最近看sql的书,这里自己举个例子来温故知新一遍常用常见的sql查询。好了,code is cheap,代码来了。

ContractedBlock.gif Code

下面对上面新建表的字段稍微介绍一下:

ContractedBlock.gif Code

接着在相应表里插入一些记录:

ContractedBlock.gif Code

最后就是要按条件查询结果了:
1 回答关于”否定“的问题
问题(1): 找到没有选择sql server课程的学生

ContractedBlock.gif Code

分析:上述问题的结果集应该是包含没有选任何课程的学生和选择了除sql server之外的任何其他课程的学生,但是第一种查询返回的结果集是“选取了不是sql server课程的学生“而不是”没有选sql server的学生“。
结论:真正的否定需要两步操作,即要找出”谁不在“,先找出”谁在“,然后排除它们
问题(2):找到选取sql server或者my sql课程(但不是两者都选)的学生。

ContractedBlock.gif Code

分析:从正确的查询语句我们可以看到这里也采取了问题一里的解决方案,并通过使用自联接查找选取sql server和my sql课程的学生,然后使用子查询,选出选取sqlserver或者mysql的学生。
问题(3):选取了sqlserver而且未选取其他课程的学生

ContractedBlock.gif Code

分析:正确的查询通过子查询找到所有没有选sqlserver的学生,外层查询通过not in就找到了选择sqlserver或者没有选择任何一门课程的学生,然后表Student和StudentTakeCourses之间的联结会筛选掉未选择任何课程的学生。
2 回答有关”至多“的问题
问题(4):找到选取了课程并且至多选取两门课程的学生

ContractedBlock.gif Code

 分析:通过聚集函数count可以查找到选取课程不多于两门的学生。下面给出一种使用多次自联接的解决方案:

ContractedBlock.gif Code

总结:上述子查询的where判断可以这样理解,对于某个特定学生,返回满足下述条件的结果集:他的第一个课程id小于第二个课程id,而且第二个课程id小于第三个课程id。如果学生选择的课程小于三门,则该表达式永远不会为真,因为并不存在第三个课程id。子查询查到了选取三门以上课程的学生,外层查询not in加上学生表和学生选择的课程表联接查询一下就找到了至少选取一门课程且不多于两门的学生。
问题(5):找到至多比另外两名学生大的学生。
分析:问题换一种说法就是“找到比0个学生、1个学生、2个学生大的那些学生。”

ContractedBlock.gif Code

通过窗口函数DENSE_RANK,我们可以非常方便地找到所要选取的结果集。其实,不使用dbms的函数,同样可以取到结果,思路如下: 先找到不比三个以上学生大的学生,然后排除他们。

ContractedBlock.gif Code

未完待续。







本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/04/05/1429437.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
16天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
14 0
sql语句加正则 简化查询
|
1月前
|
SQL
sql server链接查询
sql server链接查询
17 1
|
1月前
|
SQL
sql server简单查询
sql server简单查询
14 1
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
65 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
2月前
|
SQL 缓存 关系型数据库
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
65 0
|
23天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
14 0
|
1月前
|
SQL
sql高级查询
sql高级查询
12 0
|
1月前
|
SQL 存储 数据可视化
10个高级的 SQL 查询技巧
10个高级的 SQL 查询技巧
|
1天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
16天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
16 1