order by case when 语句

  • 通过CASE语句为不同条件赋予排序权重值,实现按自定义顺序对查询结果排序。
  • 案例:
    • 创建一张成绩表
      CREATE TABLE academic_records (
          id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
          student_id VARCHAR(10) NOT NULL COMMENT '学生唯一标识符',
          student_name VARCHAR(50) NOT NULL COMMENT '学生姓名',
          subject VARCHAR(20) NOT NULL COMMENT '学科名称',
          score DECIMAL(5,1) NOT NULL COMMENT '数值成绩(0-100分,允许一位小数)',
          CHECK (score BETWEEN 0 AND 100)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生学业成绩记录表';
      
    • 填充数据
      -- 关闭自动提交,保证事务一致性
      SET autocommit = 0;
      
      -- 插入核心数据
      INSERT INTO academic_records (student_id, student_name, subject, score)
      SELECT 
        students.student_id,
        students.student_name,
        subjects.subject,
        ROUND(RAND() * 90 + 10, 1) AS score -- 生成10-100之间的随机成绩
      FROM 
        (-- 生成10个学生基础信息
         SELECT 'S2023001' AS student_id, '张一鸣' AS student_name UNION ALL
         SELECT 'S2023002', '李思思' UNION ALL
         SELECT 'S2023003', '王伟' UNION ALL
         SELECT 'S2023004', '赵敏' UNION ALL
         SELECT 'S2023005', '陈强' UNION ALL
         SELECT 'S2023006', '周晓晓' UNION ALL
         SELECT 'S2023007', '黄轩' UNION ALL
         SELECT 'S2023008', '吴倩' UNION ALL
         SELECT 'S2023009', '郑浩' UNION ALL
         SELECT 'S2023010', '林小美'
        ) students
      CROSS JOIN 
        (-- 定义三门学科
         SELECT '语文' AS subject UNION ALL
         SELECT '数学' UNION ALL
         SELECT '英文'
        ) subjects;
      
      -- 提交事务
      COMMIT;
      
    • 查询
      SELECT * FROM
      academic_records a
      ORDER BY
      	CASE  
      	WHEN a.`subject` = '语文' THEN 1  
      	WHEN a.`subject` = '数学' THEN 2  
      	ELSE 3  
      	END;
      
      • 在这里插入图片描述
### SQL 中使用 ORDER BYCASE WHEN 的用法与示例 在 SQL 查询中,`ORDER BY` 子句可以结合 `CASE WHEN` 语句实现动态排序逻辑。这种组合允许根据特定条件对结果集进行排序,从而增强查询的灵活性和功能性。 以下是一个典型的用法示例: ```sql SELECT column1, column2, column3 FROM table_name ORDER BY CASE WHEN column1 = 'specific_value' THEN 1 ELSE 2 END, column2 DESC; ``` 在这个例子中,查询首先根据 `column1` 是否等于 `'specific_value'` 来决定优先级[^1]。如果 `column1` 等于 `'specific_value'`,则该行被赋予较高的优先级(值为 1);否则,赋予较低的优先级(值为 2)。此外,`column2` 按降序排列作为次要排序依据[^2]。 #### 动态排序的详细说明 - **基于条件的排序**:通过 `CASE WHEN`,可以根据不同的列值或表达式结果调整排序顺序。 - **多级排序**:除了主排序条件外,还可以添加额外的排序字段以确保结果的唯一性或进一步组织数据。 例如,假设有一个名为 `Employees` 的表,包含员工姓名 (`Name`)、部门 (`Department`) 和工资 (`Salary`)。我们希望按以下规则排序: 1. 如果部门是 `'HR'`,则优先显示这些记录。 2. 对于其他部门,按工资从高到低排序。 ```sql SELECT Name, Department, Salary FROM Employees ORDER BY CASE WHEN Department = 'HR' THEN 1 ELSE 2 END, Salary DESC; ``` 在此查询中,`CASE WHEN` 语句用于定义部门为 `'HR'` 的记录优先级最高,而其他部门的记录则按照工资降序排列[^3]。 #### 注意事项 - 确保 `CASE WHEN` 表达式的返回值类型一致,以避免潜在的类型转换错误。 - 在复杂查询中,合理使用索引可以显著提高性能,尤其是在涉及大量数据时。 ### 示例代码 以下是一个更复杂的示例,展示如何结合多个条件进行排序: ```sql SELECT ProductID, Category, Price FROM Products ORDER BY CASE WHEN Category = 'Electronics' THEN 1 WHEN Category = 'Books' THEN 2 ELSE 3 END, Price ASC; ``` 这段代码将 `Products` 表中的记录按类别排序,其中电子产品的优先级最高,书籍次之,其余类别的产品最后排序。同时,相同类别的产品按价格升序排列。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值