概述
查询(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 条件为 FALSE 或 NULL 时总会返回空集。
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 子句可用于聚合函数。