diff --git a/DatabaseScript/数据库脚本.txt b/DatabaseScript/数据库脚本.txt new file mode 100644 index 0000000..2e2d788 --- /dev/null +++ b/DatabaseScript/数据库脚本.txt @@ -0,0 +1,305 @@ +create table drugs ( + drug_id int not null auto_increment, + class_id int not null, + class_name varchar(128) null, + drug_name varchar(128) not null, + efficacy TEXT null, + price decimal(10, 2) null, + validity int null, + inventory int null, + is_deleted tinyint(4) null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (drug_id), + foreign key (class_id) references drug_classification(class_id), + index class_id_index (class_id asc) +) engine = innodb default charset = utf8mb4; + +create table users ( + user_id int not null auto_increment, + user_name varchar(128) not null, + password varchar(128) not null, + identity tinyint(4) not null, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (user_id), + unique index user_name_UNIQUE (user_name asc) +)engine = innodb default character set = utf8mb4; + +create table orders ( + order_id int not null auto_increment, + user_id int not null, + consignee varchar(128) null, + tele varchar(11) null, + address varchar(128) null, + total_amount decimal(10, 2) null, + order_status varchar(128) default 0, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (order_id), + foreign key (user_id) references users(user_id), + index user_id_index (user_id asc) +) engine = innodb default charset = utf8mb4; + +create table drug_classification( + class_id int not null auto_increment, + class_name varchar(128) not null, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (class_id) +) engine = innodb default charset = utf8mb4; + + +create table order_items ( + order_item_id int not null auto_increment, + order_id int not null, + drug_id int not null, + quantity int null, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (order_item_id), + foreign key (order_id) references orders(order_id), + foreign key (drug_id) references drugs(drug_id), + index order_id_index (order_id asc) +) engine = innodb default charset = utf8mb4; + +create table cart ( + cart_id int not null auto_increment, + user_id int not null, + drug_id int not null, + num int not null default 1, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (cart_id), + foreign key (user_id) references users(user_id), + foreign key (drug_id) references drugs(drug_id) +) engine = innodb default charset = utf8mb4; + +insert into users (user_id,user_name,password,identity) values +(1,'张三',1398,0),(2,'李四',1542,1),(3,'赵五',1397,1),(4,'王六',1271,1), +(5,'许七',4569,1),(6,'一一',1284,1),(7,'宋二',1594,1),(8,'乌龟',1478,1), +(9,'苹果',1369,1),(0,'空空',1258,1); + +insert into drug_classification (class_id,class_name)values +(1,'感冒药'),(2,'解热镇痛药'),(3,'镇咳药'),(4,'消化系统用药'),(5,'抗生素'), +(6,'外用消炎药'),(7,'抗病毒药'),(8,'抗过敏药'); + +insert into drugs +(class_id,drug_name,efficacy,price,validity,inventory,picture,class_name) +values(1,'板蓝根颗粒','用于抗感冒',13.56,18,100,"images\\1.jpg",'感冒药'), +(1,'双黄连口服液','用于缓解感冒症状',25.89,18,100,"images\\1.2.jpg",'感冒药'), +(2,'布洛芬','用于缓解轻度至中度的疼痛,如头痛、关节痛,也可以用于缓解发热',45.23,18,100,"images\\2.1.jpg",'解热镇痛药'), +(2,'对乙酰氨基酚','常用于退烧和缓解轻度疼痛',12.89,18,100,"images\\2.2.jpg",'解热镇痛药'), +(3,'鲜竹沥口服液','用于止咳化痰',28.45,36,100,"images\\3.1.jpg",'镇咳药'), +(3,'右美沙芬','用于干咳无痰的情况',46.12,36,100,"images\\3.2.jpg",'镇咳药'), +(4,'蒙脱石散','用于治疗腹泻',13.46,36,100,"images\\4.1.jpg",'消化系统用药'), +(4,'多潘立酮','促进胃肠蠕动的药物,帮助缓解消化不良',29.84,36,100,"images\\4.2.jpg",'消化系统用药'), +(5,'阿奇霉素分散片','用于治疗各种细菌感染',39.47,36,100,"images\\5.1.jpg",'抗生素'), +(5,'阿莫西林胶囊','青霉素类抗生素,广泛用于治疗多种细菌感染',23.84,24,100,"images\\5.2.jpg",'抗生素'), +(6,'红霉素软膏','用于皮肤感染',17.56,24,100,"images\\6.1.jpg",'外用消炎药'), +(6,'夫西地酸乳膏','用于治疗皮肤感染及炎症',9.56,24,100,"images\\6.2.jpg",'外用消炎药'), +(7,'氯雷他定片','用于治疗过敏症状,如过敏性鼻炎、皮肤瘙痒等',53.49,24,100,"images\\7.1.jpg",'抗病毒药'), +(7,'盐酸西替利嗪片','用于缓解过敏症状',16.79,24,100,"images\\7.2.jpg",'抗病毒药'), +(8,'奥司他韦','用于治疗流感病毒引起的症状',46.58,24,100,"images\\8.jpg",'抗过敏药'); + +insert into orders +(user_id,consignee,tele,address,total_amount,order_status) +values(1,'公瑞',15632165486,'北京市朝阳区林萃西里15号楼4单元201室',39.45,'已付款未发货'), +(2,'吴菲',12356231254,'上海市浦东新区世纪公园路88号金茂大厦12层',58.12,'已付款未发货'), +(2,'李四',14545681235,'广州市天河区珠江新城华夏路49号津滨腾越大厦B座902室',74.57,'已付款未发货'), +(4,'依依',15064352013,'深圳市福田区福华三路88号时代科技大厦7楼705室',43.3,'已付款未发货'), +(6,'一一',17856491235,'成都市武侯区高新南区天府大道中段666号希顿国际广场C座1801室',63.31,'已付款未发货'), +(6,'谷谷',13578546456,'天津市南开区红旗南路251号增1号新技术产业园区华苑产业区海泰信息广场D座402室',27.12,'已付款未发货'), +(7,'艳艳',18946571258,'杭州市西湖区文三路90号东部软件园3号楼5层',70.28,'已付款未发货'), +(8,'萌萌',15679562345,'重庆市渝北区金开大道100号爱都会3幢1单元9-2',57.03,'已付款未发货'), +(9,'作业本',10356894678,'南京市鼓楼区中山路300号德基广场二期28楼',59.58,'已付款未发货'), +(10,'酷爱香水',18956782345,'苏州市工业园区星海街200号湖邑16幢202室',46.58,'已付款未发货'); + +insert into order_items (order_id,drug_id,quantity) values +(1,2,1),(1,1,1),(2,3,1),(2,4,1),(3,5,1),(3,6,1),(4,7,1),(4,8,1),(5,11,1), +(5,12,1),(6,9,1),(6,10,1),(7,13,1),(7,14,1),(8,9,1),(8,11,1),(9,6,1),(9,7,1), +(10,15,1); + +select drug_name from drugs where drug_name like '%口服液%'; +select drug_name from drugs where drug_name like '%膏%'; +Select * from orders where consignee LIKE '张%'; +select a.order_id, a.total_amount, b.order_item_id, c.drug_name, b.quantity from orders a left join order_items b on a.order_id = b.order_id left join drugs c on b.drug_id = c.drug_id where a.user_id = 2; +select a.drug_name from drugs a left join drug_classification b on a.class_id = b.class_id where b.class_name = '感冒药'; +Select o.order_id, u.user_name from orders o JOIN users u ON o.user_id = u.user_id; +select drug_name from drugs where price > ALL(select price from drugs a left join drug_classification b on a.class_id = b.class_id where b.class_name ='感冒药'); +select drug_name from drugs where price > ALL(select price from drugs a left join drug_classification b on a.class_id = b.class_id where b.class_name ='感冒药'); +Select a.drug_name, a.price from drugs a join drug_classification b on a.class_id = b.class_id where b.class_name IN ('感冒药', '抗生素'); +select a.user_id, COUNT(*) orders_num from users a join orders b on a.user_id = b.user_id GROUP BY b.user_id HAVING COUNT(*) >= 2; +select drug_id, drug_name from drugs where price > 50; +select drug_name, inventory from drugs where inventory < 10; +select * from orders where order_id between 4 and 9; +select a.drug_id, a.drug_name, b.class_name from drugs a join drug_classification b on a.class_id = b.class_id where b.class_name NOT IN ('感冒药', '抗生素'); +Select * from drugs where price BETWEEN 30 AND 50; +select * from drugs limit 5, 5; +select * from orders where user_id = 1 limit 0, 5; +select a.user_id, a.user_name from users a join orders c on a.user_id = c.user_id join order_items d on c.order_id = d.order_id join drugs b on b.drug_id = d.drug_id where b.class_id IN (select class_id from drug_classification where class_name = '感冒药') GROUP BY a.user_id, a.user_name; +select d.drug_id, d.drug_name, c.class_name from drugs d join drug_classification c on d.class_id = c.class_id where d.price < (select AVG(d.price) from drugs d join drug_classification c on d.class_id = c.class_id where c.class_name = '感冒药') and c.class_name != '感冒药'; +select user_id, user_name from users u where NOT EXISTS (select 1 from orders o where o.user_id = u.user_id); + +update users set user_name='哈哈' where user_id=1; +update users set password=1234 where user_name='李四'; +update orders set tele=15666796023 where consignee='吴菲'; +update drugs set price=19.60 where drug_name='板蓝根颗粒'; +update drugs set validity=12 where drug_name='对乙酰氨基酚'; +update drugs set inventory=88 where drug_name='阿奇霉素分散片'; +update drug_classification set class_name='抗生素类药品' where class_id in(select class_id from drugs where drug_name='阿奇霉素分散片'); +update drugs set efficacy='奥司他韦是一种抗病毒药物,主要用于治疗和预防甲型和乙型流感' where drug_name='奥司他韦'; + +delete from orders where user_id in (select user_id from users where user_name='空空'); +delete from users where user_name=’乌龟’; +delete from drugs where drug_name='多潘立酮'; + +create view low_stock_drug_view as select d.drug_name, c.class_name, d.inventory from drugs d join drug_classification c on d.class_id = c.class_id where d.is_deleted = 0 and d.inventory < 10; +create view user_order_history_view as select o.order_id, o.total_amount, d.drug_name, d.price, d.picture, i.quantity, i.order_item_id from users u join orders o on u.user_id = o.user_id join order_items i on o.order_id = i.order_id join drugs d on d.drug_id = i.drug_id where u.is_deleted = 0 and o.is_deleted = 0 and i.is_deleted = 0 and d.is_deleted = 0; +create view drug_sales_detail_view as select d.drug_name, SUM(i.quantity) as total_sales_quantity ,SUM(i.quantity * d.price) as total_sales_amount from drugs d join order_items i on d.drug_id = i.drug_id join orders o on i.order_id = o.order_id where o.is_deleted = 0 and i.is_deleted = 0 and d.is_deleted = 0 GROUP BY d.drug_name; +CREATE VIEW active_users_and_popular_medicines_view AS SELECT u.user_id, u.user_name, d.drug_name, COUNT(i.order_id) AS purchase_count FROM users u JOIN orders o ON u.user_id = o.user_id JOIN order_items i ON o.order_id = i.order_id JOIN drugs d ON i.drug_id = d.drug_id WHERE u.is_deleted = 0 AND o.is_deleted = 0 AND i.is_deleted = 0 AND d.is_deleted = 0 GROUP BY u.user_id, u.user_name, d.drug_name HAVING COUNT(i.order_id) > 2 ORDER BY u.user_id, purchase_count DESC; +CREATE VIEW medicine_price_proportion_in_orders_view AS SELECT o.order_id, d.drug_name, (i.quantity * d.price) AS medicine_total_price, o.total_amount, (i.quantity * d.price) / o.total_amount AS price_proportion FROM orders o JOIN order_items i ON o.order_id = i.order_id JOIN drugs d ON i.drug_id = d.drug_id WHERE o.is_deleted = 0 AND i.is_deleted = 0 AND d.is_deleted = 0; + +create index idx_username on users (user_name); +create index idx_class on drugs (class_id); +create index idx_drug_name on drugs (drug_name); +create index idx_user_id on orders (user_id); +create index idx_order_id on order_items (order_id); +create index idx_drug_id on order_items (drug_id); +create index idx_class_name on drug_classification (class_name); + +DELIMITER // +CREATE PROCEDURE add_medicine( + IN p_category_id INT, + IN p_medicine_name VARCHAR(100), + IN p_validity_period DATE, + IN p_price DECIMAL(10, 2), + IN p_efficacy TEXT, + IN p_stock INT)BEGIN + INSERT INTO medicines (category_id, medicine_name, validity_period, price, efficacy, stock, create_time, modify_time, is_deleted) +VALUES (p_category_id, p_medicine_name, p_validity_period, p_price, p_efficacy, p_stock, NOW(), NOW(), 0); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_user_insert +BEFORE INSERT ON users +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_user_update +BEFORE UPDATE ON users +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_drug_insert +BEFORE INSERT ON drugs +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_drug_update +BEFORE UPDATE ON drugs +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_drug_inventory_update +BEFORE UPDATE ON drugs +FOR EACH ROW +BEGIN + IF NEW.inventory < 0 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不能为负数'; + END IF; +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_insert +BEFORE INSERT ON orders +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_update +BEFORE UPDATE ON orders +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_item_insert +BEFORE INSERT ON order_items +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_item_update +BEFORE UPDATE ON order_items +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER after_order_item_quantity_update +AFTER UPDATE ON order_items +FOR EACH ROW +BEGIN + DECLARE drug_inventory INT; + SELECT inventory INTO drug_inventory FROM drugs WHERE drug_id = NEW.drug_id; + UPDATE drugs SET inventory = drug_inventory - (NEW.quantity - OLD.quantity) WHERE drug_id = NEW.drug_id; +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_class_insert +BEFORE INSERT ON drug_classification +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_class_update +BEFORE UPDATE ON drug_classification +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + diff --git a/数据库脚本/数据库脚本.txt b/数据库脚本/数据库脚本.txt new file mode 100644 index 0000000..2e2d788 --- /dev/null +++ b/数据库脚本/数据库脚本.txt @@ -0,0 +1,305 @@ +create table drugs ( + drug_id int not null auto_increment, + class_id int not null, + class_name varchar(128) null, + drug_name varchar(128) not null, + efficacy TEXT null, + price decimal(10, 2) null, + validity int null, + inventory int null, + is_deleted tinyint(4) null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (drug_id), + foreign key (class_id) references drug_classification(class_id), + index class_id_index (class_id asc) +) engine = innodb default charset = utf8mb4; + +create table users ( + user_id int not null auto_increment, + user_name varchar(128) not null, + password varchar(128) not null, + identity tinyint(4) not null, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (user_id), + unique index user_name_UNIQUE (user_name asc) +)engine = innodb default character set = utf8mb4; + +create table orders ( + order_id int not null auto_increment, + user_id int not null, + consignee varchar(128) null, + tele varchar(11) null, + address varchar(128) null, + total_amount decimal(10, 2) null, + order_status varchar(128) default 0, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (order_id), + foreign key (user_id) references users(user_id), + index user_id_index (user_id asc) +) engine = innodb default charset = utf8mb4; + +create table drug_classification( + class_id int not null auto_increment, + class_name varchar(128) not null, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (class_id) +) engine = innodb default charset = utf8mb4; + + +create table order_items ( + order_item_id int not null auto_increment, + order_id int not null, + drug_id int not null, + quantity int null, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (order_item_id), + foreign key (order_id) references orders(order_id), + foreign key (drug_id) references drugs(drug_id), + index order_id_index (order_id asc) +) engine = innodb default charset = utf8mb4; + +create table cart ( + cart_id int not null auto_increment, + user_id int not null, + drug_id int not null, + num int not null default 1, + is_deleted tinyint(4) not null default 0, + create_time datetime default now(), + update_time datetime default now(), + primary key (cart_id), + foreign key (user_id) references users(user_id), + foreign key (drug_id) references drugs(drug_id) +) engine = innodb default charset = utf8mb4; + +insert into users (user_id,user_name,password,identity) values +(1,'张三',1398,0),(2,'李四',1542,1),(3,'赵五',1397,1),(4,'王六',1271,1), +(5,'许七',4569,1),(6,'一一',1284,1),(7,'宋二',1594,1),(8,'乌龟',1478,1), +(9,'苹果',1369,1),(0,'空空',1258,1); + +insert into drug_classification (class_id,class_name)values +(1,'感冒药'),(2,'解热镇痛药'),(3,'镇咳药'),(4,'消化系统用药'),(5,'抗生素'), +(6,'外用消炎药'),(7,'抗病毒药'),(8,'抗过敏药'); + +insert into drugs +(class_id,drug_name,efficacy,price,validity,inventory,picture,class_name) +values(1,'板蓝根颗粒','用于抗感冒',13.56,18,100,"images\\1.jpg",'感冒药'), +(1,'双黄连口服液','用于缓解感冒症状',25.89,18,100,"images\\1.2.jpg",'感冒药'), +(2,'布洛芬','用于缓解轻度至中度的疼痛,如头痛、关节痛,也可以用于缓解发热',45.23,18,100,"images\\2.1.jpg",'解热镇痛药'), +(2,'对乙酰氨基酚','常用于退烧和缓解轻度疼痛',12.89,18,100,"images\\2.2.jpg",'解热镇痛药'), +(3,'鲜竹沥口服液','用于止咳化痰',28.45,36,100,"images\\3.1.jpg",'镇咳药'), +(3,'右美沙芬','用于干咳无痰的情况',46.12,36,100,"images\\3.2.jpg",'镇咳药'), +(4,'蒙脱石散','用于治疗腹泻',13.46,36,100,"images\\4.1.jpg",'消化系统用药'), +(4,'多潘立酮','促进胃肠蠕动的药物,帮助缓解消化不良',29.84,36,100,"images\\4.2.jpg",'消化系统用药'), +(5,'阿奇霉素分散片','用于治疗各种细菌感染',39.47,36,100,"images\\5.1.jpg",'抗生素'), +(5,'阿莫西林胶囊','青霉素类抗生素,广泛用于治疗多种细菌感染',23.84,24,100,"images\\5.2.jpg",'抗生素'), +(6,'红霉素软膏','用于皮肤感染',17.56,24,100,"images\\6.1.jpg",'外用消炎药'), +(6,'夫西地酸乳膏','用于治疗皮肤感染及炎症',9.56,24,100,"images\\6.2.jpg",'外用消炎药'), +(7,'氯雷他定片','用于治疗过敏症状,如过敏性鼻炎、皮肤瘙痒等',53.49,24,100,"images\\7.1.jpg",'抗病毒药'), +(7,'盐酸西替利嗪片','用于缓解过敏症状',16.79,24,100,"images\\7.2.jpg",'抗病毒药'), +(8,'奥司他韦','用于治疗流感病毒引起的症状',46.58,24,100,"images\\8.jpg",'抗过敏药'); + +insert into orders +(user_id,consignee,tele,address,total_amount,order_status) +values(1,'公瑞',15632165486,'北京市朝阳区林萃西里15号楼4单元201室',39.45,'已付款未发货'), +(2,'吴菲',12356231254,'上海市浦东新区世纪公园路88号金茂大厦12层',58.12,'已付款未发货'), +(2,'李四',14545681235,'广州市天河区珠江新城华夏路49号津滨腾越大厦B座902室',74.57,'已付款未发货'), +(4,'依依',15064352013,'深圳市福田区福华三路88号时代科技大厦7楼705室',43.3,'已付款未发货'), +(6,'一一',17856491235,'成都市武侯区高新南区天府大道中段666号希顿国际广场C座1801室',63.31,'已付款未发货'), +(6,'谷谷',13578546456,'天津市南开区红旗南路251号增1号新技术产业园区华苑产业区海泰信息广场D座402室',27.12,'已付款未发货'), +(7,'艳艳',18946571258,'杭州市西湖区文三路90号东部软件园3号楼5层',70.28,'已付款未发货'), +(8,'萌萌',15679562345,'重庆市渝北区金开大道100号爱都会3幢1单元9-2',57.03,'已付款未发货'), +(9,'作业本',10356894678,'南京市鼓楼区中山路300号德基广场二期28楼',59.58,'已付款未发货'), +(10,'酷爱香水',18956782345,'苏州市工业园区星海街200号湖邑16幢202室',46.58,'已付款未发货'); + +insert into order_items (order_id,drug_id,quantity) values +(1,2,1),(1,1,1),(2,3,1),(2,4,1),(3,5,1),(3,6,1),(4,7,1),(4,8,1),(5,11,1), +(5,12,1),(6,9,1),(6,10,1),(7,13,1),(7,14,1),(8,9,1),(8,11,1),(9,6,1),(9,7,1), +(10,15,1); + +select drug_name from drugs where drug_name like '%口服液%'; +select drug_name from drugs where drug_name like '%膏%'; +Select * from orders where consignee LIKE '张%'; +select a.order_id, a.total_amount, b.order_item_id, c.drug_name, b.quantity from orders a left join order_items b on a.order_id = b.order_id left join drugs c on b.drug_id = c.drug_id where a.user_id = 2; +select a.drug_name from drugs a left join drug_classification b on a.class_id = b.class_id where b.class_name = '感冒药'; +Select o.order_id, u.user_name from orders o JOIN users u ON o.user_id = u.user_id; +select drug_name from drugs where price > ALL(select price from drugs a left join drug_classification b on a.class_id = b.class_id where b.class_name ='感冒药'); +select drug_name from drugs where price > ALL(select price from drugs a left join drug_classification b on a.class_id = b.class_id where b.class_name ='感冒药'); +Select a.drug_name, a.price from drugs a join drug_classification b on a.class_id = b.class_id where b.class_name IN ('感冒药', '抗生素'); +select a.user_id, COUNT(*) orders_num from users a join orders b on a.user_id = b.user_id GROUP BY b.user_id HAVING COUNT(*) >= 2; +select drug_id, drug_name from drugs where price > 50; +select drug_name, inventory from drugs where inventory < 10; +select * from orders where order_id between 4 and 9; +select a.drug_id, a.drug_name, b.class_name from drugs a join drug_classification b on a.class_id = b.class_id where b.class_name NOT IN ('感冒药', '抗生素'); +Select * from drugs where price BETWEEN 30 AND 50; +select * from drugs limit 5, 5; +select * from orders where user_id = 1 limit 0, 5; +select a.user_id, a.user_name from users a join orders c on a.user_id = c.user_id join order_items d on c.order_id = d.order_id join drugs b on b.drug_id = d.drug_id where b.class_id IN (select class_id from drug_classification where class_name = '感冒药') GROUP BY a.user_id, a.user_name; +select d.drug_id, d.drug_name, c.class_name from drugs d join drug_classification c on d.class_id = c.class_id where d.price < (select AVG(d.price) from drugs d join drug_classification c on d.class_id = c.class_id where c.class_name = '感冒药') and c.class_name != '感冒药'; +select user_id, user_name from users u where NOT EXISTS (select 1 from orders o where o.user_id = u.user_id); + +update users set user_name='哈哈' where user_id=1; +update users set password=1234 where user_name='李四'; +update orders set tele=15666796023 where consignee='吴菲'; +update drugs set price=19.60 where drug_name='板蓝根颗粒'; +update drugs set validity=12 where drug_name='对乙酰氨基酚'; +update drugs set inventory=88 where drug_name='阿奇霉素分散片'; +update drug_classification set class_name='抗生素类药品' where class_id in(select class_id from drugs where drug_name='阿奇霉素分散片'); +update drugs set efficacy='奥司他韦是一种抗病毒药物,主要用于治疗和预防甲型和乙型流感' where drug_name='奥司他韦'; + +delete from orders where user_id in (select user_id from users where user_name='空空'); +delete from users where user_name=’乌龟’; +delete from drugs where drug_name='多潘立酮'; + +create view low_stock_drug_view as select d.drug_name, c.class_name, d.inventory from drugs d join drug_classification c on d.class_id = c.class_id where d.is_deleted = 0 and d.inventory < 10; +create view user_order_history_view as select o.order_id, o.total_amount, d.drug_name, d.price, d.picture, i.quantity, i.order_item_id from users u join orders o on u.user_id = o.user_id join order_items i on o.order_id = i.order_id join drugs d on d.drug_id = i.drug_id where u.is_deleted = 0 and o.is_deleted = 0 and i.is_deleted = 0 and d.is_deleted = 0; +create view drug_sales_detail_view as select d.drug_name, SUM(i.quantity) as total_sales_quantity ,SUM(i.quantity * d.price) as total_sales_amount from drugs d join order_items i on d.drug_id = i.drug_id join orders o on i.order_id = o.order_id where o.is_deleted = 0 and i.is_deleted = 0 and d.is_deleted = 0 GROUP BY d.drug_name; +CREATE VIEW active_users_and_popular_medicines_view AS SELECT u.user_id, u.user_name, d.drug_name, COUNT(i.order_id) AS purchase_count FROM users u JOIN orders o ON u.user_id = o.user_id JOIN order_items i ON o.order_id = i.order_id JOIN drugs d ON i.drug_id = d.drug_id WHERE u.is_deleted = 0 AND o.is_deleted = 0 AND i.is_deleted = 0 AND d.is_deleted = 0 GROUP BY u.user_id, u.user_name, d.drug_name HAVING COUNT(i.order_id) > 2 ORDER BY u.user_id, purchase_count DESC; +CREATE VIEW medicine_price_proportion_in_orders_view AS SELECT o.order_id, d.drug_name, (i.quantity * d.price) AS medicine_total_price, o.total_amount, (i.quantity * d.price) / o.total_amount AS price_proportion FROM orders o JOIN order_items i ON o.order_id = i.order_id JOIN drugs d ON i.drug_id = d.drug_id WHERE o.is_deleted = 0 AND i.is_deleted = 0 AND d.is_deleted = 0; + +create index idx_username on users (user_name); +create index idx_class on drugs (class_id); +create index idx_drug_name on drugs (drug_name); +create index idx_user_id on orders (user_id); +create index idx_order_id on order_items (order_id); +create index idx_drug_id on order_items (drug_id); +create index idx_class_name on drug_classification (class_name); + +DELIMITER // +CREATE PROCEDURE add_medicine( + IN p_category_id INT, + IN p_medicine_name VARCHAR(100), + IN p_validity_period DATE, + IN p_price DECIMAL(10, 2), + IN p_efficacy TEXT, + IN p_stock INT)BEGIN + INSERT INTO medicines (category_id, medicine_name, validity_period, price, efficacy, stock, create_time, modify_time, is_deleted) +VALUES (p_category_id, p_medicine_name, p_validity_period, p_price, p_efficacy, p_stock, NOW(), NOW(), 0); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_user_insert +BEFORE INSERT ON users +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_user_update +BEFORE UPDATE ON users +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_drug_insert +BEFORE INSERT ON drugs +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_drug_update +BEFORE UPDATE ON drugs +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_drug_inventory_update +BEFORE UPDATE ON drugs +FOR EACH ROW +BEGIN + IF NEW.inventory < 0 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不能为负数'; + END IF; +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_insert +BEFORE INSERT ON orders +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_update +BEFORE UPDATE ON orders +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_item_insert +BEFORE INSERT ON order_items +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_order_item_update +BEFORE UPDATE ON order_items +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER after_order_item_quantity_update +AFTER UPDATE ON order_items +FOR EACH ROW +BEGIN + DECLARE drug_inventory INT; + SELECT inventory INTO drug_inventory FROM drugs WHERE drug_id = NEW.drug_id; + UPDATE drugs SET inventory = drug_inventory - (NEW.quantity - OLD.quantity) WHERE drug_id = NEW.drug_id; +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_class_insert +BEFORE INSERT ON drug_classification +FOR EACH ROW +BEGIN + SET NEW.create_time = NOW(); + SET NEW.update_time = NOW(); +END // +DELIMITER ; + +DELIMITER // +CREATE TRIGGER before_class_update +BEFORE UPDATE ON drug_classification +FOR EACH ROW +BEGIN + SET NEW.update_time = NOW(); +END // +DELIMITER ; +