单表查询(二)
文章主要如何使用通配符进行内容查询、如何去除重复结果和查询空值以及如何进行多条件查询。
带 LIKE 的字符匹配查询
任务描述
本关任务:使用通配符%检索数据表中指定字段的数据。
相关知识
为了完成本关任务,你需要掌握:如何使用通配符%模糊匹配数据内容。
在前面的检所操作中,我们讲述了如何进行比较查询或者是范围查询,但如果我们想查找所有包含字符ir
的内容该么办呢?用之前的方法好像行不通了。在这里,我们需要用通配符进行匹配查找。而执行匹配查找的关键字就是LIKE
。SQL
语句支持很多种通配符,其中可以和LIKE一起搭配使用的就是通配符%
和_
了。
使用通配符%
模糊匹配数据内容
百分号通配符%可以匹配任意长度的字符,甚至包括零字符。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';
。 其中%
的位置可以根据需要在字符间变化。
举个例子
假设我们现在有一张表Mall_products
,内容如下:
我们将使用LIKE
关键字和通配符%检索出所有商品名称带ir
的商品信息。
查询代码如下:
1 |
|
结果为:
分析:
该语句查询的结果返回所有商品的名字中间带ir
字符的所有信息。通配符%告诉MySQL
,返回字符串中间带ir
字符的记录,不管ir
前面和后面分别有多少字符。
通配符%
可以放在不同的位置以满足你查询的需要,仔细想想,如果我们想要查找商品名称以B
开头的所有记录,%
应该放在哪里?
查询过程如下:
使用通配符_
模糊匹配数据内容
下划线通配符_
与百分号通配符%
类似,也用于模糊匹配。但是区别在于下划线通配符_
只能模糊匹配1个
字符。如果你执意想用下划线通配符_
匹配多个字符,那只能多用几个_
咯!
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';
。 其中_
的位置可以根据需要在字符间变化。
举个例子
假设我们现在有一张表Mall_products
,内容如下:
我们将使用LIKE
关键字和通配符_
检索出所有商品名称以r
结尾,且前边有9个字母的商品信息。
查询代码如下:
1 |
|
结果为:
看到查询结果中prod_name
对应的Teddy bear
,大家可能注意到了,我们把空格也当成了一个字符来计算。
查询过程如下:
好了,下面轮到你们来上手试试了!
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码;
我们为你新建了一个数据表tb_emp
,结构如下:
请你查询所有Name
以字母C
为起始的员工的Name
和Salary
的内容;
测试说明
我会对你编写的代码进行测试,最终结果会如下图所示:
我的代码
1 |
|
查询空值与去除重复结果
任务描述
本关任务:使用关键字IS NULL
检索数据表中指定的字段的空值;使用关键字DISTINCT
检索数据表中指定的不重复的内容。
相关知识
为了完成本关任务,你需要掌握:
1.如何使用关键字IS NULL
检索数据表中的空值,
2.使用关键字DISTINCT
检索数据表中不重复的内容。
查询空值
在数据表创建之初,创建者可以指定某个字段是否为空值NULL
。注意了,这个NULL
既不代表0
,也不代表空字符,而是代表一种未知的状态,比如不适用或者放着等将来有合适数据了再添加进去。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IS NULL;
。
举个例子
假设我们现在有一张表Mall_products
,内容如下:
我们将使用IS NULL
关键字检索出所有prod_country
字段为NULL
的商品信息。
查询代码如下:
1 |
|
结果为:
查询过程如下:
可以看到,结果成功显示了prod_country
字段为NULL
的商品信息。与关键字IS NULL
查询结果相反的是关键字IS NOT NULL
,我们来看看实际操作的效果。
查询代码如下:
1 |
|
结果为:
查询过程如下:
可以看到,查出来了prod_country
字段的非NULL
记录。
去除重复结果
有的时候,出于对数据分析的要求,分析人员需要消除数据表中重复的数据,那么如何消除呢?别担心,SQL
语句也贴心的为你准备好了消除重复数据的关键字DISTINCT
。
语法规则为: SELECT DISTINCT 字段名 FROM 表名;
。
举个例子
假设我们现在有一张表Mall_products
,内容如下:
可以从表中看到,除了字段ID
没有重复项,剩下的字段里都出现了重复项。
我们将使用DISTINCT
关键字去除prod_name
字段中的重复数据。
查询代码如下:
1 |
|
结果为:
查询过程如下:
可以看到,使用了关键字DISTINCT
后,我们返回的记录都不再有重复值。
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,内容如下:
使用关键字
IS NULL
返回数据表中字段DeptId
为NULL
的所有字段的内容,注意,返回的是指定行所有字段的内容;使用关键字
DISTINCT
返回数据表中字段Name
不重复的内容,注意,只需返回字段Name
的内容。
测试说明
我会对你编写的代码进行测试,最终结果会如下图所示:
我的代码
1 |
|
带 AND 与 OR 的多条件查询
任务描述
本关任务:使用关键字AND
检索数据表中指定的字段的内容;使用关键字IN
检索数据表中指定的字段的内容。
相关知识
为了完成本关任务,你需要掌握:
1.如何使用关键字AND
检索数据表中指定的字段的内容,
2.使用关键字IN
检索数据表中指定的字段的内容。
带AND
关键字的多条件查询
大家在前两章使用WHERE
关键字限定查询内容的时候,有没有注意到我们使用的都是单一条件查询。有没有同学曾经在检索的时候觉得力不从心:“我需要的结果只用单一条件查询是得不到的呀!”
比如,我既想要成熟苹果中直径大于5cm
的苹果的品种,又想要成熟苹果果色为黄色的苹果的品种。这两个条件如何综合在一起进行检索呢?
MySQ
L在WHERE
子句中使用AND
操作符限制只有满足所有条件的查询才会被返回。可以使用AND
连接两个甚至更多个查询条件,多个条件表达式之间用AND
分开。
语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2;
。
举个例子
假设我们现在有一张表Mall_products
,内容如下:
我们想要查询表中哪些商品不仅商品名中带有toy
字符,单价又同时大于5
,并列出他们的商品信息。
查询代码如下:
1 |
|
结果为:
查询过程如下:
分析:
在这个例子中,WHERE
子句中的条件分为了两部分,AND
关键字指示MySQL
返回所有同时满足两个条件的内容。单独满足带toy
字符后者单独满足价格大于5
都得不到我们想要查询的结果。
小提示: 可以同时添加多个过滤条件,增加条件的同时只需增加一个 AND
关键字。
带OR
关键字的多条件查询
与AND
相反,在WHERE声明中使用OR
关键字表示只需满足两个条件中的其中一个条件即可返回结果。
语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 OR 表达式2;
。
举个例子
假设我们现在有一张表Mall_products
,内容如下:
我们想要查询表中商品ID
为BNBG01
或BR01
的名称和单价。
查询代码如下:
1 |
|
结果为:
查询过程如下:
分析:
在这个例子里,关键字OR
告诉MySQL
只需要满足其中一个条件就可以返回结果,恩,很幸运的是它两个条件都能满足,所以返回了所有条件的结果。这里我们如果使用关键字AND
,将不会得到任何结果。
小提示: OR
可以和 AND
一起使用。但是 AND
的优先级要高于 OR
的优先级!
在这里我们不得不提到关键字IN
,它能实现与OR
相同的功能。
比如以下代码的功能和该例中的代码功能是一样的:
1 |
|
小提示: 虽然两种写法功能一样,但是我们更推荐使用 IN
关键字。因为它不仅逻辑清晰,执行的速度也会快于 OR
关键字。更重要的是,使用 IN
关键字,我们以后可以执行更加复杂的嵌套语句。
好了,下面轮到你们来上手试试了!
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,内容如下:
结构如下:
使用关键字
AND
返回数据表中字段DeptId
为301
并且薪水大于3000
的所有字段的内容,其中DeptId
的倒数第二个字母为i
的大写;使用关键字
IN
返回数据表中字段DeptId
为301
和303
的所有字段的内容。
测试说明
我会对你编写的代码进行测试,最终结果会如下图所示:
我的代码
1 |
|