commit ea8d38c146a5826fb105a6a675b49d2302a43d2b Author: Launchcore Date: Thu Nov 6 09:53:12 2025 +0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..032dff6 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..8bf4d45 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,6 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..2b31a31 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlserver.ms + true + com.microsoft.sqlserver.jdbc.SQLServerDriver + jdbc:sqlserver://localhost + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..09710bf --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Data/Homework250313.mdf b/Data/Homework250313.mdf new file mode 100644 index 0000000..6cd012e Binary files /dev/null and b/Data/Homework250313.mdf differ diff --git a/Data/Homework250313_log.ldf b/Data/Homework250313_log.ldf new file mode 100644 index 0000000..e9de070 Binary files /dev/null and b/Data/Homework250313_log.ldf differ diff --git a/Data/Homework250320.mdf b/Data/Homework250320.mdf new file mode 100644 index 0000000..8a332fe Binary files /dev/null and b/Data/Homework250320.mdf differ diff --git a/Data/Homework250320_log.ldf b/Data/Homework250320_log.ldf new file mode 100644 index 0000000..de464e7 Binary files /dev/null and b/Data/Homework250320_log.ldf differ diff --git a/Data/Homework250324.mdf b/Data/Homework250324.mdf new file mode 100644 index 0000000..87aeb4d Binary files /dev/null and b/Data/Homework250324.mdf differ diff --git a/Data/Homework250324_log.ldf b/Data/Homework250324_log.ldf new file mode 100644 index 0000000..42c6b6b Binary files /dev/null and b/Data/Homework250324_log.ldf differ diff --git a/Data/Homework250403.mdf b/Data/Homework250403.mdf new file mode 100644 index 0000000..a37987e Binary files /dev/null and b/Data/Homework250403.mdf differ diff --git a/Data/Homework250403_log.ldf b/Data/Homework250403_log.ldf new file mode 100644 index 0000000..3db8bfa Binary files /dev/null and b/Data/Homework250403_log.ldf differ diff --git a/Data/Homework250410.mdf b/Data/Homework250410.mdf new file mode 100644 index 0000000..f2a1d65 Binary files /dev/null and b/Data/Homework250410.mdf differ diff --git a/Data/Homework250410_log.ldf b/Data/Homework250410_log.ldf new file mode 100644 index 0000000..0587d96 Binary files /dev/null and b/Data/Homework250410_log.ldf differ diff --git a/Data/Homework250417.mdf b/Data/Homework250417.mdf new file mode 100644 index 0000000..6959f8b Binary files /dev/null and b/Data/Homework250417.mdf differ diff --git a/Data/Homework250417_log.ldf b/Data/Homework250417_log.ldf new file mode 100644 index 0000000..b7b9301 Binary files /dev/null and b/Data/Homework250417_log.ldf differ diff --git a/Data/Homework250515.mdf b/Data/Homework250515.mdf new file mode 100644 index 0000000..2b33afa Binary files /dev/null and b/Data/Homework250515.mdf differ diff --git a/Data/Homework250515_log.ldf b/Data/Homework250515_log.ldf new file mode 100644 index 0000000..9acd7d6 Binary files /dev/null and b/Data/Homework250515_log.ldf differ diff --git a/Data/TPCH.mdf b/Data/TPCH.mdf new file mode 100644 index 0000000..f38912e Binary files /dev/null and b/Data/TPCH.mdf differ diff --git a/Data/TPCH_log.ldf b/Data/TPCH_log.ldf new file mode 100644 index 0000000..4c8a001 Binary files /dev/null and b/Data/TPCH_log.ldf differ diff --git a/Experiment1.1/Exp1-1.sql b/Experiment1.1/Exp1-1.sql new file mode 100644 index 0000000..3a2611c --- /dev/null +++ b/Experiment1.1/Exp1-1.sql @@ -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 \ No newline at end of file diff --git a/Experiment1.1/Report.docx b/Experiment1.1/Report.docx new file mode 100644 index 0000000..b9f8ae9 Binary files /dev/null and b/Experiment1.1/Report.docx differ diff --git a/Experiment1.1/graph.png b/Experiment1.1/graph.png new file mode 100644 index 0000000..2d48dd0 Binary files /dev/null and b/Experiment1.1/graph.png differ diff --git a/Experiment1.2/Exp1-2.sql b/Experiment1.2/Exp1-2.sql new file mode 100644 index 0000000..6825d61 --- /dev/null +++ b/Experiment1.2/Exp1-2.sql @@ -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 diff --git a/Experiment1.2/Report.docx b/Experiment1.2/Report.docx new file mode 100644 index 0000000..ca746b5 Binary files /dev/null and b/Experiment1.2/Report.docx differ diff --git a/Experiment1.3/Exp1-3.sql b/Experiment1.3/Exp1-3.sql new file mode 100644 index 0000000..eeca94e --- /dev/null +++ b/Experiment1.3/Exp1-3.sql @@ -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 \ No newline at end of file diff --git a/Experiment1.3/Report.docx b/Experiment1.3/Report.docx new file mode 100644 index 0000000..e5c995c Binary files /dev/null and b/Experiment1.3/Report.docx differ diff --git a/Experiment2.1/Exp2-1.sql b/Experiment2.1/Exp2-1.sql new file mode 100644 index 0000000..b126a1d --- /dev/null +++ b/Experiment2.1/Exp2-1.sql @@ -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 \ No newline at end of file diff --git a/Experiment3/Exp3-1.sql b/Experiment3/Exp3-1.sql new file mode 100644 index 0000000..e4d13a3 --- /dev/null +++ b/Experiment3/Exp3-1.sql @@ -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)。 */ \ No newline at end of file diff --git a/Experiment3/Exp3-2.sql b/Experiment3/Exp3-2.sql new file mode 100644 index 0000000..ce4a7a5 --- /dev/null +++ b/Experiment3/Exp3-2.sql @@ -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'。 */ \ No newline at end of file diff --git a/Experiment3/Exp3-3.sql b/Experiment3/Exp3-3.sql new file mode 100644 index 0000000..aa8df54 --- /dev/null +++ b/Experiment3/Exp3-3.sql @@ -0,0 +1,2 @@ +Use TPCH; +Go diff --git a/Homework/Homework250313/CreateTable.sql b/Homework/Homework250313/CreateTable.sql new file mode 100644 index 0000000..53ac2dd --- /dev/null +++ b/Homework/Homework250313/CreateTable.sql @@ -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) +); \ No newline at end of file diff --git a/Homework/Homework250313/InsertData.sql b/Homework/Homework250313/InsertData.sql new file mode 100644 index 0000000..29e97b8 --- /dev/null +++ b/Homework/Homework250313/InsertData.sql @@ -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); \ No newline at end of file diff --git a/Homework/Homework250313/Query.sql b/Homework/Homework250313/Query.sql new file mode 100644 index 0000000..6f56d83 --- /dev/null +++ b/Homework/Homework250313/Query.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250320/Query.sql b/Homework/Homework250320/Query.sql new file mode 100644 index 0000000..b9d222f --- /dev/null +++ b/Homework/Homework250320/Query.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250324/Homework250324.sql b/Homework/Homework250324/Homework250324.sql new file mode 100644 index 0000000..c50efd7 --- /dev/null +++ b/Homework/Homework250324/Homework250324.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250327/Homework250327.sql b/Homework/Homework250327/Homework250327.sql new file mode 100644 index 0000000..59e6be1 --- /dev/null +++ b/Homework/Homework250327/Homework250327.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250403/1.txt b/Homework/Homework250403/1.txt new file mode 100644 index 0000000..dd404fa --- /dev/null +++ b/Homework/Homework250403/1.txt @@ -0,0 +1,5 @@ +1. 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。 +4. 用户身份鉴别、多层存取控制、审计、视图和数据加密等。 +用户身份鉴别方法有静态口令鉴别、动态口令鉴别、生物特征鉴别、智能卡鉴别。 +存取控制包括定义用户权限和合法权限检查两部分。 +数据加密主要包括存储加密和传输加密。 \ No newline at end of file diff --git a/Homework/Homework250403/Q6.sql b/Homework/Homework250403/Q6.sql new file mode 100644 index 0000000..afe3d50 --- /dev/null +++ b/Homework/Homework250403/Q6.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250403/Q7.sql b/Homework/Homework250403/Q7.sql new file mode 100644 index 0000000..2c246bd --- /dev/null +++ b/Homework/Homework250403/Q7.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250410/1.txt b/Homework/Homework250410/1.txt new file mode 100644 index 0000000..7d5f415 --- /dev/null +++ b/Homework/Homework250410/1.txt @@ -0,0 +1,2 @@ +1. 数据库的完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反应当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。 +4. 提供定义完整性约束条件的机制、提供完整性检查的方法、进行违约处理 \ No newline at end of file diff --git a/Homework/Homework250410/Q6.sql b/Homework/Homework250410/Q6.sql new file mode 100644 index 0000000..20ad454 --- /dev/null +++ b/Homework/Homework250410/Q6.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250417/Work1.sql b/Homework/Homework250417/Work1.sql new file mode 100644 index 0000000..64967c1 --- /dev/null +++ b/Homework/Homework250417/Work1.sql @@ -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 \ No newline at end of file diff --git a/Homework/Homework250417/Work2.sql b/Homework/Homework250417/Work2.sql new file mode 100644 index 0000000..46f16a6 --- /dev/null +++ b/Homework/Homework250417/Work2.sql @@ -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 diff --git a/Homework/Homework250508/1.docx b/Homework/Homework250508/1.docx new file mode 100644 index 0000000..45ef13f Binary files /dev/null and b/Homework/Homework250508/1.docx differ diff --git a/Homework/Homework250512/1.docx b/Homework/Homework250512/1.docx new file mode 100644 index 0000000..6afc0ad Binary files /dev/null and b/Homework/Homework250512/1.docx differ diff --git a/Homework/Homework250515/CreateTable.sql b/Homework/Homework250515/CreateTable.sql new file mode 100644 index 0000000..853f5d3 --- /dev/null +++ b/Homework/Homework250515/CreateTable.sql @@ -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) +); diff --git a/Homework/Homework250515/Homework250515.sql b/Homework/Homework250515/Homework250515.sql new file mode 100644 index 0000000..6d3cb5a --- /dev/null +++ b/Homework/Homework250515/Homework250515.sql @@ -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 \ No newline at end of file diff --git a/学院实验报告册模板.dot b/学院实验报告册模板.dot new file mode 100644 index 0000000..5f02dcb Binary files /dev/null and b/学院实验报告册模板.dot differ diff --git a/数据库实验部分-2.pdf b/数据库实验部分-2.pdf new file mode 100644 index 0000000..74f7fbb Binary files /dev/null and b/数据库实验部分-2.pdf differ