ZetCode

SQLite SELECT 语句

最后修改于 2020 年 7 月 6 日

SQLite 教程的这一部分详细介绍了 SQLite 对 SELECT 语句的实现。

SQLite 检索所有数据

以下 SQL 语句是最常见的语句之一。它也是最昂贵的语句之一。

sqlite> SELECT * FROM Cars;
Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000     
7           Hummer      41400     
8           Volkswagen  21600 

在这里,我们从 Cars 表中检索所有数据。

SQLite 选择特定列

我们可以使用 SELECT 语句来检索特定的列。列名紧跟在 SELECT 之后。

sqlite> SELECT Name, Price FROM Cars;
Name        Price     
----------  ----------
Audi        52642     
Mercedes    57127     
Skoda       9000      
Volvo       29000     
Bentley     350000    
Citroen     21000     
Hummer      41400     
Volkswagen  21600    

我们检索 NamePrice 列。列名之间用逗号分隔。

SQLite 重命名列名

我们可以重命名返回结果集的列名。为此,我们使用 AS 子句。

sqlite> SELECT Name, Price AS 'Price of car' FROM Cars;
Name        Price of car
----------  ------------
Audi        52642       
Mercedes    57127       
Skoda       9000        
Volvo       29000       
Bentley     350000      
Citroen     21000       
Hummer      41400       
Volkswagen  21600  

使用上面的 SQL 语句,我们将 Price 列重命名为 Price of car

SQLite 限制数据输出

如上所述,处理大量数据时,检索所有数据是昂贵的。我们可以使用 LIMIT 子句来限制语句返回的数据量。

sqlite> SELECT * FROM Cars LIMIT 4;
Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000    

LIMIT 子句将返回的行数限制为 4。

sqlite> SELECT * FROM Cars LIMIT 2, 4;
Id          Name        Price     
----------  ----------  ----------
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000  

此语句选择四行,跳过前两行。

OFFSET 子句跟随 LIMIT,指定在结果集开头跳过多少行。这是前一个的替代解决方案。

sqlite> SELECT * FROM Cars LIMIT 4 OFFSET 2;
Id          Name        Price     
----------  ----------  ----------
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000  

在这里,我们选择最多四行的数据,并从第三行开始。OFFSET 子句跳过前两行。

SQLite 排序数据

我们使用 ORDER BY 子句对返回的数据集进行排序。ORDER BY 子句后面是我们要排序的列。ASC 关键字按升序对数据进行排序,DESC 关键字按降序排序。

sqlite> SELECT * FROM Cars ORDER BY Price;
Id          Name        Price     
----------  ----------  ----------
3           Skoda       9000      
6           Citroen     21000     
8           Volkswagen  21600     
4           Volvo       29000     
7           Hummer      41400     
1           Audi        52642     
2           Mercedes    57127     
5           Bentley     350000  

默认排序为升序。ASC 子句可以省略。

sqlite> SELECT Name, Price FROM Cars ORDER BY Price DESC;
Name        Price     
----------  ----------
Bentley     350000    
Mercedes    57127     
Audi        52642     
Hummer      41400     
Volvo       29000     
Volkswagen  21600     
Citroen     21000     
Skoda       9000  

在上面的 SQL 语句中,我们从 Cars 表中选择 NamePrice 列,并按汽车的 Price 降序排序。因此,最贵的汽车排在前面。

SQLite 按更多列排序数据

可以按多个列对数据进行排序。

sqlite> INSERT INTO Cars(Name, Price) VALUES('Fiat', 9000);
sqlite> INSERT INTO Cars(Name, Price) VALUES('Tatra', 9000);

对于此示例,我们添加了两辆价格为 9000 的额外汽车。

sqlite> SELECT * FROM Cars ORDER BY Price, Name DESC;
Id          Name        Price     
----------  ----------  ----------
10          Tatra       9000      
3           Skoda       9000      
9           Fiat        9000      
6           Citroen     21000     
8           Volkswagen  21600     
4           Volvo       29000     
7           Hummer      41400     
1           Audi        52642     
2           Mercedes    57127     
5           Bentley     350000  

在该语句中,我们按两列排序数据:价格和名称。名称按降序排序。

SQLite 使用 WHERE 选择特定行

下一组示例使用 Orders 表。

sqlite> SELECT * FROM Orders;
Id          OrderPrice  Customer  
----------  ----------  ----------
1           1200        Williamson
2           200         Robertson 
3           40          Robertson 
4           1640        Smith     
5           100         Robertson 
6           50          Williamson
7           150         Smith     
8           250         Smith     
9           840         Brown     
10          440         Black     
11          20          Brown  

在这里,我们看到来自 Orders 表的所有数据。

接下来,我们要选择一个特定的行。

sqlite> SELECT * FROM Orders WHERE Id=6;
Id          OrderPrice  Customer  
----------  ----------  ----------
6           50          Williamson

上面的 SQL 语句选择 ID 为 6 的行。

sqlite> SELECT * FROM Orders WHERE Customer="Smith";
Id          OrderPrice  Customer  
----------  ----------  ----------
4           1640        Smith     
7           150         Smith     
8           250         Smith     

上面的 SQL 语句选择来自 Smith 客户的所有订单。

我们可以使用 LIKE 子句在数据中查找特定的模式。

sqlite> SELECT * FROM Orders WHERE Customer LIKE 'B%';
Id          OrderPrice  Customer  
----------  ----------  ----------
9           840         Brown     
10          440         Black     
11          20          Brown 

此 SQL 语句选择所有名称以字母 B 开头的客户的订单。

SQLite 删除重复项

DISTINCT 子句用于仅从结果集中选择唯一的项目。

sqlite> SELECT Customer FROM Orders WHERE Customer LIKE 'B%';
Customer  
----------
Brown     
Black     
Brown  

这次我们选择了名称以 B 开头的客户。我们可以看到 Brown 出现了两次。要删除重复项,我们使用 DISTINCT 关键字。

sqlite> SELECT DISTINCT Customer FROM Orders WHERE Customer LIKE 'B%';
Customer  
----------
Black     
Brown   

这是正确的解决方案。

SQLite 分组数据

GROUP BY 子句用于将具有相同值的数据库记录合并为单个记录。它通常与聚合函数一起使用。

假设我们想找出每个客户的订单总额。

sqlite> SELECT sum(OrderPrice) AS Total, Customer FROM Orders GROUP BY Customer;
Total       Customer  
----------  ----------
440         Black     
860         Brown     
340         Robertson 
2040        Smith     
1250        Williamson

sum 函数返回数值列的总和。GROUP BY 子句将总和分配给客户。因此,我们可以看到 Black 订购了价值 440 的商品,或者 Smith 订购了价值 2040 的商品。

使用聚合函数时,我们不能使用 WHERE 子句。我们使用 HAVING 子句代替。

sqlite> SELECT sum(OrderPrice) AS Total, Customer FROM Orders 
        GROUP BY Customer HAVING sum(OrderPrice)>1000;
Total       Customer  
----------  ----------
2040        Smith     
1250        Williamson

上面的 SQL 语句选择总订单超过 1000 单位的客户。

在本部分 SQLite 教程中,我们更详细地描述了 SQL SELECT 语句。