数据库day-05
一、实验目的
1.掌握数据的基本检索方法;
2.掌握数据查询的join和Order by子句的使用;
3. 掌握聚集函数的使用方法。
二、实验的软硬件环境要求
硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
Windows 10等下的SQL Server 2019
三、知识准备
前期要求掌握的知识:
数据检索的语句格式:
SELECT [ALL|DISTINCT] <目标列表达式列表>
FROM <表名或视图名列表> join <表名或视图名列表> on <连接条件>
[ WHERE <条件表达式> ]
[ ORDER BY <列名2> [ ASC|DESC ] ]
其中,SELECT后的目标列表达式可以是列名、表达式或函数。
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
注意:T-SQL语句中关键字不区分大小写
四、实验内容
1.对数据表进行简单检索;
2.对数据表进行排序检索;
3.多表查询;
用SQL语句创建四个表:
create database STUXXX
go
use STUXXX
go
create table studentXXX
(
Sno char(3) not null primary key ,--学号
Sname nchar(4) not null,--学生姓名
Ssex nchar(1) not null, --学生性别
Sbirthday date,--学生出生年月
Class char(5)--学生所在班级
)
go
create table teacherXXX--老师
(
Tno char(3) not null primary key ,--教工编号(主码)
Tname nchar(4) not null,--教工姓名
Tsex nchar(1) not null, --教工性别
Tbirthday date,--教工出生年月
Prof nchar(3),--职称
Depart nchar(5) not null--教工所在部门
)
go
create table CourseXXX--课程
(
Cno char(5) not null primary key ,--课程号
Cname Nvarchar(25) not null,--课程名称
Tno char(3) not null references teacher(Tno) --教工编号(外码)
)
go
create table ScoreXXX--分数
(
Sno char(3) not null references student(Sno), --学号(外码)
Cno char(5) not null references Course(Cno), --课程号(外码)
primary key(Sno,Cno),
Degree Decimal(4,1)--成绩
)
五、验证性实验
以下查询要求在逐个语句执行,执行后将执行结果记录下来:
- 无条件查询全部数据
USE STUDENT
SELECT * FROM STUDENT023
- 在SELECT关键字后指明要检索的列名
(1) 查询学生表的学生学号和姓名
SELECT SNO,SNAME FROM STUDENT023
(2) 查询STUDENT表中的班级名
SELECT class FROM STUDENT023
(3)查询S表中不重复的班级
SELECT DISTINCT class FROM STUDENT023
- 改变列标题的检索
- 使用 空格 形式: 列名 新标题
SELECT SNO 学号 , SNAME 姓名 FROM STUDENT023
-
- 使用“AS”形式,列名 AS 新标题
SELECT SNO AS ‘学号’, SNAME AS ‘姓名’ FROM STUDENT023
-
- 使用“AS”形式,列名 AS 新标题
SELECT SNO AS ‘学 号’, SNAME AS ‘姓 名’ FROM STUDENT023
-
- 使用“AS”形式,列名 AS 新标题
SELECT ‘学 号’=SNO , ‘姓 名’=SNAME FROM STUDENT023
- 有条件选择的查询
在S表检索“95033”的学生信息
SELECT * FROM STUDENT023
WHERE CLASS=’ 95033’
-
- 在S表中检索姓“王”的学生信息
SELECT * FROM STUDENT023
WHERE sname like ‘王%’
-
- 在SC表检索’ 3-105’选修课成绩为空的选课记录
SELECT SNO, CNO FROM SCORE023
WHERE cno=’3-105’ and Degree is null
-
- 检索年龄为21,25,22的学生学号、姓名
SELECT SNO,SNAME FROM STUDENT023
WHERE YEAR(GETDATE())-YEAR([Sbirthday]) IN in (21,25,22)
- 多表查询
查询所有人的学号,姓名,课程号,课程名,成绩
Select s.sno sname,c.cno,cname , Degree from STUDENT023 s join SCORE023 sc
On s.sno=sc.sno join course023 c on c.cno=sc.cno
注意:表的别名
- 对检索结果进行排序
SELECT * FROM SCORE023
WHERE Degree IS not NULL
ORDER BY SNO,CNO DESC
六、设计性实验
(1).实验要求
1、 查询Student表中95031班的所有记录的sno,Sname 和Ssex列。
SELECT Sno, Sname, Ssex
FROM student023
WHERE Class = '95031';
2、 查询教师所有的单位即不重复的Depart列。
SELECT DISTINCT Depart
FROM teacher023;
3、 查询Score表中成绩在60到80之间的所有记录。
SELECT *
FROM Score023
WHERE Degree BETWEEN 60 AND 80;
4、 查询Score表中成绩为85,86或88的记录。
SELECT *
FROM Score023
WHERE Degree IN (85, 86, 88);
5、 查询Student表中“95031”班或性别为“女”的同学记录。
SELECT *
FROM student023
WHERE Class = '95031' OR Ssex = '女';
6、 以Cno升序、Degree降序查询Score表的所有记录。
SELECT *
FROM Score023
ORDER BY Cno ASC, Degree DESC;
7、查询课程名中的第15个字符是‘理’课程信息。
SELECT *
FROM Course023
WHERE LEN(Cname) >= 15 AND SUBSTRING(Cname, 15, 1) = '理';
8、查询Student表中不姓“王”且姓名第二字为‘君’的同学记录。
SELECT *
FROM student023
WHERE LEFT(Sname, 1) <> '王' AND SUBSTRING(Sname, 2, 1) = '君';
9、查询Student表中每个学生的姓名和年龄。
SELECT Sname, YEAR(GETDATE()) - YEAR(Sbirthday) AS Age
FROM student023;
10、查询Student表中最大和最小的Sbirthday日期值。
SELECT MAX(Sbirthday) AS MaxBirthday, MIN(Sbirthday) AS MinBirthday
FROM student023;
11、以班号和年龄从大到小的顺序查询Student表中的全部记录。
SELECT *
FROM student023
ORDER BY Class DESC, YEAR(GETDATE()) - YEAR(Sbirthday) DESC;
12. 查询Student表本月过生日同学的信息,包括学号,姓名,课程号,课程名,任课教师和成绩。
SELECT s.Sno, s.Sname, co.Cno, co.Cname, t.Tname, sc.Degree
FROM student023 s
JOIN Score023 sc ON s.Sno = sc.Sno
JOIN Course023 co ON sc.Cno = co.Cno
JOIN teacher023 t ON co.Tno = t.Tno
WHERE MONTH(s.Sbirthday) = MONTH(GETDATE());
13. 查询选修课程名中含有%的信息,包括学号,姓名,课程号,课程名和成绩。
SELECT s.Sno, s.Sname, c.Cno, c.Cname, sc.Degree
FROM student023 s
JOIN Score023 sc ON s.Sno = sc.Sno
JOIN Course023 c ON sc.Cno = c.Cno
WHERE c.Cname LIKE '%\%%' ESCAPE '\';
14. 查询选修课程名中含有’[‘或’]’的信息,包括学号,姓名,课程号,课程名和成绩。
SELECT s.Sno, s.Sname, c.Cno, c.Cname, sc.Degree
FROM student023 s
JOIN Score023 sc ON s.Sno = sc.Sno
JOIN Course023 c ON sc.Cno = c.Cno
WHERE c.Cname LIKE '%\[%' ESCAPE '\'
OR c.Cname LIKE '%\]%' ESCAPE '\';
15. 查询选修课程名中含有’[‘和’]’的课程信息,包括学号,姓名,课程号,课程名和成绩。
SELECT s.Sno, s.Sname, c.Cno, c.Cname, sc.Degree
FROM student023 s
JOIN Score023 sc ON s.Sno = sc.Sno
JOIN Course023 c ON sc.Cno = c.Cno
WHERE c.Cname LIKE '%\[%\]%' ESCAPE '\';
16. 查询所有学生信息,包括学号,姓名,课程号,课程名,任课教师和成绩(包括没上课的学生,没有选修的课程以及没上课的教师)。
SELECT s.Sno, s.Sname, c.Cno, c.Cname, t.Tname, sc.Degree
FROM student023 s
LEFT JOIN Score023 sc ON s.Sno = sc.Sno
LEFT JOIN Course023 c ON sc.Cno = c.Cno
LEFT JOIN teacher023 t ON c.Tno = t.Tno
ORDER BY s.Sno, c.Cno;
七、试验小结
通过实验,熟练掌握了使用SQL语句进行数据的基本检索方法,包括无条件查询全部数据、指定列名查询、改变列标题的检索以及有条件选择的查询等多种方式。例如,能够准确使用SELECT
语句结合WHERE
子句,根据不同的条件筛选出所需的学生信息、课程信息等,像查询“95031”班的学生记录、查询姓“王”的学生信息等操作都能轻松实现。