
MySQL查询命令
学习资料来源:数据库原理与应用——MySQL从入门到实战
单表查询(一)
基本查询语句
查询数据表中指定字段的内容
MySQL
从数据表中查询数据的基本语句为SELECT
语句。
SELECT
语句的可选参数比较多,让我们先从最简单的开始,带大家一步一步的深入SELECT
语句的使用。
SELECT 基本语法规则为: SELECT 字段名 FROM 表名;
。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们需要从数据表中查询所有商品的名称,你们想想该怎么写?
查询代码如下:
SELECT prod_name FROM Mall_products;
结果为:
查询过程如下:
分析:
在该例子中,我们使用了SELECT
语句从Mall_products
表中获取名称为prod_name
字段下的所有产品名称,字段名称需要紧跟在SELECT
关键字之后。
然而事实上,我们查询数据的时候,往往需要同时查询多个字段
下的内容。这时,我们只需要在字段之间
加入逗号,
即可。
语法规则为: SELECT 字段名1, 字段名2 FROM 表名;
。
举个例子 假设我们现在有一张表Mall_products
,内容与上例相同。我们需要从数据表中查询所有商品的名称和价格,你们想想该怎么写?
查询代码如下:
SELECT prod_name, prod_price
FROM Mall_products;
结果为:
小提示: MySQL 中的 SQL 语句对关键字的大小写不敏感, SELECT 和 select 是一样的。 但是许多开发者更喜欢将关键字大写,表名和字段名使用小写,养成这种习惯,以后写出来的脚本就更容易阅读和维护了。
查询数据表中的所有内容
如果我们不记得字段名字了,我们还可以查看整张表的内容。这时候,只需要我们用星号*
来代替字段的名字,就会得到一整张表的内容。
语法规则为: SELECT * FROM 表名;
举个例子 假设我们现在有一张表Mall_products
。一开始我们并不知道表里都有什么,所以想要查看整张数据表的内容,你们想想该怎么写?
查询代码如下:
SELECT * FROM Mall_products;
结果为:
小提示: 虽然使用星号 * 看起来是一件很方便的事情,但是建议大家在不想获取整张表的情况下,还是使用字段名来进行查询。因为很显然,它会降低查询的效率。
带IN
关键字的查询
IN
关键字被用在WHERE
语句的后边,用来过滤你所需要查询的内容。更形象的说,IN
关键字的使用情形就像点名,点到谁谁就要站出来。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...);
。
其中,括号内的数字必须为INT
格式的数字。被“点到名”的这些括号里数字对应的内容,都要乖乖的站到前边来展示给大家看。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们会使用IN
关键字检索出所有国家代码为1
、86
和39
的商品信息。
查询代码如下:
SELECT *
FROM Mall_products
WHERE prod_country IN (1,87,39);
结果为:
查询过程如下:
Oopes! 貌似我们刚才输入了三个数字,为什么只查询到了国家代码为1
和39
的数据内容,87
去哪里了?
因为国家代号87
的内容就压根没存在过啊,仔细看看表Mall_products
就知道了。
带NOT IN
关键字的查询
聪明的小伙伴一看NOT
就知道了,我们是要取反了。刚才我们是在查询括号中出现的内容,加了NOT
取反后,就意味着,我们要查询的是除了括号中出现内容外的所有内容。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,...);
。
举个例子 我们还使用刚才的表Mall_products
。现在我们想要查询除了国家代码为86
的所有国家的产品内容。
查询代码如下:
SELECT *
FROM Mall_products
WHERE prod_country NOT IN (86);
结果为:
带BETWEEN AND
关键字的查询
我们已经学会了如何用IN
关键字精确查询数据表中的内容,但是在很多时候,我们仅仅是想知道在某一范围内有多少符合条件的数据,这就不得不使用到关键字BETWEEN AND
了。
BETWEEN AND
需要两个参数支持,一个是范围的开始值,另一个就是结束值了。如果字段值满足指定的范围查询条件,就返回这些满足条件的数据内容。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2;
。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们将使用BETWEEN AND
关键字检索出所有国家代码为1~50
的商品的信息。
查询代码如下:
SELECT *
FROM Mall_product
WHERE 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_products
WHERE prod_country NOT BETWEEN 1 AND 50;
结果为:
由结果可以看出,返回的结果只有大于国家代码50
的内容。
单表查询(二)
带 LIKE 的字符匹配查询
使用通配符%
模糊匹配数据内容
百分号通配符%
可以匹配任意长度的字符,甚至包括零字符。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';
。 其中 % 的位置可以根据需要在字符间变化。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们将使用LIKE
关键字和通配符%
检索出所有商品名称带ir
的商品信息。
查询代码如下:
SELECT *
FROM Mall_products
WHERE prod_name LIKE '%ir%';
结果为:
分析:
该语句查询的结果返回所有商品的名字中间带ir
字符的所有信息。通配符%
告诉MySQL
,返回字符串中间带ir
字符的记录,不管ir
前面和后面分别有多少字符。
通配符%
可以放在不同的位置以满足你查询的需要,仔细想想,如果我们想要查找商品名称以B
开头的所有记录,%
应该放在哪里?
查询过程如下:
使用通配符_
模糊匹配数据内容
下划线通配符_
与百分号通配符%
类似,也用于模糊匹配。但是区别在于下划线通配符_
只能模糊匹配1个
字符。如果你执意想用下划线通配符_
匹配多个字符,那只能多用几个_
咯!
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';
。 其中_
的位置可以根据需要在字符间变化。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们将使用LIKE
关键字和通配符_
检索出所有商品名称以r
结尾,且前边有9个字母的商品信息。
查询代码如下:
SELECT *
FROM Mall_products
WHERE prod_name LIKE '_________r';
结果为:
看到查询结果中prod_name
对应的Teddy bear
,大家可能注意到了,我们把空格也当成了一个字符来计算。
查询过程如下:
查询空值与去除重复结果
查询空值
在数据表创建之初,创建者可以指定某个字段是否为空值NULL
。注意了,这个NULL
既不代表0
,也不代表空字符,而是代表一种未知的状态,比如不适用或者放着等将来有合适数据了再添加进去。
语法规则为: SELECT 字段名 FROM 表名 WHERE 字段名 IS NULL;
。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们将使用IS NULL
关键字检索出所有prod_country
字段为NULL
的商品信息。
查询代码如下:
SELECT *
FROM Mall_products
WHERE prod_country IS NULL;
结果为:
查询过程如下:
可以看到,结果成功显示了prod_country
字段为NULL
的商品信息。与关键字IS NULL
查询结果相反的是关键字IS NOT NULL
,我们来看看实际操作的效果。
查询代码如下:
SELECT *
FROM Mall_products
WHERE 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_price
FROM Mall_products;
结果为:
查询过程如下:
可以看到,使用了关键字DISTINCT
后,我们返回的记录都不再有重复值。
带 AND 与 OR 的多条件查询
带AND
关键字的多条件查询
大家在前两章使用WHERE
关键字限定查询内容的时候,有没有注意到我们使用的都是单一条件查询。有没有同学曾经在检索的时候觉得力不从心:“我需要的结果只用单一条件查询是得不到的呀!”
比如,我既想要成熟苹果中直径大于5cm
的苹果的品种,又想要成熟苹果果色为黄色的苹果的品种。这两个条件如何综合在一起进行检索呢?
MySQL
在WHERE
子句中使用AND
操作符限制只有满足所有条件的查询才会被返回。可以使用AND
连接两个甚至更多个查询条件,多个条件表达式之间用AND
分开。
语法规则为: SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2;
。
举个例子 假设我们现在有一张表Mall_products
,内容如下:
我们想要查询表中哪些商品不仅商品名中带有toy
字符,单价又同时大于5
,并列出他们的商品信息。
查询代码如下:
SELECT *
FROM Mall_products
WHERE 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
,内容如下:
我们想要查询表中商品ID
为BNBG01
或BR01
的名称和单价。
查询代码如下:
SELECT ID, prod_name, prod_price
FROM Mall_products
WHERE ID = 'BNBG01' OR ID = 'BR01';
结果为:
查询过程如下:
分析:
在这个例子里,关键字OR
告诉MySQL
只需要满足其中一个条件就可以返回结果,恩,很幸运的是它两个条件都能满足,所以返回了所有条件的结果。这里我们如果使用关键字AND
,将不会得到任何结果。
小提示: OR 可以和 AND 一起使用。但是 AND 的优先级要高于 OR 的优先级!
在这里我们不得不提到关键字IN
,它能实现与OR
相同的功能。
比如以下代码的功能和该例中的代码功能是一样的:
SELECT ID, prod_name, prod_price
FROM Mall_products
WHERE ID IN('BNBG01', 'BR01');
小提示: 虽然两种写法功能一样,但是我们更推荐使用 IN 关键字。因为它不仅逻辑清晰,执行的速度也会快于 OR 关键字。更重要的是,使用 IN 关键字,我们以后可以执行更加复杂的嵌套语句。
单表查询(三)
对查询结果进行排序
我们知道在MySQL
中从数据表中读取数据都是使用SELECT
语句。 如果我们需要对读取的语句进行排序,我们就可以使用Order By
子句来设定你想要按照的字段进行排序并返回结果。
语法:
SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]];
你还可以根据自己的需求添加WHERE
、LIKE
子句来设置条件,再对结果过进行排序显示。
现有user
表数据如下:
id | name | age |
---|---|---|
1 | Tom | 32 |
2 | Nancy | 18 |
3 | Allen | 24 |
4 | Jason | 23 |
我们需要查询表中信息,要求按照年龄的升序进行排序:
指定排序方向
从上面的查询语句中我们并未看到有任何表示排序方向的关键字,在默认情况下,它是按升序排列的。
ASC
升序关键字DESC
降序关键字
分组查询
分组查询的单独使用
分组查询的关键字是Group By
,查询的是每个分组中 首次出现的一条记录。
语法:
SELECT 字段名 FROM 表名 GROUP BY 字段名;
例如: 现有user
表数据:
id | name | sex |
---|---|---|
1 | Tom | 男 |
2 | Nancy | 女 |
3 | Allen | Null |
4 | Jason | 男 |
我们对表中数据的性别进行分组查询:
可以看出,返回了3
条记录,分别是sex
字段值为Null
、女、男的记录,查询结果按照sex
字段中不同的值进行了分类,只显示每个分组中的一条记录,意义不大,一般情况下,GROUP BY
都和聚合函数一起使用。
使用 LIMIT 限制查询结果的数量
LIMIT
的使用
在我们查询大量数据结果时,会返回很多条数据,有需要的记录可能就其中的一条或者几条。比如,实现分页功能,若每页显示10
条记录,每次查询就只需要10
条记录。 在MySQL
中,提供了LIMIT
关键字,用来限制查询结果的数量。
语法:
SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;
参数说明:
- 第一个参数,
OFFSET
,可选参数,表示偏移量,如果不指定默认值为0
,表示从查询结果的第一条记录开始,若偏移量为1
,则从查询结果中的第二条记录开始,以此类推。 - 第二个参数,记录数,表示返回查询结果的条数。
现有employee
表数据如下:
id | name | age |
---|---|---|
1 | Tom | 23 |
2 | Allen | 45 |
3 | Nancy | 32 |
4 | Jack | 27 |
5 | Rose | 29 |
6 | Mary | 18 |
- 查询
employee
表中前4
条数据:
- 从第二条记录开始往后查看
4
条数据(不包含第二条):