六、where条件查询

学习目标
  • 能够写出模糊查询的SQL语句

1、where条件查询的介绍

使用where条件查询可以对表中的数据进行筛选,条件成立的记录会出现在结果中

where语句支持的运算符:
  1. 比较运算符
  2. 逻辑运算符
  3. 模糊查询
  4. 范围查询
  5. 空判断
where条件查询语法格式如下:
select * from 表名 where 条件;
例:
select * from students where id = 1;

2、比较运算符查询

  1. 等于:=
  2. 大于:>
  3. 大于等于:>=
  4. 小于:<
  5. 小于等于:<=
  6. 不等于:!=或<>
例1:查询编号大于3的同学
select * from students where id > 3;
例2:查询编号不大于4的学生
select * from students where id <= 4;
例3:查询姓名不是“张三”的学生
select * from students where name != '张三';
例4:查询没被删除的学生
select * from students where is_delete=0;

3、逻辑运算符查询

  1. and
  2. or
  3. not
例1:查询编号大于3的女同学
select * from students where id > 3 and gender=0;
例2:查询编号小于4或没被删除的学生
select * from students where id < 4 or is_delete=0;
例3:查询年龄不在10岁到15岁之间的学生
select * from students where not (age >= 10 and age <= 15);
说明:
  • 多个条件判断想要作为一个整体,可以结合()

4、模糊查询

  1. like是模糊查询关键字
  2. %表示任意多个字符
  3. _表示任意一个字符
例1:查询姓黄的学生
select * from students where name like '黄%';
例2:查询姓黄并且“名”是一个字的学生
select * from students where name like '黄_';
例3:查询姓黄或叫靖的学生
select * from students where name like '黄%' or name like '%靖';

5、范围查询

  1. betweem…and…表示在一个连续的范围内查询
  2. in表示在一个非连续的范围内查询
例1:查询编号为3至8的学生
select * from students where id between 3 and 8;
例2:查询编号不是3至8的学生
select * from students where not (id between 3 and 8) and gender='男';
例3:查询编号是3、5、7的学生
select * from students where id in (3, 5, 7);
例4:查询编号不是3、5、7的学生
select * from students where id not in (3, 5, 7);

6、空判断查询

  1. 判断为空使用:is null
  2. 判断非空使用:is not null
例1:查询没有填写身高的同学
select * from students where height is null;
注意:
  1. 不能使用where height = null判断为空
  2. 不能使用where height != null判断非空
  3. null不等于’'空字符串

7、小结

  • 常见的比较运算符有>,<,>=,<=,!=
  • 逻辑运算符and表示多个条件同时成立则为真,or表示多个条件有一个成立则为真,not表示对数据取反
  • like和%结合使用表示任意多个任意字符,like和_结合使用表示一个任意字符
  • between-and限制连续性范围,in限制非连续性范围
  • 判断为空使用is null
  • 判断非空使用is not null
<think>好的,我现在需要帮助用户了解SQLWHERE条件的使用方法,并且根据他们的要求提供说明、示例和教程。首先,我需要回忆关于SQL WHERE子句的基本知识,确保信息的准确性。 用户提供的引用资料中提到了动态拼接WHERE条件、防止SQL注入以及截取WHERE后的条件部分。这些可能都是用户关心的点,尤其是动态条件和安全性问题。我需要将这些内容整合到回答中,同时保持结构清晰。 首先,应该解释WHERE子句的基本作用,即过滤数据。然后,给出基本语法,比如SELECT ... FROM ... WHERE条件。接着,举例说明如何使用比较运算符、逻辑运算符(AND、OR、NOT)、IN、BETWEEN、LIKE和IS NULL等。每个部分都需要具体的例子,比如查询年龄大于18岁的用户,或者名字以“张”开头的人。 接下来,需要讨论动态拼接WHERE条件,这可能涉及到用户提到的引用[1]中的内容。这里要注意SQL注入的问题,引用[2]提到使用正则表达式检查,但用户也提到有更好的方法,比如参数化查询。这部分需要强调安全性,避免拼接字符串带来的风险,并给出参数化查询的示例,比如在Java中使用PreparedStatement。 然后,用户可能想知道如何从现有SQL语句中提取WHERE后的条件,如引用[3]中的例子。这里可以建议使用字符串处理函数或者专门的SQL解析库,比如jsqlparser,但需要提醒用户注意复杂情况下的准确性。 在注意事项部分,要包括防止SQL注入、性能优化(比如索引的使用)、NULL值的处理,以及避免过度复杂的条件影响性能。这些内容能帮助用户避免常见错误。 最后,生成相关问题,引导用户深入学习的兴趣,比如动态拼接的安全方法、索引对WHERE的影响、NULL的处理技巧,以及防止注入的最佳实践。这些问题应该覆盖用户可能进一步探索的方向。 需要确保所有数学表达式和代码格式正确,中文回答,结构清晰。同时,引用要自然地添加到相关内容末尾,例如动态拼接部分引用[^1],防注入引用[^2],截取条件引用[^3]。 检查是否有遗漏的重要点,比如是否涵盖了所有常用的WHERE条件操作符,是否提到了性能优化,以及是否正确引用了用户提供的资料。确保回答符合用户的要求,提供实用且安全的示例,避免错误信息。</think>### SQL WHERE条件使用说明与示例教程 #### 一、基本语法与功能 `WHERE`子句用于从数据库表中**筛选满足特定条件的记录**,是SQL查询的核心过滤机制。基本语法结构为: ```sql SELECT 列名 FROM 表名 WHERE 条件表达式; ``` #### 二、运算符与示例 1. **比较运算符** - `=`、`<>`/`!=`、`>`、`<`、`>=`、`<=` 示例:筛选年龄大于18岁的用户 ```sql SELECT * FROM users WHERE age > 18; ``` 2. **逻辑运算符** - `AND`:同时满足多个条件 ```sql SELECT * FROM orders WHERE total_amount > 100 AND status = 'paid'; ``` - `OR`:满足任一条件 ```sql SELECT * FROM products WHERE category = 'electronics' OR price < 500; ``` - `NOT`:排除条件 ```sql SELECT * FROM employees WHERE NOT department = 'HR'; ``` 3. **特殊运算符** - `IN`:匹配列表中的值 ```sql SELECT * FROM cities WHERE country IN ('China', 'Japan', 'Korea'); ``` - `BETWEEN`:范围查询(包含边界) ```sql SELECT * FROM sales WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'; ``` - `LIKE`:模糊匹配(`%`匹配任意字符,`_`匹配单个字符) ```sql SELECT * FROM customers WHERE name LIKE '张%'; -- 姓"张"的用户 ``` - `IS NULL`:空值检测 ```sql SELECT * FROM students WHERE email IS NULL; ``` #### 三、动态拼接WHERE条件 在存储过程或脚本中,可能需要根据输入参数动态构建查询条件。例如根据用户输入筛选商品: ```sql DECLARE @min_price INT = 100; DECLARE @category VARCHAR(50) = 'books'; DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM products WHERE 1=1'; IF @min_price IS NOT NULL SET @sql += ' AND price >= ' + CAST(@min_price AS VARCHAR); IF @category IS NOT NULL SET @sql += ' AND category = ''' + @category + ''''; EXEC sp_executesql @sql; ``` **注意**:直接拼接字符串存在SQL注入风险,建议使用参数化查询[^1]。 #### 四、安全实践与性能优化 1. **SQL注入** 使用参数化查询(如Java中的`PreparedStatement`)替代字符串拼接: ```java String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, inputUsername); stmt.setString(2, inputPassword); ``` 2. **索引优化** WHERE条件中的列若已建立索引,可大幅提升查询速度。例如对`users.age`建立索引: ```sql CREATE INDEX idx_age ON users(age); ``` 3. **避免复杂表达式** 减少在WHERE中使用函数计算,如: ```sql -- 低效写法 SELECT * FROM logs WHERE YEAR(create_time) = 2023; -- 高效写法 SELECT * FROM logs WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'; ``` #### 五、高级用法示例 1. **查询条件** ```sql SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 2. **多表关联条件** ```sql SELECT o.order_id, c.customer_name FROM orders o JOIN customers c ON o.customer_id = c.id WHERE o.total_amount > 1000; ``` 3. **正则表达式匹配**(部分数据库支持) ```sql SELECT * FROM products WHERE product_name ~ '^A\d{3}'; -- PostgreSQL正则匹配 ``` #### 、常见问题解决 **Q:如何提取现有SQL语句中的WHERE条件** 可通过字符串截取(如`SUBSTRING_INDEX`函数)或SQL解析工具实现,但复杂语句建议使用专用解析库(如jsqlparser)。 **Q:如何处理NULL值?** - 使用`IS NULL`/`IS NOT NULL`而非`= NULL` - 可用`COALESCE`函数设置默认值: ```sql SELECT * FROM orders WHERE COALESCE(discount, 0) > 0.1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值