sql server 练习题5

课后作业

在homework库下执行

作业1:

案例:根据用户分数划分等级。小于60分为不及格,[60,80)为及格,[80,90)为良好,大于等于90分以上为优秀。

建表语句:

CREATE TABLE Grades (

ID INT PRIMARY KEY,

Name VARCHAR(50),

Score INT

);

数据插入语句:

-- 插入一些示例数据

INSERT INTO Grades (ID, Name, Score) VALUES (1, '张三', 95);

INSERT INTO Grades (ID, Name, Score) VALUES (2, '李四', 85);

INSERT INTO Grades (ID, Name, Score) VALUES (3, '王五', 70);

INSERT INTO Grades (ID, Name, Score) VALUES (4, '赵六', 58);

INSERT INTO Grades (ID, Name, Score) VALUES (5, '陈七', 30);

查询语句:

sql 复制代码
select Name, case  when Score>90 then '优秀' 
when Score>=80 and Score<90  then '良好'
when Score>=60 and Score<80 then '及格'
else  '不及格' end from Grades;

希望得到的结果如下:

作业2:

查询过去一周内的活动记录

建表语句

CREATE TABLE ActivityLog (

ActivityID INT PRIMARY KEY IDENTITY(1,1),

UserID INT NOT NULL,

ActivityType VARCHAR(50) NOT NULL,

ActivityTime DATETIME NOT NULL

);

这个ActivityLog表设计包含ActivityID(主键,自动增长)、UserID(执行活动的用户ID)、ActivityType(活动类型,如登录、发布、评论等)和ActivityTime(活动发生的时间)字段。

数据插入语句

接下来,我们将插入一些示例数据,确保其中包含过去一周内的活动记录:

-- 插入过去一周内的活动记录

INSERT INTO ActivityLog(UserID, ActivityType, ActivityTime)

VALUES (101, 'Login', DATEADD(DAY, -3, GETDATE())), -- 三天前的登录活动

(102, 'Post', DATEADD(HOUR, -24, GETDATE())), -- 昨天的发帖活动

(103, 'Comment', DATEADD(DAY, -6, GETDATE())), -- 六天前的评论活动

(104, 'Logout', DATEADD(HOUR, -72, GETDATE())), -- 三天前的登出活动

(105, 'Like', GETDATE() - 7); -- 正好一周前的点赞活动

-- 插入超过一周的活动作为对比

INSERT INTO ActivityLog(UserID, ActivityType, ActivityTime)

VALUES (106, 'Share', DATEADD(WEEK, -2, GETDATE())); -- 两周前的分享活动

这些插入语句模拟了不同用户在过去一周内进行的各种活动记录,同时也加入了一条超过一周的记录作为对比,以便在执行查询时能明确区分哪些活动是在过去一周内发生的。

如果你想找出最近一周内所有的活动记录,查询语句应写为:

sql 复制代码
select *from ActivityLog where ActivityTime>=dateadd(week,-1,getdate());

作业3:

计算订单处理时长

如果有Orders表,包含OrderPlaced(订单下单时间)和OrderCompleted(订单完成时间)字段,你可以计算每个订单的处理时长:

建表语句

首先,我们来创建一个Orders表,以保存订单的放置时间和完成时间,以及其他可能需要的信息。

CREATE TABLE Orders (

OrderID INT PRIMARY KEY IDENTITY(1,1),

CustomerID INT NOT NULL,

OrderPlaced DATETIME NOT NULL,

OrderCompleted DATETIME,

TotalAmount DECIMAL(10, 2) NOT NULL

);

在这个表结构中,OrderID是主键且自动递增,CustomerID存储客户ID,OrderPlaced和OrderCompleted分别存储订单的放置时间和完成时间,而TotalAmount表示订单总金额。

数据插入语句

接下来,我们向Orders表中插入一些示例数据,包括订单的放置时间和完成时间,以便演示处理时长的计算。

-- 插入订单数据

INSERT INTO Orders(CustomerID, OrderPlaced, OrderCompleted, TotalAmount)

VALUES (101, '2024-05-01 14:30:00', '2024-05-01 15:45:00', 250.99), -- 处理时长1小时15分钟

(102, '2024-05-02 09:00:00', '2024-05-02 10:00:00', 120.50), -- 处理时长1小时

(103, '2024-05-03 16:30:00', NULL, 85.75), -- 未完成订单,处理时长未知

(104, '2024-05-04 10:15:00', '2024-05-04 11:00:00', 175.00); -- 处理时长45分钟

这些插入语句为不同的客户创建了订单记录,其中包含了订单的放置时间、完成时间(有的订单可能还未完成,所以OrderCompleted为NULL),以及订单的总金额。通过前面提供的查询语句,我们可以计算出已完成订单的处理时长(以分钟为单位)。请注意,最后一个订单的OrderCompleted字段是NULL,这意味着该订单尚未完成,所以在执行原始的查询时,它应被排除在外。

查询语句:

sql 复制代码
select *from Orders where OrderCompleted  is not NULL;

最后结果应是:

作业4:

计算员工工龄

假设我们有一个公司员工信息表Employees,其中包含员工的入职日期(HireDate)。我们想要查询每位员工的工龄(以年为单位)。

建表语句

CREATE TABLE Employees (

EmployeeID INT PRIMARY KEY IDENTITY(1,1),

FirstName NVARCHAR(50) NOT NULL,

LastName NVARCHAR(50) NOT NULL,

HireDate DATE NOT NULL

);

这个表格定义了EmployeeID(员工ID,主键自动增长)、FirstName(名)、LastName(姓)和HireDate(入职日期)字段。

数据插入语句

INSERT INTO Employees(FirstName, LastName, HireDate)

VALUES ('John', 'Doe', '2020-01-01'), -- 入职于2020年

('Jane', 'Smith', '2019-07-15'), -- 入职于2019年

('Alice', 'Johnson', '2023-03-20'); -- 入职于2023年

这里插入了三个员工的记录,每个员工的入职日期不同。

查询语句

现在,我们要计算每个员工截止到当前时间的工龄,

查询语句:

sql 复制代码
select *,datediff(year,HireDate,getdate())as 工龄年数 from Employees;

最后结果应是:

相关推荐
卫生纸不够用10 分钟前
远程链接mysql步骤
数据库·mysql
夏小花花1 小时前
postgresql 创建序列
数据库·postgresql
Allen Bright1 小时前
Redis介绍
数据库·redis·缓存
engchina1 小时前
Oracle ADB 导入 BANK_GRAPH 的学习数据
数据库·学习·oracle·graph
不爱学习的YY酱1 小时前
【计网不挂科】计算机网络第二章< 物理层 >习题库(含答案)
java·数据库·计算机网络
CCSBRIDGE1 小时前
sql文件
数据库·oracle
柯南二号1 小时前
HarmonyOS ArkTS 下拉列表组件
前端·javascript·数据库·harmonyos·arkts
液态不合群2 小时前
Mysql篇-三大日志
数据库·mysql
喝醉酒的小白2 小时前
数据库参数备份
数据库
小徍2 小时前
MySQL 8.0特性-自增变量的持久化
数据库·mysql