数据库基础(lab4:单表查询 二)

lab4:单表查询(二)

一、模糊查询 (LIKE)

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。通常与通配符一起使用。

  1. 百分号通配符 (%)

    • 作用: 匹配零个或多个任意字符。
    • 语法: WHERE 字段名 LIKE '模式'
    • 模式示例:
      • 'C%': 匹配以 "C" 开头的字符串 (如: 'Charlie', 'Catherine')。
      • '%r': 匹配以 "r" 结尾的字符串 (如: 'bear')。
      • '%ir%': 匹配任何位置包含 "ir" 的字符串 (如: 'bird', 'girl')。
  2. 下划线通配符 (_)

    • 作用: 匹配单个任意字符。
    • 语法: WHERE 字段名 LIKE '模式'
    • 模式示例:
      • 'h_t': 匹配以 "h" 开头,以 "t" 结尾,中间只有一个字符的字符串 (如: 'hot', 'hat')。
      • '__r': 匹配第三个字符是 "r" 的字符串。

二、特殊条件查询

  1. 查询空值 (IS NULL)

    • 作用: 查找字段值为 NULL 的记录。NULL 表示未知或不适用的值,它不等于 0 或空字符串 ''
    • 语法: WHERE 字段名 IS NULLWHERE 字段名 IS NOT NULL
    • 示例: 查询 DeptId 为空的员工。
      SELECT * FROM tb_emp WHERE DeptId IS NULL;
      
  2. 去除重复 (DISTINCT)

    • 作用: 返回唯一不同的值。它作用于所有指定的列,即只有当所有指定列的值都相同时,才被视为重复行。
    • 语法: SELECT DISTINCT 字段1, 字段2, ... FROM 表名;
    • 示例: 返回 tb_emp 表中不重复的 Name
      SELECT DISTINCT Name FROM tb_emp;
      

三、多条件查询

  1. AND 操作符

    • 作用: 用于组合多个条件,只有当所有条件都为真时,记录才会被返回。
    • 语法: WHERE 条件1 AND 条件2 AND ...;
    • 示例: 查询 DeptId301 并且薪水大于 3000 的员工。
      SELECT * FROM tb_emp WHERE DeptId = 301 AND Salary > 3000;
      
  2. OR 操作符

    • 作用: 用于组合多个条件,只要其中任意一个条件为真,记录就会被返回。
    • 语法: WHERE 条件1 OR 条件2 OR ...;
    • 示例: 查询 DeptId301303 的员工。
      SELECT * FROM tb_emp WHERE DeptId = 301 OR DeptId = 303;
      
    • 提示: 当对同一个字段进行多个 OR 判断时,使用 IN 关键字通常更清晰、更高效。
      SELECT * FROM tb_emp WHERE DeptId IN (301, 303);
      

四、我遇到的问题与解决方案

1. 困惑:LIKE 通配符 %_ 的区别与用法

  • 问题: 不理解为什么教程中 % 的位置不同,以及 _ 的具体作用。
  • 解析:
    • % 匹配零个或多个任意字符。它的位置决定了匹配模式:
      • 'C%':以 C 开头。
      • '%C':以 C 结尾。
      • '%C%':包含 C。
    • _ 匹配恰好一个任意字符。每个 _ 都代表一个字符位。
      • 'C_':匹配以 C 开头且总长度为2的字符串。
      • 'C___':匹配以 C 开头且总长度为4的字符串。
    • 结论: 对于“查询以C开头的名字”这类需求,应使用 LIKE 'C%',因为名字的长度不固定。

2. 困惑:DISTINCT 如何处理多列的重复项?

  • 问题: 当 SELECT DISTINCT 作用于多个列时,如果出现重复,它会保留哪一行?
  • 解析: DISTINCT 作用于所有指定的列。只有当一行中所有被 SELECT 的列的值与另一行完全相同时,才被视为重复行。它不是“选择”保留哪一行,因为这些重复行在所选列的维度上是完全相同的,所以只返回这个组合一次。

3. 错误:对题目描述的过度解读与错误使用 LIKE

  • 问题: 在一个查询中,将题目中对字段名的描述("DeptId的倒数第二个字母为i的大写")误解为查询条件,并对数字类型的 DeptId 字段使用了 LIKE 'I_'
  • 解析:
    • 逻辑错误: 题目中对字段名的描述通常是为了提示或增加趣味性,而非实际的查询过滤条件。应关注核心要求,如 "DeptId为301并且薪水大于3000"。
    • 语法错误: LIKE 是字符串匹配操作符,不能用于 INT 等数字类型的字段。
    • 正确做法: 忽略描述性文字,直接根据明确的数值和比较条件编写 WHERE 子句。
      -- 错误
      WHERE DeptId = 301 AND Salary > 3000 AND DeptId LIKE 'I_';
      -- 正确
      WHERE DeptId = 301 AND Salary > 3000;
      
posted @ 2025-11-17 17:10  yesno233233  阅读(6)  评论(0)    收藏  举报