多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# SQLite 函数 > 原文: [http://zetcode.com/db/sqlite/sqlitefunctions/](http://zetcode.com/db/sqlite/sqlitefunctions/) 在 SQLite 教程的这一部分中,我们将介绍 SQLite 内置函数。 SQLite 数据库中有三种类型的函数:核心函数,聚合函数和日期&时间函数。 我们将介绍每组 SQLite 函数中的一些函数。 ## SQLite 核心函数 在这一组中,我们具有各种函数。 有些是数字函数,有些是文本处理。 其他人则做一些非常具体的事情。 ```sql sqlite> SELECT sqlite_version() AS 'SQLite Version'; SQLite Version -------------- 3.16.2 ``` `sqlite_version()`函数返回 SQLite 库的版本。 ```sql sqlite> SELECT random() AS Random; Random ------------------- 1056892254869386643 ``` `random()`函数返回 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。 ```sql sqlite> SELECT abs(11), abs(-5), abs(0), abs(NULL); abs(11) abs(-5) abs(0) abs(NULL) ------------------ ----------- ---------- ---------- 11 5 0 NULL ``` `abs()`函数返回数字参数的绝对值。 ```sql sqlite> SELECT max(Price), min(Price) FROM Cars; max(Price) min(Price) ---------- ---------- 350000 9000 ``` 在我们的示例中,`max()`和`min()`函数从`Cars`表中返回最昂贵和最便宜的汽车。 ```sql sqlite> .width 18 sqlite> SELECT upper(Name) AS 'Names in capitals' FROM Friends; Names in capitals ------------------ JANE THOMAS FRANK ELISABETH MARY LUCY JACK ``` `upper()`函数将字符转换为大写字母。 ```sql sqlite> SELECT lower(Name) AS 'Names in lowercase' FROM Friends ...> WHERE Id IN (1, 2, 3); Names in lowercase ------------------ jane thomas frank ``` 使用`lower()`函数,我们将前三行的名称更改为小写字母。 ```sql sqlite> SELECT length('ZetCode'); length('ZetCode') ------------------ 7 ``` `length()`函数返回字符串的长度。 ```sql sqlite> SELECT total_changes() AS 'Total changes'; Total changes ------------- 3 ``` 自打开当前数据库连接以来,`total_changes()`函数返回由`INSERT`,`UPDATE`或`DELETE`语句引起的行更改数。 在当前的数据库连接中,我们已经完成了三个`INSERT`语句,所以总更改等于三个。 ```sql sqlite> .width 5 sqlite> SELECT sqlite_compileoption_used('SQLITE_DEFAULT_FOREIGN_KEYS') AS 'FK'; FK ----- 0 ``` `sqlite_compileoption_used()`函数返回一个布尔值,具体取决于在构建过程中是否使用了该选项。 在我们的例子中,我们检查默认情况下是否强制执行`FOREIGN KEY`约束。 该函数返回 0,这意味着默认情况下不强制执行约束。 我们使用`PRAGMA`语句进行更改。 (`PRAGMA foreign_keys = 1;`) ```sql sqlite> SELECT typeof(12), typeof('ZetCode'), typeof(33.2), typeof(NULL), ...> typeof(x'345edb'); typeof(12) typeof('ZetCode') typeof(33.2) typeof(NULL) typeof(x'345edb') ------------ ------------------ ------------ ------------ ----------------- integer text real null blob ``` `typeof()`函数返回参数的数据类型。 ## SQLite 聚合函数 通过聚合函数,我们可以获得一些统计数据。 带有单个参数的聚合函数可以在`DISTINCT`关键字之后。 在这种情况下,重复元素将在传递到聚合函数之前被过滤。 我们总结一下`Cars`表中的内容。 ```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 ``` 请注意,没有重复的记录。 ```sql sqlite> SELECT count(*) AS '# of cars' FROM Cars; # of cars ---------- 8 ``` `count()`函数返回表中的行数-共有八辆汽车。 在`Orders`表中,我们确实有重复的客户记录。 ```sql 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 ``` 从逻辑上讲,每个客户可以下多个订单。 我们如何计算订单数量以及如何计算客户数量? ```sql sqlite> SELECT count(Customer) AS '# of orders' FROM Orders; # of orders ----------- 11 ``` 该 SQL 语句返回订单数。 要计算唯一客户的数量,我们必须利用`DISTINCT`子句。 ```sql sqlite> SELECT count(DISTINCT Customer) AS '# of customers' FROM Orders; # of customers -------------- 5 ``` `Orders`表中有 5 个客户。 他们下了 11 个订单。 接下来,我们将演示`count(*)`和`count(ColumnName)`函数之间的区别。 区别在于它们处理`NULL`值的方式。 ```sql sqlite> .nullvalue NULL ``` 首先,我们更改`sqlite3`显示`NULL`值的方式。 默认情况下,`NULL`值显示为空字符串。 ```sql sqlite> CREATE TABLE TESTING(Id INTEGER); sqlite> INSERT INTO Testing VALUES (1), (2), (3), (NULL), (NULL); ``` 在这里,我们创建具有 3 个数字值和 2 个`NULL`值的表`Testing`。 ```sql sqlite> SELECT last_insert_rowid(); 5 ``` `last_insert_rowid()`函数返回最后插入的行的 ID。 ```sql sqlite> SELECT count(*) AS '# of rows' FROM Testing; # of rows ---------- 5 ``` `count(*)`返回表中的行数。 它考虑了`NULL`值。 ```sql sqlite> SELECT count(Id) AS '# of non NULL values' FROM Testing; # of non NULL values -------------------- 3 ``` `count(Id)`仅计算非`NULL`值。 ```sql sqlite> SELECT avg(Price) AS 'Average price' FROM Cars; Average price ------------- 72721.125 ``` `avg()`函数返回所有非`NULL`记录的平均值。 在我们的示例中,我们在`Cars`表中显示了汽车的平均价格。 最后,我们提到`sum()`函数。 它将所有非`NULL`值相加。 ```sql sqlite> SELECT sum(OrderPrice) AS Sum FROM Orders; Sum -------- 4930 ``` 在这里,我们计算客户下的订单数量。 ## SQLite 日期和时间函数 SQLite 具有处理日期和时间的函数。 这些函数采用各种时间字符串,修饰符和格式。 ```sql sqlite> .header OFF sqlite> SELECT date('now'); 2014-11-17 ``` 带有`now`字符串的`date()`函数返回当前日期。 ```sql sqlite> SELECT datetime('now'); 2018-07-20 09:57:38 ``` `datetime()`函数返回当前日期和时间。 ```sql sqlite> SELECT time('now'); 09:57:56 ``` `time()`函数给出当前时间。 ```sql sqlite> SELECT time(), time('now'); 09:58:30 09:58:30 sqlite> SELECT date(), date('now'); 2018-07-20 2018-07-20 ``` `now`字符串可以省略。 `date()`,`time()`和`datetime()`函数的第一个参数是时间字符串。 可以紧跟一个或多个修饰符。 ```sql sqlite> SELECT date('now', '2 months'); 2018-09-20 ``` 在此示例中,`'2 months'`是修饰语。 它会将当前日期增加两个月。 因此该函数返回从今天起两个月的日期。 ```sql sqlite> SELECT date('now', '-55 days'); 2018-05-26 ``` 也可以使用负修饰符。 在此示例中,我们从今天开始提取 55 天。 ```sql sqlite> SELECT date('now', 'start of year'); 2018-01-01 ``` 使用`start of year`修饰符,我们可以得到年初的日期,例如 1 月 1 日。 ```sql sqlite> SELECT datetime('now', 'start of day'); 2018-07-20 00:00:00 ``` 借助`start of day`修饰符,我们可以了解当天的开始时间。 ```sql sqlite> SELECT date('now', 'weekday 6'); 2018-07-21 ``` `weekday`修饰符前进到下一个日期,其中星期日是 0,星期一 1,...,星期六 6。在本示例中,我们获得最近的星期六的日期。 修饰符可以组合。 ```sql sqlite> SELECT date('now', 'start of year', '10 months', 'weekday 4'); 2018-11-01 ``` 该 SQL 语句返回当年 11 月的第一个星期四。 在此示例中,我们使用了三个修饰符:`start of year`,`+x months`和`weekday x`。 `now`时间字符串给出当前日期。 `start of year`将日期向后移动到年初。 `10 months`在当月(1 月)增加了 10 个月。 最后,`weekday 4`修饰符将日期提前到第一个星期四。 `strftime()`函数返回根据指定为第一个参数的格式字符串格式化的日期和时间。 第二个参数是时间字符串。 可以紧跟一个或多个修饰符。 ```sql sqlite> SELECT strftime('%d-%m-%Y'); 20-07-2018 ``` 我们可以使用`strftime()`函数以其他格式返回日期。 ```sql sqlite> SELECT 'Current day: ' || strftime('%d'); Current day: 20 ``` 该 SQL 语句返回每月的当前日期。 我们使用了`strftime()`函数。 ```sql sqlite> SELECT 'Days to XMas: ' || (strftime('%j', '2018-12-24') - strftime('%j', 'now')); Days to XMas: 157 ``` 在这里,我们计算了到圣诞节为止的天数。 `%j`修饰符给出时间字符串的年份。 在 SQLite 教程的这一部分中,我们使用了内置的 SQLite 函数。