Android数据库,第二篇。(主要就是研究Sqlite数据库的高级属性)

前言

我们是接着上一篇写的Android数据库,第二篇。(主要就是研究Sqlite数据库)

继续开车::

12).SQLite 视图(View)(是只读的无法在试图上,执行DELETE、INSERT和UPDATE语句)
视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。
视图(View)可以包含一个表的所有行或从一个或多个表选定行。视图(View)可以从一个或多个表创建,这取决于要创建视图的 SQLite 查询。
视图(View)是一种虚表,允许用户实现以下几点:
1.用户或用户组查找结构数据的方式更自然或直观。
2.限制数据访问,用户只能看到有限的数据,而不是完整的表。
3.汇总各种表中的数据,用于生成报告。

SQLite 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。
基本指令:

创建视图
SQLite 的视图是使用 CREATE VIEW 语句创建的。SQLite 视图可以从一个单一的表、多个表或其他视图创建。
CREATE VIEW 的基本语法如下:

CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
您可以在 SELECT 语句中包含多个表,这与在正常的 SQL SELECT 查询中的方式非常相似。如果使用了可选的 TEMP 或 TEMPORARY 关键字,则将在临时数据库中创建视图。

创建视图::
假设 COMPANY 表有以下记录:

ID | NAME | AGE | ADDRESS | SALARY
-----|----- ---------- ---------- ---------- ----------
1 | Paul | 32 | California | 20000.0
2 | Allen | 25 | Texas | 15000.0
3 | Teddy | 23 | Norway | 20000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David | 27 | Texas | 85000.0
6 | Kim | 22 | South-Hall| 45000.0
7 | James | 24 | Houston | 10000.0
现在,下面是一个从 COMPANY 表创建视图的实例。视图只从 COMPANY 表中选取几列:

sqlite> CREATE VIEW COMPANY_VIEW AS
SELECT ID, NAME, AGE
FROM  COMPANY;
现在,可以查询 COMPANY_VIEW,与查询实际表的方式类似。下面是实例:
sqlite> SELECT * FROM COMPANY_VIEW;

这将产生以下结果:

ID | NAME | AGE
----|------ ---------- ----------
1 | Paul | 32
2 | Allen | 25
3 | Teddy | 23
4 | Mark | 25
5 | David | 27
6 | Kim | 22
7 | James | 24
分析:上面给人的感觉就好像是表的一个影子,只能查询,不能做其他的操作。

删除视图:
要删除视图,只需使用带有 view_name 的 DROP VIEW 语句。DROP VIEW 的基本语法如下:
sqlite> DROP VIEW view_name;
下面的命令将删除我们在前面创建的 COMPANY_VIEW 视图:
sqlite> DROP VIEW COMPANY_VIEW;

13).SQLite 事务(Transaction)
事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。
事务(Transaction)是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。
实际上,您可以把许多的 SQLite 查询联合成一组,把所有这些放在一起作为事务的一部分进行执行。
>>事务的属性
事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID:
>原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
>一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。
>隔离性(Isolation):使事务操作相互独立和透明。
>持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。

事务控制
使用下面的命令来控制事务:
BEGIN TRANSACTION:开始事务处理。
COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
ROLLBACK:回滚所做的更改。
事务控制命令只与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。

BEGIN TRANSACTION 命令
事务(Transaction)可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法:
BEGIN;或者是( BEGIN TRANSACTION;)这样就开启事务了。

>COMMIT 命令
COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。
COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库。
COMMIT 命令的语法如下:
COMMIT;(END TRANSACTION;)结束或者是提交命令。

>ROLLBACK 命令
ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。
ROLLBACK 命令只能用于撤销自上次发出 COMMIT 或 ROLLBACK 命令以来的事务。
ROLLBACK 命令的语法如下:
ROLLBACK;  只有这么一种表现形式。

实战:
假设 COMPANY 表有以下记录:

ID | NAME | AGE | ADDRESS | SALARY
-----|----- ---------- ---------- ---------- ----------
1 | Paul | 32 | California | 20000.0
2 | Allen | 25 | Texas | 15000.0
3 | Teddy | 23 | Norway | 20000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David | 27 | Texas | 85000.0
6 | Kim | 22 | South-Hall | 45000.0
7 | James | 24 | Houston | 10000.0
现在,让我们开始一个事务,并从表中删除 age = 25 的记录,最后,我们使用 ROLLBACK 命令撤消所有的更改。

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> ROLLBACK;

检查 COMPANY 表,仍然有以下记录:

ID | NAME | AGE | ADDRESS| SALARY
-----|----- ---------- ---------- ---------- ----------
1 | Paul | 32 | California| 20000.0
2 | Allen | 25 | Texas | 15000.0
3 | Teddy | 23 | Norway | 20000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David | 27 | Texas | 85000.0
6 | Kim | 22 | South-Hall | 45000.0
7 | James | 24 | Houston | 10000.0
现在,让我们开始另一个事务,从表中删除 age = 25 的记录,最后我们使用 COMMIT 命令提交所有的更改。

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> COMMIT;

检查 COMPANY 表,有以下记录:

ID | NAME | AGE | ADDRESS | SALARY
-----|----- ---------- ---------- ---------- ----------
1 | Paul | 32 | California| 20000.0
3 | Teddy | 23 | Norway | 20000.0
5 | David | 27 | Texas | 85000.0
6 | Kim | 22 | South-Hall| 45000.0
7 | James | 24 | Houston | 10000.0
注意:最后的生效还是commit好用。
14).SQLite 子查询
子查询或内部查询或嵌套查询是在另一个 SQLite 查询内嵌入在 WHERE 子句中的查询。
使用子查询返回的数据将被用在主查询中作为条件,以进一步限制要检索的数据。
子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。
必须遵循的几个规则:
>子查询必须用括号括起来。
>子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
>ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。
>子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
>BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用。

SELECT语句中的子查询使用:
子查询通常与 SELECT 语句一起使用。基本语法如下:
SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
  (SELECT column_name [, column_name ]
  FROM table1 [, table2 ]
  [WHERE])

实战:sqlite> SELECT * 
        FROM COMPANY 
        WHERE ID IN (SELECT ID 
                    FROM COMPANY 
                    WHERE SALARY > 45000) ;
 最后的结果就是打印出所有大于45000的数据。

INSERT 语句中的子查询使用:(这就是复制表格啊!!

子查询也可以与 INSERT 语句一起使用。INSERT 语句使用子查询返回的数据插入到另一个表中。在子查询中所选择的数据可以用任何字符、日期或数字函数修改。
基本语法如下:
INSERT INTO table_name [ (column1 [, column2 ]) ]
           SELECT [ *|column1 [, column2 ]
           FROM table1 [, table2 ]
           [ WHERE VALUE OPERATOR ]
实战:
假设 COMPANY_BKP 的结构与 COMPANY 表相似,且可使用相同的 CREATE TABLE 进行创建,只是表名改为 COMPANY_BKP。现在把整个 COMPANY 表复制到 COMPANY_BKP,语法如下:
sqlite> INSERT INTO COMPANY_BKP
     SELECT * FROM COMPANY 
     WHERE ID IN (SELECT ID 
                  FROM COMPANY) ;

UPDATE 语句中的子查询使用

子查询可以与 UPDATE 语句结合使用。当通过 UPDATE 语句使用子查询时,表中单个或多个列被更新。
基本语法如下:
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]
需要上面的表辅助,意思就是两个表格是一样的。哪个数值进行操作放到这个表里面。
实战:
我们有 COMPANY_BKP 表,是 COMPANY 表的备份。
下面的实例把 COMPANY 表中所有 AGE 大于或等于 27 的客户的 SALARY 更新为原来的 0.50 倍:
sqlite> UPDATE COMPANY
     SET SALARY = SALARY * 0.50
     WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
                   WHERE AGE >= 27 );

DELETE语句中的子查询使用:

基本语法如下:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]
实战:
假设,我们有 COMPANY_BKP 表,是 COMPANY 表的备份。
下面的实例删除 COMPANY 表中所有 AGE 大于或等于 27 的客户记录:
sqlite> DELETE FROM COMPANY
    WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
               WHERE AGE > 27 );

这将影响两行,最后 COMPANY 表中的记录如下:

ID | NAME | AGE | ADDRESS | SALARY
-----|----- ---------- ---------- ---------- ----------
2 | Allen | 25 | Texas | 15000.0
3 | Teddy | 23 | Norway | 20000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David | 27 | Texas | 42500.0
6 | Kim | 22 | South-Hall |45000.0
7 | James | 24 | Houston | 10000.0
15).SQLite Autoincrement(自动递增)
SQLite 的 AUTOINCREMENT 是一个关键字,用于表中的字段值自动递增。我们可以在创建表时在特定的列名称上使用 AUTOINCREMENT 关键字实现该字段值的自动增加。

关键字 AUTOINCREMENT 只能用于整型(INTEGER)字段。
基本语法:
就是在在建表的时候使用:
CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);
实战就是:向表格里面添加值,有一个字段是自己增长的,并且理论上这个值是不用插入的。

16).SQLite 注入(安卓数据目前没有用到过)
######作为了解内容吧!
注入通常在请求用户输入时发生,比如需要用户输入姓名,但用户却输入了一个 SQLite 语句,而这语句就会在不知不觉中在数据库上运行。
永远不要相信用户提供的数据,所以只处理通过验证的数据,这项规则是通过模式匹配来完成的。在下面的实例中,用户名 username 被限制为字母数字字符或者下划线,长度必须在 8 到 20 个字符之间 - 请根据需要修改这些规则。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){
$db = new SQLiteDatabase('filename');
$result = @$db->query("SELECT * FROM users WHERE username=$matches[0]");
}else{
echo "username not accepted";
}
为了演示这个问题,假设考虑此摘录:To demonstrate the problem, consider this excerpt:
$name = "Qadir'; DELETE FROM users;";
@$db->query("SELECT * FROM users WHERE username='{$name}'");
函数调用是为了从用户表中检索 name 列与用户指定的名称相匹配的记录。正常情况下,$name 只包含字母数字字符或者空格,比如字符串 ilia。但在这里,向 $name 追加了一个全新的查询,这个对数据库的调用将会造成灾难性的问题:注入的 DELETE 查询会删除 users 的所有记录。
虽然已经存在有不允许查询堆叠或在单个函数调用中执行多个查询的数据库接口,如果尝试堆叠查询,则会调用失败,但 SQLite 和 PostgreSQL 里仍进行堆叠查询,即执行在一个字符串中提供的所有查询,这会导致严重的安全问题。
防止 SQL 注入
在脚本语言中,比如 PERL 和 PHP,您可以巧妙地处理所有的转义字符。编程语言 PHP 提供了字符串函数 sqlite_escape_string() 来转义对于 SQLite 来说比较特殊的输入字符。
if (get_magic_quotes_gpc())
{
$name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username='{$name}'");
虽然编码使得插入数据变得安全,但是它会呈现简单的文本比较,在查询中,对于包含二进制数据的列,LIKE 子句是不可用的。
请注意,addslashes() 不应该被用在 SQLite 查询中引用字符串,它会在检索数据时导致奇怪的结果。
17).SQLite Explain(解释)
在 SQLite 语句之前,可以使用 "EXPLAIN" 关键字或 "EXPLAIN QUERY PLAN" 短语,用于描述表的细节。
如果省略了 EXPLAIN 关键字或短语,任何的修改都会引起 SQLite 语句的查询行为,并返回有关 SQLite 语句如何操作的信息。
> 来自 EXPLAIN 和 EXPLAIN QUERY PLAN 的输出只用于交互式分析和排除故障。
> 输出格式的细节可能会随着 SQLite 版本的不同而有所变化。
> 应用程序不应该使用 EXPLAIN 或 EXPLAIN QUERY PLAN,因为其确切的行为是可变的且只有部分会被记录。
基本语法:
EXPLAIN 的语法如下:
EXPLAIN [SQLite Query]

EXPLAIN QUERY PLAN 的语法如下:
EXPLAIN  QUERY PLAN [SQLite Query]

实战::
假设 COMPANY 表有以下记录:

ID | NAME | AGE | ADDRESS | SALARY
------|---- ---------- ---------- ---------- ----------
1 | Paul | 32 | California | 20000.0
2 | Allen | 25 | Texas | 15000.0
3 | Teddy | 23 | Norway | 20000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David | 27 | Texas | 85000.0
6 | Kim | 22 | South-Hall| 45000.0
7 | James | 24 | Houston | 10000.0

现在,让我们检查 SELECT 语句中的 Explain 使用:
sqlite> EXPLAIN SELECT *  FROM COMPANY  WHERE Salary &gt= 20000;

这将产生以下结果:

addr | opcode | p1 | p2 | p3
-------|--- ---------- ---------- ---------- ----------
0 | Goto | 0 | 19
1 | Integer | 0 | 0
2 | OpenRead | 0 | 8
3 | SetNumColu | 0 | 5
4 | Rewind | 0 | 17
5 | Column | 0 | 4
6 | RealAffini | 0 | 0
7 | Integer | 20000 | 0
8 | Lt |357 | 16 | collseq(BI
9 | Rowid | 0 | 0
10 | Column | 0 | 1
11 | Column | 0 | 2
12 | Column | 0 | 3
13 | Column | 0 | 4
14 | RealAffini | 0 | 0
15 | Callback | 5 | 0
16 | Next | 0 | 5
17 | Close | 0 | 0
18 | Halt | 0 | 0
19 | Transactio | 0 | 0
20 | VerifyCook | 0 | 38
21 | Goto | 0 | 1
22 | Noop | 0 | 0

现在,让我们检查 SELECT 语句中的 Explain Query Plan 使用:
SQLite> EXPLAIN QUERY PLAN SELECT * FROM COMPANY WHERE Salary &gt= 20000;

order| from | detail
-------|--- ---------- -------------
0 | 0 | TABLE COMPANY
18).SQLite Vacuum(真空)
VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。
如果表中没有明确的整型主键(INTEGER PRIMARY KEY),VACUUM 命令可能会改变表中条目的行 ID(ROWID)。VACUUM 命令只适用于主数据库,附加的数据库文件是不可能使用 VACUUM 命令。
如果有一个活动的事务,VACUUM 命令就会失败。VACUUM 命令是一个用于内存数据库的任何操作。由于 VACUUM 命令从头开始重新创建数据库文件,所以 VACUUM 也可以用于修改许多数据库特定的配置参数。

手动VACUUM

下面是在命令提示符中对整个数据库发出VACUUM命令的语法:
$sqlite3 database_name "VACUUM;"
您也可以在SQLite提示符中运行VACUUM,如下所示:
sqlite > VACUUM;
您也可以在特定的表上运行VACUUM,如下所示:
sqlite > VACUUM table_name;

自动VACUUM(Auto-VACUUM)

SQLite 的 Auto-VACUUM 与 VACUUM 不大一样,它只是把空闲页移到数据库末尾,从而减小数据库大小。通过这样做,它可以明显地把数据库碎片化,而 VACUUM 则是反碎片化。所以 Auto-VACUUM 只会让数据库更小。
在 SQLite 提示符中,您可以通过下面的编译运行,启用/禁用 SQLite 的 Auto-VACUUM:
sqlite> PRAGMA auto_vacuum = NONE;  -- 0 means disable auto vacuum
sqlite> PRAGMA auto_vacuum = INCREMENTAL;  -- 1 means enable incremental vacuum
sqlite> PRAGMA auto_vacuum = FULL;  -- 2 means enable full auto vacuum
您可以从命令提示符中运行下面的命令来检查 auto-vacuum 设置:
$sqlite3 database_name "PRAGMA auto_vacuum;"

19).SQLite 日期 & 时间
SQLite 支持以下五个日期和时间函数:

序号| 函数 | 实例
-----|
1 | date(timestring, modifier, modifier, ...) | 以 YYYY-MM-DD 格式返回日期。
2 | time(timestring, modifier, modifier, ...) | 以 HH:MM:SS 格式返回时间。
3 | datetime(timestring, modifier, modifier, ...) | 以 YYYY-MM-DD HH:MM:SS 格式返回。
4 | julianday(timestring, modifier, modifier, ...) | 这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数。
5 | strftime(format, timestring, modifier, modifier, ...)| 这将根据第一个参数指定的格式字符串返回格式化的日期。具体格式见下边讲解。

上述五个日期和时间函数把时间字符串作为参数。时间字符串后跟零个或多个 modifier 修饰符。strftime() 函数也可以把格式字符串 format 作为其第一个参数。下面将为您详细讲解不同类型的时间字符串和修饰符。

时间字符串:
一个时间字符串可以采用下面任何一种格式:

序号| 时间字符串 | 实例
----|
1| YYYY-MM-DD | 2010-12-30
2| YYYY-MM-DD HH:MM | 2010-12-30 12:10
3| YYYY-MM-DD HH:MM:SS.SSS| 2010-12-30 12:10:04.100
4| MM-DD-YYYY HH:MM |30-12-2010 12:10
5| HH:MM | 12:10
6| YYYY-MM-DDTHH:MM | 2010-12-30 12:10
7| HH:MM:SS |12:10:01
8| YYYYMMDD HHMMSS | 20101230 121001
9| now | 2013-05-07
您可以使用 "T" 作为分隔日期和时间的文字字符。

修饰符(Modifier)
时间字符串后边可跟着零个或多个的修饰符,这将改变有上述五个函数返回的日期和/或时间。任何上述五大功能返回时间。修饰符应从左到右使用,下面列出了可在 SQLite 中使用的修饰符:
NNN days
NNN hours
NNN minutes
NNN.NNNN seconds
NNN months
NNN years
start of month
start of year
start of day
weekday N
unixepoch
localtime
utc

格式化
SQLite 提供了非常方便的函数 strftime() 来格式化任何日期和时间。您可以使用以下的替换来格式化日期和时间:

替换 |描述
----|
%d |一月中的第几天,01-31
%f |带小数部分的秒,SS.SSS
%H |小时,00-23
%j |一年中的第几天,001-366
%J |儒略日数,DDDD.DDDD
%m |月,00-12
%M |分,00-59
%s |从 1970-01-01 算起的秒数
%S |秒,00-59
%w| 一周中的第几天,0-6 (0 is Sunday)
%W| 一年中的第几周,01-53
%Y |年,YYYY
%% | % symbol

实战::

现在让我们使用 SQLite 提示符尝试不同的实例。下面是计算当前日期:

sqlite> SELECT date('now');
2013-05-07

下面是计算当前月份的最后一天:

sqlite> SELECT date('now','start of month','+1 month','-1 day');
2013-05-31

下面是计算给定 UNIX 时间戳 1092941466 的日期和时间:

sqlite> SELECT datetime(1092941466, 'unixepoch');
2004-08-19 18:51:06

下面是计算给定 UNIX 时间戳 1092941466 相对本地时区的日期和时间:

sqlite> SELECT datetime(1092941466, 'unixepoch', 'localtime');
2004-08-19 11:51:06

下面是计算当前的 UNIX 时间戳:

sqlite> SELECT strftime('%s','now');
1367926057

下面是计算美国"独立宣言"签署以来的天数:
sqlite> SELECT julianday('now') - julianday('1776-07-04');
86504.4775830326

下面是计算从 2004 年某一特定时刻以来的秒数:

sqlite> SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');
295001572

下面是计算当年 10 月的第一个星期二的日期:

sqlite> SELECT date('now','start of year','+9 months','weekday 2');
2013-10-01

下面是计算从 UNIX 纪元算起的以秒为单位的时间(类似 strftime('%s','now') ,不同的是这里有包括小数部分):

sqlite> SELECT (julianday('now') - 2440587.5)*86400.0;
1367926077.12598

在 UTC 与本地时间值之间进行转换,当格式化日期时,使用 utc 或 localtime 修饰符,如下所示:

sqlite> SELECT time('12:00', 'localtime');
05:00:00
sqlite>  SELECT time('12:00', 'utc');
19:00:00

20).SQLite 常用函数

序号 |函数 & 描述
----|
1 | SQLite COUNT 函数
SQLite COUNT 聚集函数是用来计算一个数据库表中的行数。
2 | SQLite MAX 函数
SQLite MAX 聚合函数允许我们选择某列的最大值。
3 | SQLite MIN 函数
SQLite MIN 聚合函数允许我们选择某列的最小值。
4 | SQLite AVG 函数
SQLite AVG 聚合函数计算某列的平均值。
5 | SQLite SUM 函数
SQLite SUM 聚合函数允许为一个数值列计算总和。
6 | SQLite RANDOM 函数
SQLite RANDOM 函数返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。
7 | SQLite ABS 函数
SQLite ABS 函数返回数值参数的绝对值。
8 | SQLite UPPER 函数
SQLite UPPER 函数把字符串转换为大写字母。
9 | SQLite LOWER 函数
SQLite LOWER 函数把字符串转换为小写字母。
10 | SQLite LENGTH 函数
SQLite LENGTH 函数返回字符串的长度。
11 | SQLite sqlite_version 函数
SQLite sqlite_version 函数返回 SQLite 库的版本。

实战:
在我们开始讲解这些函数实例之前,先假设 COMPANY 表有以下记录:

ID | NAME | AGE | ADDRESS | SALARY
-----|----- ---------- ---------- ---------- ----------
1 | Paul | 32 | California | 20000.0
2 | Allen | 25 | Texas | 15000.0
3 | Teddy | 23 | Norway | 20000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David | 27 | Texas | 85000.0
6 | Kim | 22 | South-Hall |45000.0
7 | James | 24 | Houston | 10000.0

SQLite COUNT 函数

SQLite COUNT 聚集函数是用来计算一个数据库表中的行数。下面是实例:
sqlite> SELECT count(*) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:

count(*)
----------
7

SQLite MAX 函数

SQLite MAX 聚合函数允许我们选择某列的最大值。下面是实例:
sqlite> SELECT max(salary) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:

max(salary)
-----------
85000.0

SQLite MIN 函数

SQLite MIN 聚合函数允许我们选择某列的最小值。下面是实例:
sqlite> SELECT min(salary) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:
min(salary)
-----------
10000.0

SQLite AVG 函数

SQLite AVG 聚合函数计算某列的平均值。下面是实例:
sqlite> SELECT avg(salary) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:

avg(salary)
----------------
37142.8571428572

SQLite SUM 函数

SQLite SUM 聚合函数允许为一个数值列计算总和。下面是实例:
sqlite> SELECT sum(salary) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:

sum(salary)
-----------
260000.0

SQLite RANDOM 函数

SQLite RANDOM 函数返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。下面是实例:
sqlite> SELECT random() AS Random;
上面的 SQLite SQL 语句将产生以下结果:

Random
-------------------
5876796417670984050

SQLite ABS 函数

SQLite ABS 函数返回数值参数的绝对值。下面是实例:
sqlite> SELECT abs(5), abs(-15), abs(NULL), abs(0), abs("ABC");
上面的 SQLite SQL 语句将产生以下结果:
abs(5)      abs(-15)    abs(NULL)   abs(0)      abs("ABC")
----------  ----------  ----------  ----------  ----------
5           15                      0           0.0

SQLite UPPER 函数

SQLite UPPER 函数把字符串转换为大写字母。下面是实例:
sqlite> SELECT upper(name) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:
upper(name)
-----------
PAUL
ALLEN
TEDDY
MARK
DAVID
KIM
JAMES

SQLite LOWER 函数

SQLite LOWER 函数把字符串转换为小写字母。下面是实例:
sqlite> SELECT lower(name) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:

lower(name)
-----------
paul
allen
teddy
mark
david
kim
james

SQLite LENGTH 函数

SQLite LENGTH 函数返回字符串的长度。下面是实例:
sqlite> SELECT name, length(name) FROM COMPANY;
上面的 SQLite SQL 语句将产生以下结果:

NAME        length(name)
----------  ------------
Paul        4
Allen       5
Teddy       5
Mark        4
David       5
Kim         3
James       5

SQLite sqlite_version 函数

SQLite sqlite_version 函数返回 SQLite 库的版本。下面是实例:
sqlite> SELECT sqlite_version() AS 'SQLite Version';
上面的 SQLite SQL 语句将产生以下结果:
SQLite Version
--------------
3.6.20
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容