数据库基础(lab4:单表查询 二)
lab4:单表查询(二)
一、模糊查询 (LIKE)
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。通常与通配符一起使用。
-
百分号通配符 (
%)- 作用: 匹配零个或多个任意字符。
- 语法:
WHERE 字段名 LIKE '模式' - 模式示例:
'C%': 匹配以 "C" 开头的字符串 (如: 'Charlie', 'Catherine')。'%r': 匹配以 "r" 结尾的字符串 (如: 'bear')。'%ir%': 匹配任何位置包含 "ir" 的字符串 (如: 'bird', 'girl')。
-
下划线通配符 (
_)- 作用: 匹配单个任意字符。
- 语法:
WHERE 字段名 LIKE '模式' - 模式示例:
'h_t': 匹配以 "h" 开头,以 "t" 结尾,中间只有一个字符的字符串 (如: 'hot', 'hat')。'__r': 匹配第三个字符是 "r" 的字符串。
二、特殊条件查询
-
查询空值 (
IS NULL)- 作用: 查找字段值为
NULL的记录。NULL表示未知或不适用的值,它不等于0或空字符串''。 - 语法:
WHERE 字段名 IS NULL或WHERE 字段名 IS NOT NULL - 示例: 查询
DeptId为空的员工。SELECT * FROM tb_emp WHERE DeptId IS NULL;
- 作用: 查找字段值为
-
去除重复 (
DISTINCT)- 作用: 返回唯一不同的值。它作用于所有指定的列,即只有当所有指定列的值都相同时,才被视为重复行。
- 语法:
SELECT DISTINCT 字段1, 字段2, ... FROM 表名; - 示例: 返回
tb_emp表中不重复的Name。SELECT DISTINCT Name FROM tb_emp;
三、多条件查询
-
AND 操作符
- 作用: 用于组合多个条件,只有当所有条件都为真时,记录才会被返回。
- 语法:
WHERE 条件1 AND 条件2 AND ...; - 示例: 查询
DeptId为301并且薪水大于3000的员工。SELECT * FROM tb_emp WHERE DeptId = 301 AND Salary > 3000;
-
OR 操作符
- 作用: 用于组合多个条件,只要其中任意一个条件为真,记录就会被返回。
- 语法:
WHERE 条件1 OR 条件2 OR ...; - 示例: 查询
DeptId为301或303的员工。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;
浙公网安备 33010602011771号