课后作业
在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;
最后结果应是: