SQL学习四、过滤、数据筛选 |
您所在的位置:网站首页 › 数据筛选有几种方法 › SQL学习四、过滤、数据筛选 |
数据过滤,即按照条件筛选数据,找出符合条件的数据。这可以说是SQL学习和使用时最核心的地方了。 1、使用简单WHERE 子句WHERE 子句在表名(FROM 子句)之后给出 比如我们需要在 adjunctlist 中查询 flaw_id = 201902的数据的add_time SELECT add_time FROM adjunctlist WHERE flaw_id = 201902注意:SQL 过滤与应用过滤 我们应该在查询的时候就使用SQL对数据做好过滤,而不是交给应用去进行数据过滤,这样做是非常不好的,不仅会传输多余数据,还会影响应用的性能和扩展性。 2、WHERE 子句操作符不同的DBMS对这些操作符的支持可能不同 操作符说明=等于!= 、不等于< 、!>小于(不大于)> 、!201904 和 条件 add_time >‘2018-03-23 00:00:00’ 的数据,AND前后的条件必须同时满足,取交集 SELECT * FROM adjunctlist WHERE flaw_id > 201904 AND add_time > '2018-03-23 00:00:00' OR 我们筛选满足条件 flaw_id >201904 或者 满足条件 add_time >‘2018-03-23 00:00:00’ 的数据,AND前后的条件只要满足一条即可,取并集 SELECT * FROM adjunctlist WHERE flaw_id > 201904 OR add_time > '2018-03-23 00:00:00' 关于 AND 和 OR 的优先级 AND 的优先级是高于OR的,为了防止筛选出错,最好在使用 AND 和 OR的时候加上圆括号进行优先级限定。例如,我们想查询 flaw_id > 201904 或者 task_id > 1028 ,且user_id = 26 的任务点 按照顺序书写的SQL: SELECT * FROM taskpoint WHERE flaw_id > 201904 OR task_id > 1028 AND user_id = 26我们会发现查询出来的结果并不是我们想要的结果 这就是因为AND 的优先级是高于OR造成的,其实上面的这条SQL 实际相当于 查询 flaw_id > 201904 的任务点 或者 task_id > 1028 且user_id = 26 的任务点 SELECT * FROM taskpoint WHERE flaw_id > 201904 OR (task_id > 1028 AND user_id = 26)正确的SQL应该这样写 SELECT * FROM taskpoint WHERE (flaw_id > 201904 OR task_id > 1028) AND user_id = 26所以我们写SQL的时候最好加上圆括号,这样不易出错,且让人一目了然。 IN IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。比如我们想查询task_id = 1029 或者 task_id = 1028 的任务点,我们使用OR 可以这么写: SELECT * FROM taskpoint WHERE task_id = 1029 OR task_id = 1028用IN 我们可以这样写: SELECT * FROM taskpoint WHERE task_id IN (1029 , 1028)关于执行的效率,IN 操作符一般比一组 OR 操作符执行得更快 NOT NOT 操作符是 WHERE 子句中用来否定其后条件的关键字。比如,我们想查询task_id >2010 但是不能为2018 或者2017 的任务点 SELECT * FROM taskpoint WHERE task_id > 2010 AND NOT task_id IN (2018 , 2017) 4、利用通配符进行过滤1、通配符一般会结合LIKE 操作符进行使用 2、通配符本身实际上是 SQL的 WHERE 子句中有特殊含义的字符 3、通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用 通配符搜索。 百分号(%)通配符这是SQL中最常用的通配符了,在搜索串中,%表示任何字符出现任意次数。 1、匹配开头字符,需要使用word%进行匹配 比如我们查询任务点里面以工井开头的任务点名称。 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '工井%'2、匹配任意位置的字符,需要使用%word%进行匹配 比如我们查询任务点里面包含井的任务点名称。 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%井%'3、匹配结束字符,需要使用%word进行匹配 比如我们查询任务点里面以18结束的任务点名称。 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%18'4、匹配开始和结束的字符,需要使用word%word进行匹配 比如我们查询任务点里面以设备开头,以18结尾的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '设备%18'注意 1、有些DBMS会使用空格来填补字段内容,可能对结束字符的匹配造成影响,这时我们需要使用函数去掉空格。 2、通配符%可以匹配空字符串,但是不能匹配NULL 下划线(_)通配符 1、用途和%一样,但是下划线()只匹配单个字符,而不是多个字符 2、DB2不支持下划线()通配符 3、Access需要使用?而不是_下面我们来测试一下,使用下面的三条SQL语句 //匹配任务点中包含`井`的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%井%' //匹配任务点中第二个字符为`井`的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '_井%' //匹配任务点中第三个字符为`井`的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '__井%'1、匹配任务点中包含井的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '%井%'2、匹配任务点中第二个字符为井的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '_井%'3、匹配任务点中第三个字符为井的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '__井%'通过上述SQL的对比,我们就可以发现下划线(_)只匹配单个字符 方括号( [ ] )通配符方括号( [ ] )通配符用来指定一个字符集,它必须匹配指定位置的一个字符。 只有Access 和 SQL Server 支持使用,其他DBMS使用时需要先查阅相关文档,确认是否支持 使用: 比如,匹配任务点中以J或者M开头的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '[JM]%'另外,方括号( [ ] )通配符可以使用前缀字符^(脱字号)来否定,但是 Access中需要用!而不是^来否定一个集合 比如,我们需要匹配任务点中不是以J或者M开头的任务点名称 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '[^JM]%'而在Access中我们就需要这样写了 SELECT task_point_name FROM taskpoint WHERE task_point_name LIKE '[!JM]%'当然我们也可以使用 NOT 操作符实现相同的查询。 5、通配符的使用技巧**注意:**通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间,所以 1、不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符 2、在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的,应该先利用明确的条件缩小数据查找的范围,最后再使用通配符在最小的范围内进行查找 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |