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对这些操作符的支持可能不同

操作符 说明
= 等于
!= 、<> 不等于
< 、!> 小于(不大于)
> 、!< 大于(不小于)
<= 小于等于
>= 大于等于
BETWEEN 在指定的两个值之间
IS NULL 为NULL值
  • BETWEEN 的使用

使用 BETWEEN 时,必须指定两个值——所需范 围的低端值和高端值。这两个值必须用 AND 关键字分隔。BETWEEN 匹配 范围中所有的值,包括指定的开始值和结束值。

例如,我们查找 flaw_id 在 201901 和 201904 之间数据的 add_time 和 flaw_id 值

SELECT add_time,flaw_id FROM adjunctlist WHERE flaw_id BETWEEN 201901 AND 201904
BETWEEN
  • 空值检查
    在创建表的时候可以指定某一字段是否可以为空(即不包含值,无值no value)
    当我们利用SQL检索数据时,判断某个字段值是否为空,不能简单地检查是否= NULL,而应该使用 IS NULL 子句来进行判断。
SELECT 
add_time 
FROM 
adjunctlist 
WHERE 
flaw_id IS NULL

3、利用操作符 ,组合WHERE 子句

我们可以在WHERE 子句中加入多个条件,使用 AND、OR等操作符连接,进行数据筛选 。

  • AND
    我们筛选必须满足条件 flaw_id >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'
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、在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的,应该先利用明确的条件缩小数据查找的范围,最后再使用通配符在最小的范围内进行查找

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容