跳到主要内容

概述

查询(SQL)是指数据库中用来获取数据的方式,它可搭配条件限制的子句(如 WHERE),排列顺序的子句(如 ORDER BY)等语句来获取查询结果。本节主要介绍查询的基本运算与查询的组成。

查询的基本运算

查询的本质是关系的运算,在数据库中,关系以表的形式存储,其中每一行是集合中的一个元组(Tuple),每一列是集合的一个属性(Attribute)。

关系的基本运算包括:

  • 选择(Selection):从关系中选择满足指定条件的若干元组。在数据库中,选择是选择表中某几行的操作。

    SELECT * FROM t WHERE c1 <10;
  • 投影(Projection):从关系中选择满足指定条件的若干属性。在数据库中,投影是选择表中某几列的操作。

    SELECT c1,c2 FROM t;
  • 联接(Join):从两个关系的笛卡尔积(Cartesian Product)中选择选取属性间满足一定条件的元组。在数据库中,联接是选择两个表的笛卡尔积中满足指定条件的操作。

    SELECT t1.c2,t2.c4 FROM t1 JOIN t2 WHERE t1.c1 = t2.c3;

查询的组成

查询的基本语法如下,其中 att_name 为属性名,rel_name 为关系名。

SELECT att_name FROM rel_name;

单个元组组成的关系称为单元组关系,单个元素组成的元组称为单元素元组,也就是说,单个元素也可以作为关系,因此最基本的查询也可以是单个元素,以下示例中的查询是合法的。

SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.001 sec)

查询结果中,上面的 1 是元素的属性名,下面的 1 是元素的值。

seekdb 支持 FROM DUAL 语法,DUAL 是一个虚拟表,用来构成 SELECT 的语法规则。

SELECT 1 FROM DUAL;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.001 sec)

FROM 子句

FROM 子句用于指定查询的关系名。由于查询的结果也是关系,因此您可以将查询的结果作为 FROM 子句引用的关系。

SELECT * FROM (SELECT 1 FROM DUAL);
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.001 sec)

WHERE 子句

WHERE 子句用于指定查询元组的条件,WHERE 语句会逐个比较元组的某项属性是否满足条件,并返回比较结果为 TRUE 的元组。例如以下查询中,WHERE 条件为 FALSENULL 时总会返回空集。

SELECT * FROM (SELECT 1 FROM DUAL) WHERE TRUE;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.001 sec)

SELECT * FROM (SELECT 1 FROM DUAL) WHERE FALSE;
Empty set

SELECT * FROM (SELECT 1 FROM DUAL) WHERE NULL;
Empty set

ORDER BY 子句

ORDER BY 子句用于对查询结果进行排序,您可以指定若干用于排序的列 c1,c2,...,使查询结果依次按排序列进行排序。

CREATE TABLE t (c1 INTEGER,c2 INTEGER);
SELECT * FROM t ORDER BY c1,c2;

seekdb 支持以数字 1,2,... 分别指代关系 t 的第一列、第二列,以此类推。因此,您也可以将以上查询改写为:

SELECT * FROM t ORDER BY 1,2;

GROUP BY 子句

GROUP BY 子句用于对查询结果进行分组,您可以指定若干用于分组的列 c1,c2,...,使查询结果依次按分组列进行分组。

CREATE TABLE t (c1 INTEGER,c2 INTEGER);
SELECT * FROM t GROUP BY c1,c2;

seekdb 支持以数字 1,2,... 分别指代关系 t 的第一列、第二列,以此类推。因此,您也可以将以上查询改写为:

SELECT * FROM t GROUP BY 1,2;

LIMIT 子句

LIMIT 子句用于限制查询结果的行数。LIMIT 有两种语法:

  • LIMIT N:只返回查询结果的前 N 行。

  • LIMIT N,M:返回查询结果中第 N+1 行起的 M 行。

HAVING 子句

HAVING 子句与 WHERE 子句相同,但 HAVING 子句可用于聚合函数。