SQL-server第三次实验(单表查询)

  • Post author:
  • Post category:其他




一、选择表中的若干列

1.查询经过计算的值

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

SELECT Sname,2021-Sage
FROM Student;

在这里插入图片描述

查询结果中第二列是没有列名的,仅是代表着一个算术表达式,还可以是字符串常量,函数等。

例3.20 查询全体学生的的姓名,出生年份和所在的院系,要求用小写字母表示系名。

SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;

在这里插入图片描述

也可以指定别名来改变查询结果的列标题

SELECT Sname NAME,'Year of Birth:'BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept)DEPARTMENT
FROM Student;

lower是将输出结果都以小写输出,若想全以大写输出则用UPPER

在这里插入图片描述

这里就是让它从无列名到有列名。



二、选择表中的若干元组

1.消除取值重复的行

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

SELECT Sno
FROM Sc;

在这里插入图片描述

可以看到有重复的值,这时就要用到DISTINCT去重

SELECT DISTINCT Sno
FROM Sc;

在这里插入图片描述

如果是将DISTINCT改为ALL的话,则结果与不写是相同的,都保留了重复的行。

在这里插入图片描述

2.查询满足条件的元组

例3.22查询计算机科学系全体学生的名单

SELECT Sname
FROM Student
WHERE Sdept='CS';

在这里插入图片描述

例3.23查询所有年龄在20岁以下的学生姓名及其年龄

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

在这里插入图片描述

例3.24查询考试成绩不及格的学生的学号

SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;

在这里插入图片描述

如果不加DISTINCT的话,一个学生有多门不及格就会出现重复的学号

在这里插入图片描述

例3.25查询年龄在20-23岁(包括20和23)之间的学生的姓名、系别和年龄

…between and 包含界限

SELECT  Sname,Sdept,Sage
FROM Student
WHERE Sage  BETWEEN 20 AND 23;

在这里插入图片描述

例3.26 查询年龄不在20-23之间的学生姓名、系别和年龄

SELECT  Sname,Sdept,Sage
FROM Student
WHERE Sage  NOT BETWEEN 20 AND 23;

在这里插入图片描述

例3.27(确定集合)谓词IN可以用来查找属性值属于指定集合的元组,逗号表示或。

SELECT  Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

在这里插入图片描述

例3.28查询既不是计算机科学系,数学系,也不是信息系的学生的姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA','IS');

在这里插入图片描述

字符匹配

通配符%代表任意长度的字符串,-代表任意单个字符

例3.29查询学号为201215121的学生的详细情况

SELECT *
FROM Student
WHERE Sno like '201215121';/*like也可用=替代*/

在这里插入图片描述

例3.30查询所有姓李的学生的姓名、学号和性别

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '李%';

在这里插入图片描述

例3.31 查询姓“欧阳”且全名为三个汉字的学生的姓名

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';

在这里插入图片描述

这里的实验结果并没有只出现三个字而是还出现了两个字,说明它的_通配符还可以表示NULL

例3.32查询名字中第二个字为“阳”的学生的姓名和学号

SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_阳%';

在这里插入图片描述

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

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';

在这里插入图片描述

如果用户要查询的字符串本身就含有通配符%或_,这时就要使用SECAPE’<换码字符>’短语对通配符进行转义了

例3.34查询DB_Design课程的课程号和学分

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE'DB\_Design'ESCAPE'\';

在这里插入图片描述

例3.35查询以“DB_开头,且倒数第三个字符为i的课程的详细情况

SELECT *
FROM Course
WHERE Cname LIKE'DB\_%i__'ESCAPE'\';

在这里插入图片描述

查询空值时必须使用NULL

例3.36查询缺少成绩的学生的学号和相应的课程号

SELECT Sno,Cno
FROM SC
WHERE Grade is NULL;

在这里插入图片描述

当把NULL改为空格或什么都不写,将出现错误

在这里插入图片描述

例3.37查询所有有成绩的学生学号和课程号

SELECT Sno,Cno
FROM SC
WHERE Grade is not NULL;

在这里插入图片描述

多重条件查询

and的优先级高于or

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

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

在这里插入图片描述



三、ORDER BY子句

默认是按升序排列

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

SELECT Sno,Grade
FROM SC
where Cno=3
order by grade desc

在这里插入图片描述



四、聚集函数

只能用于select和group by中的having子句

例3.41查询学生总人数

SELECT * from Student;
SELECT count(*)//count是统计一列中值的个数
from Student;

在这里插入图片描述

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

SELECT count(DISTINCT Sno)
from SC;

在这里插入图片描述

如果不加DISTINCT的话,查询结果将不去重显示7个

`实验开始前要确保表已经建好。

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

SELECT avg(GRADE)
from SC
where Cno=1;

在这里插入图片描述

例3.45查询学生201215121选修课程的总学分数

SELECT sum(Ccredit)
from SC,Course
where Sno='201215121'and SC.Cno=Course.Cno;;


GROUP BY子句

它是将查询结果按某一列或多列进行分组,值相等的为一组

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

SELECT Cno,count(Sno)NUM
from SC
group by Cno;

例3.47查询选修了两门以上的课程的学生学号

      student表

里插入图片描述

例3.47查询选修了两门以上课程的学生学号

SELECT Sno
from SC
group by Sno
having count(*)>2;//having和where效果相同

这次实验做的比较多,照着书做完之后自己再做还是会想不起来一些东西,需要课下多看多复习



版权声明:本文为m0_53678120原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。