余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

数据分析人必掌握的数据库语言——SQL指南第二期

xiyangw 2022-11-25 11:56 42 浏览 0 评论

本篇文章继续围绕SQL的语法重点为大家介绍过滤数据高级过滤数据以及用通配符进行过滤


01 过滤数据


数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只是根据特定的需要提取表数据的子集。因此检索所需数据时需要指定搜索条件,搜索条件也称为过滤条件。

语法:
#column_name=列名称, table_name=表名称, operator=运算符,value=值
SELECT column_name,column_name 
FROM table_name
WHERE column_name operator value


使用WHERE字句

在SELECT语句中,WHERE子句用于规定选择的标准,即有条件地从表中选取数据。

示例:
SELECT prod_name,prod_price 
FROM Products 
WHERE prod_price = 3.49

分析:该语句从Products表中检索prod_name和prod_price两个列,不返回所有行,只返回prod_price值为3.49的行。


WHERE子句操作符

下面的运算符可在WHERE子句中使用:

操作符

说明

=

等于

<>

不等于

!=

不等于

<

小于

<=

小于等于

!<

不小于

>

大于

>=

大于等于

!>

不大于

BETWEEN

在某个范围内

IS NULL

为NULL值

LIKE

搜索某种模式

IN

指定条件范围

AND

指示检索满足所有给定条件的行

OR

检索匹配任一给定条件的行

NOT

否定其后条件

()

明确分组

EXISTS

判断查询子句是否有记录

具体使用如下:

①检查单个值

示例:列出所有价格小于10美元的产品
SELECT prod_name,prod_price 
FORM Products 
WHERE prod_price < 10

分析:从Products表中检索prod_name和prod_price两个列,不返回所有行,只返回prod_price值小于10的行。

②不匹配检查

示例:检索所有不是供应商DLL01制造的产品
# 其中<>操作符通常可更换为!=,但并非所有DBMS都支持互换
SELECT vend_id,prod_name 
FROM Products 
WHERE vend_id <> ‘DLL01’

分析:从Products表中检索prod_name和vend_id两个列,不返回所有行,只返回vend_id值不等于DLL01的行。

③范围值检查

示例:检索价格在5美元和10美元之间的所有产品
SELECT prod_name,prod_price 
FROM Products 
WHERE prod_price BETWEEN 5 AND 10

分析:在使用BETWEEN时,必须指定两个值——所需范围的低值和高值,且两个值必须用AND关键字分隔。BETWEEN匹配范围中的值包含指定的低值和高值。

④空值检查

示例:检索没有价格的产品(没有价格为指定字段为空值,不是价格为0)
SELECT cust_name
FROM Customers 
WHERE cust_email IS NULL

分析:确定值为NULL不能简单检查是否等于NULL,而是需要用到一个特殊的WHERE子句——IS NULL子句。示例中若cust_email列不包含NULL值,则没有返回数据,否则将返回指定的数据。


02 高级过滤数据


上述介绍的WHERE子句在过滤数据时使用的都是单一条件,而为了进行更强的过滤控制,SQL允许给出多个WHERE子句,即多个条件的过滤。


组合WHERE子句

用来联结或改变WHERE子句中的关键字,也称为逻辑操作符,此处有两种形式,分别是AND子句OR子句

①AND操作符

示例:通过不止一个条件进行过滤
SELECT prod_id,prod_price,prod_name 
FROM Products 
WHERE vend_id = ‘DLL01’ AND prod_price <= 4

分析:该SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的编号、名称和价格。

这条SELECT语句的WHERE子句包含两个条件,用AND关键字联结起来,还可以增加条件,但每个条件都需要用AND联结。

AND指示DBMS只返回满足所有给定条件的行。

②OR操作符

示例:检索匹配任一条件的行
SELECT prod_id,prod_price,prod_name 
FROM Products 
WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’

分析:该SQL语句检索由DLL01和BRS01两者中的任一供应商制造的所有产品的编号、名称和价格。

OR操作符指示DBMS匹配任一条件,而不是同时匹配两个条件。

此处如果将OR换成AND将没有数据返回,因为会创造没有匹配行的WHERE子句。

③求值顺序

WHERE子句可包含任意数量的AND和OR操作符,以两者结合进行复杂、高级的过滤。

但结合AND和OR时会遇到一个问题,那就是SQL通常情况下在处理OR操作符之前,会优先处理AND操作符,这时就无法很好地按照过滤条件顺序检索数据了。

此时我们可以借用圆括号对操作符进行分组,以此控制过滤条件的顺序。

示例:
SELECT prod_name,prod_price 
FROM Products 
WHERE (vend_id = ‘DLL01’ OR vend_id = ‘BRS01’)  AND prod_price >= 10

分析:该语句检索由供应商DLL01或BRS01制造的且价格在10美元及以上的所有产品的名称和价格。

若没有圆括号,则最终该语句会检索由供应商BRS01制造的价格为10美元及以上的所有产品,以及供应商DLL01制造的所有产品,不管其价格如何。


IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可进行匹配。IN取一组由逗号分隔、在圆括号中的合法值。

示例:
SELECT prod_name,prod_price 
FROM Products 
WHERE vend_id IN (‘DLL01’,’BRS01’) 
ORDER BY prod_name

分析:该SELECT语句检索由供应商DLL01和BRS01制造的所有产品名称和价格。

相比于OR操作符,IN操作符有如下优点

在合法选项很多时,IN操作符的语法更清楚;

在与其他AND和OR操作符组合使用IN时,求值顺序更易管理;

IN操作符一般比一组OR操作符执行更快;

IN的最大优点是可包含其他SELECT语句,能更动态地建立WHERE子句。


NOT操作符

WHERE子句中的NOT操作符只具备一个功能,即否定其后所跟的任何条件。NOT通常不是单独使用,且该关键字既可以用在要过滤的列之前,也可在之后。

示例:检索出除DLL01之外的所有供应商制造的产品
SELECT prod_name 
FROM Products 
WHERE NOT vend_id = ‘DLL01’ 
ORDER BY prod_name

分析:该语句检索非DLL01供应商制造的之外的所有产品。其中也可使用<>操作符来完成。

NOT操作符适合更复杂的子句,对于简单的WHERE子句,使用NOT并无优势。比如在与IN操作符联合使用时,NOT可简单地找出与条件列表不匹配的列。


03 用通配符进行过滤


通配符是用来匹配值的一部分的特殊字符。上述操作符都针对已知值的过滤条件,当过滤条件比较模糊时便需要用到通配符进行搜索。

通配符可在搜索模式中的任意位置使用,且可使用多个通配符。


LIKE操作符

若要在搜索时使用通配符,必须借助LIKE操作符。LIKE指示DBMS后跟的搜索模式利用通配符匹配而不是简单的相等匹配

通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符检索。

①百分号(%)通配符

%是最常用的通配符,其表示在检索时,%表示任何字符出现任意次数,如’FISH%’表示搜索以FISH开头的所有产品,不论FISH后跟的字符以及其出现的次数。

示例:搜索以FISH起头的所有产品
SELECT prod_id,prod_name
FROM Products 
WHERE prod_name LIKE ‘FISH%’

分析:该语句搜索任意以FISH开头的词。%指示DBMS接受FISH之后的任意字符,不管有多少字符。

根据DBMS的不同配置,检索可区分大小写,若区分大小写,则’FISH%’与fish就不匹配。

示例:使用两个%通配符
SELECT prod_id,prod_name 
FROM Products 
WHERE prod_name LIKE ’%bean bag%’

分析:搜索模式‘%bean bag%’表示匹配任何位置上包含文本bean bag的值,不论前后出现什么字符。

示例:通配符位于搜索模式的中间
SELECT prod_name 
FROM Products 
WHERE prod_name LIKE ‘F%y’

分析:搜索以F开头、y结尾的所有产品。该形式很适合根据邮件地址的一部分来查找电子邮件。

需要注意的是%代表搜搜模式中给定位置的0个、1个或多个字符。%通配符不能匹配NULL

②下划线(_)通配符

下划线用途与%一致,区别是下划线只能匹配单个字符

示例:
SELECT prod_id,prod_name 
FROM Products 
WHERE prod_name LIKE ‘__ inch teddy bear’

分析:该语句中的搜索模式给出了后跟有文本的两个通配符,即只能匹配两个字符,而%还可以匹配多个字符或1个字符。

③方括号([])通配符

方括号([])通配符常用来指定一个字符集,必须匹配指定位置的一个字符。其中并不是所有的DBMS都支持创建集合的[]。

示例:找出所有名字以J或M开头的联系人
SELECT cust_contact 
FROM Customers 
WHERE cust_contact LIKE ‘[JM]%’ 
ORDER BY cust_contact

分析:该语句的WHERE子句搜索模式为‘[JM]%’。该搜索模式使用了方括号和%两种通配符。其中[JM]匹配方括号中任意一个字符,且只能匹配单个字符,其后的%通配符则匹配第一个字符之后的任意数目的字符。

方括号通配符中的字符还可用前缀字符^(脱字号)来否定。

TopBDA大数据分析师培训

不止SQL语言学习,还能全方位学习大数据分析技术!

使用通配符的技巧

SQL的通配符很有用,但耗费的搜索时间也比其他搜索要长。此处列出一些使用通配符时需记住的技巧

不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符;

在确定需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的;

仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

以上就是本篇文章的全部内容啦!

有关SQL的语法内容还没结束,下期将围绕SQL的语法重点为大家介绍创建计算字段函数使用

我们下期见!

整理不易,点赞、转发帮忙点一下~

相关推荐

数控系统常见术语详解,机加工人士必备资料
数控系统常见术语详解,机加工人士必备资料

增量编码器(Incrementpulsecoder)回转式位置测量元件,装于电动机轴或滚珠丝杠上,回转时发出等间隔脉冲表示位移量。由于没有记忆元件,故不能准...

2023-09-24 17:42 xiyangw

功、功率、扭矩的关系

功=功率×时间work=power×timeW=P×T功=力×距离work=force×lengthW=F×LP×T=F×LP=F×L/T=F×V(velocity)具体到电机输出轴上,圆...

Wi-Fi协议(802.11 )常见专业术语汇总
Wi-Fi协议(802.11 )常见专业术语汇总

Wi-Fi协议(802.11)常见专业术语汇总AP(Accesspoint的简称,即访问点,接入点):是一个无线网络中的特殊节点,通过这个节点,无线网络中的...

2023-09-24 17:41 xiyangw

不需要策略模式也能避免满屏if/else
不需要策略模式也能避免满屏if/else

满屏if/elsejava复制代码publicstaticvoidmain(String[]args){inta=1;if...

2023-09-24 17:41 xiyangw

喜极而泣,我终于干掉了该死的 if-else
喜极而泣,我终于干掉了该死的 if-else

推荐阅读:面试淘宝被Tomcat面到“自闭”,学习这份文档之后“吊打”面试官刷完spring+redis+负载均衡+netty+kafka面试题,再去面试BAT...

2023-09-24 17:40 xiyangw

Python中使用三元运算符简化if-else语句
Python中使用三元运算符简化if-else语句

Python是一种极简主义的编程语言,相比其他编程语言,在多个地方简化了代码的写法,可以让我们用更少的时间更简洁地完成工作。以赋值运算符为例:a=a+b简化...

2023-09-24 17:40 xiyangw

雅思课堂 | 雅思口语写作句型第二讲
雅思课堂 | 雅思口语写作句型第二讲

纯干货,无废话用最少的时间学最制胜的内容!泡图书馆泡不过学霸?碎片时间也能弯道超车!向着雅思8分行动起来吧!雅思口语写作句型1.Ipreferseeing...

2023-09-24 17:39 xiyangw

设计模式(三)——简单的状态模式代替if-else
设计模式(三)——简单的状态模式代替if-else

博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注。一起学习,一起成长。前言大多数开...

2023-09-24 17:38 xiyangw

如何优化代码中大量的if/else,switch/case?

前言随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得更优雅吗?正文使用枚举这里我们简单的定义一...

优秀程序员早就学会用“状态模式”代替if-else了
优秀程序员早就学会用“状态模式”代替if-else了

2020年已经进入倒计时了,大家立好的flag完成了吗?2020实“鼠”不易,希望2021可以“牛”转乾坤。简介状态模式是行为型设计模式的一种。其设计理念是当对...

2023-09-24 17:37 xiyangw

用Select Case语句对执行多条件进行控制
用Select Case语句对执行多条件进行控制

今日的内容是"VBA之EXCEL应用"的第六章"条件判断语句(If...Then...Else)在VBA中的利用"。这讲是第三节...

2023-09-24 17:37 xiyangw

c#入门教程(四)条件判断if else

条件判断,是编程里常用的判断语句,比如某个代码如果满足条件就执行a代码块否则就执行b代码块。案例1:inti=2*5;if(a>0){执行a代码块}elseif(a<0){执行b代码块...

每日学编程之JAVA(十一)—条件语句(if……else)

一个if语句包含一个布尔表达式和一条或多条语句。如果布尔表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。if语句后面可以跟else语句,当if语句...

不需要策略模式也能避免满屏if/else

除了使用策略模式以外,还可以使用其他设计模式来避免满屏if/else的问题。以下是一些可能的解决方案:工厂模式:将if/else语句移到工厂类中,由工厂类负责创建对象。这样可以将if/else语句从客...

围绕ifelse与业务逻辑的那些梗
围绕ifelse与业务逻辑的那些梗

ifelse很重要,几乎是程序员编程核心,业务逻辑与规则也通过ifelse体现出来,语句简单但是背后文章很大,先看几则幽默图:1.也许默认使用returnf...

2023-09-24 17:36 xiyangw

取消回复欢迎 发表评论: