yjw 7 months ago
parent 52697bb1b5
commit e1bd386d81

@ -0,0 +1,667 @@
-- 创建数据库
CREATE DATABASE supermarket OWNER yjw;
-- 表空间
CREATE TABLESPACE products RELATIVE LOCATION 'tablespace/products';
CREATE TABLESPACE money RELATIVE LOCATION 'tablespace/money';
CREATE TABLESPACE employee RELATIVE LOCATION 'tablespace/employee';
CREATE TABLESPACE customers RELATIVE LOCATION 'tablespace/customers';
CREATE TABLESPACE caigou RELATIVE LOCATION 'tablespace/caigou';
-- 模式
CREATE SCHEMA admin;
CREATE SCHEMA public;
CREATE SCHEMA purchase;
CREATE SCHEMA sale;
-- 创建序列
CREATE SEQUENCE empID START 1 INCREMENT 1 MAXVALUE 200 CACHE 1;
CREATE SEQUENCE productTypeID START 2001 INCREMENT 1 MAXVALUE 700 CACHE 1;
CREATE SEQUENCE vipI START 700 INCREMENT 1 MAXVALUE 200000 CACHE 1;
CREATE SEQUENCE productID START 200001 INCREMENT 1 MAXVALUE 2000000 CACHE 1;
CREATE SEQUENCE inventoryID START 2000001 INCREMENT 1 MAXVALUE 3000000 CACHE 1;
CREATE SEQUENCE supplierID START 3000001 INCREMENT 1 MAXVALUE 350000 CACHE 1;
CREATE SEQUENCE purchaseID START 3500001 INCREMENT 1 MAXVALUE 5000000 CACHE 1;
CREATE SEQUENCE salesPromotionID START 5000001 INCREMENT 1 MAXVALUE 6000000 CACHE 1;
CREATE SEQUENCE salaryID START 6000001 INCREMENT 1 MAXVALUE 7000000 CACHE 1;
CREATE SEQUENCE financialStatementID START 7000001 INCREMENT 1 MAXVALUE 8000000 CACHE 1;
CREATE SEQUENCE sellID START 8000001 INCREMENT 1 CACHE 1;
-- 创建表
-- 员工表:
CREATE TABLE admin.employees (
emp_id INT PRIMARY KEY DEFAULT nextval('empID'),
emp_name VARCHAR(20) NOT NULL,
emp_gender CHAR(3) NOT NULL CHECK(emp_gender IN ('','')),
emp_age INT NOT NULL,
emp_contactInfo VARCHAR(11) NOT NULL,
emp_position VARCHAR(20) NOT NULL,
hiredate DATE NOT NULL DEFAULT CURRENT_DATE
)TABLESPACE employee;
-- 商品类型表:
CREATE TABLE sale.product_type (
category_id INT PRIMARY KEY DEFAULT nextval('productTypeID'),
category_name VARCHAR(20) NOT NULL,
notes TEXT DEFAULT ('')
)TABLESPACE products;
-- 商品表:
CREATE TABLE sale.products (
product_id INT PRIMARY KEY DEFAULT nextval('productID'),
product_name VARCHAR(40) NOT NULL,
category_id INT REFERENCES product_type(category_id),
brand VARCHAR(20) NOT NULL DEFAULT '',
purchase_price DECIMAL(10, 2) NOT NULL,
selling_price DECIMAL(10, 2) NOT NULL,
member_price DECIMAL(10, 2) NOT NUL,
stock_quantity FLOAT NOT NULL CHECK (stock_quantity >= 0)
)TABLESPACE products;
-- 会员表:
CREATE TABLE sale.members (
member_id INT PRIMARY KEY DEFAULT nextval('vipID'),
member_name VARCHAR(20) NOT NULL,
member_gender CHAR(3) NOT NULL DEFAULT '' CHECK (member_gender IN ('', '')),
member_age INT,
member_contactInfo VARCHAR(11) NOT NULL,
member_level INT NOT NULL DEFAULT 0,
points INT NOT NULL DEFAULT 0
)TABLESPACE member;
-- 库存表:
CREATE TABLE public.inventory (
inventory_id INT PRIMARY KEY DEFAULT nextval('inventoryID'),
product_id INT REFERENCES products(product_id),
stock_quantity FLOAT NOT NULL CHECK (stock_quantity >= 0),
stock_upper_limit FLOAT NOT NULL CHECK (stock_upper_limit >= 0),
stock_lower_limit FLOAT NOT NULL CHECK (stock_lower_limit >= 0),
inbound_date DATE NOT NULL,
outbound_date DATE NOT NULL
)TABLESPACE caigou;
-- 供应商表:
CREATE TABLE purchase.suppliers (
supplier_id INT PRIMARY KEY DEFAULT nextval('supplierID'),
supplier_name VARCHAR(20) NOT NULL,
supplier_contact_person_name VARCHAR(20) NOT NULL,
supplier_contact_info VARCHAR(11) NOT NULL,
supplied_product INT REFERENCES products(product_id)
)TABLESPACE caigou;
-- 促销活动表:
CREATE TABLE sale.sale_promotion (
promotion_id INT PRIMARY KEY DEFAULT nextval('salesPromotionID'),
promotion_name VARCHAR(20) NOT NULL,
start_date DATE NOT NULL DEFAULT CURRENT_DATE,
end_date DATE NOT NULL,
discount_rate FLOAT NOT NULL CHECK (discount_rate > 0 AND discount_rate < 1)
)TABLESPACE products;
-- 采购订单表:
CREATE TABLE purchase.purchase_order (
order_id INT PRIMARY KEY DEFAULT nextval('purchaseID'),
supplier_id INT NOT NULL REFERENCES suppliers(supplier_id),
emp_id INT NOT NULL REFERENCES employees(emp_id),
product_id INT NOT NULL REFERENCES products(product_id),
order_date DATE NOT NULL DEFAULT CURRENT_DATE,
estimated_delivery_date DATE NOT NULL,
total_price DECIMAL(10, 2) NOT NULL CHECK (total_price > 0),
order_status VARCHAR(5) NOT NULL,
product_quantity FLOAT NOT NULL CHECK (product_quantity > 0)
)TABLESPACE caigou;
-- 工资表:
CREATE TABLE public.salaries (
salary_id INT PRIMARY KEY DEFAULT nextval('salaryID'),
emp_id INT NOT NULL REFERENCES employees(emp_id),
basic_salary DECIMAL(10, 2) NOT NULL CHECK (basic_salary > 0),
performance_salary DECIMAL(10, 2) NOT NULL DEFAULT 0,
bonus DECIMAL(10, 2) NOT NULL DEFAULT 0,
deduction DECIMAL(10, 2) NOT NULL DEFAULT 0,
actual_salary DECIMAL(10, 2) NOT NULL,
payment_date DATE NOT NULL
)TABLESPACE employee;
-- 财务报表:
CREATE TABLE admin.financial_reports (
report_id INT PRIMARY KEY DEFAULT nextval('financialStatementID'),
sales_revenue DECIMAL(10, 2) NOT NULL DEFAULT 0,
procurement_cost DECIMAL(10, 2) NOT NULL DEFAULT 0,
emp_wage_cost DECIMAL(10, 2) NOT NULL DEFAULT 0,
rent_and_utilities DECIMAL(10, 2) NOT NULL DEFAULT 0,
net_profit DECIMAL(10, 2) NOT NULL DEFAULT 0,
report_start_date DATE NOT NULL,
report_end_date DATE NOT NULL CHECK (report_start_date < report_end_date)
)TABLESPACE money;
-- 商品促销表:
CREATE TABLE sale.product_promotion (
promotion_id INT,
product_id INT,
discount_rate FLOAT NOT NULL CHECK (discount_rate > 0 AND discount_rate < 1),
PRIMARY KEY (promotion_id, product_id),
FOREIGN KEY (promotion_id) REFERENCES sale_promotion(promotion_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
)TABLESPACE products;
-- 销售记录表:
CREATE TABLE sale.sales (
sale_id INT DEFAULT nextval('sellID'),
emp_id INT,
product_id INT,
member_id INT,
sale_quantity FLOAT NOT NULL CHECK (sale_quantity > 0),
sale_time DATE NOT NULL DEFAULT CURRENT_DATE,
PRIMARY KEY (sale_id, emp_id, product_id, member_id),
FOREIGN KEY (emp_id) REFERENCES employees(emp_id),
FOREIGN KEY (product_id) REFERENCES products(product_id),
FOREIGN KEY (member_id) REFERENCES members(member_id)
)TABLESPACE money;
-- 数据初始化脚本
-- 员工表初始化:
INSERT INTO admin.employees (emp_name, emp_age, emp_gender, emp_contactinfo, emp_position, password) VALUES
('喻佳文', 20, '', 18702616716, '管理员', 'admin'),
('吴天宇', 20, '', 18702616716, '售货员', '123456'),
('test', 20, '', 18702616716, '管理员', '123456'),
('Bob', 30, '', 12345678912, '采购员', '123456'),
('Alice', 20, '', 12345678912, '采购员', '123456'),
('Mark', 33, '', 12345678912, '售货员', '123456'),
('嵙嵙', 18, '', 12345678912, '售货员', '123456'),
('张三', 30, '', 12345678912, '售货员', '123456'),
('李四', 20, '', 12345678912, '采购员', '123456'),
('王五', 33, '', 12345678912, '售货员', '123456');
-- 工资表初始化:
INSERT INTO public.salaries (emp_id, basic_salary, performance_salary, bonus, deduction, payment_date) VALUES
(8, 6455.96, 187.16, 65.53, 558.94, TO_DATE('2024-03-10 17:22:39', 'YYYY-MM-DD HH24:MI:SS')),
(10, 5623.29, 305.80, 764.70, 988.92, TO_DATE('2023-04-15 16:50:22', 'YYYY-MM-DD HH24:MI:SS')),
(5, 8750.76, 137.45, 448.72, 955.63, TO_DATE('2024-02-25 10:58:13', 'YYYY-MM-DD HH24:MI:SS')),
(7, 5747.54, 382.15, 863.73, 675.80, TO_DATE('2022-12-07 17:29:09', 'YYYY-MM-DD HH24:MI:SS')),
(9, 7717.88, 853.36, 883.65, 831.46, TO_DATE('2023-08-05 09:26:51', 'YYYY-MM-DD HH24:MI:SS')),
(3, 6080.88, 244.53, 881.90, 543.34, TO_DATE('2024-08-28 13:33:40', 'YYYY-MM-DD HH24:MI:SS')),
(5, 8886.48, 403.13, 317.58, 993.22, TO_DATE('2024-12-06 14:01:44', 'YYYY-MM-DD HH24:MI:SS')),
(3, 9328.66, 359.43, 574.67, 496.32, TO_DATE('2024-02-08 17:54:40', 'YYYY-MM-DD HH24:MI:SS')),
(4, 9275.54, 447.25, 357.84, 463.25, TO_DATE('2023-12-17 15:39:34', 'YYYY-MM-DD HH24:MI:SS')),
(1, 7864.91, 304.06, 709.95, 248.94, TO_DATE('2023-11-10 12:40:41', 'YYYY-MM-DD HH24:MI:SS'));
-- 商品类型表初始化:
INSERT INTO sale.product_type ( category_name, notes )
VALUES
( '食品', '需冷藏' ),
( '日用品', '易碎品小心存放' ),
( '饮料', '注意保质期' ),
( '文具', '防潮' ),
( '玩具', '注意安全' ),
( '电器', '防潮防尘' ),
( '服装', '注意洗涤方式' ),
( '书籍', '防潮防虫' ),
( '化妆品', '注意保质期' ),
( '数码产品', '不能接触水' );
-- 商品表初始化:
INSERT INTO sale.products ( product_name, category_id, brand, purchase_price, selling_price, member_price, stock_quantity )
VALUES
('牛奶',2003,'蒙牛',21.00,35.00,32.00,0),
('洗发水',2009,'清扬',11.00,23.00,20.00,0),
('饼干',2001,'徐福记',20.00,33.00,30.00,0),
('三体',2008,'人民文学出版社',40.00,55.00,50.00,0),
('遥控汽车',2005,'顽皮龙',33.00,45.00,40.00,0),
('男士短袖',2007,'李宁',45.00,60.00,57.00,0),
('照相机',2010,'尼康',3000.00,3400.00,3379.00,0),
('签字笔',2004,'晨光',3.00,8.00,6.00,0),
('空调',2006,'格力',1999.00,2500.00,2399.00,0),
('牙刷',2002,'小鹿妈妈',9.00,14.00,12.00,0);
-- 商品促销表初始化:
INSERT INTO sale.product_promotion ( promotion_id, product_id )
VALUES
(5000001,200001),
(5000001,200002),
(5000001,200003),
(5000001,200004),
(5000001,200005),
(5000002,200003),
(5000005,200005),
(5000002,200007),
(5000002,200006),
(5000002,200004);
-- 会员表初始化:
INSERT INTO sale.members ( member_name, member_gender, member_age, member_contactinfo, member_level, points )
VALUES
('会员1','', 20, '13670000000', 2, 200),
('会员2','', 20, '13670000000', 1, 100),
('会员3','', 20, '13670000000', 2, 200),
('会员4','', 20, '13670000000', 3, 300),
('会员5','', 20, '13670000000', 1, 20),
('会员6','', 20, '13670000000', 2, 210),
('会员7','', 20, '13670000000', 2, 290),
('会员8','', 20, '13670000000', 2, 260),
('会员9','', 20, '13670000000', 2, 223),
('会员10','', 20, '13670000000', 2, 212);
-- 促销活动表初始化:
INSERT INTO sale.sale_promotion ( promotion_name, start_date, end_date, discount_rate )
VALUES
('双十一大促','2024-10-24','2024-11-11',0.88),
('双十二大促','2024-11-24','2024-12-12',0.88),
('年末大促','2024-12-24','2025-01-01',0.88),
('促销活动4','2024-10-24','2024-11-11',0.88),
('促销活动5','2024-10-24','2024-11-11',0.88),
('促销活动6','2024-10-24','2024-11-11',0.88),
('促销活动7','2024-10-24','2024-11-11',0.88),
('促销活动8','2024-10-24','2024-11-11',0.88),
('促销活动9','2024-10-24','2024-11-11',0.88),
('促销活动10','2024-10-24','2024-11-11',0.88);
-- 供应商表初始化:
INSERT INTO purchase.suppliers ( supplier_name, supplier_contact_person_name, supplier_contact_info, supplied_product )
VALUES
('供应商A','联系人A','13500000000',200001),
('供应商B','联系人B','13500000000',200002),
('供应商C','联系人C','13500000000',200003),
('供应商D','联系人D','13500000000',200004),
('供应商E','联系人E','13500000000',200005),
('供应商F','联系人F','13500000000',200006),
('供应商G','联系人G','13500000000',200007),
('供应商H','联系人H','13500000000',200008),
('供应商I','联系人I','13500000000',200009),
('供应商J','联系人J','13500000000',200010);
-- 库存表初始化:
INSERT INTO PUBLIC.inventory ( product_id, stock_quantity, stock_upper_limit, stock_lower_limit, inbound_date, outbound_date )
VALUES
( 200001, 250, 1000, 25, '2024-11-29', '2024-12-10'),
( 200002, 350, 1000, 25, '2024-11-29', '2024-12-10'),
( 200003, 340, 1000, 25, '2024-11-29', '2024-12-10'),
( 200004, 150, 1000, 25, '2024-11-29', '2024-12-10'),
( 200005, 350, 1000, 25, '2024-11-29', '2024-12-10'),
( 200006, 150, 1000, 25, '2024-11-29', '2024-12-10'),
( 200007, 220, 1000, 25, '2024-11-29', '2024-12-10'),
( 200008, 100, 1000, 25, '2024-11-29', '2024-12-10'),
( 200009, 250, 1000, 25, '2024-11-29', '2024-12-10'),
( 200010, 250, 1000, 25, '2024-11-29', '2024-12-10');
-- 采购订单表初始化:
INSERT INTO purchase.purchase_order ( supplier_id, emp_id, product_id, order_date, estimated_delivery_date, total_price, order_status, product_quantity )
VALUES
( 3000001, 4, 200001, '2024-12-01','2024-12-30', 2000, '未到货', 100),
( 3000002, 5, 200002, '2024-12-01','2024-12-30', 5500, '未到货', 100),
( 3000003, 9, 200003, '2024-12-01','2024-12-30', 2099, '已到货', 100),
( 3000004, 9, 200004, '2024-12-01','2024-12-30', 2000, '未到货', 100),
( 3000005, 4, 200005, '2024-12-01','2024-12-30', 1980, '未到货', 100),
( 3000006, 5, 200006, '2024-12-01','2024-12-30', 1900, '已到货', 100),
( 3000007, 5, 200007, '2024-12-01','2024-12-30', 3300, '未到货', 100),
( 3000008, 9, 200008, '2024-12-01','2024-12-30', 3000, '未到货', 100),
( 3000009, 4, 200009, '2024-12-01','2024-12-30', 1200, '未到货', 100),
( 3000010, 4, 200010, '2024-12-01','2024-12-30', 3200, '未到货', 100);
-- 财务报表表初始化:
INSERT INTO admin.financial_reports ( sales_revenue, procurement_cost, emp_wage_cost, rent_and_utilities, report_start_date , report_end_date)
VALUES
( 120000, 5000, 15000, 5000, '2021-01-01', '2021-03-31'),
( 156000, 6600, 15600, 5000, '2021-04-01', '2021-06-30'),
( 119000, 4000, 14000, 5000, '2021-07-01', '2021-09-30'),
( 170000, 5000, 20300, 5000, '2021-10-01', '2021-12-31'),
( 120000, 5000, 15000, 5000, '2022-01-01', '2022-03-31'),
( 156000, 6600, 15600, 5000, '2022-04-01', '2022-06-30'),
( 119000, 4000, 14000, 5000, '2022-07-01', '2022-09-30'),
( 170000, 5000, 20300, 5000, '2022-10-01', '2022-12-31'),
( 120000, 5000, 15000, 5000, '2023-01-01', '2023-03-31'),
( 156000, 6600, 15600, 5000, '2023-04-01', '2023-06-30'),
( 119000, 4000, 14000, 5000, '2023-07-01', '2023-09-30'),
( 170000, 5000, 20300, 5000, '2023-10-01', '2023-12-31');
-- 销售记录表初始化:
INSERT INTO sale.sales ( emp_id, product_id, member_id, sale_quantity )
VALUES
( 2, 200001, 7001, 3),
( 7, 200002, NULL, 1),
( 5, 200003, 7002, 3),
( 8, 200004, 7005, 4),
( 2, 200005, 7007, 7),
( 8, 200006, 7001, 2),
( 8, 200007, NULL, 4),
( 6, 200004, 7005, 6),
( 2, 200003, 7003, 1),
( 7, 200001, 7009, 3);
-- 业务查询及查询脚本
-- 比较条件查询
-- 1. 查询需求查询所有工资高于3500的员工
SELECT * FROM public.salaries WHERE actual_salary > 3500;
-- 2. 查询需求查询所有库存数量低于50的商品。
SELECT * FROM PUBLIC.inventory WHERE stock_quantity < 50;
-- 3. 查询需求查询所有进价大于20的商品。
SELECT * FROM sale.products WHERE purchase_price > 20;
-- 集合比较查询
-- 1. 查询需求:查询在商品表中存在但是在销售记录表中不存在的商品编号及名称。
SELECT product_id,product_name FROM sale.products
WHERE product_id NOT IN (SELECT product_id FROM sale.sales);
-- 2. 查询需求:查询在商品表中存在同时在商品促销表中也存在的商品编号及名称。
SELECT product_id,product_name FROM sale.products
WHERE product_id IN (SELECT product_id FROM sale.product_promotion);
-- 范围比较查询
-- 1. 查询需求查询所有库存上限在100至200之间的商品。
SELECT * FROM PUBLIC.inventory WHERE stock_upper_limit BETWEEN 100 AND 200;
-- 2. 查询需求查询所有在2024年1月至2024年12月期间有促销活动。
SELECT * FROM sale.sale_promotion WHERE start_date BETWEEN '2024-01-01' AND '2024-12-30';
-- 3. 查询需求查询所有售价在20至50之间的商品。
SELECT * FROM sale.products WHERE selling_price BETWEEN 20 AND 50;
-- 字符串相似比较查询
-- 1.查询需求:查询所有名字中包含“文”的员工。
SELECT * FROM admin.employees WHERE emp_name LIKE '%文%';
-- 2.查询需求:查询所有品牌名称中包含“牛”的商品
SELECT * FROM sale.products WHERE brand LIKE '%牛%';
-- 3.查询需求查询供应商名称为“供应商A”的供应的商品。
SELECT p.product_name
FROM purchase.suppliers s
JOIN sale.products p ON s.supplied_product = p.product_id
WHERE s.supplier_name = '供应商A';
-- 多表连接查询
-- 1.查询需求:查询每个员工的工资和基本信息。
SELECT e.emp_name, s.basic_salary, s.performance_salary, s.bonus, s.deduction, s.actual_salary
FROM admin.employees e
JOIN public.salaries s ON e.emp_id = s.emp_id;
-- 2.查询需求:查询每个供应商的供应商品信息。
SELECT s.supplier_name, p.product_name
FROM purchase.suppliers s
JOIN sale.products p ON s.supplied_product = p.product_id;
-- 3.查询需求:查询每种商品的库存信息和商品基本信息。
SELECT p.product_name, i.stock_quantity, i.stock_upper_limit, i.stock_lower_limit
FROM sale.products p
JOIN PUBLIC.inventory i ON p.product_id = i.product_id;
-- 嵌套查询
-- 1. 查询需求:查询所有有库存的商品名称。
SELECT product_name FROM sale.products WHERE product_id IN (SELECT product_id FROM PUBLIC.inventory);
-- 2.查询需求:查询所有有销售记录的会员编号。
SELECT member_id FROM sale.members WHERE member_id IN (SELECT member_id FROM sale.sales);
-- 3.查询需求:查询所有销售过商品的员工姓名。
SELECT emp_name FROM admin.employees WHERE emp_id IN (SELECT emp_id FROM sale.sales);
-- EXISTS查询
-- 1. 查询需求:查询所有有促销活动的商品。
SELECT * FROM sale.products p WHERE EXISTS (SELECT 1 FROM sale.product_promotion pp WHERE pp.product_id = p.product_id);
-- 2. 查询需求:查询所有有工资记录的员工。
SELECT * FROM admin.employees e WHERE EXISTS (SELECT 1 FROM public.salaries s WHERE s.emp_id = e.emp_id);
-- 3. 查询需求:查询所有有库存的商品。
SELECT * FROM sale.products p WHERE EXISTS (SELECT 1 FROM PUBLIC.inventory i WHERE i.product_id = p.product_id);
-- 数据更新及脚本
-- 更新:
-- 1.更新需求将员工喻佳文的联系方式更新为13800000011。
UPDATE admin.employees SET emp_contactInfo = '13800000011' WHERE emp_name = '喻佳文';
-- 2.更新需求将商品牛奶的售价更新为7.00。
UPDATE sale.products SET selling_price = 7.00 WHERE product_name = '牛奶';
-- 3.更新需求将会员一的等级更新为2。
UPDATE sale.members SET member_level = 2 WHERE member_name = '会员一';
-- 4.更新需求将库存编号为1的库存上限更新为250。
UPDATE PUBLIC.inventory SET stock_upper_limit = 250 WHERE inventory_id = 1;
-- 5.更新需求将供应商A的联系人姓名更新为联系人A1。
UPDATE purchase.suppliers SET supplier_contact_person_name = '联系人A1' WHERE supplier_name = '供应商A';
-- 6.更新需求将促销活动春节促销的折扣率更新为0.7。
UPDATE sale.sale_promotion SET discount_rate = 0.7 WHERE promotion_name = '春节促销';
-- 7.更新需求将采购订单编号为1的订单状态更新为“未到货”。
UPDATE purchase.purchase_order SET order_status = '未到货' WHERE order_id = 1;
-- 8.更新需求将员工吴天宇的基本工资更新为3200.00。
UPDATE public.salaries SET basic_salary = 3200.00 WHERE emp_id = (SELECT emp_id FROM admin.employees WHERE emp_name = '吴天宇');
-- 9.更新需求将财务报表编号为1的净利润更新为6000.00。
UPDATE admin.financial_reports SET net_profit = 6000.00 WHERE report_id = 1;
-- 10.更新需求将商品促销活动编号为1的折扣率更新为0.75。
UPDATE sale.product_promotion SET discount_rate = 0.75 WHERE promotion_id = 1;
-- 删除:
-- 1.删除需求删除员工test的记录。
DELETE FROM admin.employees WHERE emp_name = 'test';
-- 2.删除需求:删除商品牛奶的记录。
DELETE FROM sale.products WHERE product_name = '牛奶';
-- 3.删除需求:删除会员一的记录。
DELETE FROM sale.members WHERE member_name = '会员一';
-- 4.删除需求删除库存编号为1的记录。
DELETE FROM PUBLIC.inventory WHERE inventory_id = 1;
-- 5.删除需求删除供应商A的记录。
DELETE FROM purchase.suppliers WHERE supplier_name = '供应商A';
-- 6.删除需求:删除促销活动春节促销的记录。
DELETE FROM sale.sale_promotion WHERE promotion_name = '春节促销';
-- 7.删除需求删除采购订单编号为1的记录。
DELETE FROM purchase.purchase_order WHERE order_id = 1;
-- 8.删除需求删除员工Bob的工资记录。
DELETE FROM public.salaries WHERE emp_id = (SELECT emp_id FROM admin.employees WHERE emp_name = 'Bob');
-- 9.删除需求删除财务报表编号为1的记录。
DELETE FROM admin.financial_reports WHERE report_id = 1;
-- 10.删除需求删除商品促销活动编号为2的记录。
DELETE FROM sale.product_promotion WHERE promotion_id = 2;
-- 视图创建脚本:
-- 1.视图:员工工资详情
CREATE VIEW view_employee_salary AS
SELECT e.emp_name, s.basic_salary, s.performance_salary, s.bonus, s.deduction, s.actual_salary
FROM admin.employees e
JOIN public.salaries s ON e.emp_id = s.emp_id;
-- 2. 视图:商品库存详情
CREATE VIEW view_product_inventory AS
SELECT p.product_name, i.stock_quantity, i.stock_upper_limit, i.stock_lower_limit
FROM sale.products p
JOIN PUBLIC.inventory i ON p.product_id = i.product_id;
-- 3. 视图:促销活动商品
CREATE VIEW view_promotion_products AS
SELECT pp.promotion_id, p.product_name, pp.discount_rate
FROM sale.product_promotion pp
JOIN sale.products p ON pp.product_id = p.product_id;
-- 4. 视图:销售记录详情
CREATE VIEW view_sales_details AS
SELECT s.sale_id, e.emp_name, p.product_name, m.member_name, s.sale_quantity, s.sale_time
FROM sale.sales s
JOIN admin.employees e ON s.emp_id = e.emp_id
JOIN sale.products p ON s.product_id = p.product_id
JOIN sale.members m ON s.member_id = m.member_id;
-- 5.视图:供应商商品信息
CREATE VIEW view_supplier_products AS
SELECT s.supplier_name, p.product_name
FROM purchase.suppliers s
JOIN sale.products p ON s.supplied_product = p.product_id;
-- 索引创建脚本:
CREATE INDEX idx_emp_name ON employees (emp_name);-- (可能经常需要根据员工名字查找员工信息,建立索引提高查找效率)
CREATE INDEX idx_member_contactInfo ON members (member_contactInfo);-- (可能经常需要根据会员的联系方式查找对应的会员,如在结账时根据手机号码查找会员信息,建立索引提高查找效率)
CREATE INDEX idx_member_name ON members (member_name);-- (也可能经常需要根据会员的姓名找对应的会员,建立索引提高查找效率)
CREATE INDEX idx_category_name ON product_type (category_name);-- (可能经常需要根据商品类别的名称查找相应的商品类别信息,建立索引提高查找效率)
CREATE INDEX idx_product_name ON products (product_name);-- (可能经常需要根据商品名称查找对应的商品信息,建立索引提高查找效率)
CREATE INDEX idx_emp_id ON salaries (emp_id);-- (可能经常需要根据员工的编号查找相应的工资信息,建立索引提高查找效率)
CREATE INDEX idx_supplied_product ON suppliers (supplied_product);-- (可能经常需要根据供应商供应的商品查找相应的供应商信息,建立索引提高查找效率)
-- 存储过程创建脚本:
-- 1、添加新员工
CREATE OR REPLACE PROCEDURE sp_add_employee(
IN emp_name VARCHAR(20),
IN emp_gender VARCHAR(3),
IN emp_age INT,
IN emp_contactinfo VARCHAR(11),
IN emp_position VARCHAR(20),
IN hiredate DATE,
IN password VARCHAR(20),
OUT new_emp_id INT
)
IS
BEGIN
INSERT INTO admin.employees (emp_name, emp_gender, emp_age, emp_contact, emp_position, hiredate,password)
VALUES (emp_name, emp_gender, emp_age, emp_contactinfo, emp_position, hiredate, password)
RETURNING emp_id INTO new_emp_id;
END;
-- 2、更新商品库存
CREATE OR REPLACE PROCEDURE sp_update_inventory(
IN inv_id INT,
IN new_quantity INT
)
IS
BEGIN
UPDATE public.inventory
SET stock_quantity = new_quantity
WHERE inventory_id = inv_id;
END;
-- 3、添加销售记录
CREATE OR REPLACE PROCEDURE add_sales_record(
IN p_emp_id INT,
IN p_member_id INT,
IN p_product_id INT,
IN p_sale_id INT,
IN p_sale_money DECIMAL(10, 2),
IN p_sale_quantity FLOAT,
IN p_sale_time TIMESTAMP
)
IS
BEGIN
INSERT INTO sale.sales (emp_id, member_id, product_id, sale_id, sale_money, sale_quantity, sale_time)
VALUES (p_emp_id, p_member_id, p_product_id, p_sale_id, p_sale_money, p_sale_quantity, p_sale_time);
END;
-- 4、添加新供应商
CREATE OR REPLACE PROCEDURE sp_add_supplier(
IN supplier_name VARCHAR(20),
IN contact_name VARCHAR(20),
IN contact_info VARCHAR(20),
IN supply_product VARCHAR(20),
OUT new_supplier_id INT
)
IS
BEGIN
INSERT INTO purchase.suppliers (supplier_name, supplier_contact_person_name, supplier_contact_info, supplied_product)
VALUES (supplier_name, contact_name, contact_info, supply_product)
RETURNING supplier_id INTO new_supplier_id;
END;
-- 5、更新会员信息
CREATE OR REPLACE PROCEDURE sp_update_member(
IN p_member_id INT,
IN p_member_name VARCHAR(20),
IN p_member_gender VARCHAR(10),
IN p_member_age INT,
IN p_member_contact VARCHAR(20),
IN p_new_level INT,
IN p_new_points INT
)
AS
BEGIN
UPDATE sale.members
SET member_name = p_member_name, member_gender = p_member_gender, member_age = p_member_age, member_contactInfo = p_member_contact, member_level = p_new_level, points = p_new_points
WHERE member_id = p_member_id;
END;
-- 触发器创建脚本:
-- 1、计算净利润触发器
CREATE
OR REPLACE FUNCTION calculate_net_profit ( ) RETURNS TRIGGER AS $$ BEGIN
NEW.net_profit := NEW.sales_revenue - NEW.procurement_cost - NEW.emp_wage_cost - NEW.rent_and_utilities;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_calculate_net_profit BEFORE INSERT ON ADMIN.financial_reports FOR EACH ROW
EXECUTE PROCEDURE calculate_net_profit ( );
-- 2、更新商品库存触发器
CREATE
OR REPLACE FUNCTION update_stock_quantity ( ) RETURNS TRIGGER AS $$ BEGIN
EXECUTE'UPDATE sale.products
SET stock_quantity = stock_quantity + $1
WHERE product_id = $2' USING NEW.stock_quantity,
NEW.product_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_update_stock_quantity BEFORE INSERT ON inventory FOR EACH ROW
EXECUTE PROCEDURE update_stock_quantity ( );
-- 3、设置商品促销折扣率触发器
CREATE
OR REPLACE FUNCTION update_discount_rate ( ) RETURNS TRIGGER AS $$ BEGIN
SELECT
discount_rate INTO NEW.discount_rate
FROM
sale_promotion
WHERE
promotion_id = NEW.promotion_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_update_discount_rate BEFORE INSERT ON product_promotion FOR EACH ROW
EXECUTE PROCEDURE update_discount_rate ( );
-- 4、销售时计算总价触发器
CREATE
OR REPLACE FUNCTION update_sale_money ( ) RETURNS TRIGGER AS $$ DECLARE
price NUMERIC;
BEGIN
IF
NEW.member_id IS NULL THEN
SELECT
selling_price INTO price
FROM
sale.products
WHERE
product_id = NEW.product_id;
ELSE SELECT
member_price INTO price
FROM
sale.products
WHERE
product_id = NEW.product_id;
END IF;
NEW.sale_money := price * NEW.sale_quantity;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_update_sale_money BEFORE INSERT ON sale.sales FOR EACH ROW
EXECUTE PROCEDURE update_sale_money ( );
-- 5、计算员工工资触发器
CREATE
OR REPLACE FUNCTION calculate_actual_salary ( ) RETURNS TRIGGER AS $$ BEGIN
NEW.actual_salary := NEW.basic_salary + NEW.performance_salary + NEW.bonus - NEW.deduction;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER before_insert_salaries BEFORE INSERT ON salaries FOR EACH ROW
EXECUTE PROCEDURE calculate_actual_salary ( );
-- 1、创建管理员角色
CREATE ROLE admin IDENTIFIED BY 'admin@123';
-- 2、创建采购员角色
CREATE ROLE purchaser IDENTIFIED BY 'purchaser@123'
-- 3、创建售货员角色
CREATE ROLE salesperson IDENTIFIED BY 'sale@123'
-- 授予权限
-- 1、授予管理员所有权限
GRANT ALL PRIVILEGES ON DATABASE supermarket TO admin;
-- 2、授予采购员权限
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE inventory TO purchaser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE salaries TO purchaser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.product_type TO purchaser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.products TO purchaser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE purchase.purchase_order TO purchaser;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE purchase.suppliers TO purchaser;
-- 3、授予售货员权限
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE inventory TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE salaries TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.members TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.product_promotion TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.product_type TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.products TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.sale_promotion TO salesperson;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sale.sales TO salesperson;
Loading…
Cancel
Save