1. 实验目的
- 掌握运用Transact-SQL语句实现表的更新操作。
- 掌握运用Transact-SQL语句实现表的简单查询操作。
包括:
(1)掌握SELECT子句以及WHERE子句的使用方法。
(2)学会应用ORDER BY子句。
(3)掌握5种基本的聚合函数。
(4)学会分组统计。
2.实验内容
- 熟悉SQL Server 查询分析器环境。
- 运用T-SQL语句对表中的数据进行插入、修改和删除操作。
- 运用Transact-SQL语句实现:
(1)SELECT子句的应用。
(2)WHERE子句的应用。
(3)ORDER BY子句的应用。
(4)聚合函数的应用。
(5)聚合操作与分组统计的应用。
3.实验步骤
根据实验一创建的数据库及基本表,运用SQL语句实现以下查询要求:
- 查询所有同学的基本信息,包括:学号s_no、班级号class_no、姓名s_name、性别s_sex、出生日期s_birthday。
SELECT [s_no]
,[class_no]
,[s_name]
,[s_sex]
,[s_birthday]
FROM [study].[dbo].[Student]
- 查询所有同学,要求显示其学号s_no、姓名s_name。
SELECT [s_no]
,[s_name]
FROM [study].[dbo].[Student]
- 查询所有男同学,要求显示其学号s_no、姓名s_name、出生日期s_birthday。
SELECT [s_no]
,[s_name]
,[s_sex]
,[s_birthday]
FROM [study].[dbo].[student]
WHERE [s_sex] ='男'
- 查询所有出生日期在“1980-01-01”前的女同学,要求显示其学号s_no、姓名s_name、性别s_sex、出生日期s_birthday。
select s_no,
s_name,
s_sex,
s_birthday
from Student
where s_birthday>'1980-01-01'and s_sex='女'
- 查询所有姓“李”的男同学,要求显示其学号s_no、姓名s_name、性别s_sex、出生日期s_birthday。
SELECT [s_no]
,[s_name]
,[s_sex]
,[s_birthday]
FROM [study].[dbo].[student]
WHERE s_sex='男'AND s_name like'李%'
- 查询所有姓名中含有“一”字的同学,要求显示其学号s_no、姓名s_name。
SELECT [s_no]
,[s_name]
FROM [study].[dbo].[student]
WHERE s_name like'%一%'
- 查询所有职称不是“讲师”的教师,要求显示其教师号t_no、姓名t_name、职称t_title。
SELECT [t_no]
,[t_name]
,[t_title]
FROM [study].[dbo].[teacher]
WHERE t_title not like'讲师'
- 查询虽选修了课程,但未参加考试的所有同学,要求显示出这些同学的学号s_no。
SELECT [s_no]
FROM [study].[dbo].[choice]
WHERE score is null
and course_no is not null
- 查询所有考试不及格的同学,要求显示出这些同学的学号s_no、成绩score,并按成绩降序排列。
SELECT [s_no],[score]
FROM [study].[dbo].[choice]
WHERE score<60
- 查询出课程号为01001、02001、02003的所有课程,要求显示出课程号course_no、课程名称course_name。(要求用in运算符)。
SELECT [course_no],[course_name]
FROM [study].[dbo].[course]
WHERE course_no in (01001,02001,02003)
- 查询所有在1970年出生的教师,要求显示其教师号t_no、姓名t_name、出生日期t_birthday。
SELECT [t_no]
,[t_name]
,[t_birthday]
FROM [study].[dbo].[teacher]
WHERE [t_birthday] between'1970-1-1'and'1970-12-31'
- 查询出各个课程号course_no及相应的选课人数。
SELECT [course_no]
,count(course_no)as 选修人数
FROM [study].[dbo].[choice]
GROUP BY course_no
- 查询出教授两门以上课程的教师号t_no。
SELECT [t_no] as 教授2门以上课程的教师号
FROM [study].[dbo].[teaching]
GROUP BY t_no
having count(t_no)>=2
- 查询出选修了01001课程的学生平均分数、最低分数及最高分数。
select avg(score) 平均分
,max(score) 最大分,
min(score) 最小分
from [study].[dbo].[choice]
where course_no=01001
- 查询1960年以后出生的,职称为讲师的教师的姓名t_name、出生日期t_birthday,并按出生日期升序排列。
select t_name,t_birthday
from [study].[dbo].[teacher]
where t_birthday > '1959-12-31'
order by t_birthday
5.思考回答
- HAVING短语与WHERE子句的区别:作用对象不同。有什么不同?
where子句与having短语的区别在于作用的对象不同
where:
作用于基本表或者是试图
表示的是个体存在的条件
是分组统计前对个体进行的筛选
where不能使用聚集函数
having:
是对于分组以后对统计量进行的判断条件
作用于组,从中选择满足条件的组
having可以使用聚集函数
where与having的执行顺序where > group by > having
- 集函数的作用对象在有无分组的SELECT语句中有什么不同?
集函数是用来对数据进行统计和计算的函数,通常用于在SELECT语句中进行聚合操作。集函数的作用对象在有无分组的SELECT语句中有以下不同:
1. 无分组的SELECT语句:在没有使用GROUP BY子句的SELECT语句中,集函数会对查询结果集中的所有行进行计算,并返回单个值作为结果。这样的语句常用于对整个数据集进行聚合操作,如求和、平均值、最大值、最小值等。例如:SELECT SUM(salary) FROM employees; 将返回所有员工的薪水总和。
2. 有分组的SELECT语句:在使用GROUP BY子句的SELECT语句中,集函数会根据GROUP BY子句指定的列对数据进行分组,然后对每个分组内的数据进行计算,并返回每个分组的结果。这样的语句常用于按照某个列的值进行分组统计或计算。
无分组的SELECT语句使用集函数对整个数据集进行计算,返回单个结果;有分组的SELECT语句使用集函数对每个分组内的数据进行计算,返回多个结果。
- 用户可以使用LIKE或NOT LIKE进行部分匹配查询(也称模糊查询),问:字符串中的通配符有哪些,举例说明如何使用。
在SQL中,字符串模糊查询可以使用通配符进行匹配,常用的通配符有以下三种1. 百分号(%)通配符:表示任意字符出现任意次数(包括零次)。可以用来匹配任意长度的字符串。例如,使用 "SELECT * FROM students WHERE name LIKE '%son%';" 将查询出名字中包含 "son" 字符的所有学生记录,比如 "Johnson"、"Wilson"、"Jackson" 等。2. 下划线(_)通配符:表示任意单个字符的出现。可以用来匹配一个字符的位置。例如,使用 "SELECT * FROM students WHERE name LIKE '_oan';" 将查询出名字以 "o" 开头,后面接一个任意字符,然后是 "an" 的学生记录,比如 "Joan"、"Moan" 等。
3. 转义符(\):用于转义通配符本身的含义。例如,如果想要匹配一个包含 "%" 字符的字符串,可以使用 "SELECT * FROM students WHERE name LIKE '\%son';"。
需要注意的是,通配符只能在与LIKE关键字一起使用时起效。此外,不同数据库的通配符可能存在差异,可以根据具体数据库的文档来了解更多详细信息。