当前位置: 首页 > news >正文

数据库——MySQL数字函数和子查询

一、数据库表结构设计

1. 患者表(patient)

记录患者基本信息:

CREATE TABLE patient (
    patientID INT PRIMARY KEY,
    patientName VARCHAR(50),
    birthDate DATE
);

示例数据

INSERT INTO patient VALUES
(1, '姚维新', '1990-05-15'),
(2, '夏颖', '1985-03-20'),
(3, '张三', '2000-01-10'),
(4, '李四', '1975-07-30'),
(5, '简要选', '1980-12-25');

2. 检查记录表(prescription)

记录患者的检查记录:

CREATE TABLE prescription (
    prescriptionID INT PRIMARY KEY,
    patientID INT,
    checkItemID INT,
    examDate DATE
);

示例数据

INSERT INTO prescription VALUES
(1, 2, 1, '2022-01-15'),
(2, 2, 1, '2023-01-10'),
(3, 1, 1, '2021-05-20'),
(4, 3, 1, '2023-03-15'),
(5, 4, 1, '2020-11-30');

3. 检查项目表(checkitem)

定义检查项目类型:

CREATE TABLE checkitem (
    checkItemID INT PRIMARY KEY,
    checkItemName VARCHAR(50)
);

示例数据

INSERT INTO checkitem VALUES
(1, '血常规'),
(2, '尿常规'),
(3, '心电图');

二、基础数学函数详解

1. ABS() - 绝对值

语法ABS(number)
示例

SELECT ABS(-10) AS result; -- 输出:10

2. CEIL()/CEILING() - 向上取整

语法CEIL(number)
示例

SELECT CEIL(4.3) AS result; -- 输出:5
SELECT CEIL(-4.3) AS result; -- 输出:-4

3. FLOOR() - 向下取整

语法FLOOR(number)
示例

SELECT FLOOR(4.7) AS result; -- 输出:4
SELECT FLOOR(-4.3) AS result; -- 输出:-5

4. ROUND() - 四舍五入

语法ROUND(number, decimal_places)
示例

SELECT ROUND(4.567, 2) AS result; -- 输出:4.57
SELECT ROUND(4.567, 0) AS result; -- 输出:5

三、子查询实战案例

1. 查找做过“血常规”检查的患者

SELECT p.patientName 
FROM patient p
WHERE p.patientID IN (
    SELECT pr.patientID 
    FROM prescription pr
    JOIN checkitem ci ON pr.checkItemID = ci.checkItemID
    WHERE ci.checkItemName = '血常规'
);

输出

patientName
夏颖
姚维新
张三
李四

2. 显示每个患者的检查次数

SELECT p.patientName, 
       (SELECT COUNT(*) 
        FROM prescription 
        WHERE patientID = p.patientID) AS check_count
FROM patient p;

输出

patientName | check_count
姚维新       | 1
夏颖        | 2
张三        | 1
李四        | 1
简要选       | 0

3. 查找2022年后做过检查的患者

SELECT p.patientName 
FROM patient p
WHERE EXISTS (
    SELECT 1 
    FROM prescription 
    WHERE patientID = p.patientID 
      AND examDate > '2022-12-31'
);

输出

patientName
夏颖
张三

4. 查找最近3年内做过检查的患者

SELECT p.patientName 
FROM patient p
WHERE EXISTS (
    SELECT 1 
    FROM prescription 
    WHERE patientID = p.patientID 
      AND examDate >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
);

5. 计算患者年龄并筛选30-40岁之间的患者

SELECT patientName, 
       TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) AS age
FROM patient
HAVING age BETWEEN 30 AND 40;

输出

patientName | age
姚维新       | 33
夏颖        | 38
简要选       | 43

6. 显示每个检查项目的使用次数

SELECT ci.checkItemName, 
       COUNT(pr.prescriptionID) AS usage_count
FROM checkitem ci
LEFT JOIN prescription pr ON ci.checkItemID = pr.checkItemID
GROUP BY ci.checkItemID;

输出

checkItemName | usage_count
血常规        | 5
尿常规        | 0
心电图        | 0

四、关键问题与优化建议

  1. 年龄计算的准确性

    • 使用TIMESTAMPDIFF(YEAR, birthDate, CURDATE())替代简单年份差,避免忽略月份和日期。

    • 示例:TIMESTAMPDIFF(YEAR, '1990-05-15', '2023-10-01') 精确计算为33岁。

  2. 子查询性能优化

    • 避免在WHERE子句中对字段使用函数(如YEAR(examDate)),改用范围查询:

      WHERE examDate BETWEEN '2023-01-01' AND '2023-12-31'

http://www.dtcms.com/a/112274.html

相关文章:

  • 交互式 AI 系统
  • C++ 极简常用内容
  • 电商---part02 项目环境准备
  • 如何根据电池电流计算电池容量
  • wsl编译openwrt24.10.0
  • dbscan 检测噪声
  • Node.js中间件的5个注意事项
  • 【Java集合】单列集合List详解
  • 基于K8s的演示用单机ML服务部署
  • 26考研——线性表_ 线性表的链式表示_双循环链表(2)
  • 多表查询的多与一
  • 对 Python Websockets 库全方位详解
  • 企业安全——FIPs
  • 面试可能会遇到的问题回答(嵌入式软件开发部分)
  • 如何在 Windows 上安装 Python
  • 新旧iPhone相册复制 - 相册图片视频对拷 - 换机 - 迁移设备数据 - 免费开源爱思助手
  • 免费在线MBTI性格测试工具 - 探索你的性格特质
  • 什么是自动化测试框架?常用的自动化测试框架有哪些?
  • 2.3 MySQL基本内置函数
  • Cortex-M​ 函数调用的入栈与出栈操作
  • 【5】搭建k8s集群系列(二进制部署)之安装master节点组件(kube-controller-manager)
  • 盲盒小程序开发平台搭建:打造个性化、高互动性的娱乐消费新体验
  • 定长池的实现
  • 蓝桥杯 小明的背包1 小兰的神秘礼物 01背包问题 模板 C++
  • 财务税务域——企业税务系统设计
  • centos8上实现lvs集群负载均衡dr模式
  • 【学Rust写CAD】23 渐变效果(gradient_source.rs)
  • 【面试篇】Dubbo
  • NSSCTF [HGAME 2023 week1]simple_shellcode
  • 音视频入门基础:MPEG2-PS专题(8)——使用Wireshark分析GB28181的PS流