SQL WHERE 条件查询

SQL WHERE是SQL的条件查询语句。SQL查询里的条件指定了要返回满足什么标准的信息。条件的值是TRUE或FALSE,从而限制查询中获取的数据。WHERE子句用于给查询添加条件,从而去除用户不需要的数据。WHERE自己本身比较简单,本文更多地介绍WHERE子句与比较运算符、逻辑运算符和通配符这三种方式对检索条件进行过滤。

WHERE子句里可以有多个条件,它们之间以操作符 ANDOR 连接。

SQL WHERE 语法

SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

SQL WHERE 子句比较运算符

在SQL中,我们可以使用WHERE子句对条件进行筛选,在此之前,你需要了解WHERE子句中的比较运算符。这些比较运算符的含义你可以参见下面这张表格:

SQL WHERE 条件查询

实际上你能看到,同样的含义可能会有多种表达方式,比如小于等于,可以是(<=),也可以是不大于(!>)。同样不等于,可以用(<>),也可以用(!=),它们的含义都是相同的,但这些符号的顺序都不能颠倒,比如你不能写(=<)。

需要注意的是,你需要查看使用的DBMS是否支持,不同的DBMS支持的运算符可能是不同的,比如Access不支持(!=),不等于应该使用(<>)。在MySQL中,不支持(!>)(!<)等。

极客教程在SQL 查询文章中使用了heros数据表,我们还是以这张表格做练习。下面我们通过比较运算符对王者荣耀的英雄属性进行条件筛选。

WHERE子句的基本格式是:SELECT ……(列名) FROM ……(表名) WHERE ……(子句条件)

比如我们想要查询所有最大生命值大于6000的英雄:

SELECT name, hp_max FROM heros WHERE hp_max > 6000

运行结果(41条记录):

SQL WHERE 条件查询

想要查询所有最大生命值在5399到6811之间的英雄:

SELECT name, hp_max FROM heros WHERE hp_max BETWEEN 5399 AND 6811

运行结果:(41条记录)

SQL WHERE 条件查询

需要注意的是hp_max可以取值到最小值和最大值,即5399和6811。

我们也可以对heros表中的hp_max字段进行空值检查。

SELECT name, hp_max FROM heros WHERE hp_max IS NULL

运行结果为空,说明heros表中的hp_max字段没有存在空值的数据行。

SQL WHERE 子句逻辑运算符

如果我们存在多个WHERE条件子句,可以使用逻辑运算符:

SQL WHERE 条件查询

我们还是通过例子来看下这些逻辑运算符的使用,同样采用heros这张表的数据查询。

假设想要筛选最大生命值大于6000,最大法力大于1700的英雄,然后按照最大生命值和最大法力值之和从高到低进行排序。

SELECT name, hp_max, mp_max FROM heros WHERE hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC

运行结果:(23条记录)

SQL WHERE 条件查询

如果AND和OR同时存在WHERE子句中会是怎样的呢?假设我们想要查询最大生命值加最大法力值大于8000的英雄,或者最大生命值大于6000并且最大法力值大于1700的英雄。

SELECT name, hp_max, mp_max FROM heros WHERE (hp_max+mp_max) > 8000 OR hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC

运行结果:(33条记录)

SQL WHERE 条件查询

你能看出来相比于上一个条件查询,这次的条件查询多出来了10个英雄,这是因为我们放宽了条件,允许最大生命值+最大法力值大于8000的英雄显示出来。另外你需要注意到,当WHERE子句中同时存在OR和AND的时候,AND执行的优先级会更高,也就是说SQL会优先处理AND操作符,然后再处理OR操作符。

如果我们对这条查询语句OR两边的条件增加一个括号,结果会是怎样的呢?

SELECT name, hp_max, mp_max FROM heros WHERE ((hp_max+mp_max) > 8000 OR hp_max > 6000) AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC

运行结果:

SQL WHERE 条件查询

所以当WHERE子句中同时出现AND和OR操作符的时候,你需要考虑到执行的先后顺序,也就是两个操作符执行的优先级。一般来说()优先级最高,其次优先级是AND,然后是OR

如果我想要查询主要定位或者次要定位是法师或是射手的英雄,同时英雄的上线时间不在2016-01-01到2017-01-01之间。

SELECT name, role_main, role_assist, hp_max, mp_max, birthdate
FROM heros 
WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手')) 
AND DATE(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY (hp_max + mp_max) DESC

你能看到我把WHERE子句分成了两个部分。第一部分是关于主要定位和次要定位的条件过滤,使用的是role_main in ('法师', '射手') OR role_assist in ('法师', '射手')。这里用到了IN逻辑运算符,同时role_main和role_assist是OR(或)的关系。

第二部分是关于上线时间的条件过滤。NOT代表否,因为我们要找到不在2016-01-01到2017-01-01之间的日期,因此用到了NOT BETWEEN ‘2016-01-01’ AND ‘2017-01-01’。同时我们是在对日期类型数据进行检索,所以使用到了DATE函数,将字段birthdate转化为日期类型再进行比较。关于日期的操作,可以参考极客教程提供的。

这是运行结果(6条记录):

SQL WHERE 条件查询

SQL WHERE 子句使用通配符进行过滤

刚才讲解的条件过滤都是对已知值进行的过滤,还有一种情况是我们要检索文本中包含某个词的所有数据,这里就需要使用通配符。通配符就是我们用来匹配值的一部分的特殊字符。这里我们需要使用到LIKE操作符。

如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找英雄名中包含“太”字的英雄都有哪些:

SELECT name FROM heros WHERE name LIKE '%太%'

运行结果:(2条记录)

SQL WHERE 条件查询

需要说明的是不同DBMS对通配符的定义不同,在Access中使用的是(*)而不是(%)。另外关于字符串的搜索可能是需要区分大小写的,比如'liu%'就不能匹配上'LIU BEI'。具体是否区分大小写还需要考虑不同的DBMS以及它们的配置。

如果我们想要匹配单个字符,就需要使用下划线(_)通配符。(%)和(_)的区别在于

  • %)代表一个或多个字符
  • _)只代表一个字符

比如我们想要查找英雄名除了第一个字以外,包含“太”字的英雄有哪些。

SELECT name FROM heros WHERE name LIKE '_%太%'

运行结果(1条记录):

SQL WHERE 条件查询

因为太乙真人的太是第一个字符,而_%太%中的太不是在第一个字符,所以匹配不到“太乙真人”,只可以匹配上“东皇太一”。

同样需要说明的是,在Access中使用(?)来代替(_),而且在DB2中是不支持通配符(_)的,因此你需要在使用的时候查阅相关的DBMS文档。

你能看出来通配符还是很有用的,尤其是在进行字符串匹配的时候。不过在实际操作过程中,我还是建议你尽量少用通配符,因为它需要消耗数据库更长的时间来进行匹配。即使你对LIKE检索的字段进行了索引,索引的价值也可能会失效。如果要让索引生效,那么LIKE后面就不能以(%)开头,比如使用LIKE '%太%'LIKE '%太'的时候就会对全表进行扫描。如果使用LIKE '太%',同时检索的字段进行了索引的时候,则不会进行全表扫描。

关于SQL 查询,请参与极客教程提供的SQL 教程

赞(3)

猜你喜欢

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址
    SQL 实例
    SQL检索所有行和列SQL 筛选行SQL 查找满足多个查询条件的行SQL 筛选列SQL 创建有意义的列名SQL 在WHERE子句中引用别名列SQL 串联多列的值SQL 在SELECT语句里使用条件逻辑SQL 限定返回行数SQL 随机返回若干行记录SQL 查找Null值SQL 把Null值转换为实际值SQL 查找匹配项SQL 以指定顺序返回查询结果SQL 多字段排序SQL 依据子串排序SQL 对含有字母和数字的列排序SQL 排序时对Null值的处理SQL 依据条件逻辑动态调整排序项SQL 叠加两个行集SQL 合并相关行SQL 确定两个表是否有相同的数据SQL 查找两个表中相同的行SQL 查找只存在于一个表中的数据SQL 从一个表检索与另一个表不相关的行SQL 新增连接查询而不影响其他连接查询SQL 识别并消除笛卡儿积SQL 组合使用连接查询与聚合函数SQL 组合使用外连接查询与聚合函数SQL 从多个表中返回缺失值SQL 在运算和比较中使用NullSQL 插入新记录SQL 判断闰年SQL 计算一年有多少天SQL 从给定日期值里提取年月日时分秒SQL 计算一个月的第一天和最后一天SQL 列出一年中所有的星期五SQL 找出当前月份的第一个和最后一个星期一SQL 插入默认值SQL 使用Null覆盖默认值SQL 复制数据到另一个表SQL 复制表定义SQL 多表插入SQL 禁止插入特定列SQL 更新记录SQL 当相关行存在时更新记录SQL 使用另一个表的数据更新记录SQL 合并记录SQL 生成日历SQL 列出一年中每个季度的开始日期和结束日期SQL 计算一个季度的开始日期和结束日期SQL 填补缺失的日期SQL 依据特定时间单位检索数据SQL 比较特定的日期要素SQL 识别重叠的日期区间SQL 定位连续的值区间SQL 计算同一组或分区的行之间的差SQL 定位连续值区间的开始值和结束值SQL 为值区间填充缺失值SQL 生成连续的数值SQL 结果集分页SQL 删除单行记录SQL 删除指定记录SQL 删除全表记录SQL 删除违反参照完整性的记录SQL 删除被其他表参照的记录SQL 删除重复记录SQL 列举字段SQL 列举模式中的表SQL 列举非索引外键SQL 列举约束SQL 跳过n行记录SQL 在外连接查询里使用OR逻辑SQL 识别互逆的记录SQL 提取最靠前的n行记录SQL 找出最大和最小的记录SQL 查询未来的行SQL 行值轮转SQL 对结果排序SQL 删除重复项SQL 查找骑士值SQL 生成简单的预测SQL 列举索引列SQL 用SQL生成SQLSQL 描述Oracle数据字典视图SQL 遍历字符串SQL 嵌入引号SQL 统计字符出现的次数SQL 删除不想要的字符SQL 分离数字和字符数据SQL 判断含有字母和数字的字符串SQL 根据字符串里的数字排序SQL 变换结果集成多行SQL 反向变换结果集SQL 反向变换结果集成一列SQL 删除重复数据SQL 变换结果集以实现跨行计算SQL 创建固定大小的数据桶SQL 创建预定数目的桶SQL 创建水平直方图SQL 创建垂直直方图SQL 返回非分组列SQL 计算简单的小计SQL 计算所有可能的表达式组合的小计SQL 识别非小计行SQL 使用CASE表达式标记行数据SQL 创建稀疏矩阵SQL 按照时间单位分组SQL 变换结果集成一行SQL 多维度聚合运算SQL 动态区间聚合运算SQL 变换带有小计的结果集SQL 按照子字符串排序SQL 提取姓名的首字母SQL 创建分隔列表SQL 分隔数据转换为多值IN列表SQL 按字母表顺序排列字符SQL 识别字符串里的数字字符SQL 提取第n个分隔子字符串SQL 解析IP地址SQL 计算平均值SQL 查找最小值和最大值SQL 展现父子关系SQL 展现祖孙关系SQL 创建层次视图SQL 找出给定的父节点对应的所有子节点SQL 确认叶子节点、分支节点和根节点SQL 使用SQL Server的PIVOT操作符创建交叉报表SQL 使用SQL Server的UNPIVOT操作符逆向转换交叉报表SQL 使用Oracle的MODEL子句变换结果集SQL 从不固定位置提取字符串的元素SQL 计算一年有多少天SQL 查找含有数字和字母的字符串SQL 在Oracle中把整数转换成二进制SQL 变换已排名的结果集SQL 为两次变换后的结果集增加列标题SQL 在Oracle中把标量子查询转换为复合子查询SQL 解析串行化的数据SQL 计算比重SQL 从Oracle中生成CSV格式的输出SQL 找出不匹配某个格式的文本SQL 使用内嵌视图转换数据SQL 测试一组数据中是否存在某个值SQL 求和SQL 计算行数SQL 计算非Null值的个数SQL 累计求和SQL 计算累计乘积SQL 计算累计差SQL 计算众数SQL 计算中位数SQL 计算百分比SQL 聚合Null列SQL 将含有字母和数字的字符串转换为数字SQL 修改累计值SQL 年月日加减法SQL 计算两个日期之间的天数SQL 计算两个日期之间的工作日天数SQL 计算两个日期之间相差的月份和年份SQL 计算两个日期之间相差的秒数、分钟数和小时数SQL 统计一年中有多少个星期一SQL 计算当前记录和下一条记录之间的日期差SQL 计算平均值时去掉最大值和最小值SQL查询优化的最佳实SQL如何打印表中重复的行
    SQL 教程
    SQL 教程SQL 语句SQL 语句是如何执行的SQL 创建数据库SQL 删除数据库SQL 创建表SQL 修改表SQL 删除表SQL 查询 SELECTSQL WHERE 条件查询SQL - 注释SQL - 别名SQL - 连接(内连接,左连接,右连接和全连接)SQL - 连接(笛卡尔连接和自连接)SQL - 约束SQL - 通配符SQL - DROP 和 TRUNCATESQL - AND和OR 运算符
    SQL 函数
    SQL 函数SQL ABS 函数
    SQL 语句
    SQL - CREATE 语句SQL - WHERE 语句SQL - UPDATE 语句SQL - GROUP BY 语句SQL - ORDER BY 语句SQL - INSERT INTO 语句SQL - Union 语句SQL - SELECT 查询SQL - SELECT TOP 语句SQL - DELETE 语句SQL - Distinct 语句
    SQL 问答
    SQL 和 MySQL 的区别