Mysql中where后的五种子句

SQL查询技巧精要
本文详细介绍了SQL查询语言中的关键概念和技术,包括where条件筛选、group by分组、having筛选分组后的数据、order by排序及limit进行分页。通过这些技术的组合使用,能够高效地管理和检索数据库中的信息。

where

group by

having

Order by

limit

1.where从表中直接筛选记录,影响的是行数

后边可以跟

(1)算术运算符:+  -  *  /(除也可以写成div)   %(取模可以写成mod)

(2)比较运算符:=  >  >=  <  <=  !=(不等于还可以写成<>)

(3)逻辑运算符:&&(逻辑与也可以写成and) ||(逻辑或也可以写成or) not(逻辑非)

(4)范围:表达式 between ... and ... (也可以写成 表达式>=...  and 表达式 <=...)

            表达式 not between ... and ...(也可以写成 表达式<...  || 表达式 >...)

(5)集合:in (值,值,值...)  not in(值,值,值...)

(6)模糊查询:LIKE  NOT  LIKE,通配符:%表示0-n个字符,_下划线代表一个字符

(7)位运算符:&(按位与) |(按位或)  注意:极少用

(8)NULL值判断,is null 或 is not null,如果使用null=null,null<>null,null=0,null<>0,null=false等都不对

2.group by 配合聚合函数一块使用

count,max,min,avg,sum

select的查询条件只能是group by 的字段和聚合函数

3.having和where不同,where是从原数据库中筛选,having是从查询的结果中再次筛选.

        where子句中不能使用组合函数,having中可以使用

4.order by排序

        默认是升序,也可以在字段后面加asc显示说明是升序,desc为降序.可以使用多列排序

5.分页 limit 参数1,参数2

        参数1:从第几行开始查询,行数从零开始;参数2:每页显示几行

# 0,5

# 5,5

# 10,5

#(page -1)*n,n page:n,n每页显示的行数

<think> 我们正在讨论的是MySQLWHERE子句精确匹配字符串的用法。根据用户的问题,他之前询问了LIKE的用法,现在转向精确匹配。 精确匹配字符串通常使用等号(=)操作符,但需要注意一些细节以避免常见错误。 核心要点: 1. 使用等号(=)进行精确匹配 2. 字符串必须用引号(单引号或双引号)括起来 3. 注意字符串的大小写敏感性(取决于数据库的字符集和校对规则) 4. 避免在WHERE子句中隐式类型转换(特别是字符串和数字) 根据引用[5]:用户提到MySQL有时会在WHERE子句中隐式将字符串转换为整数,这可能导致不期望的结果。因此,我们需要确保比较时类型一致。 另外,根据引用[2]:使用主键作为WHERE子句的条件查询是非常快速的。所以,如果精确匹配的列是主键,性能会很高。 示例表结构(假设): 表名:users 列:id (INT, 主键), username (VARCHAR), email (VARCHAR), ... 精确匹配示例: 1. 基本字符串匹配 ```sql SELECT * FROM users WHERE username = 'john_doe'; ``` 2. 匹配带空格的字符串 ```sql SELECT * FROM products WHERE product_name = 'Laptop Pro 15'; ``` 3. 匹配包含特殊字符的字符串(需要正确转义) ```sql SELECT * FROM comments WHERE content = 'It\'s a sunny day!'; -- 注意单引号转义 ``` 4. 多个条件组合 ```sql SELECT * FROM users WHERE username = 'alice' AND email = 'alice@example.com'; ``` 5. 使用BINARY关键字强制区分大小写(如果数据库的校对规则不区分大小写,例如utf8_general_ci) ```sql SELECT * FROM users WHERE BINARY username = 'John'; -- 此时'john'不会被匹配 ``` 关于隐式类型转换的问题(参考引用[5]): 当比较字符串列和一个数字时,MySQL会将字符串转换为数字,这可能导致非预期的结果。 例如: ```sql -- 假设有一个列varchar_col,值为'123', '123abc' SELECT * FROM table WHERE varchar_col = 123; -- 会匹配'123',但也会匹配以123开头的字符串(因为转换时取前面的数字部分),这是不准确的。 ``` 解决方案:确保比较时类型一致。 ```sql SELECT * FROM table WHERE varchar_col = '123'; -- 精确匹配字符串'123' ``` 性能建议: - 对字符串列使用索引(特别是当该列经常用于精确匹配时) - 避免在WHERE子句中对列进行函数操作(如:WHERE LOWER(column) = 'value'),这会导致索引失效 特殊注意事项: - 在MySQL中,字符串比较默认是不区分大小写的(取决于校对规则)。如果需要区分大小写,可以使用BINARY运算符(如上所示)或更改列的校对规则为区分大小写的规则(如utf8_bin)。 - 使用NOT操作符进行否定匹配:`WHERE username != 'john'` 根据引用[4]:当使用IN子句进行多个精确匹配时,需要注意字符串的引号处理。例如: ```php $arr = ['apple', 'banana', 'orange']; $str = "'" . implode("','", $arr) . "'"; $sql = "SELECT * FROM fruits WHERE name IN ($str)"; ``` 这样生成的SQL为:`SELECT * FROM fruits WHERE name IN ('apple','banana','orange')` 总结: 精确匹配字符串使用等号(=)和引号包裹的字符串。注意转义特殊字符,避免类型转换问题,并根据需要处理大小写敏感问题。 相关问题: 1. 在MySQL中,如何避免字符串比较时的大小写不敏感问题? 2. 为什么在WHERE子句中字符串列与数字比较会导致性能问题? 3. 如何在PHP中安全地构建包含多个精确字符串匹配的IN子句? 4. 精确匹配字符串时,使用单引号和双引号有什么区别? </think> ### MySQL WHERE 子句精确匹配字符串方法详解 在 MySQL 中,精确匹配字符串需使用等号(`=`)操作符,结合单引号包裹字符串值。这是最高效的字符串匹配方式,**能充分利用索引**,避免模糊匹配的性能损耗[^1][^2]。 --- #### 一、基础语法 ```sql SELECT 列名 FROM 表名 WHERE 字符串列 = '精确值'; ``` **示例**: ```sql -- 匹配用户名 "admin" SELECT * FROM users WHERE username = 'admin'; -- 匹配商品编号 "SKU-2023A" SELECT * FROM products WHERE sku = 'SKU-2023A'; ``` --- #### 二、核心要点 1. **引号规范** - 字符串必须用 **单引号** 包裹:`WHERE name = '张三'` - 双引号仅适用于 ANSI_QUOTES 模式(不推荐) - ✅ 正确:`WHERE code = 'ABC123'` ❌ 错误:`WHERE code = ABC123`(无引号会解析为列名或变量) 2. **大小写敏感处理** - 默认情况下,匹配不区分大小写(校对规则如 `utf8_general_ci`) - 强制区分大小写: ```sql SELECT * FROM users WHERE BINARY username = 'Admin'; -- 仅匹配 "Admin" ``` 3. **特殊字符转义** 使用反斜杠转义单引号: ```sql -- 匹配 "O'Neil" SELECT * FROM employees WHERE name = 'O\'Neil'; ``` 4. **复合条件** ```sql -- 同时匹配用户名和状态 SELECT * FROM users WHERE username = 'admin' AND status = 'active'; ``` --- #### 三、IN 子句精确匹配多值 引用[^4]的方法扩展: ```sql -- 匹配多个预设值 SELECT * FROM products WHERE category IN ('电子产品','家居用品','图书'); ``` PHP 动态构建示例: ```php $items = ["手机", "平板", "笔记本"]; $safe_values = "'" . implode("','", array_map('mysqli_real_escape_string', $items)) . "'"; $sql = "SELECT * FROM products WHERE name IN ($safe_values)"; ``` --- #### 四、常见误区与解决方案 | 问题类型 | 错误示例 | 解决方案 | |----------|----------|----------| | 隐式类型转换 | `WHERE id = '100'` (id 是 INT 列) | 保持类型一致:`WHERE id = 100` [^5] | | 尾部空格 | `WHERE name = 'John '` | 使用 `TRIM()`:`WHERE TRIM(name) = 'John'` | | 字符集冲突 | 中文匹配异常 | 确保连接字符集与表一致:`SET NAMES utf8mb4` | --- #### 五、性能优化建议 1. **索引优化** - 为频繁查询的字符串列创建索引: ```sql CREATE INDEX idx_username ON users(username); ``` 2. **避免函数操作** ❌ `WHERE LOWER(name) = 'john'`(索引失效) ✅ `WHERE name = 'John'`(使用索引) 3. **使用 EXISTS 替代 IN** 当子查询结果集较大时: ```sql SELECT * FROM orders o WHERE EXISTS ( SELECT 1 FROM products p WHERE p.id = o.product_id AND p.sku = 'GADGET-2023' ); ``` > 📌 **关键区别**:精确匹配(`=`)比模糊匹配(`LIKE`)**快 10-100 倍**,特别是在百万级数据表中[^1]。 --- #### 六、与其他匹配方式对比 | 方法 | 使用场景 | 索引支持 | |-----------|------------------------|----------| | `=` | 精确匹配完整字符串 | ✅ 是 | | `LIKE` | 模糊匹配(含通配符) | ️ 部分 | | `REGEXP` | 正则表达式匹配 | ❌ 否 | | `STRCMP()`| 精确比较(区分大小写) | ✅ 是 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值