自学内容网 自学内容网

数据库系统设计-SQL语句

题目:

假设我们要为宿舍管理系统设计一个数据库,这个数据库包含用户,学生,宿舍,住宿,报修等信息。请用SQLY语句实现创建数据库,创建表,注意表中要实现各种完整性如建立主键,外键,check约束等,最后向每个表中输入5行数据。

一、表结构及样例数据

1. 学生表 (Student)

表结构:

列名数据类型允许空值说明
snoCHAR(8)NO主键,唯一标识学生
snameCHAR(8)NO学生姓名
ageSMALLINTYES学生年龄
sexCHAR(2)YES性别,仅限“男”或“女”
sdeptVARCHAR(50)YES学生所在的系别

样例数据:

snosnameagesexsdept
20210001张三20计算机系
20210002李四21电子信息系
20210003王五22土木工程系
20210004赵六19化学系
20210005孙七23物理系

2. 宿舍表 (Dormitory)

表结构:

列名数据类型允许空值说明
dorm_idCHAR(6)NO主键,唯一标识宿舍
capacitySMALLINTNO宿舍容量,必须大于0
availableSMALLINTYES当前可用床位数,限制范围在0到capacity之间

样例数据:

dorm_idcapacityavailable
A10143
A10242
B20164
B20265
C30188

3. 住宿表 (Accommodation)

表结构:

列名数据类型允许空值说明
accomm_idINTNO主键,自增字段
snoCHAR(8)NO外键,关联到学生表
dorm_idCHAR(6)NO外键,关联到宿舍表
start_dateDATENO入住宿舍的开始日期
end_dateDATEYES退宿日期,允许为空表示仍在住宿中

样例数据:

accomm_idsnodorm_idstart_dateend_date
120210001A1012024-09-01NULL
220210002A1022024-09-01NULL
320210003B2012023-09-012024-07-01
420210004B2022024-09-01NULL
520210005C3012024-08-15NULL

4. 报修表 (Repair)

表结构:

列名数据类型允许空值说明
repair_idINTNO主键,自增字段
dorm_idCHAR(6)NO外键,关联到宿舍表
report_dateDATENO报修日期
repair_descriptionVARCHAR(255)NO报修描述,说明故障或维修需求
statusVARCHAR(20)YES报修状态,仅限“待处理”、“处理中”、“已完成”

样例数据:

repair_iddorm_idreport_daterepair_descriptionstatus
1A1012024-10-01空调不制冷处理中
2A1022024-09-15门锁损坏已完成
3B2012024-08-20水管漏水待处理
4B2022024-10-05电灯不亮处理中
5C3012024-09-10床铺损坏已完成

5. 管理员表 (Admin)

表结构:

列名数据类型允许空值说明
admin_idCHAR(6)NO主键,唯一标识管理员
admin_nameCHAR(8)NO管理员姓名
phoneVARCHAR(15)NO管理员电话,仅限数字
dorm_idCHAR(6)NO外键,关联到宿舍表,表示负责的宿舍

样例数据:

admin_idadmin_namephonedorm_id
A001王老师13812345678A101
A002李老师13987654321A102
B001张老师13698765432B201
B002赵老师13587654321B202
C001孙老师13712345678C301

6. 访客登记表 (VisitorRegister)

表结构:

列名数据类型允许空值说明
visit_idINTNO主键,自增字段
visitor_nameCHAR(8)NO访客姓名
snoCHAR(8)YES外键,关联到学生表
visit_dateDATENO访问日期
visit_purposeVARCHAR(255)NO访问目的
admin_idCHAR(6)NO外键,关联到管理员表

样例数据:

visit_idvisitor_namesnovisit_datevisit_purposeadmin_id
1刘一202100012024-10-01探望朋友A001
2陈二202100022024-09-28递送物品A002
3张三202100032024-10-02参观校园B001
4李四NULL2024-10-03业务洽谈B002
5王五202100052024-10-05学习交流C001

二、 创建数据库并使用

-- 创建数据库
CREATE DATABASE DormitoryManagement;
--使用数据库
USE DormitoryManagement;

三、创建表并插入数据(完整代码)

-- 创建学生表,包括学号、姓名、年龄、性别和所在系的信息
CREATE TABLE Student (
    sno CHAR(8) PRIMARY KEY, -- 学号,主键
    sname CHAR(8) NOT NULL, -- 姓名,不允许为空
    age SMALLINT, -- 年龄
    sex CHAR(2) CHECK (sex IN ('男', '女')), -- 性别,限制为“男”或“女”
    sdept VARCHAR(50) -- 所在系,最多50个字符
);

-- 插入数据到学生表
INSERT INTO Student (sno, sname, age, sex, sdept) VALUES
('20210001', '张三', 20, '男', '计算机系'),
('20210002', '李四', 21, '女', '电子信息系'),
('20210003', '王五', 22, '男', '土木工程系'),
('20210004', '赵六', 19, '女', '化学系'),
('20210005', '孙七', 23, '男', '物理系');

-- 创建宿舍表,包括宿舍编号、最大容量和当前可用床位数
CREATE TABLE Dormitory (
    dorm_id CHAR(6) PRIMARY KEY, -- 宿舍编号,主键
    capacity SMALLINT CHECK (capacity > 0), -- 宿舍容量,必须大于0
    available SMALLINT -- 当前可用床位数
);

-- 插入数据到宿舍表
INSERT INTO Dormitory (dorm_id, capacity, available) VALUES
('A101', 4, 3),
('A102', 4, 2),
('B201', 6, 4),
('B202', 6, 5),
('C301', 8, 8);

-- 创建住宿表,记录学生住宿情况,包括住宿ID、学号、宿舍编号、入住日期和退宿日期
CREATE TABLE Accommodation (
    accomm_id INT IDENTITY PRIMARY KEY, -- 住宿ID,自增主键
    sno CHAR(8) FOREIGN KEY REFERENCES Student(sno), -- 学号,外键
    dorm_id CHAR(6) FOREIGN KEY REFERENCES Dormitory(dorm_id), -- 宿舍编号,外键
    start_date DATE NOT NULL, -- 入住日期,不允许为空
    end_date DATE -- 退宿日期
);

-- 插入数据到住宿表
INSERT INTO Accommodation (sno, dorm_id, start_date, end_date) VALUES
('20210001', 'A101', '2024-09-01', NULL),
('20210002', 'A102', '2024-09-01', NULL),
('20210003', 'B201', '2023-09-01', '2024-07-01'),
('20210004', 'B202', '2024-09-01', NULL),
('20210005', 'C301', '2024-08-15', NULL);

-- 创建报修表,记录宿舍的报修情况,包括报修ID、宿舍编号、报修日期、报修描述和状态
CREATE TABLE Repair (
    repair_id INT IDENTITY PRIMARY KEY, -- 报修ID,自增主键
    dorm_id CHAR(6) FOREIGN KEY REFERENCES Dormitory(dorm_id), -- 宿舍编号,外键
    report_date DATE NOT NULL, -- 报修日期,不允许为空
    repair_description VARCHAR(255) NOT NULL, -- 报修描述,不允许为空
    status VARCHAR(20) CHECK (status IN ('待处理', '处理中', '已完成')) -- 报修状态,限定为待处理、处理中或已完成
);

-- 插入数据到报修表
INSERT INTO Repair (dorm_id, report_date, repair_description, status) VALUES
('A101', '2024-10-01', '空调不制冷', '处理中'),
('A102', '2024-09-15', '门锁损坏', '已完成'),
('B201', '2024-08-20', '水管漏水', '待处理'),
('B202', '2024-10-05', '电灯不亮', '处理中'),
('C301', '2024-09-10', '床铺损坏', '已完成');

-- 创建管理员表,包括管理员ID、姓名、电话号码和管理的宿舍编号
CREATE TABLE Admin (
    admin_id CHAR(6) PRIMARY KEY, -- 管理员ID,主键
    admin_name CHAR(8) NOT NULL, -- 管理员姓名,不允许为空
    phone VARCHAR(15) CHECK (phone NOT LIKE '%[^0-9]%'), -- 电话号码,只允许数字
    dorm_id CHAR(6) FOREIGN KEY REFERENCES Dormitory(dorm_id) -- 管理的宿舍编号,外键
);

-- 插入数据到管理员表
INSERT INTO Admin (admin_id, admin_name, phone, dorm_id) VALUES
('A001', '王老师', '13812345678', 'A101'),
('A002', '李老师', '13987654321', 'A102'),
('B001', '张老师', '13698765432', 'B201'),
('B002', '赵老师', '13587654321', 'B202'),
('C001', '孙老师', '13712345678', 'C301');

-- 创建访客登记表,记录访客的访问情况,包括访客ID、访客姓名、学号、访问日期、访问目的和管理员ID
CREATE TABLE VisitorRegister (
    visit_id INT IDENTITY PRIMARY KEY, -- 访客ID,自增主键
    visitor_name CHAR(8) NOT NULL, -- 访客姓名,不允许为空
    sno CHAR(8) FOREIGN KEY REFERENCES Student(sno), -- 学号,外键
    visit_date DATE NOT NULL, -- 访问日期,不允许为空
    visit_purpose VARCHAR(255) NOT NULL, -- 访问目的,不允许为空
    admin_id CHAR(6) FOREIGN KEY REFERENCES Admin(admin_id) -- 管理员ID,外键
);

-- 插入数据到访客登记表
INSERT INTO VisitorRegister (visitor_name, sno, visit_date, visit_purpose, admin_id) VALUES
('刘一', '20210001', '2024-10-01', '探望朋友', 'A001'),
('陈二', '20210002', '2024-09-28', '递送物品', 'A002'),
('张三', '20210003', '2024-10-02', '参观校园', 'B001'),
('李四', NULL, '2024-10-03', '业务洽谈', 'B002'),
('王五', '20210005', '2024-10-05', '学习交流', 'C001');

-- 分离创建触发器的语句,以确保触发器的创建在单独的查询批次中进行
GO

-- 创建触发器,检查宿舍的available列的值范围
CREATE TRIGGER trg_check_available
ON Dormitory
AFTER INSERT, UPDATE
AS
BEGIN
    -- 检查available是否在0到capacity之间
    IF EXISTS (
        SELECT 1
        FROM inserted
        WHERE available < 0 OR available > capacity
    )
    BEGIN
        -- 如果available的值超出范围,触发错误并回滚事务
        RAISERROR('The available value must be between 0 and capacity.', 16, 1);
        ROLLBACK TRANSACTION;
    END
END;

三、创建表并插入数据(拆分)

1. 创建表

学生表(Student)

-- 创建学生表,包括学号、姓名、年龄、性别和所在系的信息
CREATE TABLE Student (
    sno CHAR(8) PRIMARY KEY, -- 学号,主键
    sname CHAR(8) NOT NULL, -- 姓名,不允许为空
    age SMALLINT, -- 年龄
    sex CHAR(2) CHECK (sex IN ('男', '女')), -- 性别,限制为“男”或“女”
    sdept VARCHAR(50) -- 所在系,最多50个字符
);

宿舍表(Dormitory)

-- 创建宿舍表,包括宿舍编号、最大容量和当前可用床位数
CREATE TABLE Dormitory (
    dorm_id CHAR(6) PRIMARY KEY, -- 宿舍编号,主键
    capacity SMALLINT CHECK (capacity > 0), -- 宿舍容量,必须大于0
    available SMALLINT -- 当前可用床位数
);

触发器说明

  • trg_check_available: 用于在插入或更新Dormitory表时,确保available(可用床位数)在0到capacity(宿舍容量)之间。
  • (创建触发器,实现“available在0到capacity之间”),该代码放在最后以确保触发器的创建在单独的查询批次中进行:
-- 分离创建触发器的语句,以确保触发器的创建在单独的查询批次中进行
GO

-- 创建触发器,检查宿舍的available列的值范围
CREATE TRIGGER trg_check_available
ON Dormitory
AFTER INSERT, UPDATE
AS
BEGIN
    -- 检查available是否在0到capacity之间
    IF EXISTS (
        SELECT 1
        FROM inserted
        WHERE available < 0 OR available > capacity
    )
    BEGIN
        -- 如果available的值超出范围,触发错误并回滚事务
        RAISERROR('The available value must be between 0 and capacity.', 16, 1);
        ROLLBACK TRANSACTION;
    END
END;

住宿表(Accommodation)

-- 创建住宿表,记录学生住宿情况,包括住宿ID、学号、宿舍编号、入住日期和退宿日期
CREATE TABLE Accommodation (
    accomm_id INT IDENTITY PRIMARY KEY, -- 住宿ID,自增主键
    sno CHAR(8) FOREIGN KEY REFERENCES Student(sno), -- 学号,外键
    dorm_id CHAR(6) FOREIGN KEY REFERENCES Dormitory(dorm_id), -- 宿舍编号,外键
    start_date DATE NOT NULL, -- 入住日期,不允许为空
    end_date DATE -- 退宿日期
);

报修表(Repair)

-- 创建报修表,记录宿舍的报修情况,包括报修ID、宿舍编号、报修日期、报修描述和状态
CREATE TABLE Repair (
    repair_id INT IDENTITY PRIMARY KEY, -- 报修ID,自增主键
    dorm_id CHAR(6) FOREIGN KEY REFERENCES Dormitory(dorm_id), -- 宿舍编号,外键
    report_date DATE NOT NULL, -- 报修日期,不允许为空
    repair_description VARCHAR(255) NOT NULL, -- 报修描述,不允许为空
    status VARCHAR(20) CHECK (status IN ('待处理', '处理中', '已完成')) -- 报修状态,限定为待处理、处理中或已完成
);

管理员表(Admin)

-- 创建管理员表,包括管理员ID、姓名、电话号码和管理的宿舍编号
CREATE TABLE Admin (
    admin_id CHAR(6) PRIMARY KEY, -- 管理员ID,主键
    admin_name CHAR(8) NOT NULL, -- 管理员姓名,不允许为空
    phone VARCHAR(15) CHECK (phone NOT LIKE '%[^0-9]%'), -- 电话号码,只允许数字
    dorm_id CHAR(6) FOREIGN KEY REFERENCES Dormitory(dorm_id) -- 管理的宿舍编号,外键
);

访客登记表(VisitorRegister)

-- 创建访客登记表,记录访客的访问情况,包括访客ID、访客姓名、学号、访问日期、访问目的和管理员ID
CREATE TABLE VisitorRegister (
    visit_id INT IDENTITY PRIMARY KEY, -- 访客ID,自增主键
    visitor_name CHAR(8) NOT NULL, -- 访客姓名,不允许为空
    sno CHAR(8) FOREIGN KEY REFERENCES Student(sno), -- 学号,外键
    visit_date DATE NOT NULL, -- 访问日期,不允许为空
    visit_purpose VARCHAR(255) NOT NULL, -- 访问目的,不允许为空
    admin_id CHAR(6) FOREIGN KEY REFERENCES Admin(admin_id) -- 管理员ID,外键
);

2. 插入数据

向学生表插入数据

-- 插入数据到学生表
INSERT INTO Student (sno, sname, age, sex, sdept) VALUES
('20210001', '张三', 20, '男', '计算机系'),
('20210002', '李四', 21, '女', '电子信息系'),
('20210003', '王五', 22, '男', '土木工程系'),
('20210004', '赵六', 19, '女', '化学系'),
('20210005', '孙七', 23, '男', '物理系');

向宿舍表插入数据

-- 插入数据到宿舍表
INSERT INTO Dormitory (dorm_id, capacity, available) VALUES
('A101', 4, 3),
('A102', 4, 2),
('B201', 6, 4),
('B202', 6, 5),
('C301', 8, 8);

向住宿表插入数据

-- 插入数据到住宿表
INSERT INTO Accommodation (sno, dorm_id, start_date, end_date) VALUES
('20210001', 'A101', '2024-09-01', NULL),
('20210002', 'A102', '2024-09-01', NULL),
('20210003', 'B201', '2023-09-01', '2024-07-01'),
('20210004', 'B202', '2024-09-01', NULL),
('20210005', 'C301', '2024-08-15', NULL);

向报修表插入数据

-- 插入数据到报修表
INSERT INTO Repair (dorm_id, report_date, repair_description, status) VALUES
('A101', '2024-10-01', '空调不制冷', '处理中'),
('A102', '2024-09-15', '门锁损坏', '已完成'),
('B201', '2024-08-20', '水管漏水', '待处理'),
('B202', '2024-10-05', '电灯不亮', '处理中'),
('C301', '2024-09-10', '床铺损坏', '已完成');

向管理员表插入数据

-- 插入数据到管理员表
INSERT INTO Admin (admin_id, admin_name, phone, dorm_id) VALUES
('A001', '王老师', '13812345678', 'A101'),
('A002', '李老师', '13987654321', 'A102'),
('B001', '张老师', '13698765432', 'B201'),
('B002', '赵老师', '13587654321', 'B202'),
('C001', '孙老师', '13712345678', 'C301');

向访客登记表插入数据

-- 插入数据到访客登记表
INSERT INTO VisitorRegister (visitor_name, sno, visit_date, visit_purpose, admin_id) VALUES
('刘一', '20210001', '2024-10-01', '探望朋友', 'A001'),
('陈二', '20210002', '2024-09-28', '递送物品', 'A002'),
('张三', '20210003', '2024-10-02', '参观校园', 'B001'),
('李四', NULL, '2024-10-03', '业务洽谈', 'B002'),
('王五', '20210005', '2024-10-05', '学习交流', 'C001');

原文地址:https://blog.csdn.net/m0_74102736/article/details/142959393

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!