基本查询

了解查询的基本语法

简单语法

下面的语法经过大量精简,但已能满足基本使用。完整版本请查阅官方文档

SELECT <字段名> [, ...]
[FROM <表名> [, ...]]
[WHERE 条件表达式]
[GROUP BY <字段名> [, ...]]
[HAVING 条件表达式]
[ORDER BY <字段名> [DESC | ASC] [, ...]]
[LIMIT <最多行数> | <开始行数, 最多行数>]

入门

查看中的数据。

-- 查询所有字段
SELECT * FROM address;

-- 查询指定字段
SELECT district FROM address;

查询字段

很容易看出,查询结果是若干个数据记录(数据行)的集合,因此它也可以当作是一张临时的来看待。也就是说,查询结果也应该要有字段(表头)。

在这里,查询结果中的字段统一成为“查询字段”。

默认情况下,查询字段名等同于它的表达式。比如 SELECT distinct FROM address 的查询字段名是“distinct”, SELECT 1+2 的查询字段名是“1+2”。

别名

当为查询字段指定了别名之后,别名就是它新的查询字段名。

因为起了别名,所以下面两条语句的查询字段名都是“详细地址”。

-- 给查询字段起别名
SELECT address AS 详细地址 FROM address;

-- 给查询字段起别名(“AS”可忽略)
SELECT address 详细地址 FROM address;

计算字段

你可能已经发现,查询字段其实上是一个表达式,表达式就意味着可计算。

示例如下:

-- “1+2”作为计算字段,可忽略 FROM 子句
SELECT 1+2;

-- “amount*6.8”作为计算字段,它的别名是“人民币”
SELECT payment_id, amount*6.8 人民币 FROM payment;

如果全部查询字段都不依赖于任何,那么可以忽略 FROM 子句。

补充语法

下面是基于本节的 SELECT 补充语法:

SELECT <查询表达式> [[AS] 别名] [, ...]
...

查询子句

来源 - FROM

使用 FROM 子句可以指定查询的数据源,数据源可以是视图查询结果以及它们的融合(通过连接集合运算)。

-- 使用其它查询结果作为数据源(代码无意义,仅用于演示)
SELECT 详细地址 FROM (
  SELECT distict AS 详细地址 FROM address
);

数据源也可以指定别名,示例如下:

-- 为 address 表指定别名为“addr”
SELECT distinct FROM address addr;
SELECT distinct FROM address AS addr;

过滤 - WHERE

使用 WHERE 子句可以对数据源进行初次过滤,只有符合过滤条件的数据记录才能被进一步处理。

示例如下:

-- 查询所有在1998年1月1日之后出生的女学生ID
SELECT id FROM student
WHERE sex='女' and birthdate>'1998-1-1';

分组 - GROUP BY

使用 GROUP BY 子句可以指定若干个查询字段,从而将数据源按这些查询字段依次进行分类。

示例:

-- 查询各个性别的学生数
SELECT sex, COUNT(*) FROM student
GROUP BY sex;

-- 查询各个班级的各个性别的学生数
SELECT class, sex, COUNT(*) FROM student
GROUP BY class, sex;

如果使用了分组,那么所有的查询字段都必须(直接或间接的)在 GROUP BY 子句中声明。因为对于分组而言,与分组无关的查询字段都是无意义的。

在 MySQL 中,如果查询字段未在 GROUP BY 子句中声明,那么系统并不会报错,但得到的查询结果将是无意义的。

分组过滤 - HAVING

使用 HAVING 子句可以对各个分组进行过滤,只有符合过滤条件的分组才能被进一步处理。

示例用法:

-- 查询男同学的学生数
SELECT sex, COUNT(*) FROM student
GROUP BY sex
HAVING sex='男';

HAVING 子句依赖于 GROUP BY 子句,并且 HAVING 中使用的查询字段必须是在 GROUP BY 子句中已声明的。因为对于分组过滤而言,与分组无关的查询字段都是无意义的。

排序 - ORDER BY

使用 ORDER BY 子句可以对查询结果进行排序。字段名和排序方向(默认是 DESC )共同组成一个排序规则。当有多个排序规则存在时,先按第一个规则排序,如果第一个字段值相等,则按第二个规则排序,如此类推。

-- 升序排序
SELECT * FROM customer
WHERE first_name LIKE 'F%'
ORDER BY store_id ASC;

-- 降序排序
SELECT * FROM customer
WHERE first_name LIKE 'F%'
ORDER BY store_id DESC;

-- 多字段逐级排序
SELECT * FROM customer
WHERE first_name LIKE 'F%'
ORDER BY store_id, customer_id DESC;

指定结果范围 - LIMIT

在查询结果中,每条记录表示为一行数据。

使用 LIMIT 子句可以指定你要的查询结果片段,参数为“起始行数”和“片段长度”。

-- 输出前5条记录
SELECT * FROM address LIMIT 5;

-- 输出在第5条之后的10条记录
SELECT * FROM address LIMIT 5, 10;

查询参数

去除重复记录 - DISTINCT

使用 DISTINCT 关键字可以把多条完全一模一样的记录归并为一条。

-- 消除重复记录
SELECT DISTINCT district FROM address;

最后更新于

这有帮助吗?