查询某一年份出生的学生_(三)数据库查询——单表查询

SELECT [ALL|DISTINCT] [,]……FROM [,]……[WHERE ][GROUP BY[HAVING ]][ORDER BY [ASC|DESC]];

1.选择表中的若干列

——查询指定列

查询全体学生的学号与姓名

SELECT Sno ,SnameFROM Student;

——查询全部列

查询全体学生的详细记录

SELECT * FROM Student;

等价于

SELECT Sno,Sname,Ssex,Sage,Sdept /*学生全部属性*/FROM Student;

——查询经过计算的值

查询全体学生的姓名及其出生年份

SELECT Sname ,2017-SageFROM Student;

输出的结果为

c10fbd044a10031a0cc7e58936e2b9e8.png

查询结果

可以发现第2列不是列名而是一个表达式,使用当年的年份减去学生的年龄。

若想把列表中第二列列名显示为“Birthday"可以用如下方法:

SELECT Sname ,2017-Sage BirthdayFROM Student;

输出的结果为

9736604005bae9c1056d10e7941f8367.png

查询结果

相当于给2017-Sage起了一个别名。

2、选择表中的若干元组

——消除取值重复的行

查询选修了课程的学生学号

SELECT SnoFROM SC; /*选课表*/

输出结果为:

5481b02e9a55fb6d2d00b09f95700567.png

查询结果

该查询结果里包含了多个重复的行,若想去掉这些重复行必须指定关键词DISTINCT:

SELECT DISTINCT SnoFROM SC; /*选课表*/

输出结果为:

6fca45a978b190d2c0d7bd5b8a7a5182.png

查询结果

——查询满足条件的元组

1.大小比较

查询计算机科学系的全体学生的姓名

SELECT SnameFROM StudentWHERE Sdept='CS';

2.确定范围

查询年龄在20-30岁之间的学生姓名

SELECT SnameFROM StudentWHERE Sage BETWEEN 20 AND 23;

查询年龄不在20-30岁之间的学生姓名

SELECT SnameFROM StudentWHERE Sage NOT BETWEEN 20 AND 23;

3.确定集合

查询计算机科学系、数学系和信息系学生的姓名和性别

SELECT Sname,SsexFROM StudentWHERE Sdept IN('CS','MA','IS');

4.字符匹配

谓词LIKE可以用来进行字符串的匹配,其一般语法为:

[NOT ]LIKE ''[ESCAPE'']

其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的字符串,也可以是含有通配符%和_。

.%(百分号)代表任意长度的字符串

._(下划线)代表任意单个字符

查询所有姓刘的学生的姓名、学号和性别

SELECT Sname,Sno,SsexFROM StudentWHERE Sname LIKE '刘%';

注意:数据库中字符集为ASCII时一个汉字需要两个_,当字符集为GBK时只需要一个_。

5.涉及空值的查询

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

SELECT Sno ,CnoFROM SCWHERE Grade IS NULL;

注意:这里的IS不能用等号(=)代替。

6.多重条件查询

查询计算机系年龄在20岁以下的学生姓名

SELECT SnameFROM StudentWHERE Sdept='CS' AND Sage<20;

3、ORDER BY 子句

可以用ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排序,缺省值时为升序

查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列

SELECT Sno,GradeFROM SCWHERE Cno='3'ORDER BY Grade DESC;

4、聚集函数

SQL提供了许多聚集函数,主要有:

COUNT([DISTINCT|ALL] *) /*统计元组个数*/COUNT([DISTINCT|ALL] )/*统计一列中值个数*/SUM([DISTINCT|ALL] )/*计算一列值的总和(此列必须为数值型)*/AVG([DISTINCT|ALL] )/*计算一列值的平均值(此列必须为数值型)*/MAX([DISTINCT|ALL] )/*求一列值中的最大值*/MIN([DISTINCT|ALL] )/*求一列值中的最小值*//*统计一列中值个数*/SUM([DISTINCT|ALL] )/*计算一列值的总和(此列必须为数值型)*/AVG([DISTINCT|ALL] )/*计算一列值的平均值(此列必须为数值型)*/MAX([DISTINCT|ALL] )/*求一列值中的最大值*/MIN([DISTINCT|ALL] )/*求一列值中的最小值*/

查询学生总数

SELECT COUNT(*)FROM Student;

查询选修了课程的学生人数

SELECT COUNT(DISTINCT Sno)FROM SC;

计算选修1号课程的学生平均成绩

SELECT AVG(Grade)FROM SCWHERE Cno='1';

5、GROUP BY 子句

GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。

求各个课程及相应的选课人数

SELECT Cno,COUNT(Cno)FROM SCGROUP BY Cno;

该语句对查询结果按Cno的值分组,所有具有相同Cno值得元组为一组,然后对每一组作用聚集函数COUNT计算,以求得改组的学生人数结果为:

9b0fba0aba7c60885e0edd5f1b77e080.png

查询结果

查询选修了3门以上课程的学生学号

SELECT SnoFROM SCGROUP BY SnoHAVING COUNT(*)>3;

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值