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

25
.gitignore vendored Normal file
View File

@@ -0,0 +1,25 @@
### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk

6
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,6 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

12
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="@localhost" uuid="08e2a5a2-cf6b-45ef-a37f-21e661369fca">
<driver-ref>sqlserver.ms</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbc-driver>
<jdbc-url>jdbc:sqlserver://localhost</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

16
.idea/sqldialects.xml generated Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/Experiment2.1/Exp2-1.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Experiment3/Exp3-1.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Experiment3/Exp3-2.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250403/Q6.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250403/Q7.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250410/Q6.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250417/Work1.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250417/Work2.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250515/CreateTable.sql" dialect="TSQL" />
<file url="file://$PROJECT_DIR$/Homework/Homework250515/Homework250515.sql" dialect="TSQL" />
<file url="PROJECT" dialect="TSQL" />
</component>
</project>

BIN
Data/Homework250313.mdf Normal file

Binary file not shown.

BIN
Data/Homework250313_log.ldf Normal file

Binary file not shown.

BIN
Data/Homework250320.mdf Normal file

Binary file not shown.

BIN
Data/Homework250320_log.ldf Normal file

Binary file not shown.

BIN
Data/Homework250324.mdf Normal file

Binary file not shown.

BIN
Data/Homework250324_log.ldf Normal file

Binary file not shown.

BIN
Data/Homework250403.mdf Normal file

Binary file not shown.

BIN
Data/Homework250403_log.ldf Normal file

Binary file not shown.

BIN
Data/Homework250410.mdf Normal file

Binary file not shown.

BIN
Data/Homework250410_log.ldf Normal file

Binary file not shown.

BIN
Data/Homework250417.mdf Normal file

Binary file not shown.

BIN
Data/Homework250417_log.ldf Normal file

Binary file not shown.

BIN
Data/Homework250515.mdf Normal file

Binary file not shown.

BIN
Data/Homework250515_log.ldf Normal file

Binary file not shown.

BIN
Data/TPCH.mdf Normal file

Binary file not shown.

BIN
Data/TPCH_log.ldf Normal file

Binary file not shown.

95
Experiment1.1/Exp1-1.sql Normal file
View File

@@ -0,0 +1,95 @@
CREATE DATABASE TPCH;
Go
USE TPCH;
Go
CREATE SCHEMA Sales;
Go
CREATE TABLE Sales.Region
(
regionkey INTEGER PRIMARY KEY,
name CHAR(25),
comment VARCHAR(152)
);
CREATE TABLE Sales.Nation
(
nationkey INTEGER PRIMARY KEY,
name CHAR(25),
regionkey INTEGER REFERENCES Sales.Region (regionkey),
comment VARCHAR(152)
);
CREATE TABLE Sales.Supplier
(
suppkey INTEGER PRIMARY KEY,
name CHAR(25),
address VARCHAR(40),
nationkey INTEGER REFERENCES Sales.Nation (nationkey),
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101)
);
CREATE TABLE Sales.Part
(
partkey INTEGER PRIMARY KEY,
name VARCHAR(55),
mfgr CHAR(25),
brand CHAR(10),
type VARCHAR(25),
size INTEGER,
container CHAR(10),
retailprice REAL,
comment VARCHAR(23)
);
CREATE TABLE Sales.Partsupp
(
partkey INTEGER REFERENCES Sales.Part (partkey),
suppkey INTEGER REFERENCES Sales.Supplier (suppkey),
availqty INTEGER,
supplycost REAL,
comment VARCHAR(199),
PRIMARY KEY (partkey, suppkey)
);
CREATE TABLE Sales.Customer
(
custkey INTEGER PRIMARY KEY,
name VARCHAR(25),
address VARCHAR(40),
nationkey INTEGER REFERENCES Sales.Nation (nationkey),
phone CHAR(15),
acctbal REAL,
mktsegment CHAR(10),
comment VARCHAR(117)
);
CREATE TABLE Sales.Orders
(
orderkey INTEGER PRIMARY KEY,
custkey INTEGER REFERENCES Sales.Customer (custkey),
orderstatus CHAR(1),
totalprice REAL,
orderdate DATE,
orderpriority CHAR(15),
clerk CHAR(15),
shippriority INTEGER,
comment VARCHAR(79)
);
CREATE TABLE Sales.Lineitem
(
orderkey INTEGER REFERENCES Sales.Orders (orderkey),
partkey INTEGER REFERENCES Sales.Part (partkey),
suppkey INTEGER REFERENCES Sales.Supplier (suppkey),
linenumber INTEGER,
quantity REAL,
extendedprice REAL,
discount REAL,
tax REAL,
returnflag CHAR(1),
linestatus CHAR(1),
shipdate DATE,
commitdate DATE,
receiptdate DATE,
shipinstruct CHAR(25),
shipmode CHAR(10),
comment VARCHAR(44),
PRIMARY KEY (orderkey, linenumber),
FOREIGN KEY (partkey, suppkey) REFERENCES Sales.Partsupp (partkey, suppkey)
);
Go

BIN
Experiment1.1/Report.docx Normal file

Binary file not shown.

BIN
Experiment1.1/graph.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

53
Experiment1.2/Exp1-2.sql Normal file
View File

@@ -0,0 +1,53 @@
USE TPCH;
Go
-- 单表查询(实现投影操作)
-- 查询供应商的名称、地址和联系电话
SELECT name, address, phone
FROM Sales.Supplier;
Go
-- 单表查询(实现选择操作)
-- 查询最近一周内提交的总价大于1000元的订单的编号、顾客编号等订单的所有信息
SELECT *
FROM Sales.Orders
WHERE DATEDIFF(day, orderdate, GETDATE()) < 7 AND totalprice > 1000;
Go
-- 不带分组过滤条件的分组统计查询
-- 统计每个顾客的订购金额
SELECT C.custkey, SUM(O.totalprice)
FROM Sales.Customer C, Sales.Orders O
WHERE C.custkey = O.custkey
GROUP BY C.custkey;
Go
-- 带分组过滤条件的分组统计查询
-- 查询订单平均金额超过1000元的顾客编号及其姓名
SELECT C.custkey, MAX(C.name)
FROM Sales.Customer C, Sales.Orders O
WHERE C.custkey = O.custkey
GROUP BY C.custkey
HAVING AVG(O.totalprice) > 1000;
Go
-- 单表自身连接查询
-- 查询与“金仓集团”在同一个国家的供应商编号、名称和地址信息
SELECT F.suppkey, F.name, F.address
FROM Sales.Supplier F, Sales.Supplier S
WHERE F.nationkey = S.nationkey AND S.name = N'金仓集团';
Go
-- 两表连接查询(普通连接)
-- 查询供应价格大于零售价格的零件名、制造商名、零售价格和供应价格
SELECT P.name, P.mfgr, P.retailprice, PS.supplycost
FROM Sales.Part P, Sales.Partsupp PS
WHERE PS.supplycost > P.retailprice;
Go
-- 两表连接查询(自然连接)
-- 查询供应价格大于零售价格的零件名、制造商名、零售价格和供应价格
SELECT P.name, P.mfgr, P.retailprice, PS.supplycost
FROM Sales.Part P, Sales.Partsupp PS
WHERE P.partkey = PS.partkey
AND PS.supplycost > P.retailprice;
Go
-- 三表连接查询
-- 查询顾客“苏举库”订购的订单编号、总价及其订购的零件编号、数量和明细价格
SELECT O.orderkey, O.totalprice, L.partkey, L.quantity, L.extendedprice
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L
WHERE C.custkey = O.custkey AND O.orderkey = L.orderkey AND C.name = N'苏举库';
Go

BIN
Experiment1.2/Report.docx Normal file

Binary file not shown.

124
Experiment1.3/Exp1-3.sql Normal file
View File

@@ -0,0 +1,124 @@
Use TPCH;
Go
-- IN嵌套查询
-- 查询订购了“海大”制造的“船舶模拟驾驶舱”的顾客。
SELECT custkey, name
FROM Sales.Customer
WHERE custkey IN(
SELECT O.custkey
FROM Sales.Orders AS O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE O.orderkey = L.orderkey
AND L.partkey = PS.partkey
AND L.suppkey = PS.suppkey
AND PS.partkey = P.partkey
AND P.mfgr = N'海大' AND P.name = N'船舶模拟驾驶舱'
);
Go
-- 单层EXISTS嵌套查询
-- 查询没有购买过“海大”制造的“船舶模拟驾驶舱”的顾客。
SELECT custkey, name
FROM Sales.Customer C
WHERE NOT EXISTS(
SELECT O.custkey
FROM Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.partkey = PS.partkey
AND L.suppkey = PS.suppkey
AND PS.partkey = P.partkey
AND P.mfgr = N'海大' AND P.name = N'船舶模拟驾驶舱'
);
Go
-- 双层EXISTS嵌套查询
-- 查询至少购买过顾客“张三”购买过的全部零件的顾客姓名。
SELECT CA.name
FROM Sales.Customer CA
WHERE NOT EXISTS(
SELECT *
FROM Sales.Customer CB, Sales.Orders OB, Sales.Lineitem LB
WHERE CB.custkey = OB.custkey
AND OB.orderkey = LB.orderkey
AND CB.name = N'张三'
AND NOT EXISTS(
SELECT *
FROM Sales.Orders OC, Sales.Lineitem LC
WHERE CA.custkey = OC.custkey
AND OC.orderkey = LC.orderkey
AND LB.suppkey = LC.suppkey
AND LB.partkey = LC.partkey
)
);
Go
-- FROM子句中的嵌套查询
-- 查询订单平均金额超过1万元的顾客中的中国籍顾客信息。
SELECT C.*
FROM Sales.Customer C,(
SELECT custkey
FROM Sales.Orders
GROUP BY custkey
HAVING AVG(totalprice) > 10000
) B, Sales.Nation N
WHERE C.custkey = B.custkey
AND C.nationkey = N.nationkey
AND N.name = N'中国';
Go
-- 集合查询(交)
-- 查询顾客“张三”和“李四”都订购过的全部零件的信息。
SELECT P.*
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.suppkey = PS.suppkey
AND L.partkey = PS.partkey
AND PS.partkey = P.partkey
AND C.name = N'张三'
INTERSECT
SELECT P.*
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.suppkey = PS.suppkey
AND L.partkey = PS.partkey
AND PS.partkey = P.partkey
AND C.name = N'李四';
Go
-- 集合查询(并)
-- 查询顾客“张三”和“李四”订购的全部零件的信息。
SELECT P.*
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.suppkey = PS.suppkey
AND L.partkey = PS.partkey
AND PS.partkey = P.partkey
AND C.name = N'张三'
UNION
SELECT P.*
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.suppkey = PS.suppkey
AND L.partkey = PS.partkey
AND PS.partkey = P.partkey
AND C.name = N'李四';
Go
-- 集合查询(差)
-- 顾客“张三”订购过而“李四”没订购过的零件的信息。
SELECT P.*
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.suppkey = PS.suppkey
AND L.partkey = PS.partkey
AND PS.partkey = P.partkey
AND C.name = N'张三'
EXCEPT
SELECT P.*
FROM Sales.Customer C, Sales.Orders O, Sales.Lineitem L, Sales.Partsupp PS, Sales.Part P
WHERE C.custkey = O.custkey
AND O.orderkey = L.orderkey
AND L.suppkey = PS.suppkey
AND L.partkey = PS.partkey
AND PS.partkey = P.partkey
AND C.name = N'李四';
Go

BIN
Experiment1.3/Report.docx Normal file

Binary file not shown.

116
Experiment2.1/Exp2-1.sql Normal file
View File

@@ -0,0 +1,116 @@
Use master;
Go
-- 创建用户
-- 1. 为采购、销售和客户管理等三个部门的经理创建用户标识,要求具有创建用户和角色的权利。
CREATE ROLE DepartmentManager;
GRANT ALTER ANY USER TO DepartmentManager;
GRANT ALTER ANY ROLE TO DepartmentManager;
CREATE LOGIN David WITH PASSWORD = '123456';
CREATE USER David FOR LOGIN David;
ALTER ROLE DepartmentManager ADD MEMBER David;
CREATE LOGIN Tom WITH PASSWORD = '123456';
CREATE USER Tom FOR LOGIN Tom;
ALTER ROLE DepartmentManager ADD MEMBER Tom;
CREATE LOGIN Kathy WITH PASSWORD = '123456';
CREATE USER Kathy FOR LOGIN Kathy;
ALTER ROLE DepartmentManager ADD MEMBER Kathy;
Go
-- 2. 为采购、销售和客户经理等三个部门的职员创建用户标识和用户口令。
CREATE LOGIN Jeffery WITH PASSWORD = '123456';
CREATE USER Jeffery FOR LOGIN Jeffery;
CREATE LOGIN Jane WITH PASSWORD = '123456';
CREATE USER Jane FOR LOGIN Jane;
CREATE LOGIN Mike WITH PASSWORD = '123456';
CREATE USER Mike FOR LOGIN Mike;
Go
-- 创建角色并分配权限
-- 1. 为各个部门分别创建一个查询角色,并分配相应的查询权限。
CREATE ROLE PurchaseQueryRole;
GRANT SELECT ON Sales.Part TO PurchaseQueryRole;
GRANT SELECT ON Sales.Supplier TO PurchaseQueryRole;
GRANT SELECT ON Sales.Partsupp TO PurchaseQueryRole;
CREATE ROLE SalesQueryRole;
GRANT SELECT ON Sales.Orders TO SalesQueryRole;
GRANT SELECT ON Sales.Lineitem TO SalesQueryRole;
CREATE ROLE CustomerQueryRole;
GRANT SELECT ON Sales.Customer TO CustomerQueryRole;
GRANT SELECT ON Sales.Nation TO CustomerQueryRole;
GRANT SELECT ON Sales.Region TO CustomerQueryRole;
Go
-- 2. 为各个部门分别创建一个职员角色,对本部门信息具有查看、插入权限。
CREATE ROLE PurchaseEmployeeRole;
GRANT SELECT, INSERT ON Sales.Part TO PurchaseEmployeeRole;
GRANT SELECT, INSERT ON Sales.Supplier TO PurchaseEmployeeRole;
GRANT SELECT, INSERT ON Sales.Partsupp TO PurchaseEmployeeRole;
CREATE ROLE SalesEmployeeRole;
GRANT SELECT, INSERT ON Sales.Orders TO SalesEmployeeRole;
GRANT SELECT, INSERT ON Sales.Lineitem TO SalesEmployeeRole;
CREATE ROLE CustomerEmployeeRole;
GRANT SELECT, INSERT ON Sales.Customer TO CustomerEmployeeRole;
GRANT SELECT, INSERT ON Sales.Nation TO CustomerEmployeeRole;
GRANT SELECT, INSERT ON Sales.Region TO CustomerEmployeeRole;
Go
-- 3. 为各部门创建一个经理角色,相应角色对本部门的信息具有完全控制权限,对其他部门的信息具有查询权。经理有权给本部门职员分配权限。
CREATE ROLE PurchaseManagerRole;
GRANT CONTROL ON Sales.Part TO PurchaseManagerRole;
GRANT CONTROL ON Sales.Supplier TO PurchaseManagerRole;
GRANT CONTROL ON Sales.Partsupp TO PurchaseManagerRole;
GRANT SELECT ON Sales.Orders TO PurchaseManagerRole;
GRANT SELECT ON Sales.Lineitem TO PurchaseManagerRole;
GRANT SELECT ON Sales.Customer TO PurchaseManagerRole;
GRANT SELECT ON Sales.Nation TO PurchaseManagerRole;
GRANT SELECT ON Sales.Region TO PurchaseManagerRole;
GRANT ALTER ON ROLE::PurchaseEmployeeRole TO PurchaseManagerRole;
CREATE ROLE SalesManagerRole;
GRANT CONTROL ON Sales.Orders TO SalesManagerRole;
GRANT CONTROL ON Sales.Lineitem TO SalesManagerRole;
GRANT SELECT ON Sales.Part TO SalesManagerRole;
GRANT SELECT ON Sales.Supplier TO SalesManagerRole;
GRANT SELECT ON Sales.Partsupp TO SalesManagerRole;
GRANT SELECT ON Sales.Customer TO SalesManagerRole;
GRANT SELECT ON Sales.Nation TO SalesManagerRole;
GRANT SELECT ON Sales.Region TO SalesManagerRole;
GRANT ALTER ON ROLE::SalesEmployeeRole TO SalesManagerRole;
CREATE ROLE CustomerManagerRole;
GRANT CONTROL ON Sales.Customer TO CustomerManagerRole;
GRANT CONTROL ON Sales.Nation TO CustomerManagerRole;
GRANT CONTROL ON Sales.Region TO CustomerManagerRole;
GRANT SELECT ON Sales.Part TO CustomerManagerRole;
GRANT SELECT ON Sales.Supplier TO CustomerManagerRole;
GRANT SELECT ON Sales.Partsupp TO CustomerManagerRole;
GRANT SELECT ON Sales.Orders TO CustomerManagerRole;
GRANT SELECT ON Sales.Lineitem TO CustomerManagerRole;
GRANT ALTER ON ROLE::CustomerEmployeeRole TO CustomerManagerRole;
Go
-- 给用户分配权限
-- 1. 给各部门经理分配权限。
ALTER ROLE PurchaseManagerRole ADD MEMBER David;
ALTER ROLE SalesManagerRole ADD MEMBER Tom;
ALTER ROLE CustomerManagerRole ADD MEMBER Kathy;
Go
-- 2. 给各部门职员分配权限。
ALTER ROLE PurchaseEmployeeRole ADD MEMBER Jeffery;
ALTER ROLE SalesEmployeeRole ADD MEMBER Jane;
ALTER ROLE CustomerEmployeeRole ADD MEMBER Mike;
Go
-- 回收角色或用户权限
-- 1. 收回客户经理角色的销售信息查看权限。
REVOKE SELECT ON Sales.Orders FROM CustomerManagerRole;
REVOKE SELECT ON Sales.Lineitem FROM CustomerManagerRole;
Go
-- 2. 回收MIKE的客户部门职员权限。
ALTER ROLE CustomerEmployeeRole DROP MEMBER Mike;
Go
-- 验证权限分配正确性
-- 1. 以David用户名登录数据库验证采购部门经理的权限
EXECUTE AS USER = 'David';
SELECT * FROM Sales.Part;
DELETE * FROM Sales.Orders;
Go
-- 2. 回收MIKE的客户部门职员权限
ALTER ROLE CustomerEmployeeRole DROP MEMBER Mike;
SELECT * FROM Sales.Customer;
SELECT * FROM Sales.Part;
Go

79
Experiment3/Exp3-1.sql Normal file
View File

@@ -0,0 +1,79 @@
Use TPCH;
Go
-- (1) 创建表时定义实体完整性(列级实体完整性)
-- 定义供应商表的实体完整性。
CREATE TABLE Sales_Exp3.Supplier(
suppkey INT CONSTRAINT PK_Supplier PRIMARY KEY,
name CHAR(25),
address VARCHAR(40),
nationkey INT,
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101)
);
Go
DROP TABLE Sales_Exp3.Supplier;
Go
-- (2) 创建表时定义实体完整性(表级实体完整性)
-- 定义供应商表的实体完整性。
CREATE TABLE Sales_Exp3.Supplier (
suppkey INT,
name CHAR(25),
address VARCHAR(40),
nationkey INT,
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101),
CONSTRAINT PK_Supplier PRIMARY KEY (suppkey)
);
Go
DROP TABLE Sales_Exp3.Supplier;
Go
-- (3) 创建表后定义实体完整性
-- 定义供应商表。
CREATE TABLE Sales_Exp3.Supplier (
suppkey INT NOT NULL,
name CHAR(25),
address VARCHAR(40),
nationkey INT,
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101)
);
ALTER TABLE Sales_Exp3.Supplier /* 再修改供应商表,增加实体完整性 */
ADD CONSTRAINT PK_Supplier PRIMARY KEY (suppkey);
Go
-- (4) 定义实体完整性(主码由多个属性组成)
-- 定义供应关系表的实体完整性。
CREATE TABLE Sales_Exp3.PartSupp (
partkey INT,
suppkey INT,
availqty INT,
supplycost REAL,
comment VARCHAR(199),
PRIMARY KEY (partkey, suppkey)
);
/* 主码由多个属性组成,实体完整性必须定义在表级 */
Go
-- (5) 有多个候选码时定义实体完整性
-- 定义国家表的实体完整性其中nationkey和name都是候选码选择nationkey作为主码name上定义唯一性约束。
CREATE TABLE Sales_Exp3.nation (
nationkey INT CONSTRAINT PK_Nation PRIMARY KEY,
name CHAR(25) UNIQUE,
regionkey INT,
comment VARCHAR(152)
);
Go
-- (6) 删除实体完整性
-- 删除国家实体的主码。
ALTER TABLE Sales_Exp3.nation
DROP CONSTRAINT PK_Nation;
Go
-- (7) 增加两条相同记录,验证实体完整性是否起作用
/* 插入两条主码相同的记录就会违反实体完整性约束 */
INSERT INTO Sales_Exp3.Supplier (suppkey, name, address, nationkey, phone, acctbal, comment)
VALUES (11, 'test1', 'test1_addr', 101, '12345678', 0.0, 'test1_comment');
INSERT INTO Sales_Exp3.Supplier (suppkey, name, address, nationkey, phone, acctbal, comment)
VALUES (11, 'test2', 'test2_addr', 102, '23456789', 0.0, 'test2_comment');
Go
/* [23000][2627] 行 5: 违反了 PRIMARY KEY 约束“PK_Supplier”。不能在对象“Sales_Exp3.Supplier”中插入重复键。重复键值为 (11)。 */

105
Experiment3/Exp3-2.sql Normal file
View File

@@ -0,0 +1,105 @@
Use TPCH;
Go
-- (1) 创建表时定义参照完整性
-- 先定义地区表的实体完整性,再定义国家表上的参照完整性。
CREATE TABLE Sales_Exp3.region (
regionkey INT PRIMARY KEY,
name CHAR(25),
comment VARCHAR(152)
);
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT REFERENCES Sales_Exp3.region(regionkey), /* 列级参照完整性 */
comment VARCHAR(152)
);
-- OR
DROP TABLE Sales_Exp3.nation;
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT,
comment VARCHAR(152),
CONSTRAINT FK_Nation_Region FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey) /* 表级参照完整性 */
);
Go
DROP TABLE Sales_Exp3.nation;
Go
-- (2) 创建表后定义参照完整性
-- 定义国家表的参照完整性。
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT,
comment VARCHAR(152)
);
ALTER TABLE Sales_Exp3.nation
ADD CONSTRAINT FK_Nation_Region FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey);
Go
-- (3) 定义参照完整性(外码由多个属性组成)
-- 定义订单项目表的参照完整性。
CREATE TABLE Sales_Exp3.Supplier(suppkey INT PRIMARY KEY, name CHAR(25));
CREATE TABLE Sales_Exp3.Part(partkey INT PRIMARY KEY, name VARCHAR(55));
CREATE TABLE Sales_Exp3.Orders(orderkey INT PRIMARY KEY, orderdate DATE);
Go
CREATE TABLE Sales_Exp3.PartSupp (
partkey INT,
suppkey INT,
availqty INT,
supplycost REAL,
comment VARCHAR(199),
PRIMARY KEY (partkey, suppkey)
);
CREATE TABLE Sales_Exp3.Lineitem (
orderkey INT REFERENCES Sales_Exp3.Orders(orderkey),
partkey INT REFERENCES Sales_Exp3.Part(partkey),
suppkey INT REFERENCES Sales_Exp3.Supplier(suppkey),
linenumber INT,
quantity REAL,
extendedprice REAL,
discount REAL,
tax REAL,
returnflag CHAR(1),
linestatus CHAR(1),
shipdate DATE,
commitdate DATE,
receiptdate DATE,
shipinstruct CHAR(25),
shipmode CHAR(10),
comment VARCHAR(44),
PRIMARY KEY (orderkey, linenumber),
FOREIGN KEY (partkey, suppkey) REFERENCES Sales_Exp3.PartSupp(partkey, suppkey)
);
Go
DROP TABLE Sales_Exp3.nation;
Go
-- (4) 定义参照完整性的违约处理
-- 定义国家表的参照完整性,当删除或修改被参照表记录时,设置参照表中相应记录的值为空值。
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT NULL,
comment VARCHAR(152),
CONSTRAINT FK_Nation_regionkey
FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey)
ON DELETE SET NULL
ON UPDATE SET NULL
);
Go
-- (5) 删除参照完整性
-- 删除国家表的外码
ALTER TABLE Sales_Exp3.nation
DROP CONSTRAINT FK_Nation_regionkey;
Go
-- (6) 插入一条国家记录,验证参照完整性是否起作用
/* 插入一条国家记录,如果'1001'号地区记录不存在,违反参照完整性约束。 */
ALTER TABLE Sales_Exp3.nation
ADD CONSTRAINT PK_Nation_regionkey
FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey)
ON DELETE SET NULL
ON UPDATE SET NULL;
Go
INSERT INTO Sales_Exp3.nation (nationkey, name, regionkey, comment)
VALUES (1001, 'nation1', 1001, 'comment1');
Go
/* [23000][547] 行 1: INSERT 语句与 FOREIGN KEY 约束"PK_Nation_regionkey"冲突。该冲突发生于数据库"TPCH",表"Sales_Exp3.region", column 'regionkey'。 */

2
Experiment3/Exp3-3.sql Normal file
View File

@@ -0,0 +1,2 @@
Use TPCH;
Go

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

Binary file not shown.

BIN
数据库实验部分-2.pdf Normal file

Binary file not shown.