欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL Server 数据库基本操作入门篇【4】

程序员文章站 2022-05-10 07:58:16
...

本文将继续介绍上一篇单表查询的剩余部分,欢迎阅读~


一、选择表中的若干元组(续)

⑤ 涉及空值的查询

谓词如下:

IS NULLIS NOT NULL

!!此处需注意: IS 不能用 = 来代替

????来看例子: 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号:

SELECT Sno, Cno
FROM   SC
WHERE  Grade IS NULL;

SQL Server 数据库基本操作入门篇【4】
诶 等会,129和131好像是夏雨和夏冰雹(刘星)?!啊哈哈,看来回家又得挨骂了hhhhh????
SQL Server 数据库基本操作入门篇【4】
对了,刚刚说IS 不能用 = 来代替,那我现在来演示给你康康,如果把上面的语句中IS 改为 =
(啥子都没得)
SQL Server 数据库基本操作入门篇【4】
????Another one: 查所有成绩的学生学号和课程号:(我把全部人都打印了粗来参照)

SELECT Sno, Cno
FROM   SC
WHERE  Grade IS NOT NULL;

SELECT *
FROM   SC

SQL Server 数据库基本操作入门篇【4】

⑥ 多重条件查询

逻辑运算符:ANDOR 来连接多个查询条件
· AND的优先级高于OR
· 可以用括号改变优先级
(所以记不住的优先级的小伙伴别着急,用括号不就行了嘛)

????来看例子: 查询计算机系年龄在20岁以下的学生姓名:(我同样把所有的学生打印粗来参照)

SELECT Sname
FROM   Student
WHERE  Sdept= 'CS' AND Sage < 20;

SELECT *
FROM   Student

SQL Server 数据库基本操作入门篇【4】
????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   /*老规矩,参照一下*/

SQL Server 数据库基本操作入门篇【4】


二、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;

SQL Server 数据库基本操作入门篇【4】
????此处值得一提的是:不写ORDER BY的话,它打印出来是按录入的顺序
SQL Server 数据库基本操作入门篇【4】
????Another one: 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列:(因为缺省时默认为升序,这里就不写ASC了)

SELECT *
FROM   Student
ORDER BY Sdept, Sage DESC; 

SQL Server 数据库基本操作入门篇【4】
先按系别升序排,系别相同时再按年龄降序排,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;   /*老规矩,打印出来参考一下*/

SQL Server 数据库基本操作入门篇【4】
????Another one: 查询选修了课程的学生人数:(即去掉重复的)

SELECT COUNT(DISTINCT Sno)
FROM   SC;

SELECT *
FROM   Student;   /*老规矩,打印出来参考一下*/

SQL Server 数据库基本操作入门篇【4】
????Another one: 计算1号课程的学生平均成绩:

SELECT AVG(Grade)
FROM   SC
WHERE  Cno= '1';

SELECT *
FROM   Student;   /*老规矩,打印出来参考一下*/

SQL Server 数据库基本操作入门篇【4】
????Another one: 查询选修1号课程的学生最高分数:

SELECT MAX(Grade)
FROM   SC
WHERE  Cno='1';

SELECT *
FROM   SC;   /*老规矩,打印出来康康*/

SQL Server 数据库基本操作入门篇【4】
????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;  /*这里把等值连接后的表也打印出来参考*/

SQL Server 数据库基本操作入门篇【4】


四、GROUP BY子句

GROUP BY子句分组细化聚集函数的作用对象
· 如果未对查询结果分组,聚集函数将作用于整个查询结果
· 对查询结果分组后,聚集函数将分别作用于每个组
· 按指定的一列或多列值分组,值相等的为一组

????来看例子: 求各个课程号及相应的选课人数:

SELECT Cno, COUNT(Sno)
FROM   SC
GROUP BY Cno; 

SELECT *
FROM   SC   /*同样 咱还是整个表打印出来康康*/

SQL Server 数据库基本操作入门篇【4】
????Another one: 查询选修了1门以上课程的学生学号:

SELECT Sno
FROM   SC
GROUP BY Sno
HAVING COUNT(*) > 1;       

SELECT *
FROM   SC

SQL Server 数据库基本操作入门篇【4】
ps:HAVING 短语是跟着GROUP BY用的,不能单独拿出来使用,它只能作用于,其功能相当于在表或视图中的WHERE子句

????Another one: 查询平均成绩大于等于80分的学生学号和平均成绩:
下面这样写是不对的:

SELECT Sno, AVG(Grade)
FROM   SC
WHERE  AVG(Grade) >= 80
GROUP BY Sno;

SELECT *
FROM   SC

SQL Server 数据库基本操作入门篇【4】
????如图中的警告所说,即WHERE子句中不能用聚集函数作为条件表达式! 同时注意这里 因为第一句语句出现了错误,所以后面的查看整张表的语句SELECT * FROM SC未能正常执行。
正确的写法应该是:

SELECT Sno, AVG(Grade)
FROM   SC
GROUP BY Sno
HAVING AVG(Grade) >= 80;

SELECT *
FROM   SC

SQL Server 数据库基本操作入门篇【4】
???? HAVING 短语与 WHERE 子句的区别:

  • 作用对象不同
    WHERE子句作用于基表或视图,从中选择满足条件的元组
    HAVING短语作用于,从中选择满足条件的组

嘿嘿 本文单表查询的介绍到这里也就结束啦,感谢你耐心地阅读~????
这里是一个想把学习过程记录成博客分享给大家的undergraduate,请多关照????
咱们下期 ~
SQL Server 数据库基本操作入门篇【4】