diff --git a/数据库脚本/数据库脚本.sql b/数据库脚本/数据库脚本.sql new file mode 100644 index 0000000..f4a78b8 --- /dev/null +++ b/数据库脚本/数据库脚本.sql @@ -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;