SQL Server 数据库基本操作入门篇【4】
本文将继续介绍上一篇单表查询的剩余部分,欢迎阅读~
一、选择表中的若干元组(续)
⑤ 涉及空值的查询
谓词如下:
IS NULL 或 IS NOT NULL
!!此处需注意: IS
不能用 =
来代替
????来看例子: 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号:
SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL;
诶 等会,129和131好像是夏雨和夏冰雹(刘星)?!啊哈哈,看来回家又得挨骂了hhhhh????
对了,刚刚说IS
不能用 =
来代替,那我现在来演示给你康康,如果把上面的语句中IS
改为 =
:
(啥子都没得)
????Another one: 查所有有成绩的学生学号和课程号:(我把全部人都打印了粗来参照)
SELECT Sno, Cno
FROM SC
WHERE Grade IS NOT NULL;
SELECT *
FROM SC
⑥ 多重条件查询
逻辑运算符:AND 和 OR 来连接多个查询条件
· AND的优先级高于OR
· 可以用括号改变优先级
(所以记不住的优先级的小伙伴别着急,用括号不就行了嘛)
????来看例子: 查询计算机系年龄在20岁以下的学生姓名:(我同样把所有的学生打印粗来参照)
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage < 20;
SELECT *
FROM Student
????Another one: 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别:
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS ','MA ','IS');
这是上一篇的一个例子,可改写为:
SELECT Sname, Ssex
FROM Student
WHERE Sdept = 'CS' OR Sdept = 'MA' OR Sdept = 'IS';
SELECT *
FROM Student /*老规矩,参照一下*/
二、ORDER BY子句
ORDER BY子句(排序):可以按一个或多个属性列排序
升序:ASC,降序:DESC,缺省值为ASC
(这里的排序关键字同 INDEX 的升序和降序排序的关键字,且缺省值(默认)都为升序ASC,不过为了增强可读性,建议升序时还是把ASC关键字写上)
对于空值,排序时显示的次序由具体系统实现来决定(对于ORDER BY来说 空值超纲了,不是咱能管的)
????来看例子: 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列:
SELECT Sno, Grade
FROM SC
WHERE Cno = '3'
ORDER BY Grade DESC;
????此处值得一提的是:不写ORDER BY的话,它打印出来是按录入的顺序
????Another one: 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列:(因为缺省时默认为升序,这里就不写ASC了)
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
即先按系别升序排,系别相同时再按年龄降序排,NULL放在前面还是后面取决于你所用的DBMS
三、聚集函数
统计元组个数(即求总的有多少行): COUNT(*)
统计一列中值的个数: COUNT( [DISTINCT|ALL] <列名>)
计算一列值的总和 : SUM( [DISTINCT|ALL] <列名>)
计算一列值的平均值: AVG( [DISTINCT|ALL] <列名>)
求一列中的最大值和最小值:
· MAX( [DISTINCT|ALL] <列名>)
· MIN( [DISTINCT|ALL] <列名>)
????来看例子: 查询学生总人数:
SELECT COUNT(*)
FROM Student;
SELECT *
FROM Student; /*老规矩,打印出来参考一下*/
????Another one: 查询选修了课程的学生人数:(即去掉重复的)
SELECT COUNT(DISTINCT Sno)
FROM SC;
SELECT *
FROM Student; /*老规矩,打印出来参考一下*/
????Another one: 计算1号课程的学生平均成绩:
SELECT AVG(Grade)
FROM SC
WHERE Cno= '1';
SELECT *
FROM Student; /*老规矩,打印出来参考一下*/
????Another one: 查询选修1号课程的学生最高分数:
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
SELECT *
FROM SC; /*老规矩,打印出来康康*/
????Another one: 查询学生201215122选修课程的总学分数:(这实际是一个多表查询啦,在这里用于介绍SUM提前运用一下)
SELECT SUM(Ccredit)
FROM SC, Course
WHERE Sno = '201215122' AND SC.Cno = Course.Cno;
SELECT *
FROM SC, Course
WHERE Sno = '201215122' AND SC.Cno = Course.Cno; /*老规矩,打印出来康康*/
SELECT *
FROM SC, Course
WHERE SC.Cno = Course.Cno; /*这里把等值连接后的表也打印出来参考*/
四、GROUP BY子句
GROUP BY子句分组:细化聚集函数的作用对象
· 如果未对查询结果分组,聚集函数将作用于整个查询结果
· 对查询结果分组后,聚集函数将分别作用于每个组
· 按指定的一列或多列值分组,值相等的为一组
????来看例子: 求各个课程号及相应的选课人数:
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
SELECT *
FROM SC /*同样 咱还是整个表打印出来康康*/
????Another one: 查询选修了1门以上课程的学生学号:
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) > 1;
SELECT *
FROM SC
(ps:HAVING 短语是跟着GROUP BY用的,不能单独拿出来使用,它只能作用于组,其功能相当于在表或视图中的WHERE子句)
????Another one: 查询平均成绩大于等于80分的学生学号和平均成绩:
下面这样写是不对的:
SELECT Sno, AVG(Grade)
FROM SC
WHERE AVG(Grade) >= 80
GROUP BY Sno;
SELECT *
FROM SC
????如图中的警告所说,即WHERE子句中不能用聚集函数作为条件表达式! 同时注意这里 因为第一句语句出现了错误,所以后面的查看整张表的语句SELECT * FROM SC
未能正常执行。
正确的写法应该是:
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade) >= 80;
SELECT *
FROM SC
???? HAVING 短语与 WHERE 子句的区别:
-
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组
嘿嘿,那 本文单表查询的介绍到这里也就结束啦,感谢你耐心地阅读~????
这里是一个想把学习过程记录成博客分享给大家的undergraduate,请多关照????
咱们下期 见~
推荐阅读
-
sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
-
SQL Server 数据库基本操作语句总结
-
用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
-
sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
-
解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法
-
SQL Server 数据库基本操作语句总结
-
在asp.net中操作sql server数据库的一些小技巧
-
C# SQL server数据库基本操作(连接、增、删、改、查)封装
-
SQL学习(1)初学实验:SQL Server基本配置及基本操作
-
SQL Server 数据库调整表中列的顺序操作方法及遇到问题