§ 单表查询


本节介绍如何使用 SELECT 命令来对GreatSQL数据库中的数据进行查询。

本章将使用 文档约定 中提到的样例数据库

  • employee data (large dataset, includes data and test/verification suite)
  • world database
  • sakila database

§ 基本的SELECT语句

最基本的SELECT语句如下:

greatsql> SELECT 1; 
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

-- 可以做数学运算
greatsql> SELECT 9/2;
+--------+
| 9/2    |
+--------+
| 4.5000 |
+--------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

§ SELECT … FROM语句

语法如下:

SELECT   标识选择哪些列
FROM     标识从哪个表中选择
1
2
  • 选择全部列:

例如查询 world 库中 city 表的所有数据

greatsql> SELECT * FROM world.city;
+------+------------------------------------+-------------+------------------------+------------+
| ID   | Name                               | CountryCode | District               | Population |
+------+------------------------------------+-------------+------------------------+------------+
|    1 | Kabul                              | AFG         | Kabol                  |    1780000 |
|    2 | Qandahar                           | AFG         | Qandahar               |     237500 |
|    3 | Herat                              | AFG         | Herat                  |     186800 |
|    4 | Mazar-e-Sharif                     | AFG         | Balkh                  |     127800 |
|    5 | Amsterdam                          | NLD         | Noord-Holland          |     731200 |
......下面结果省略
4079 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11

一般情况下,除非需要使用表中所有的字段数据,避免滥用通配符*。除非必要获取所有字段数据,否则使用通配符不仅会导致不必要的列数据检索,还可能拖慢查询速度和应用程序性能。

  • 选择指定的列

例如查询 world 库中 city 表的 IDName

greatsql> SELECT ID, Name FROM world.city;
+------+------------------------------------+
| ID   | Name                               |
+------+------------------------------------+
|    1 | Kabul                              |
|    2 | Qandahar                           |
|    3 | Herat                              |
......下面结果省略
4079 rows in set (0.01 sec)
1
2
3
4
5
6
7
8
9

在GreatSQL中,列名和表名都可以使用反引号 "`" 包裹,避免与关键字冲突。

§ 条件查询

语法如下:

SELECT col1, col2, ...
FROM table_name
WHERE condition;
1
2
3

使用 WHERE 子句,将不满足条件的行过滤掉。

例如查询 world 库中 city 表的数据,满足 Name = "Kabul" 的行

greatsql> SELECT * FROM world.city WHERE Name = "Kabul";
+----+-------+-------------+----------+------------+
| ID | Name  | CountryCode | District | Population |
+----+-------+-------------+----------+------------+
|  1 | Kabul | AFG         | Kabol    |    1780000 |
+----+-------+-------------+----------+------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7

§ 去重查询

SELECT 语句中使用关键字 DISTINCT 去除重复行。

例如查询 world 库中 city 表的 CountryCode 列有

greatsql> SELECT CountryCode FROM city;
+-------------+
| CountryCode |
+-------------+
| ABW         |
| AFG         |
| AFG         |
......下面结果省略
4079 rows in set (0.01 sec)
1
2
3
4
5
6
7
8
9

查询出来了有4079行,但是 CountryCode 列有重复数据

使用 DISTINCT 去除重复行

greatsql> SELECT DISTINCT CountryCode FROM city;
+-------------+
| CountryCode |
+-------------+
| ABW         |
| AFG         |
| AGO         |
......下面结果省略
232 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9

去重后查询出来只有232行

§ 别名查询

可以使用关键字AS给查询结果设置别名

例如查询 world 库中 city 表的 CountryCode 列数据,设置别名 c

greatsql> SELECT CountryCode AS c FROM city;
+-----+
| c   |
+-----+
| ABW |
| AFG |
| AFG |
......下面结果省略
4079 rows in set (0.01 sec)
1
2
3
4
5
6
7
8
9

§ 排序查询

SELECT 语句中使用关键字 ORDER BY 对查询结果进行排序

  • ASC(ascend): 升序,默认升序
  • DESC(descend):降序

例如查询 world 库中 city 表的数据,按照 Population 列升序排列

greatsql> SELECT * FROM city ORDER BY `Population`;
+------+---------------------+-------------+-------------+------------+
| ID   | Name                | CountryCode | District    | Population |
+------+---------------------+-------------+-------------+------------+
| 2912 | Adamstown           | PCN         ||         42 |
| 2317 | West Island         | CCK         | West Island |        167 |
| 3333 | Fakaofo             | TKL         | Fakaofo     |        300 |
| 3538 | Città del Vaticano  | VAT         ||        455 |
| 2316 | Bantam              | CCK         | Home Island |        503 |
......下面结果省略
1
2
3
4
5
6
7
8
9
10

例如查询 world 库中 city 表的数据,按照 Population 列降序排列。

greatsql> SELECT * FROM city ORDER BY `Population` DESC;
+------+-------------------+-------------+------------------+------------+
| ID   | Name              | CountryCode | District         | Population |
+------+-------------------+-------------+------------------+------------+
| 1024 | Mumbai (Bombay)   | IND         | Maharashtra      |   10500000 |
| 2331 | Seoul             | KOR         | Seoul            |    9981619 |
|  206 | São Paulo         | BRA         | São Paulo        |    9968485 |
| 1890 | Shanghai          | CHN         | Shanghai         |    9696300 |
|  939 | Jakarta           | IDN         | Jakarta Raya     |    9604900 |
......下面结果省略
1
2
3
4
5
6
7
8
9
10

同时也可以分别对两列一个进行升序一个进行降序排序 例如查询 world 库中 city 表的数据,按照 CountryCode 列升序排列,再按照 `Population 列降序排列

greatsql> SELECT * FROM city ORDER BY `CountryCode` ASC,`Population` DESC;
+-----+----------------+-------------+----------+------------+
| ID  | Name           | CountryCode | District | Population |
+-----+----------------+-------------+----------+------------+
| 129 | Oranjestad     | ABW         ||      29034 |
|   1 | Kabul          | AFG         | Kabol    |    1780000 |
|   2 | Qandahar       | AFG         | Qandahar |     237500 |
|   3 | Herat          | AFG         | Herat    |     186800 |
|   4 | Mazar-e-Sharif | AFG         | Balkh    |     127800 |
......下面结果省略
1
2
3
4
5
6
7
8
9
10

§ 分页查询

所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。

LIMIT格式:

SELECT * FROM 表名 LIMIT [offset,] rows;
1
  • offset: 起始行号,从0开始
  • rows: 显示的行数

例如查询 world 库中 city 表的数据,从第1行开始显示5条数据

greatsql> SELECT * FROM city LIMIT 1,5;
+----+----------------+-------------+---------------+------------+
| ID | Name           | CountryCode | District      | Population |
+----+----------------+-------------+---------------+------------+
|  2 | Qandahar       | AFG         | Qandahar      |     237500 |
|  3 | Herat          | AFG         | Herat         |     186800 |
|  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800 |
|  5 | Amsterdam      | NLD         | Noord-Holland |     731200 |
|  6 | Rotterdam      | NLD         | Zuid-Holland  |     593321 |
+----+----------------+-------------+---------------+------------+
5 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11

例如查询 world 库中 city 表的数据,从第10行开始显示5条数据

greatsql> SELECT * FROM city LIMIT 10,5;
+----+-----------+-------------+---------------+------------+
| ID | Name      | CountryCode | District      | Population |
+----+-----------+-------------+---------------+------------+
| 11 | Groningen | NLD         | Groningen     |     172701 |
| 12 | Breda     | NLD         | Noord-Brabant |     160398 |
| 13 | Apeldoorn | NLD         | Gelderland    |     153491 |
| 14 | Nijmegen  | NLD         | Gelderland    |     152463 |
| 15 | Enschede  | NLD         | Overijssel    |     149544 |
+----+-----------+-------------+---------------+------------+
5 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11

§ 聚合函数查询

聚合函数:对表中的数据进行统计,计算等操作 常见的聚合函数:

  • COUNT:统计行数
  • SUM:求和
  • AVG:平均值
  • MAX:最大值
  • MIN:最小值

例如查询 world 库中 city 表的数据,统计行数

greatsql> SELECT COUNT(*) FROM city;
+----------+
| COUNT(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7

例如查询 world 库中 city 表的数据,求和

greatsql> SELECT SUM(`Population`) FROM city;
+-------------------+
| SUM(`Population`) |
+-------------------+
|        1429559884 |
+-------------------+
1 row in set (0.02 sec)
1
2
3
4
5
6
7

greatsql-wx