Initial commit

This commit is contained in:
2025-11-06 09:53:12 +08:00
commit ea8d38c146
50 changed files with 1200 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
USE Homework250313;
CREATE TABLE S
(
SNO CHAR(2) PRIMARY KEY,
SNAME VARCHAR(20),
STATUS INT,
CITY VARCHAR(20)
);
CREATE TABLE P
(
PNO CHAR(2) PRIMARY KEY,
PNAME VARCHAR(20),
COLOR VARCHAR(10),
WEIGHT INT
);
CREATE TABLE J
(
JNO CHAR(2) PRIMARY KEY,
JNAME VARCHAR(20),
CITY VARCHAR(20)
);
CREATE TABLE SPJ
(
SNO CHAR(2),
PNO CHAR(2),
JNO CHAR(2),
QTY INT,
PRIMARY KEY (SNO, PNO, JNO),
FOREIGN KEY (SNO) REFERENCES S (SNO),
FOREIGN KEY (PNO) REFERENCES P (PNO),
FOREIGN KEY (JNO) REFERENCES J (JNO)
);

View File

@@ -0,0 +1,42 @@
USE Homework250313;
INSERT INTO S (SNO, SNAME, STATUS, CITY)
VALUES ('S1', N'精益', 20, N'天津'),
('S2', N'盛锡', 10, N'北京'),
('S3', N'东方红', 30, N'北京'),
('S4', N'丰泰盛', 20, N'天津'),
('S5', N'为民', 30, N'上海');
INSERT INTO P (PNO, PNAME, COLOR, WEIGHT)
VALUES ('P1', N'螺母', N'', 12),
('P2', N'螺栓', N'绿', 17),
('P3', N'螺丝刀', N'', 14),
('P4', N'螺丝刀', N'', 14),
('P5', N'凸轮', N'', 40),
('P6', N'齿轮', N'', 30);
INSERT INTO J (JNO, JNAME, CITY)
VALUES ('J1', N'三建', N'北京'),
('J2', N'一汽', N'长春'),
('J3', N'弹簧厂', N'天津'),
('J4', N'造船厂', N'天津'),
('J5', N'机车厂', N'唐山'),
('J6', N'无线电厂', N'常州'),
('J7', N'半导体厂', N'南京');
INSERT INTO SPJ (SNO, PNO, JNO, QTY)
VALUES ('S1', 'P1', 'J1', 200),
('S1', 'P1', 'J3', 100),
('S1', 'P1', 'J4', 700),
('S1', 'P2', 'J2', 100),
('S2', 'P3', 'J1', 400),
('S2', 'P3', 'J2', 200),
('S2', 'P3', 'J4', 500),
('S2', 'P3', 'J5', 400),
('S2', 'P5', 'J1', 400),
('S2', 'P5', 'J2', 100),
('S3', 'P1', 'J1', 200),
('S3', 'P3', 'J1', 200),
('S4', 'P5', 'J1', 100),
('S4', 'P6', 'J3', 300),
('S4', 'P6', 'J4', 200),
('S5', 'P2', 'J4', 100),
('S5', 'P3', 'J1', 200),
('S5', 'P6', 'J2', 200),
('S5', 'P6', 'J4', 50);

View File

@@ -0,0 +1,50 @@
USE Homework250313
Go
-- 求供应工程 J1 零件的供应商号 SNO
SELECT DISTINCT SNO
FROM SPJ
WHERE JNO = 'J1';
Go
-- 求供应工程 J1 零件 P1 的供应商号 SNO
SELECT DISTINCT SNO
FROM SPJ
WHERE JNO = 'J1'
AND PNO = 'P1';
Go
-- 求供应工程 J1 红色零件的供应商号 SNO
SELECT DISTINCT SPJ.SNO
FROM SPJ
JOIN P ON SPJ.PNO = P.PNO
WHERE SPJ.JNO = 'J1'
AND P.COLOR = N'';
Go
-- 求没有使用天津供应商生产的红色零件的工程号 JNO
SELECT JNO
FROM J
WHERE JNO NOT IN (SELECT DISTINCT SPJ.JNO
FROM SPJ
JOIN S ON SPJ.SNO = S.SNO
JOIN P ON SPJ.PNO = P.PNO
WHERE S.CITY = N'天津'
AND P.COLOR = N'');
Go
-- 求至少用了 S1 供应商所供应的全部零件的工程号 JNO
SELECT JNO
FROM SPJ
WHERE PNO IN (SELECT PNO FROM SPJ WHERE SNO = 'S1')
GROUP BY JNO
HAVING COUNT(DISTINCT PNO) = (SELECT COUNT(DISTINCT PNO) FROM SPJ WHERE SNO = 'S1');
Go
-- 找出所有供应商的姓名和所在城市
SELECT SNAME, CITY
FROM S;
Go
-- 找出所有零件的名称、颜色、重量
SELECT PNAME, COLOR, WEIGHT
FROM P;
Go
-- 找出使用供应商 S1 所供应零件的工程号码
SELECT DISTINCT JNO
FROM SPJ
WHERE SNO = 'S1';
Go

View File

@@ -0,0 +1,69 @@
USE Homework250320;
Go
-- 找出工程项目J2使用的各种零件的名称及其数量
SELECT P.PNAME AS , SUM(SPJ.QTY) AS
FROM SPJ
JOIN P ON SPJ.PNO = P.PNO
WHERE SPJ.JNO = 'J2'
GROUP BY P.PNAME;
Go
-- 找出上海厂商供应的所有零件号码
SELECT DISTINCT SPJ.PNO
FROM SPJ
JOIN S ON SPJ.SNO = S.SNO
WHERE S.CITY = N'上海';
Go
-- 找出使用上海产的零件的工程名称
SELECT DISTINCT J.JNAME
FROM SPJ
JOIN S ON SPJ.SNO = S.SNO
JOIN J ON SPJ.JNO = J.JNO
WHERE S.CITY = N'上海';
Go
-- 找出没有使用天津产的零件的工程号码
SELECT JNO
FROM J
WHERE JNO NOT IN (SELECT DISTINCT SPJ.JNO
FROM SPJ
JOIN S ON SPJ.SNO = S.SNO
WHERE S.CITY = N'天津');
Go
-- 把全部红色零件的颜色改成蓝色
UPDATE P
SET COLOR = N''
WHERE COLOR = N'';
SELECT PNO, COLOR
FROM P; -- Validate
Go
-- 将S5供给J4的零件P6改为由S3供应
UPDATE SPJ
SET SNO = 'S3'
WHERE SNO = 'S5'
AND JNO = 'J4'
AND PNO = 'P6';
SELECT *
FROM SPJ
WHERE JNO = 'J4'
AND PNO = 'P6'; -- Validate
Go
-- 删除供应商S2及相关供应记录
DELETE
FROM SPJ
WHERE SNO = 'S2'; -- 先删除SPJ表中S2的供应记录
DELETE
FROM S
WHERE SNO = 'S2'; -- 再删除S表中的S2记录
SELECT SNO
FROM S; -- Validate: S2 已不存在
SELECT SNO
FROM SPJ; -- Validate: S2 相关记录已删除
Go
-- 插入供应情况记录 (S2,J6,P4,200)
INSERT INTO SPJ (SNO, PNO, JNO, QTY)
VALUES ('S2', 'P4', 'J6', 200);
SELECT *
FROM SPJ
WHERE SNO = 'S2'
AND JNO = 'J6'
AND PNO = 'P4'; -- Validate
Go

View File

@@ -0,0 +1,11 @@
USE Homework250324;
Go
-- 创建三建工程项目的供应情况视图包括SNO, PNO, QTY
CREATE VIEW view_sanjian as select sno, pno, qty FROM j, spj where j.jno = spj.jno and j.jname = N'三建';
Go
-- 找出三建工程项目使用的各种零件代码及其数量
SELECT pno, sum(qty) from view_sanjian group by pno;
Go
-- 找出供应商S1的供应情况
select * from view_sanjian where sno = 'S1';
Go

View File

@@ -0,0 +1,29 @@
-- 查找至少有2名男生的班号
select class from student where sex=N'' group by class having count(*) >= 2;
Go
-- 查找student表中不姓王的同学
select * from student where name not like N'王%';
Go
-- 查找student表中每个学生的姓名和年龄
select name, year(getdate())-year(birthday) age from student;
Go
-- 查询student表中最大生日和最小生日的学生
select * from student where birthday = (select min(birthday) from student)
union
select * from student where birthday = (select max(birthday) from student);
Go
-- 以班号和年龄从大到小的顺序显示学生信息
select * from student order by class desc, birthday;
Go
-- 查找男教师的姓名及其上的课程的名称
select name, cname from course, teacher where no=tno and sex=N'';
Go
-- 查找最高分同学的no, cno, degree
select * from score where degree = (select max(degree) from score);
Go
-- 查找和李军同学同性别,同班级的所有学生的姓名
select name from student
where sex=(select sex from student where name=N'李军')
and class=(select class from student where name=N'李军');
except select name from student where name=N'李军';
Go

View File

@@ -0,0 +1,5 @@
1. 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
4. 用户身份鉴别、多层存取控制、审计、视图和数据加密等。
用户身份鉴别方法有静态口令鉴别、动态口令鉴别、生物特征鉴别、智能卡鉴别。
存取控制包括定义用户权限和合法权限检查两部分。
数据加密主要包括存储加密和传输加密。

View File

@@ -0,0 +1,46 @@
-- 初始化
USE Homework250403;
Go
CREATE SCHEMA Q6;
Go
CREATE TABLE Q6.(
CHAR(10) PRIMARY KEY,
NVARCHAR(20) NOT NULL,
INT,
CHAR(1),
NVARCHAR(100),
CHAR(10) NOT NULL
);
Go
CREATE TABLE Q6.(
CHAR(10) PRIMARY KEY,
NVARCHAR(20) NOT NULL,
NVARCHAR(20),
NVARCHAR(20)
);
Go
CREATE LOGIN U1 WITH PASSWORD = 'Password123!';
CREATE LOGIN U2 WITH PASSWORD = 'Password123!';
CREATE USER U1 FOR LOGIN U1;
CREATE USER U2 FOR LOGIN U2;
CREATE ROLE R1;
Go
-- 1. 授予用户U1对两个表的所有权限并可给其他用户授权
GRANT SELECT, INSERT, UPDATE, DELETE ON Q6. TO U1 WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, DELETE ON Q6. TO U1 WITH GRANT OPTION;
Go
-- 2. 授予用户U2对学生表具有查看权限对家庭住址具有更新权限
GRANT SELECT ON Q6. TO U2;
GRANT UPDATE () ON Q6. TO U2;
Go
-- 3. 将对班级表查看权限授予所有用户
GRANT SELECT ON Q6. TO PUBLIC;
Go
-- 4. 将对学生表的查询、更新权限授予角色R1
GRANT SELECT, UPDATE ON Q6. TO R1;
Go
-- 5. 将角色R1授予用户U1并且U1可继续授权给其他角色
ALTER ROLE R1 ADD MEMBER U1;
GRANT CONTROL ON ROLE::R1 TO U1;
Go

View File

@@ -0,0 +1,72 @@
-- 初始化
USE Homework250403;
Go
CREATE SCHEMA Q7;
Go
CREATE TABLE Q7. (
VARCHAR(10) PRIMARY KEY,
VARCHAR(20) NOT NULL,
INT,
VARCHAR(20),
DECIMAL(10, 2),
VARCHAR(10)
);
CREATE TABLE Q7. (
VARCHAR(10) PRIMARY KEY,
VARCHAR(50) NOT NULL,
VARCHAR(20),
VARCHAR(100),
VARCHAR(20)
);
ALTER TABLE Q7.
ADD CONSTRAINT FK_职工_部门 FOREIGN KEY () REFERENCES Q7.();
Go
CREATE LOGIN WITH PASSWORD = 'Password123!';
CREATE USER FOR LOGIN ;
CREATE LOGIN WITH PASSWORD = 'Password123!';
CREATE USER FOR LOGIN ;
CREATE LOGIN WITH PASSWORD = 'Password123!';
CREATE USER FOR LOGIN ;
CREATE LOGIN WITH PASSWORD = 'Password123!';
CREATE USER FOR LOGIN ;
CREATE LOGIN WITH PASSWORD = 'Password123!';
CREATE USER FOR LOGIN ;
CREATE LOGIN WITH PASSWORD = 'Password123!';
CREATE USER FOR LOGIN ;
Go
-- 1. 用户王明对两个表有SELECT权限
GRANT SELECT ON Q7. TO ;
GRANT SELECT ON Q7. TO ;
Go
-- 2. 用户李勇对两个表有INSERT和DELETE权限
GRANT INSERT, DELETE ON Q7. TO ;
GRANT INSERT, DELETE ON Q7. TO ;
Go
-- 3. 每个职工只对自己的记录有SELECT权限
CREATE VIEW Q7. AS
SELECT , , , , ,
FROM Q7.
WHERE = CURRENT_USER;
Go
GRANT SELECT ON Q7. TO PUBLIC;
Go
-- 4. 用户刘星对职工表有SELECT权限对工资字段具有更新权限
GRANT SELECT ON Q7. TO ;
GRANT UPDATE () ON Q7. TO ;
Go
-- 5. 用户张新具有修改这两个表的结构的权限
GRANT ALTER ON SCHEMA::Q7 TO ;
Go
-- 6. 用户周平具有对两个表的所有权限,并具有给其他用户授权的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON Q7. TO WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, DELETE ON Q7. TO WITH GRANT OPTION;
Go
-- 7. 用户杨兰具有从每个部门职工中SELECT的权限
CREATE VIEW Q7. AS
SELECT .*, . AS
FROM Q7.
JOIN Q7. ON . = .;
Go
GRANT SELECT ON Q7. TO ;
Go

View File

@@ -0,0 +1,2 @@
1. 数据库的完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反应当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。
4. 提供定义完整性约束条件的机制、提供完整性检查的方法、进行违约处理

View File

@@ -0,0 +1,25 @@
USE Homework250410;
Go
CREATE TABLE
(
INT NOT NULL,
NVARCHAR(50) NOT NULL,
NVARCHAR(30),
VARCHAR(20),
CONSTRAINT PK_部门 PRIMARY KEY ()
);
CREATE TABLE
(
INT NOT NULL,
NVARCHAR(30) NOT NULL,
INT,
NVARCHAR(50),
DECIMAL(10, 2),
INT,
CONSTRAINT PK_职工 PRIMARY KEY (),
CONSTRAINT FK_职工_部门 FOREIGN KEY ()
REFERENCES (),
CONSTRAINT CK_职工_年龄 CHECK ( <= 60)
);
Go

View File

@@ -0,0 +1,37 @@
Use Homework250417
Go
CREATE TABLE Employee(
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(20),
Age INT,
Salary INT,
);
Go
/* 删除员工表信息时,如果员工个数<5不允许删除员工信息
记录下企图删除员工信息的行为 */
CREATE TABLE DelEmployeeAttempt(
AttemptID INT PRIMARY KEY IDENTITY(1,1),
EmployeeID INT,
AttemptTime DATETIME DEFAULT GETDATE(),
);
Go
CREATE TRIGGER trg_DelEmployee
ON Employee
INSTEAD OF DELETE
AS
BEGIN
DECLARE @EmployeeCount INT;
SELECT @EmployeeCount = COUNT(*) FROM Employee;
IF @EmployeeCount < 5
BEGIN
INSERT INTO DelEmployeeAttempt (EmployeeID)
SELECT EmployeeID FROM DELETED;
RAISERROR(N'少于5名员工无法删除', 16, 1);
END
ELSE
BEGIN
DELETE FROM Employee WHERE EmployeeID IN (SELECT EmployeeID FROM DELETED);
PRINT(N'删除员工信息成功');
END
END;
Go

View File

@@ -0,0 +1,56 @@
USE Homework250417
Go
/* 某公司想举行一个小型的联谊会关系Male记录注册的男宾信息关系Female记录注册的女宾信息。
建立一个触发器将来宾的人数现在在50人以内。 */
CREATE TABLE Male(
ID INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(20) NOT NULL,
);
CREATE TABLE Female(
ID INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(20) NOT NULL,
);
Go
CREATE TRIGGER trg_LimitGuestCount_Male
ON Male
INSTEAD OF INSERT
AS
BEGIN
DECLARE @MaleCount INT;
DECLARE @FemaleCount INT;
DECLARE @TotalCount INT;
SELECT @MaleCount = COUNT(*) FROM Male;
SELECT @FemaleCount = COUNT(*) FROM Female;
SET @TotalCount = @MaleCount + @FemaleCount;
IF @TotalCount >= 50
RAISERROR(N'宾客人数已满,无法添加更多男宾', 16, 1)
ELSE
BEGIN
INSERT INTO Male (Name)
SELECT Name FROM INSERTED;
PRINT(N'添加男宾信息成功');
END
END;
Go
CREATE TRIGGER trg_LimitGuestCount_Female
ON Female
INSTEAD OF INSERT
AS
BEGIN
DECLARE @MaleCount INT;
DECLARE @FemaleCount INT;
DECLARE @TotalCount INT;
SELECT @MaleCount = COUNT(*) FROM Male;
SELECT @FemaleCount = COUNT(*) FROM Female;
SET @TotalCount = @MaleCount + @FemaleCount;
IF @TotalCount >= 50
RAISERROR(N'宾客人数已满,无法添加更多女宾', 16, 1)
ELSE
BEGIN
INSERT INTO Female (Name)
SELECT Name FROM INSERTED;
PRINT(N'添加女宾信息成功');
END
END;
Go
-- Test

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,24 @@
CREATE TABLE Student(
Sno CHAR(8) PRIMARY KEY,
Sname NVARCHAR(20) NOT NULL,
Ssex CHAR(2),
Sage INT,
Sddpt NVARCHAR(20),
);
CREATE TABLE Course(
Cno CHAR(8) PRIMARY KEY,
Cname NVARCHAR(20) NOT NULL,
Cpno CHAR(8),
Ccredit INT,
);
CREATE TABLE SC(
Sno CHAR(8),
Cno CHAR(8),
Grade INT,
Class CHAR(1),
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

View File

@@ -0,0 +1,63 @@
-- 1. 统计离散数学的成绩分布情况,即按照各分数段统计人数
CREATE PROCEDURE sp_GetDiscreteMathGradeDistribution
AS
BEGIN
DECLARE @CourseName NVARCHAR(20) = N'离散数学';
DECLARE @TargetCno CHAR(8);
SELECT @TargetCno = Cno
FROM Course
WHERE Cname = @CourseName;
SELECT GradeCategory AS N'成绩段',
COUNT(*) AS N'人数'
FROM (SELECT CASE
WHEN Grade >= 90 AND Grade <= 100 THEN N'90-100 (优秀)'
WHEN Grade >= 80 AND Grade < 90 THEN N'80-89 (良好)'
WHEN Grade >= 70 AND Grade < 80 THEN N'70-79 (中等)'
WHEN Grade >= 60 AND Grade < 70 THEN N'60-69 (及格)'
WHEN Grade >= 0 AND Grade < 60 THEN N'<60 (不及格)'
END AS GradeCategory
FROM SC
WHERE Cno = @TargetCno) AS GradeDistribution
GROUP BY GradeCategory
ORDER BY CASE GradeCategory
WHEN N'90-100 (优秀)' THEN 1
WHEN N'80-89 (良好)' THEN 2
WHEN N'70-79 (中等)' THEN 3
WHEN N'60-69 (及格)' THEN 4
WHEN N'<60 (不及格)' THEN 5
END;
END;
Go
-- 2. 统计任意一门课的平均成绩
CREATE FUNCTION fn_GetAverageCourseGrade(@InputCno CHAR(8))
RETURNS DECIMAL(5, 2)
AS
BEGIN
DECLARE @AverageGrade DECIMAL(5, 2);
SELECT @AverageGrade = AVG(CAST(Grade AS DECIMAL(5, 2)))
FROM SC
WHERE Cno = @InputCno
AND Grade IS NOT NULL;
RETURN @AverageGrade;
END;
Go
-- 3. 将学生选课成绩从百分制改为等级制即A、B、C、D、E
CREATE PROCEDURE sp_UpdateSCGradeToClass
AS
BEGIN
BEGIN TRANSACTION;
UPDATE SC
SET Class =
CASE
WHEN Grade >= 90 AND Grade <= 100 THEN 'A'
WHEN Grade >= 80 AND Grade < 90 THEN 'B'
WHEN Grade >= 70 AND Grade < 80 THEN 'C'
WHEN Grade >= 60 AND Grade < 70 THEN 'D'
WHEN Grade >= 0 AND Grade < 60 THEN 'E'
END
WHERE Grade IS NOT NULL;
COMMIT TRANSACTION;
END;
Go