MySQL单表查询

单表查询是指从一张表数据中查询所需的数据。本节将介绍单表查询中的各种基本的查询方 式,主要有查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果 进行排序等。

  1. 查询所有字段 在 SELECT 语句中使用星号(*)通配符查询所有字段 SELECT 查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号(*)通 配符指定查找所有列的名称。语法格式如下

SELECT * FROM 表名; 

从 fruits 表中检索所有字段的数据,SQL 语句如下:

 SELECT * FROM fruits;

可以看到,使用星号(*)通配符时,将返回所有列,列按照定义表时候的顺序显示

在 SELECT 语句中指定所有字段 下面介绍另外一种查询所有字段值的方法。根据前面 SELECT 语句的格式,SELECT 关键字 后面的字段名为将要查找的数据,因此可以将表中所有字段的名称跟在 SELECT 子句后面,如果 忘记了字段名称,可以使用 DESC 命令查看表的结构。有时候,表中的字段可能比较多,不一定 能记得所有字段的名称,因此该方法会很不方便,不建议使用。例如,查询 fruits 表中的所有数据, SQL 语句也可以书写如下:

SELECT f_id, s_id ,f_name, f_price FROM fruits;

查询结果跟上面相同

提 示 :一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符‘*’。使用通配 符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使 用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过它获 取它们。

  1. 查询指定字段 查询单个字段 查询表中的某一个字段,语法格式为

SELECT 列名 FROM 表名;

查询 fruits 表中 f_name 列所有的水果名称,SQL 语句如下

SELECT f_name FROM fruits;

该语句使用 SELECT 声明从 fruits 表中获取名称为 f_name 字段下的所有水果名称,指定字段 的名称紧跟在 SELECT 关键字之后,查询结果如下:

输出结果显示了 fruits 表中 f_name 字段下的所有数据。

查询多个字段

使用 SELECT 声明,可以获取多个字段下的数据,只需要在关键字 SELECT 后面指定要查找 的字段的名称,不同字段名称之间用逗号(,)分隔开,最后一个字段后面不需要加逗号,语法格 式如下:

SELECT 字段名1,字段名2,…,字段名 n FROM 表名;

从 fruits 表中获取 f_name 和 f_price 两列,SQL 语句如下:

SELECT f_name, f_price FROM fruits;

该语句使用 SELECT 声明从 fruits 表中获取名称为 f_name 和 f_price 两个字段下的所有水果名 称和价格,两个字段之间用逗号分隔开,查询结果如下:

输出结果显示了 fruits 表中 f_name 和 f_price 两个字段下的所有数据。 提 示 :MySQL 中的 SQL 语句是不区分大小写的,因此 SELECT 和 select 的作用是相同的,但 是,许多开发人员习惯将关键字大写、数据列和表名小写,读者也应该养成一个良好的 编程习惯,这样写出来的代码更容易阅读和维护。

  1. 查询指定记录

数据库中包含大量的数据,根据特殊要求,可能只需要查询表中的指定数据,即对数据进行 过滤。在 SELECT 语句中,通过 WHERE 子句可以对数据进行过滤,语法格式为:

SELECT 字段名1,字段名2,…,字段名 n
FROM 表名
WHERE 查询条件

在 WHERE 子句中,MySQL 提供了一系列的条件判断符,查询结果如下所示。

查询价格为 10.2 元的水果的名称,SQL 语句如下:

SELECT f_name, f_price
FROM fruits
WHERE f_price = 10.2;

该语句使用 SELECT 声明从 fruits 表中获取价格等于 10.2 的水果的数据,从查询结果可以看 到,价格是 10.2 的水果的名称是 blackberry,其他的均不满足查询条件,查询结果如下:

本例采用了简单的相等过滤,查询一个指定列 f_price 具有值 10.20。 相等还可以用来比较字符串,下面给出一个例子: 查找名称为“apple”的水果的价格,SQL 语句如下:

SELECT f_name, f_price FROM fruits
WHERE f_name = 'apple';

该语句使用 SELECT 声明从 fruits 表中获取名称为“apple”的水果的价格,从查询结果可以 看到只有名称为“apple”行被返回,其他的均不满足查询条件。

查询价格小于 10 的水果的名称,SQL 语句如下:

SELECT f_name, f_price
FROM fruits
WHERE f_price < 10;

该语句使用 SELECT 声明从 fruits 表中获取价格低于 10 的水果名称,即 f_price 小于 10 的水 果信息被返回,查询结果如下:

可以看到查询结果中所有记录的 f_price 字段的值均小于 10.00 元,而大于等于 10.00 元的记录 没有被返回。

  1. 带 IN 关键字的查询 IN 操作符用来查询满足指定范围内的条件的记录,使用 IN 操作符,将所有检索条件用括号括 起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。 查询 s_id 为 101 和 102 的记录,SQL 语句如下:

SELECT s_id,f_name, f_price
FROM fruits
WHERE s_id IN (101,102)
ORDER BY f_name; 

查询结果如下:

相反,可以使用关键字 NOT 来检索不在条件范围内的记录。 查询所有 s_id 不等于 101 也不等于 102 的记录,SQL 语句如下:

SELECT s_id,f_name, f_price
FROM fruits
WHERE s_id NOT IN (101,102)
ORDER BY f_name; 

查询结果如下:

可以看到,该语句在 IN 关键字前面加上了 NOT 关键字,这使得查询的结果与前面一个的结 果正好相反,前面检索了 s_id 等于 101 和 102 的记录,而这里所要求查询的记录中 s_id 字段值不 等于这两个值中的任何一个。

  1. 带 BETWEEN AND 的范围查询 BETWEEN AND 用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束 值,如果字段值满足指定的范围查询条件,则这些记录被返回。 查询价格在 2.00 元到 10.20 元之间的水果名称和价格,SQL 语句如下:

SELECT f_name, f_price FROM fruits WHERE f_price BETWEEN 2.00 AND 10.20;

查询结果如下:

可以看到,返回结果包含了价格从 2.00 元到 10.20 元之间的字段值,并且端点值 10.20 也包括 在返回结果中,即 BETWEEN 匹配范围中的所有值,包括开始值和结束值。 BETWEEN AND 操作符前可以加关键字 NOT,表示指定范围之外的值,如果字段值不满足指 定的范围内的值,则这些记录被返回。 查询价格在 2.00 元到 10.20 元之外的水果名称和价格,SQL 语句如下:

SELECT f_name, f_price
FROM fruits
WHERE f_price NOT BETWEEN 2.00 AND 10.20;

查询结果如下:

由结果可以看到,返回的记录只有 f_price 字段大于 10.20 的,其实,f_price 字段小于 2.00 的 记录也满足查询条件。因此,如果表中有 f_price 字段小于 2.00 的记录,也应当作为查询结果。

  1. 带 LIKE 的字符匹配查询 在前面的检索操作中讲述了如何查询多个字段的记录,如何进行比较查询或者是查询一个条 件范围内的记录,如果要查找所有包含字符“ge”的水果名称,该如何查找呢?简单的比较操作在 这里已经行不通了,需要使用通配符进行匹配查找,通过创建查找模式对表中的数据进行比较。执 行这个任务的关键字是 LIKE。 通配符是一种在 SQL 的 WHERE 条件子句中拥有特殊意思的字符。SQL 语句中支持多种通配 符,可以和 LIKE 一起使用的通配符有‘%’和‘_’。

百分号通配符‘%’,匹配任意长度的字符,甚至包括零字符 查找所有以‘b’字母开头的水果,SQL 语句如下:

SELECT f_id, f_name
FROM fruits
WHERE f_name LIKE 'b%';

查询结果如下:

该语句查询的结果返回所有以‘b’开头的水果的 id 和 name,‘%’告诉 MySQL,返回所有 以字母‘b’开头的记录,不管‘b’后面有多少个字符。 在搜索匹配时通配符‘%’可以放在不同位置,如下所示。 在 fruits 表中,查询 f_name 中包含字母‘g’的记录,SQL 语句如下:

SELECT f_id, f_name
FROM fruits
WHERE f_name LIKE '%g%'; 

查询结果如下:

该语句查询字符串中包含字母‘g’的水果名称,只要名字中有字符‘g’,不管前面或后面 有多少个字符,都满足查询的条件。 查询以‘b’开头并以‘y’结尾的水果的名称,SQL 语句如下:

SELECT f_name
FROM fruits
WHERE f_name LIKE 'b%y';

查询结果如下:

通过以上查询结果可以看到,‘%’用于匹配在指定位置的任意数目的字符。 下划线通配符‘_’,一次只能匹配任意一个字符

另一个非常有用的通配符是下划线通配符‘_’。该通配符的用法和‘%’相同,区别是‘%’ 可以匹配多个字符,而‘_’只能匹配任意单个字符。如果要匹配多个字符,则需要使用相同个数 的‘_’。 在 fruits 表中,查询以字母‘y’结尾,且‘y’前面只有 4 个字母的记录,SQL 语 句如下:

SELECT f_id, f_name FROM fruits WHERE f_name LIKE '_ _ _ _y';

查询结果如下:

从结果可以看到,以‘y’结尾且前面只有 4 个字母的记录只有一条。其他记录的 f_name 字 段也有以‘y’结尾的,但其总的字符串长度不为 5,因此不在返回结果中。

  1. 查询空值 数据表创建的时候,设计者可以指定某列中是否包含空值(NULL)。空值不同于 0,也不同 于空字符串。空值一般表示数据未知、不适用或将在以后添加数据。在 SELECT 语句中使用 IS NULL 子句,可以查询某字段内容为空记录。 下面在数据库中创建数据表 customers,该表中包含了本章中需要用到的数据。

CREATE TABLE customers
(
 c_id int NOT NULL AUTO_INCREMENT,
 c_name char(50) NOT NULL,
 c_address char(50) NULL,
 c_city char(50) NULL,
 c_zip char(10) NULL,
 c_contact char(50) NULL,
 c_email char(255) NULL,
 PRIMARY KEY (c_id)
); 

为了演示,需要插入数据,执行以下语句:

INSERT INTO customers(c_id, c_name, c_address, c_city,
c_zip, c_contact, c_email)
VALUES(10001, 'RedHook', '200 Street ', 'Tianjin',
 '300000', 'LiMing', 'LMing@163.com'),
(10002, 'Stars', '333 Fromage Lane',
 'Dalian', '116000', 'Zhangbo','Jerry@hotmail.com'),
(10003, 'Netbhood', '1 Sunny Place', 'Qingdao', '266000',
 'LuoCong', NULL),
(10004, 'JOTO', '829 Riverside Drive', 'Haikou',
 '570000', 'YangShan', 'sam@hotmail.com'); 

查询 customers 表中 c_email 为空的记录的 c_id、c_name 和 c_email 字段值,SQL 语句如下:

SELECT c_id, c_name,c_email FROM customers WHERE c_email IS NULL; 

查询结果如下:

可以看到,显示 customers 表中字段 c_email 的值为 NULL 的记录,满足查询条件。 与 IS NULL 相反的是 NOT NULL,该关键字查找字段不为空的记录。 查询 customers 表中 c_email 不为空的记录的 c_id、c_name 和 c_email 字段值,SQL 语句如下:

SELECT c_id, c_name,c_email FROM customers WHERE c_email IS NOT NULL; 

查询结果如下:

可以看到,查询出来的记录的 c_email 字段都不为空值。

  1. 带 AND 的多条件查询 使用 SELECT 查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。MySQL 在 WHERE 子句中使用 AND 操作符限定只有满足所有查询条件的记录才会被返回。可以使用 AND 连接两个甚至多个查询条件,多个条件表达式之间用 AND 分开。 在 fruits 表中查询 s_id = 101 并且 f_price 大于等于 5 的水果 id、价格和名称,SQL 语句如下:

SELECT f_id, f_price, f_name FROM fruits WHERE s_id = '101' AND f_price >=5; 

查询结果如下:

前面的语句检索了 s_id=101 的水果供应商所有价格大于等于 5 元的水果名称和价格。WHERE 子句中的条件分为两部分,AND 关键字指示 MySQL 返回所有同时满足两个条件的行。id=101 的 水果供应商提供的水果如果价格小于 5,或者是 id 不等于‘101’的水果供应商里的水果(不管其 价格为多少),均不是要查询的结果。 提 示 :上述例子的 WHERE 子句中只包含了一个 AND 语句,把两个过滤条件组合在一起。实际 上可以添加多个 AND 过滤条件,增加条件的同时增加一个 AND 关键字。

在 fruits 表中查询 s_id = 101 或者 102,并且 f_price 大于等于 5、f_name='apple' 的 水果价格和名称,SQL 语句如下:

SELECT f_id, f_price, f_name FROM fruits
WHERE s_id IN('101', '102') AND f_price >= 5 AND f_name = 'apple';

查询结果如下:

可以看到,符合查询条件的返回记录只有一条。

  1. 带 OR 的多条件查询 与 AND 相反,在 WHERE 声明中使用 OR 操作符,表示只需要满足其中一个条件的记录即可 返回。OR 也可以连接两个甚至多个查询条件,多个条件表达式之间用 OR 分开。 查询 s_id=101 或者 s_id=102 的水果供应商的 f_price 和 f_name,SQL 语句如下:

SELECT s_id,f_name, f_price FROM fruits WHERE s_id = 101 OR s_id = 102; 

查询结果如下:

结果显示了 s_id=101 和 s_id=102 的水果供应商的水果名称和价格,OR 操作符告诉 MySQL 检索的时候只需要满足其中的一个条件,不需要全部都满足。如果这里使用 AND 的话,将检索不 到符合条件的数据。 在这里,也可以使用 IN 操作符实现与 OR 相同的功能,下面的例子可进行说明。 查询 s_id=101 或者 s_id=102 的水果供应商的 f_price 和 f_name,SQL 语句如下:

SELECT s_id,f_name, f_price FROM fruits WHERE s_id IN(101,102); 

查询结果如下

在这里可以看到,OR 操作符和 IN 操作符使用后的结果是一样的,它们可以实现相同的功能, 但是使用 IN 操作符使得检索语句更加简洁明了,并且 IN 执行的速度要快于 OR。更重要的是,使 用 IN 操作符可以执行更加复杂的嵌套查询(后面将会讲述)。

提 示 :OR 可以和 AND 一起使用,但是在使用时要注意两者的优先级,由于 AND 的优先级高 于 OR,因此先对 AND 两边的操作数进行操作,再与 OR 中的操作数结合。

  1. 查询结果不重复 从前面的例子可以看到,SELECT 查询返回所有匹配的行。例如,查询 fruits 表中所有的 s_id, 其结果为:

可以看到查询结果返回了 16 条记录,其中有一些重复的 s_id 值。有时出于对数据分析的要求, 需要消除重复的记录值,该如何操作呢?在 SELECT 语句中,可以使用 DISTINCT 关键字指示 MySQL 消除重复的记录值。语法格式为:

SELECT DISTINCT 字段名 FROM 表名;

查询 fruits 表中 s_id 字段的值,返回 s_id 字段值且不得重复,SQL 语句如下:

SELECT DISTINCT s_id FROM fruits; 

查询结果如下:

可以看到,这次查询结果只返回了 7 条记录的 s_id 值,且不再有重复的值,SELECT DISTINCT s_id 告诉 MySQL 只返回不同的 s_id 行。

  1. 对查询结果排序 从前面的查询结果,读者会发现有些字段的值是没有任何顺序的,MySQL 可以通过在 SELECT 语句中使用 ORDER BY 子句对查询的结果进行排序。

单列排序 例如,查询 f_name 字段,查询结果如下:

可以看到,查询的数据并没有以一种特定的顺序显示,如果没有对它们进行排序,就将根据 它们插入到数据表中的顺序来显示。 下面使用 ORDER BY 子句对指定的列数据进行排序。 查询 fruits 表的 f_name 字段值,并对其进行排序,SQL 语句如下:

该语句查询的结果和前面的语句相同,不同的是,通过指定 ORDER BY 子句,MySQL 对查 询的 name 列的数据按字母表的顺序进行了升序排列。 多列排序 有时,需要根据多列值进行排序。比如,如果要显示一个学生列表,可能会有多个学生的姓 氏是相同的,因此还需要根据学生的名进行排序。对多列数据进行排序,要将需要排序的列之间用 逗号隔开。 查询 fruits 表中的 f_name 和 f_price 字段,先按 f_name 排序,再按 f_price 排序, SQL 语句如下:

SELECT f_name, f_price FROM fruits ORDER BY f_name, f_price;

查询结果如下:

提 示 :在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排 序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序

指定排序方向 默认情况下,查询数据按字母升序进行排序(A~Z),但数据的排序并不仅限于此,还可以使 用 ORDER BY 对查询结果进行降序排序(Z~A)。这可以通过关键字 DESC 实现,下面的例子表 明了如何进行降序排列。 查询 fruits 表中的 f_name 和 f_price 字段,对结果按 f_price 降序方式排序,SQL 语句如下:

SELECT f_name, f_price FROM fruits ORDER BY f_price DESC;

查询结果如下:

提 示 :与 DESC 相反的是 ASC(升序),将字段列中的数据按字母表顺序升序排列。实际上,在 排序的时候 ASC 是默认的排序方式,所以加不加都可以。

也可以对多列进行不同的顺序排序,如下所示。 查询 fruits 表,先按 f_price 降序排列,再按 f_name 字段升序排列,SQL 语句如下:

SELECT f_price, f_name FROM fruits ORDER BY f_price DESC, f_name;

查询结果如下:

DESC 排序方式只应用到直接位于其前面的字段上,由结果可以看出。

提 示 :DESC 关键字只对其前面的列进行降序排列,在这里只对 f_price 排序,而并没有对 f_name 进行排序,因此,f_price 按降序排列,而 f_name 列仍按升序排列。如果要对多列都进行 降序排列,必须要在每一列的列名后面加 DESC 关键字。

  1. 分组查询 分组查询是对数据按照某个或多个字段进行分组。MySQL 中使用 GROUP BY 关键字对数据 进行分组,基本语法形式为:

[GROUP BY 字段] [HAVING <条件表达式>]

字段值为进行分组时所依据的列名称;“HAVING <条件表达式>”指定满足表达式限定条件 的结果将被显示。 创建分组 GROUP BY 关键字通常和集合函数一起使用,比如 MAX()、MIN()、COUNT()、SUM()、AVG()。 例如,要返回每个水果供应商提供的水果种类,这时就要在分组过程中用到 COUNT()函数,把数 据分为多个逻辑组,并对每个组进行集合计算。

根据 s_id 对 fruits 表中的数据进行分组,SQL 语句如下:

SELECT s_id, COUNT(*) AS Total FROM fruits GROUP BY s_id;

查询结果如下:

查询结果显示,s_id 表示供应商的 ID,Total 字段使用 COUNT()函数计算得出,GROUP BY 子句按照 s_id 排序并对数据分组,可以看到 ID 为 101、102、105 的供应商分别提供 3 种水果,ID 为 103、104、107 的供应商分别提供 2 种水果,ID 为 106 的供应商只提供 1 种水果。 如果要查看每个供应商提供的水果的种类名称,该怎么办呢?在 MySQL 中,可以在 GROUP BY 子句中使用 GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来。 根据 s_id 对 fruits 表中的数据进行分组,将每个供应商的水果名称显示出来,SQL 语句如下:

SELECT s_id, GROUP_CONCAT(f_name) AS Names FROM fruits GROUP BY s_id;

查询结果如下:

由结果可以看到,GROUP_CONCAT()函数将每个分组中的名称显示出来了,其名称的个数与 COUNT()函数计算出来的相同。 使用 HAVING 过滤分组 GROUP BY 可以和 HAVING 一起限定显示记录所需满足的条件,只有满足条件的分组才会被 显示。 根据 s_id 对 fruits 表中的数据进行分组,并显示水果种类大于 1 的分组信息,SQL 语句如下:

SELECT s_id, GROUP_CONCAT(f_name) AS Names
FROM fruits
GROUP BY s_id HAVING COUNT(f_name) > 1;

查询结果如下:

由结果可以看到,ID 为 101、102、103、104、105、107 的供应商提供的水果种类大于 1,满 足 HAVING 子句条件,因此出现在返回结果中;而 ID 为 106 的供应商的水果种类等于 1,不满足 限定条件,因此不在返回结果中。

提 示 :HAVING 关键字与 WHERE 关键字都是用来过滤数据的,两者有什么区别呢?其中重要 的一点是,HAVING 在数据分组之后进行过滤来选择分组,而 WHERE 在分组之前来选 择记录。另外,WHERE 排除的记录不再包括在分组中。

在 GROUP BY 子句中使用 WITH ROLLUP 使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算 查询出的所有记录的总和,即统计记录数量。 根据 s_id 对 fruits 表中的数据进行分组,并显示记录数量,SQL 语句如下:

SELECT s_id, COUNT(*) AS Total
FROM fruits
GROUP BY s_id WITH ROLLUP;

查询结果如下:

由结果可以看到,通过 GROUP BY 分组之后,在显示结果的最后面新添加了一行,该行 Total 列的值正好是上面所有数值之和。 多字段分组 使用 GROUP BY 可以对多个字段进行分组,GROUP BY 关键字后面跟需要分组的字段, MySQL 根据多字段的值来进行层次分组,分组层次从左到右,即先按第 1 个字段分组,然后在第 1 个字段值相同的记录中再根据第 2 个字段的值进行分组,以此类推。 根据 s_id 和 f_name 字段对 fruits 表中的数据进行分组,SQL 语句如下:

mysql> SELECT * FROM fruits group by s_id,f_name;

查询结果如下:

由结果可以看到,查询记录先按照 s_id 进行分组,再对 f_name 字段按不同的取值进行分组。 GROUP BY 和 ORDER BY 一起使用 某些情况下需要对分组进行排序,在前面的介绍中,ORDER BY 用来对查询的记录排序,如 果和 GROUP BY 一起使用可以完成对分组的排序。 为了演示效果,首先创建数据表,SQL 语句如下:

CREATE TABLE orderitems
(
 o_num int NOT NULL,
 o_item int NOT NULL,
 f_id char(10) NOT NULL,
 quantity int NOT NULL,
 item_price decimal(8,2) NOT NULL,
 PRIMARY KEY (o_num,o_item)
) ;

然后插入演示数据。SQL 语句如下:

INSERT INTO orderitems(o_num, o_item, f_id, quantity, item_price)
VALUES(30001, 1, 'a1', 10, 5.2),
(30001, 2, 'b2', 3, 7.6),
(30001, 3, 'bs1', 5, 11.2),
(30001, 4, 'bs2', 15, 9.2),
(30002, 1, 'b3', 2, 20.0),
(30003, 1, 'c0', 100, 10),
(30004, 1, 'o2', 50, 2.50),
(30005, 1, 'c0', 5, 10),
(30005, 2, 'b1', 10, 8.99),
(30005, 3, 'a2', 10, 2.2),
(30005, 4, 'm1', 5, 14.99);

查询订单价格大于 100 的订单号和总订单价格,SQL 语句如下:

SELECT o_num, SUM(quantity * item_price) AS orderTotal
FROM orderitems
GROUP BY o_num
HAVING SUM(quantity*item_price) >= 100;

查询结果如下:

可以看到,返回的结果中 orderTotal 列的总订单价格并没有按照一定顺序显示,接下来使用 ORDER BY 关键字按总订单价格排序显示结果,SQL 语句如下:

SELECT o_num, SUM(quantity * item_price) AS orderTotal
FROM orderitems
GROUP BY o_num
HAVING SUM(quantity*item_price) >= 100
ORDER BY orderTotal; 

查询结果如下:

由结果可以看到,GROUP BY 子句按订单号对数据进行分组,SUM()函数便可以返回总的订 单价格,HAVING 子句对分组数据进行过滤,使得只返回总价格大于 100 的订单,最后使用 ORDER BY 子句排序输出。

提 示 :当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY 是互相排斥的。

  1. 使用 LIMIT 限制查询结果的数量 SELECT 返回所有匹配的行,有可能是表中所有的行,若仅仅需要返回第一行或者前几行, 可使用 LIMIT 关键字,基本语法格式如下:

LIMIT [位置偏移量,] 行数

第一个“位置偏移量”参数指示 MySQL 从哪一行开始显示,是一个可选参数,如果不指定“位 置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是 0,第二条记录的位置偏 移量是 1,以此类推);第二个参数“行数”指示返回的记录条数。 显示 fruits 表查询结果的前 4 行,SQL 语句如下:

SELECT * From fruits LIMIT 4;

查询结果如下:

由结果可以看到,该语句没有指定返回记录的“位置偏移量”参数,显示结果从第一行开始, “行数”参数为 4,因此返回的结果为表中的前 4 行记录。 如果指定返回记录的开始位置,那么返回结果为从“位置偏移量”参数开始的指定行数,“行 数”参数指定返回的记录条数。 在 fruits 表中,使用 LIMIT 子句,返回从第 5 个记录开始的行数长度为 3 的记录, SQL 语句如下:

SELECT * From fruits LIMIT 4, 3;

查询结果如下:

由结果可以看到,该语句指示 MySQL 返回从第 5 条记录行开始之后的 3 条记录。第一个数字 ‘4’表示从第 5 行开始(位置偏移量从 0 开始,第 5 行的位置偏移量为 4),第二个数字 3 表示 返回的行数。 所以,带一个参数的 LIMIT 指定从查询结果的首行开始,唯一的参数表示返回的行数,即 “LIMIT n”与“LIMIT 0,n”等价。带两个参数的 LIMIT 可以返回从任何一个位置开始的指定的 行数。 返回第一行时,位置偏移量是 0。因此,“LIMIT 1, 1”将返回第二行,而不是第一行。

提 示 :MySQL 8.0 中可以使用“LIMIT 4 OFFSET 3”,意思是获取从第 5 条记录开始后面的 3 条记录,和“LIMIT 4,3;”返回的结果相同

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值