MySQL数据库 - 单表查询

MySQL数据库 - 单表查询(一)

1.基本语句查询

任务描述

本关任务:

  • SELECT语句检索数据表中指定字段的数据;
  • SELECT语句检索数据表中所有字段的数据。
相关知识

为了完成本关任务,你需要掌握: 1.如何获取数据表中指定字段的数据; 2.如何获取数据表中的所有数据。

查询数据表中指定字段的内容

MySQL从数据表中查询数据的基本语句为SELECT语句。

SELECT语句的可选参数比较多,让我们先从最简单的开始,带大家一步一步的深入SELECT语句的使用。

SELECT 基本语法规则为: SELECT 字段名 FROM 表名; 。

举个例子 假设我们现在有一张表Mall_products,内容如下:
在这里插入图片描述

我们需要从数据表中查询所有商品的名称,你们想想该怎么写?

查询代码如下:

SELECT prod_nameFROM Mall_products;

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

分析:

在该例子中,我们使用了SELECT语句从Mall_products表中获取名称为prod_name字段下的所有产品名称,字段名称需要紧跟在SELECT关键字之后。

然而事实上,我们查询数据的时候,往往需要同时查询多个字段下的内容。这时,我们只需要在字段之间加入逗号,即可。

语法规则为: SELECT 字段名1, 字段名2 FROM 表名; 。

举个例子 假设我们现在有一张表Mall_products,内容与上例相同。我们需要从数据表中查询所有商品的名称和价格,你们想想该怎么写?

查询代码如下:

SELECT prod_name, prod_priceFROM Mall_products;

结果为:

在这里插入图片描述

小提示: MySQL 中的 SQL 语句对关键字的大小写不敏感, SELECT 和 select 是一样的。 但是许多开发者更喜欢将关键字大写,表名和字段名使用小写,养成这种习惯,以后写出来的脚本就更容易阅读和维护了。

查询数据表中的所有内容

如果我们不记得字段名字了,我们还可以查看整张表的内容。这时候,只需要我们用星号*来代替字段的名字,就会得到一整张表的内容。

语法规则为: SELECT * FROM 表名;

举个例子 假设我们现在有一张表Mall_products。一开始我们并不知道表里都有什么,所以想要查看整张数据表的内容,你们想想该怎么写?

查询代码如下:

SELECT *FROM Mall_products;

结果为:

在这里插入图片描述

小提示: 虽然使用星号 * 看起来是一件很方便的事情,但是建议大家在不想获取整张表的情况下,还是使用字段名来进行查询。因为很显然,它会降低查询的效率。

好了,下面轮到你们来上手试试了!

编程要求

根据提示,在右侧编辑器Begin-End处补充代码:

我们为你新建了一个数据表tb_emp,结构如下:

在这里插入图片描述

  • 请你查询字段NameSalary的内容;
  • 请你查询整张表的内容。
测试说明

我会对你编写的代码进行测试,若与预期输出一致则算通关。


开始你的任务吧,祝你成功!

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## retrieving the Name and Salary ##########
SELECT Name, Salary 
FROM tb_emp;

########## retrieving all the table ##########
SELECT *
FROM tb_emp;

########## End ##########

2.带IN关键字的查询

任务描述

本关任务:使用IN关键字检索数据表中指定的数据内容。

相关知识

为了完成本关任务,你需要掌握:如何使用关键字IN提取数据表中的指定数据内容。

IN关键字的查询

IN关键字被用在WHERE语句的后边,用来过滤你所需要查询的内容。更形象的说,IN关键字的使用情形就像点名,点到谁谁就要站出来。

在这里插入图片描述

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,…); 。

其中,括号内的数字必须为INT格式的数字。被“点到名”的这些括号里数字对应的内容,都要乖乖的站到前边来展示给大家看。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们会使用IN关键字检索出所有国家代码为18639的商品信息。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_country IN (1,87,39);

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

Oopes! 貌似我们刚才输入了三个数字,为什么只查询到了国家代码为139的数据内容,87去哪里了?

因为国家代号87的内容就压根没存在过啊,仔细看看表Mall_products就知道了。

NOT IN关键字的查询

聪明的小伙伴一看NOT就知道了,我们是要取反了。刚才我们是在查询括号中出现的内容,加了NOT取反后,就意味着,我们要查询的是除了括号中出现内容外的所有内容。

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,…); 。

举个例子 我们还使用刚才的表Mall_products。现在我们想要查询除了国家代码为86的所有国家的产品内容。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_country NOT IN (86);

结果为:

在这里插入图片描述

好了,下面轮到你们来上手试试了!

编程要求

根据提示,在右侧编辑器Begin-End处补充代码:

我们为你新建了一个数据表tb_emp,结构如下:

在这里插入图片描述

  • 请你查询当Id不等于1时,字段NameSalary的内容;
测试说明

我会对你编写的代码进行测试,最终结果会如下图所示:

在这里插入图片描述


开始你的任务吧,祝你成功!

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## retrieving the Name and Salary with IN statement ##########
SELECT Name,Salary 
FROM tb_emp 
WHERE Id NOT IN (1);



########## End ##########

3.带 BETWEEN AND 的范围查询

任务描述

本关任务:使用BETWEEN AND关键字检索数据表中指定的数据内容。

相关知识

为了完成本关任务,你需要掌握:如何使用关键字BETWEEN AND提取数据表中的指定数据内容。

BETWEEN AND关键字的查询

我们已经学会了如何用IN关键字精确查询数据表中的内容,但是在很多时候,我们仅仅是想知道在某一范围内有多少符合条件的数据,这就不得不使用到关键字BETWEEN AND了。

BETWEEN AND需要两个参数支持,一个是范围的开始值,另一个就是结束值了。如果字段值满足指定的范围查询条件,就返回这些满足条件的数据内容。

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2; 。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们将使用BETWEEN AND关键字检索出所有国家代码为1~50的商品的信息。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_country BETWEEN 1 AND 50;

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

可以看到,返回结果包含了国家代码从1~50之间的字段值。尤其值得注意的是,端点值1也包含在返回结果中。

NOT BETWEEN AND关键字的查询

像上一关介绍的关键字IN一样,我们还可以对关键字BETWEEN AND进行取反,表示查询指定范围之外的值。

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2; 。

举个例子 我们依然使用表Mall_products。现在我们想要查询除了国家代码为1~50的所有国家的产品内容。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_country NOT BETWEEN 1 AND 50;

结果为:

在这里插入图片描述

由结果可以看出,返回的结果只有大于国家代码50的内容。

怎么样?简单吧!好了,下面轮到你们来上手试试了!

编程要求

根据提示,在右侧编辑器Begin-End处补充代码:

我们为你新建了一个数据表tb_emp,结构如下:

在这里插入图片描述

  • 请你查询当字段Salary范围在3000~5000时,字段NameSalary的内容。
测试说明

我会对你编写的代码进行测试,最终结果会如下图所示:

在这里插入图片描述


开始你的任务吧,祝你成功!

USE Company;

#请在此处添加实现代码
########## Begin ##########

########## retrieving the Name and Salary with BETWEEN AND statement ##########
SELECT Name,Salary
FROM tb_emp
WHERE Salary BETWEEN 3000 AND 5000;


########## End ##########

MySQL数据库 - 单表查询(二)

第1关:带 LIKE 的字符匹配查询

任务描述

本关任务:使用通配符%检索数据表中指定字段的数据。

相关知识

为了完成本关任务,你需要掌握:如何使用通配符%模糊匹配数据内容。

在前面的检所操作中,我们讲述了如何进行比较查询或者是范围查询,但如果我们想查找所有包含字符ir的内容该么办呢?用之前的方法好像行不通了。在这里,我们需要用通配符进行匹配查找。而执行匹配查找的关键字就是LIKESQL语句支持很多种通配符,其中可以和LIKE一起搭配使用的就是通配符%_了。

使用通配符%模糊匹配数据内容

百分号通配符%可以匹配任意长度的字符,甚至包括零字符。

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE ‘字符%’; 。 其中 % 的位置可以根据需要在字符间变化。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们将使用LIKE关键字和通配符%检索出所有商品名称带ir的商品信息。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_name LIKE '%ir%';

结果为:

在这里插入图片描述

分析:

该语句查询的结果返回所有商品的名字中间带ir字符的所有信息。通配符%告诉MySQL,返回字符串中间带ir字符的记录,不管ir前面和后面分别有多少字符。

通配符%可以放在不同的位置以满足你查询的需要,仔细想想,如果我们想要查找商品名称以B开头的所有记录,%应该放在哪里?

查询过程如下:

在这里插入图片描述

使用通配符_模糊匹配数据内容

下划线通配符_与百分号通配符%类似,也用于模糊匹配。但是区别在于下划线通配符_只能模糊匹配1个字符。如果你执意想用下划线通配符_匹配多个字符,那只能多用几个_咯!

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE ‘字符_’; 。 其中_的位置可以根据需要在字符间变化。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们将使用LIKE关键字和通配符_检索出所有商品名称以r结尾,且前边有9个字母的商品信息。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_name LIKE '_________r';

结果为:

在这里插入图片描述

看到查询结果中prod_name对应的Teddy bear,大家可能注意到了,我们把空格也当成了一个字符来计算。

查询过程如下:

在这里插入图片描述

好了,下面轮到你们来上手试试了!

编程要求

根据提示,在右侧编辑器Begin-End处补充代码;

我们为你新建了一个数据表tb_emp,结构如下:
在这里插入图片描述

  • 请你查询所有Name以字母C为起始的员工的NameSalary的内容;
测试说明

我会对你编写的代码进行测试,最终结果会如下图所示:

在这里插入图片描述


开始你的任务吧,祝你成功!

USE Company;

######### Begin #########
SELECT Name,Salary
FROM tb_emp
WHERE Name LIKE 'C%';

######### End #########

第2关:查询空值与去除重复结果

任务描述

本关任务:使用关键字IS NULL检索数据表中指定的字段的空值;使用关键字DISTINCT检索数据表中指定的不重复的内容。

相关知识

为了完成本关任务,你需要掌握: 1.如何使用关键字IS NULL检索数据表中的空值, 2.使用关键字DISTINCT检索数据表中不重复的内容。

查询空值

在数据表创建之初,创建者可以指定某个字段是否为空值NULL。注意了,这个NULL既不代表0,也不代表空字符,而是代表一种未知的状态,比如不适用或者放着等将来有合适数据了再添加进去。

语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IS NULL; 。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们将使用IS NULL关键字检索出所有prod_country字段为NULL的商品信息。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_country IS NULL;

结果为:

在这里插入图片描述

查询过程如下:
在这里插入图片描述

可以看到,结果成功显示了prod_country字段为NULL的商品信息。与关键字IS NULL查询结果相反的是关键字IS NOT NULL,我们来看看实际操作的效果。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_country IS NOT NULL;

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

可以看到,查出来了prod_country字段的非NULL记录。

去除重复结果

有的时候,出于对数据分析的要求,分析人员需要消除数据表中重复的数据,那么如何消除呢?别担心,SQL语句也贴心的为你准备好了消除重复数据的关键字DISTINCT

语法规则为: SELECT DISTINCT 字段名 FROM 表名; 。

举个例子 假设我们现在有一张表Mall_products,内容如下:
在这里插入图片描述

可以从表中看到,除了字段ID没有重复项,剩下的字段里都出现了重复项。

我们将使用DISTINCT关键字去除prod_name字段中的重复数据。

查询代码如下:

SELECT DISTINCT prod_name, prod_country, prod_priceFROM Mall_products;

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

可以看到,使用了关键字DISTINCT后,我们返回的记录都不再有重复值。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码:

我们为你新建了一个数据表tb_emp,内容如下:

在这里插入图片描述

  • 使用关键字IS NULL返回数据表中字段DeptIdNULL的所有字段的内容,注意,返回的是指定行所有字段的内容;
  • 使用关键字DISTINCT返回数据表中字段Name不重复的内容,注意,只需返回字段Name的内容。
测试说明

我会对你编写的代码进行测试,最终结果会如下图所示:

在这里插入图片描述


开始你的任务吧,祝你成功!

USE Company;

######### Begin #########
SELECT *
FROM tb_emp
WHERE DeptId IS NULL;

######### End #########

######### Begin #########
SELECT DISTINCT Name
FROM tb_emp;

######### End #########

第3关:带 AND 与 OR 的多条件查询

任务描述

本关任务:使用关键字AND检索数据表中指定的字段的内容;使用关键字IN检索数据表中指定的字段的内容。

相关知识

为了完成本关任务,你需要掌握: 1.如何使用关键字AND检索数据表中指定的字段的内容, 2.使用关键字IN检索数据表中指定的字段的内容。

AND关键字的多条件查询

大家在前两章使用WHERE关键字限定查询内容的时候,有没有注意到我们使用的都是单一条件查询。有没有同学曾经在检索的时候觉得力不从心:“我需要的结果只用单一条件查询是得不到的呀!”

比如,我既想要成熟苹果中直径大于5cm的苹果的品种,又想要成熟苹果果色为黄色的苹果的品种。这两个条件如何综合在一起进行检索呢?

MySQLWHERE子句中使用AND操作符限制只有满足所有条件的查询才会被返回。可以使用AND连接两个甚至更多个查询条件,多个条件表达式之间用AND分开。

语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2; 。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们想要查询表中哪些商品不仅商品名中带有toy字符,单价又同时大于5,并列出他们的商品信息。

查询代码如下:

SELECT *FROM Mall_productsWHERE prod_name LIKE '%toy%' AND prod_price > 5;

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

分析:

在这个例子中,WHERE子句中的条件分为了两部分,AND关键字指示MySQL返回所有同时满足两个条件的内容。单独满足带toy字符后者单独满足价格大于5都得不到我们想要查询的结果。

小提示: 可以同时添加多个过滤条件,增加条件的同时只需增加一个 AND 关键字。

OR关键字的多条件查询

AND相反,在WHERE声明中使用OR关键字表示只需满足两个条件中的其中一个条件即可返回结果。

语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 OR 表达式2; 。

举个例子 假设我们现在有一张表Mall_products,内容如下:

在这里插入图片描述

我们想要查询表中商品IDBNBG01BR01的名称和单价。

查询代码如下:

SELECT  ID, prod_name, prod_priceFROM Mall_productsWHERE ID = 'BNBG01' OR ID = 'BR01';

结果为:

在这里插入图片描述

查询过程如下:

在这里插入图片描述

分析:

在这个例子里,关键字OR告诉MySQL只需要满足其中一个条件就可以返回结果,恩,很幸运的是它两个条件都能满足,所以返回了所有条件的结果。这里我们如果使用关键字AND,将不会得到任何结果。

小提示: OR 可以和 AND 一起使用。但是 AND 的优先级要高于 OR 的优先级!

在这里我们不得不提到关键字IN,它能实现与OR相同的功能。

比如以下代码的功能和该例中的代码功能是一样的:

SELECT  ID, prod_name, prod_priceFROM Mall_productsWHERE ID IN('BNBG01', 'BR01');

小提示: 虽然两种写法功能一样,但是我们更推荐使用 IN 关键字。因为它不仅逻辑清晰,执行的速度也会快于 OR 关键字。更重要的是,使用 IN 关键字,我们以后可以执行更加复杂的嵌套语句。

好了,下面轮到你们来上手试试了!

编程要求

根据提示,在右侧编辑器Begin-End处补充代码:

我们为你新建了一个数据表tb_emp,内容如下:

在这里插入图片描述

结构如下:

在这里插入图片描述

  • 使用关键字AND返回数据表中字段DeptId301并且薪水大于3000的所有字段的内容,其中DeptId的倒数第二个字母为i的大写;
  • 使用关键字IN返回数据表中字段DeptId301303的所有字段的内容。
测试说明

我会对你编写的代码进行测试,最终结果会如下图所示:

在这里插入图片描述


开始你的任务吧,祝你成功!

USE Company;

######### Begin #########
SELECT *
FROM tb_emp
WHERE DeptId = 301 AND Salary > 3000;

######### End #########

######### Begin #########
SELECT *
FROM tb_emp
WHERE DeptId IN(301,303);

######### End #########

MySQL数据库 - 单表查询(三)

第1关:对查询结果进行排序

任务描述

本关任务:以成绩的降序显示学生成绩表中所有信息。

相关知识

为了完成本关任务,你需要掌握:

  1. 结果排序的关键字;
  2. 指定排序方向的关键字。
对查询结果排序

我们知道在MySQL中从数据表中读取数据都是使用SELECT语句。 如果我们需要对读取的语句进行排序,我们就可以使用Order By子句来设定你想要按照的字段进行排序并返回结果。

语法:

SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]];

你还可以根据自己的需求添加WHERELIKE子句来设置条件,再对结果过进行排序显示。

现有user表数据如下:

idnameage
1Tom32
2Nancy18
3Allen24
4Jason23

我们需要查询表中信息,要求按照年龄的升序进行排序:

在这里插入图片描述

指定排序方向

从上面的查询语句中我们并未看到有任何表示排序方向的关键字,在默认情况下,它是按升序排列的。

  • ASC 升序关键字
  • DESC 降序关键字

在这里插入图片描述

编程要求

在右侧编辑器Begin-End处补充代码,查询学生成绩表中1班同学的所有信息并以成绩降序的方式显示结果。

我们已经为你提供了学生成绩表: tb_score表数据:

stu_idclass_idnamescore
12Jack81
21David74
31Mason92
42Ethan89
51Gina65
测试说明

平台会对你编写的代码进行测试:

预期输出:

stu_id    class_id    name    score  
3        1        Mason      92   
2        1        David      74   
5        1        Gina       65

开始你的任务吧,祝你成功!

USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询1班同学的所有信息以成绩降序的方式显示结果 ##########
SELECT * 
FROM tb_score 
WHERE class_id IN (1)
ORDER BY score DESC;

########## End ##########

第2关:分组查询

任务描述

本关任务:对班级表中的班级名称进行分组查询。

相关知识

为了完成本关任务,你只需要掌握分组查询的单独使用。

但是在实际开发中一般不会用到,本章节只作为对分组查询的了解。往后继续学习,我们会介绍分组查询与其他查询一起结合使用。

分组查询的单独使用

分组查询的关键字是Group By,查询的是每个分组中 首次出现的一条记录

语法:

SELECT 字段名 FROM 表名 GROUP BY 字段名;

例如: 现有user表数据:

idnamesex
1Tom
2Nancy
3AllenNull
4Jason

我们对表中数据的性别进行分组查询:

在这里插入图片描述

可以看出,返回了3条记录,分别是sex字段值为Null、女、男的记录,查询结果按照sex字段中不同的值进行了分类只显示每个分组中的一条记录,意义不大,一般情况下,GROUP BY都和聚合函数一起使用。

编程要求

在右侧编辑器Begin-End处补充代码,对班级表中的班级名称进行分组查询。

我们已经为你提供了班级表信息: tb_class表数据:

stu_idclass_idname
1367Jack
2366David
3366Mason
4367Ethan
5366Gina
测试说明

平台会对你编写的代码进行测试:

预期输出:

stu_id    class_id    name  
2         366       David  
1         367       Jack

开始你的任务吧,祝你成功!

USE School;

#请在此处添加实现代码
########## Begin ##########

########## 对班级名称进行分组查询 ##########
SELECT * FROM tb_class GROUP BY class_id;

########## End ##########

第3关:使用 LIMIT 限制查询结果的数量

任务描述

本关任务:使用LIMIT关键字查询班级中第2名到第5名的学生信息,并根据学生成绩进行降序排序。

相关知识

为了完成本关任务,你需要掌握:LIMIT的基本使用。

LIMIT的使用

在我们查询大量数据结果时,会返回很多条数据,有需要的记录可能就其中的一条或者几条。比如,实现分页功能,若每页显示10条记录,每次查询就只需要10条记录。 在MySQL中,提供了LIMIT关键字,用来限制查询结果的数量。

语法:

SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;

参数说明:

  • 第一个参数,OFFSET,可选参数,表示偏移量,如果不指定默认值为0,表示从查询结果的第一条记录开始,若偏移量为1,则从查询结果中的第二条记录开始,以此类推。
  • 第二个参数,记录数,表示返回查询结果的条数。

现有employee表数据如下:

idnameage
1Tom23
2Allen45
3Nancy32
4Jack27
5Rose29
6Mary18
  • 查询employee表中前4条数据:

在这里插入图片描述

  • 从第二条记录开始往后查看4条数据(不包含第二条):

在这里插入图片描述

编程要求

在右侧编辑器Begin-End处补充代码,查询班级中第2名到第5名的学生信息,并根据学生成绩进行降序排序。

我们已经为你提供了学生成绩表: tb_score表数据:

idnamescore
1Jack89
2David73
3Mason62
4Ethan93
5Gina76
6Dorris98
7kain86
8Alice91
测试说明

平台会对你编写的代码进行测试:

预期输出:

id    name    score
4     Ethan    93
8     Alice    91
1     Jack     89
7     kain     86

开始你的任务吧,祝你成功!

USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询班级中第2名到第5名的学生信息 ##########
SELECT * FROM tb_score ORDER BY score DESC LIMIT 1,4;

########## End ##########

本文仅供学习。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值