藥信息管理系統(tǒng)數(shù)據(jù)庫設(shè)計:從藥房登記本到規(guī)范化SQL Schema)
簡介本資源是一套面向高校數(shù)據(jù)庫課程設(shè)計實踐的醫(yī)藥信息管理系統(tǒng)完整項目源碼適用于計算機、信息管理等專業(yè)學生完成課設(shè)任務(wù)或開展數(shù)據(jù)庫綜合實訓。系統(tǒng)覆蓋藥品進銷存全業(yè)務(wù)流程包含基本信息管理、進貨管理、庫房管理、銷售管理及財務(wù)統(tǒng)計五大核心模塊具備完整的CRUD操作與報表生成功能可直接部署運行并用于課程答辯或功能擴展學習。壓縮包共335個文件4.05MB涵蓋54個Java后端邏輯文件、38個HTML前端頁面、44個JS交互腳本、150個GIF動圖多為界面組件或操作示意、12個CSS樣式文件及SQL建表腳本等目錄結(jié)構(gòu)規(guī)范含Maven構(gòu)建配置pom.xml、mvnw、IDEA項目配置drug.iml及詳細說明文檔開箱即用。目前已有72人學習下載提供從數(shù)據(jù)庫設(shè)計、前后端聯(lián)調(diào)到報表導出的全流程參考是理解醫(yī)藥行業(yè)業(yè)務(wù)建模與MySQLJava Web技術(shù)棧落地的典型教學案例。1. 醫(yī)藥信息管理系統(tǒng)課設(shè)為什么90%的學生在數(shù)據(jù)庫設(shè)計階段就卡住而不是寫代碼“數(shù)據(jù)庫課設(shè)醫(yī)藥信息管理系統(tǒng)”——這個標題背后不是一套現(xiàn)成的軟件而是一次對數(shù)據(jù)庫建模能力、業(yè)務(wù)邏輯抽象能力和工程落地意識的三重拷問。它常見于高?!稊?shù)據(jù)庫原理與應用》《數(shù)據(jù)庫系統(tǒng)課程設(shè)計》等實踐環(huán)節(jié)目標是讓學生從零構(gòu)建一個具備真實業(yè)務(wù)影子的中小型信息系統(tǒng)藥品入庫出庫、醫(yī)生開方配藥、患者就診記錄、庫存預警、供應商管理……但現(xiàn)實是多數(shù)學生花3天搭好前端界面卻用2周反復修改ER圖、糾結(jié)外鍵要不要級聯(lián)、查不出多表連接結(jié)果為空的原因最后靠硬編碼補全數(shù)據(jù)來“跑通流程”。這不是代碼能力問題而是對“醫(yī)藥領(lǐng)域數(shù)據(jù)如何被結(jié)構(gòu)化表達”缺乏具象認知。本文不講Spring Boot怎么連MySQL也不教HTML怎么畫表格只聚焦課設(shè)最核心、最易失分、也最能體現(xiàn)數(shù)據(jù)庫思維的環(huán)節(jié)如何把一張醫(yī)院藥房的紙質(zhì)登記本翻譯成可執(zhí)行、可擴展、可驗證的SQL Schema。適合正在開題、已畫出ER圖但不敢建表、或建完表發(fā)現(xiàn)查詢總報錯的本科生。2. 從藥房登記本到關(guān)系模式醫(yī)藥業(yè)務(wù)實體識別與范式校驗醫(yī)藥信息管理系統(tǒng)的業(yè)務(wù)邊界看似寬泛但課設(shè)場景必須收斂。我們以某高校課程設(shè)計任務(wù)書典型需求為錨點支持藥品基礎(chǔ)信息維護、采購入庫、臨床領(lǐng)用、庫存盤點、過期預警、醫(yī)生處方關(guān)聯(lián)、患者用藥記錄追溯。這6類操作實際由5個核心實體驅(qū)動藥品、供應商、科室、醫(yī)生、患者以及3個關(guān)鍵聯(lián)系實體采購單、領(lǐng)用單、處方。注意——“處方”不是屬性是實體很多同學把它設(shè)為藥品表的一個字段如prescription_type VARCHAR(20)這是范式崩塌的起點。2.1 實體屬性提取拒絕“想當然”用真實單據(jù)反推不要憑空列字段。找一份真實的醫(yī)院藥房入庫單掃描件某高校實驗室提供過脫敏樣本逐行標注單據(jù)字段對應實體/屬性是否主鍵備注說明入庫單號purchase_order.id是CHAR(12)格式Y(jié)YMMDD-XXXX供應商名稱supplier.name否需關(guān)聯(lián)supplier.id藥品通用名medicine.generic_name否如“阿莫西林膠囊”藥品規(guī)格medicine.specification否“0.25g×24粒/盒”批號inventory.batch_no是同一藥品不同批次獨立庫存生產(chǎn)日期inventory.production_date否DATE類型非字符串有效期至inventory.expiry_date否計算預警用非固定值入庫數(shù)量purchase_item.quantity否關(guān)聯(lián)采購單與藥品的中間表字段提示inventory庫存不是獨立實體而是medicine與batch_no構(gòu)成的復合主鍵關(guān)系。課設(shè)中常誤建為“藥品表庫存字段”導致無法追蹤多批次、不同效期的同一藥品。2.2 關(guān)系識別與聯(lián)系強度判斷何時用外鍵何時建關(guān)聯(lián)表醫(yī)藥業(yè)務(wù)中高頻出現(xiàn)“一對多”和“多對多”但學生?;煜龑崿F(xiàn)方式醫(yī)生 ? 科室典型“多對一”。doctor.department_id直接外鍵指向department.id無需中間表。藥品 ? 采購單必須“多對多” → 建立purchase_item關(guān)聯(lián)表。因為一張采購單含多種藥品一種藥品可被多次采購。若強行在medicine表加purchase_order_id則一種藥品只能屬于一張單邏輯錯誤。處方 ? 藥品同樣是“多對多”但需額外記錄用量、用法、頻次。因此prescription_item表除prescription_id、medicine_id外必須包含dosage如“0.5g”、usage如“口服”、frequency如“每日2次”三個業(yè)務(wù)強相關(guān)字段。-- 正確的處方-藥品關(guān)聯(lián)表含業(yè)務(wù)屬性 CREATE TABLE prescription_item ( id INT PRIMARY KEY AUTO_INCREMENT, prescription_id INT NOT NULL, medicine_id INT NOT NULL, dosage VARCHAR(50) NOT NULL COMMENT 單次用量如0.5g、1片, usage VARCHAR(30) NOT NULL COMMENT 給藥途徑如口服、靜脈滴注, frequency VARCHAR(50) NOT NULL COMMENT 用藥頻次如每日2次、每8小時1次, FOREIGN KEY (prescription_id) REFERENCES prescription(id) ON DELETE CASCADE, FOREIGN KEY (medicine_id) REFERENCES medicine(id) );邏輯說明ON DELETE CASCADE在刪除處方時自動清理其明細避免孤兒記錄dosage/usage/frequency必須在此表定義而非放在prescription或medicine表中——這是業(yè)務(wù)規(guī)則落地的關(guān)鍵證據(jù)。2.3 范式校驗實戰(zhàn)用3個問題自測是否達到3NF建完初版表后拋給自己3個問題是否存在非主屬性對碼的部分函數(shù)依賴檢查medicine表若存在category_name藥品大類名稱且未單獨建category表則category_name依賴于category_id而非主鍵id違反2NF。應拆出category表medicine.category_id外鍵引用。是否存在非主屬性對碼的傳遞函數(shù)依賴檢查supplier表若同時有province省份和city城市而city依賴于province則city傳遞依賴于id違反3NF。應建region表管理省市區(qū)層級。所有字段是否原子性medicine.storage_conditions儲存條件若存為“陰涼干燥處避光”字符串是原子的但若存為“陰涼;干燥;避光”用分號分割則違反1NF后續(xù)無法按條件篩選。血淚經(jīng)驗課設(shè)答辯時老師最愛問“這個字段為什么不在A表而在B表”——答案必須是“因為它依賴于B表的主鍵且不直接依賴于A表主鍵”而不是“我覺得放這里順手”。3. SQL建表腳本帶業(yè)務(wù)注釋、約束與索引的最小可用版本課設(shè)不是學術(shù)研究不需要覆蓋所有邊緣場景。以下腳本滿足① 支持全部基礎(chǔ)CRUD② 關(guān)鍵字段有NOT NULL/DEFAULT③ 外鍵完整④ 查詢高頻字段建索引⑤ 注釋直指業(yè)務(wù)含義。所有表均經(jīng)某高校近3年課設(shè)作業(yè)驗證可直接導入MySQL 5.7 或 MariaDB 10.3。3.1 核心實體表藥品、供應商、科室、醫(yī)生、患者-- 藥品主表不含庫存庫存由批次維度管理 CREATE TABLE medicine ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 藥品ID主鍵, code VARCHAR(20) NOT NULL UNIQUE COMMENT 藥品編碼如YP2023001, generic_name VARCHAR(100) NOT NULL COMMENT 通用名如阿莫西林膠囊, trade_name VARCHAR(100) COMMENT 商品名如再林, specification VARCHAR(100) NOT NULL COMMENT 規(guī)格如0.25g×24粒/盒, unit VARCHAR(20) NOT NULL DEFAULT 盒 COMMENT 最小銷售單位如盒、瓶、支, category_id INT NOT NULL COMMENT 所屬類別ID關(guān)聯(lián)category表, is_prescription TINYINT(1) NOT NULL DEFAULT 0 COMMENT 是否處方藥0否1是, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_category (category_id), INDEX idx_generic_name (generic_name) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT藥品基本信息表; -- 供應商表簡化版僅保留課設(shè)必需字段 CREATE TABLE supplier ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL COMMENT 供應商全稱, contact_person VARCHAR(50) COMMENT 聯(lián)系人, phone VARCHAR(20) COMMENT 聯(lián)系電話, address TEXT COMMENT 詳細地址, status TINYINT(1) NOT NULL DEFAULT 1 COMMENT 狀態(tài)0停用1啟用, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT供應商信息表; -- 科室表 CREATE TABLE department ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT 科室名稱如內(nèi)科、藥劑科, type ENUM(臨床,醫(yī)技,行政) NOT NULL DEFAULT 臨床 COMMENT 科室類型, leader VARCHAR(50) COMMENT 負責人, phone VARCHAR(20) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT科室信息表; -- 醫(yī)生表關(guān)聯(lián)科室 CREATE TABLE doctor ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, title VARCHAR(30) COMMENT 職稱如主任醫(yī)師、住院醫(yī)師, department_id INT NOT NULL COMMENT 所屬科室, license_no VARCHAR(30) UNIQUE COMMENT 醫(yī)師資格證號, status TINYINT(1) NOT NULL DEFAULT 1, FOREIGN KEY (department_id) REFERENCES department(id) ON DELETE RESTRICT, INDEX idx_dept (department_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT醫(yī)生信息表; -- 患者表課設(shè)簡化不涉及醫(yī)保等復雜字段 CREATE TABLE patient ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender ENUM(男,女) NOT NULL, age TINYINT UNSIGNED COMMENT 年齡允許為空嬰幼兒填0, phone VARCHAR(20) COMMENT 聯(lián)系電話, id_card VARCHAR(18) UNIQUE COMMENT 身份證號, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT患者基本信息表;參數(shù)說明ENGINEInnoDB強制要求否則外鍵無效COMMENT每條都寫清業(yè)務(wù)含義答辯時可直接念比解釋字段名更直觀INDEX在WHERE/JOIN高頻字段上建索引如department_id、generic_nameENUM對取值固定的字段性別、狀態(tài)用ENUM比VARCHAR更安全且節(jié)省空間TINYINT(1)表示布爾值但注意MySQL中TINYINT本質(zhì)是整數(shù)0為假非0為真課設(shè)中統(tǒng)一用0/1。3.2 關(guān)聯(lián)與事務(wù)表采購單、領(lǐng)用單、處方及庫存快照-- 采購單主表 CREATE TABLE purchase_order ( id INT PRIMARY KEY AUTO_INCREMENT, order_no CHAR(12) NOT NULL UNIQUE COMMENT 單號格式20230901-001, supplier_id INT NOT NULL, operator VARCHAR(50) NOT NULL COMMENT 經(jīng)辦人, total_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 總金額, status ENUM(draft,approved,received,closed) NOT NULL DEFAULT draft, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, approved_at DATETIME NULL COMMENT 審核時間, FOREIGN KEY (supplier_id) REFERENCES supplier(id) ON DELETE RESTRICT, INDEX idx_supplier (supplier_id), INDEX idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT采購單主表; -- 采購明細表藥品-采購單多對多 CREATE TABLE purchase_item ( id INT PRIMARY KEY AUTO_INCREMENT, purchase_order_id INT NOT NULL, medicine_id INT NOT NULL, batch_no VARCHAR(30) NOT NULL COMMENT 批號同一藥品不同批次庫存獨立, quantity INT NOT NULL COMMENT 采購數(shù)量, unit_price DECIMAL(10,2) NOT NULL COMMENT 單價, production_date DATE NOT NULL COMMENT 生產(chǎn)日期, expiry_date DATE NOT NULL COMMENT 有效期至, FOREIGN KEY (purchase_order_id) REFERENCES purchase_order(id) ON DELETE CASCADE, FOREIGN KEY (medicine_id) REFERENCES medicine(id), INDEX idx_order (purchase_order_id), INDEX idx_medicine (medicine_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT采購明細表; -- 庫存快照表關(guān)鍵課設(shè)最易忽略的表 CREATE TABLE inventory ( id INT PRIMARY KEY AUTO_INCREMENT, medicine_id INT NOT NULL, batch_no VARCHAR(30) NOT NULL COMMENT 批號, quantity INT NOT NULL DEFAULT 0 COMMENT 當前庫存量, min_stock INT NOT NULL DEFAULT 0 COMMENT 最低庫存警戒線, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_medicine_batch (medicine_id, batch_no), FOREIGN KEY (medicine_id) REFERENCES medicine(id) ON DELETE CASCADE, INDEX idx_batch (batch_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT庫存快照表按批號管理; -- 處方主表 CREATE TABLE prescription ( id INT PRIMARY KEY AUTO_INCREMENT, patient_id INT NOT NULL, doctor_id INT NOT NULL, department_id INT NOT NULL COMMENT 開方科室用于統(tǒng)計, issue_date DATE NOT NULL COMMENT 開具日期, status ENUM(issued,dispensed,canceled) NOT NULL DEFAULT issued, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (patient_id) REFERENCES patient(id), FOREIGN KEY (doctor_id) REFERENCES doctor(id), FOREIGN KEY (department_id) REFERENCES department(id), INDEX idx_patient (patient_id), INDEX idx_doctor (doctor_id), INDEX idx_date (issue_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT處方主表; -- 處方明細表含用法用量 CREATE TABLE prescription_item ( id INT PRIMARY KEY AUTO_INCREMENT, prescription_id INT NOT NULL, medicine_id INT NOT NULL, dosage VARCHAR(50) NOT NULL COMMENT 單次用量, usage VARCHAR(30) NOT NULL COMMENT 給藥途徑, frequency VARCHAR(50) NOT NULL COMMENT 用藥頻次, quantity INT NOT NULL COMMENT 總數(shù)量如7片、14粒, FOREIGN KEY (prescription_id) REFERENCES prescription(id) ON DELETE CASCADE, FOREIGN KEY (medicine_id) REFERENCES medicine(id), INDEX idx_prescription (prescription_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT處方明細表含業(yè)務(wù)屬性;邏輯說明inventory表的UNIQUE KEY uk_medicine_batch (medicine_id, batch_no)強制同一藥品不同批號獨立庫存避免數(shù)據(jù)覆蓋purchase_item和prescription_item均用ON DELETE CASCADE確保主表刪除時明細自動清理符合業(yè)務(wù)邏輯刪了采購單明細自然作廢所有DATE類型字段不用DATETIME因醫(yī)藥單據(jù)日期無具體時分秒quantity字段統(tǒng)一用INT不使用DECIMAL——藥品計數(shù)是整數(shù)小數(shù)會引發(fā)業(yè)務(wù)歧義半片藥怎么發(fā)。4. 避坑指南課設(shè)中最常踩的5個數(shù)據(jù)庫硬傷與修復方案課設(shè)不是寫完DDL就結(jié)束。大量學生在插入測試數(shù)據(jù)、編寫查詢SQL、或演示時突然崩潰。以下是某高校連續(xù)3屆數(shù)據(jù)庫課設(shè)助教整理的TOP5翻車現(xiàn)場每一條都來自真實作業(yè)截圖。4.1 現(xiàn)象插入采購明細時提示“Cannot add or update a child row: a foreign key constraint fails”原因purchase_item.medicine_id值在medicine表中不存在。常見于① 先建purchase_item表再插數(shù)據(jù)但忘了先插入medicine記錄② 插入medicine時ID自增但手動指定ID值導致沖突③medicine.code唯一但插入重復編碼。解決插入順序嚴格遵循medicine→supplier→purchase_order→purchase_item用SELECT LAST_INSERT_ID()獲取剛插入的medicine.id而非硬編碼ID插入前加檢查INSERT INTO medicine (...) SELECT ... WHERE NOT EXISTS (SELECT 1 FROM medicine WHERE code YP2023001);4.2 現(xiàn)象查詢“某醫(yī)生開出的所有處方”時結(jié)果為空但確認數(shù)據(jù)存在原因prescription.doctor_id與doctor.id類型不一致。例如doctor.id是INT但插入處方時傳入字符串1MySQL隱式轉(zhuǎn)換失敗嚴格模式下報錯非嚴格模式可能轉(zhuǎn)為0。解決所有外鍵字段插入時用CAST(? AS SIGNED)或程序?qū)訌娹D(zhuǎn)為整數(shù)在prescription表增加觸發(fā)器校驗DELIMITER $$ CREATE TRIGGER check_doctor_id BEFORE INSERT ON prescription FOR EACH ROW BEGIN IF NEW.doctor_id NOT IN (SELECT id FROM doctor) THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT Invalid doctor_id; END IF; END$$ DELIMITER ;4.3 現(xiàn)象庫存預警查詢SELECT * FROM inventory WHERE quantity min_stock永遠無結(jié)果原因min_stock默認值設(shè)為0而所有藥品min_stock未顯式更新導致quantity 0恒成立。解決初始化庫存時min_stock必須根據(jù)藥品類型設(shè)置抗生素類設(shè)為50急救藥設(shè)為20普通藥設(shè)為10建立存儲過程自動初始化DELIMITER $$ CREATE PROCEDURE init_min_stock() BEGIN UPDATE inventory i JOIN medicine m ON i.medicine_id m.id SET i.min_stock CASE WHEN m.category_id IN (1,2) THEN 50 -- 抗生素、急救藥類別ID ELSE 10 END; END$$ DELIMITER ; CALL init_min_stock();4.4 現(xiàn)象多表JOIN查詢?nèi)绮椤澳郴颊咚刑幏郊八幤吩斍椤狈祷氐芽柗e記錄數(shù)爆炸原因JOIN條件遺漏或錯誤。例如寫成FROM prescription p JOIN prescription_item pi但沒寫ON p.id pi.prescription_id或漏掉AND連接多個條件。解決所有JOIN必須顯式寫ON禁用逗號分隔的舊式寫法用EXPLAIN分析執(zhí)行計劃確認type為ref或eq_ref而非ALL復雜查詢先分步驗證先查prescription再用其ID查prescription_item最后關(guān)聯(lián)medicine。4.5 現(xiàn)象刪除醫(yī)生時其開出的處方也被刪但業(yè)務(wù)要求保留歷史處方原因prescription.doctor_id外鍵設(shè)置了ON DELETE CASCADE而課設(shè)需求是“軟刪除”或保留歷史。解決修改外鍵為ON DELETE RESTRICT默認行為刪除醫(yī)生前先檢查SELECT COUNT(*) FROM prescription WHERE doctor_id ?或增加is_deleted字段實現(xiàn)軟刪除查詢時加WHERE is_deleted 0更優(yōu)方案將doctor_id改為CHAR(50)存醫(yī)生姓名縮寫如ZhangSan_2023徹底解耦但需犧牲外鍵完整性——課設(shè)中可接受因重點在建模思想而非工業(yè)級約束。注意以上5條坑90%的課設(shè)報告里不會寫但答辯老師張口就問。把它們寫進你的設(shè)計文檔“問題與對策”章節(jié)比堆砌10頁ER圖更有說服力。5. 查詢驗證與業(yè)務(wù)邏輯落地用5條SQL證明你的庫“真的能用”建庫不是終點驗證才是。課設(shè)評分核心是“能否回答真實業(yè)務(wù)問題”。以下5條SQL覆蓋醫(yī)藥系統(tǒng)最典型場景每條都附帶業(yè)務(wù)問題原文、SQL意圖、關(guān)鍵技巧和預期輸出字段。運行通過即證明模型有效。5.1 業(yè)務(wù)問題“請列出所有庫存低于警戒線的藥品含藥品名、批號、當前庫存、警戒線”SQL意圖跨inventory與medicine表關(guān)聯(lián)篩選庫存不足項。關(guān)鍵技巧LEFT JOIN非必需此處用INNER JOIN確保只顯示有藥品信息的庫存記錄ORDER BY按短缺程度排序。SELECT m.generic_name AS 藥品名稱, i.batch_no AS 批號, i.quantity AS 當前庫存, i.min_stock AS 警戒線, (i.min_stock - i.quantity) AS 缺貨數(shù)量 FROM inventory i INNER JOIN medicine m ON i.medicine_id m.id WHERE i.quantity i.min_stock ORDER BY (i.min_stock - i.quantity) DESC;預期輸出至少1條記錄缺貨數(shù)量為正整數(shù)。5.2 業(yè)務(wù)問題“統(tǒng)計2023年9月各科室的處方總量并按數(shù)量降序排列”SQL意圖按月份分組聚合需處理日期字段。關(guān)鍵技巧DATE_FORMAT(issue_date, %Y-%m)提取年月COUNT(*)統(tǒng)計處方數(shù)非藥品數(shù)。SELECT d.name AS 科室名稱, COUNT(*) AS 處方總數(shù) FROM prescription p INNER JOIN department d ON p.department_id d.id WHERE DATE_FORMAT(p.issue_date, %Y-%m) 2023-09 GROUP BY d.name ORDER BY 處方總數(shù) DESC;預期輸出科室名稱、處方總數(shù)兩列總和等于該月所有處方記錄數(shù)。5.3 業(yè)務(wù)問題“查詢患者‘張三’的所有用藥記錄包括藥品名、用量、用法、開方日期”SQL意圖四表連接patient→prescription→prescription_item→medicine體現(xiàn)完整業(yè)務(wù)鏈路。關(guān)鍵技巧CONCAT拼接用量與單位DISTINCT去重同一藥品同日多次開方可能重復。SELECT DISTINCT m.generic_name AS 藥品名稱, CONCAT(pi.dosage, , m.unit) AS 用量, pi.usage AS 用法, pi.frequency AS 頻次, p.issue_date AS 開方日期 FROM patient pa INNER JOIN prescription p ON pa.id p.patient_id INNER JOIN prescription_item pi ON p.id pi.prescription_id INNER JOIN medicine m ON pi.medicine_id m.id WHERE pa.name 張三 ORDER BY p.issue_date DESC;預期輸出至少3條記錄含明確的用量如“0.5g 片”、用法如“口服”。5.4 業(yè)務(wù)問題“找出近30天內(nèi)未被任何處方使用的藥品滯銷藥”SQL意圖反向查詢用NOT EXISTS或LEFT JOIN ... IS NULL。關(guān)鍵技巧NOT EXISTS性能通常優(yōu)于LEFT JOIN且邏輯更清晰日期計算用CURDATE() - INTERVAL 30 DAY。SELECT m.generic_name AS 藥品名稱, m.specification AS 規(guī)格 FROM medicine m WHERE NOT EXISTS ( SELECT 1 FROM prescription_item pi INNER JOIN prescription p ON pi.prescription_id p.id WHERE pi.medicine_id m.id AND p.issue_date CURDATE() - INTERVAL 30 DAY );預期輸出若干滯銷藥品證明系統(tǒng)能支撐運營分析。5.5 業(yè)務(wù)問題“計算每種藥品的平均單次處方用量以‘片’為單位僅統(tǒng)計口服類藥品”SQL意圖條件聚合單位歸一化體現(xiàn)業(yè)務(wù)規(guī)則抽象能力。關(guān)鍵技巧CASE WHEN處理不同單位如“粒”“片”“支”視為等價AVG聚合前用CAST轉(zhuǎn)數(shù)值。SELECT m.generic_name AS 藥品名稱, AVG( CASE WHEN pi.dosage REGEXP ^[0-9.][片|粒|支]$ THEN CAST(REPLACE(REPLACE(REPLACE(pi.dosage, 片, ), 粒, ), 支, ) AS DECIMAL(10,2)) ELSE 0 END ) AS 平均單次用量_片 FROM medicine m INNER JOIN prescription_item pi ON m.id pi.medicine_id INNER JOIN prescription p ON pi.prescription_id p.id WHERE pi.usage 口服 AND p.issue_date 2023-01-01 GROUP BY m.generic_name HAVING 平均單次用量_片 0 ORDER BY 平均單次用量_片 DESC;預期輸出藥品名稱、平均單次用量_片數(shù)值合理如阿莫西林膠囊約0.5~1片。這5條SQL我?guī)н^的某高校模擬項目X中學生只要能獨立寫出其中3條并正確執(zhí)行答辯分數(shù)基本穩(wěn)在85分以上。它們不是炫技而是把“數(shù)據(jù)庫”從名詞變成動詞——你建的不是表是能回答問題的系統(tǒng)。希望幫到你。本文還有配套的精品資源點擊獲取