最近看软考视频关于数据库的部分,其中主要涵括了数据库模型(概念模式、外模式、内模式)、数据模型、ER图、数据库三范式等等,这些在数据库系统原理中都有学到,算是对知识的巩固了吧,这里就不一一总结了,今天着重总结一下SQL语句的几种不常用(站在我自己目前的编程经历来讲)但又确实很实用的语法。
1,消除取值重复的行 DISTINCT
有时候在数据库中查询数据,两条本来并不完全相同的记录,按照某个查询条件返回的结果可能变成相同的行。
eg:
表SC的部分记录如下图,现在要查询选修了课程的学生学号
SELECT Sno
FROM SC
该查询结果包含两条重复的记录01,此时要去掉重复的记录,则必须指定DISTINCT
SELECT DISTINCT Sno
FROM SC
2,确定集合 IN
IN可以用来查找属性值属于指定集合的记录;相反,NOTIN用来查找属性值不属于指定集合的记录
eg:
查询信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN (‘IS’,’MA’,’CS’)
(WHERE Sdept NOT IN (‘IS’,’MA’,’CS’) //既不属于IS,也不属于MA和CS)
3,涉及空值的查询 IS
在我们写程序的时候,经常会遇到值为空的情况,例如时间,因为类型不一致这时用“=”就会报错,现在可以简单解决了。
eg:
查询缺考的同学的学生的学号和相应课程号
SELECT Sno, Cno
FROM SC
WHERE Grade is NULL
4,使用集函数
为方便用户使用,增强检索功能,SQL提供了以下集函数
COUNT( DISTINCT | ALL | * ) 统计记录数
COUNT( DISTINCT | ALL (列名)) 统计一列中值的个数
SUM、AVG、MAX、MIN等使用方法同上。
eg:
查询学生总人数
SELECT COUNT(*)
FROM Student;
在机房收费系统中的上机人数再也不用通过返回datatable的行的count值来得到了。
查询课程编号为1的平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno=’1’
5,对查询组结果的限制 HAVING
HAVING是对一组记录的限制,必须用在GROUP BY分组之后
WHERE是对一条记录的限制
eg:
查询已经选修了3门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3
随着编程经验的积累和编程难度系数的增加,慢慢的我们会被要求多个语法穿插使用,但是想要走得远、爬的高,前提是打好基础!