一、选择表中的若干列
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效果相同
这次实验做的比较多,照着书做完之后自己再做还是会想不起来一些东西,需要课下多看多复习