SQLite的SQL语法详解(7)

用于查询数据库的schema的Pragma

PRAGMA database_list;

对每个打开的数据库,使用该数据库的信息调用一次回叫函数。使用包括附加的数据库名和索引名在内的参数。第一行用于主数据库,第二行用于存放临时表的临时数据库。

PRAGMA foreign_key_list(table-name);

对于参数表中每个涉及到字段的外键,使用该外键的信息调用一次回叫函数。每个外键中的每个字段都将调用一次回叫函数。

PRAGMA index_info(index-name);

对该索引涉及到的每个字段,使用字段信息(字段名、字段号)调用一次回叫函数。

PRAGMA index_list(table-name);

对表中的每个索引,使用索引信息调用回叫函数。参数包括索引名和一个指示索引是否唯一的标志。

PRAGMA table_info(table-name);

对于表中的每个字段,使用字段信息(字段名、数据类型、可否为空、缺省值)调用回叫函数。

用于查询/更改版本信息的Pragma

PRAGMA [database.]schema_version;
PRAGMA [database.]schema_version =
integer ;
PRAGMA [database.]user_version;
PRAGMA [database.]user_version =
integer ;

这两条pragma分别用于设置schema-version和user-version的值。schema-version和user-version均为32位有符号整数,存放于数据库头中。

schema-version通常只由SQLite内部操作。每当数据库的Schema改变时(创建或撤消表或索引),SQLite将这个值增大。Schema版本在每一次Query被执行时被SQLite所使用,以确定编译SQL Query时内部Cache的Schema与编译后的Query实际执行时数据库的Schema相匹配。使用“PRAGMA schema_version”更改schema-version会破坏这一机制,有导致程序崩溃或数据库损坏的潜在危险。请小心使用!

user-version不在SQLite内部使用,任何程序可以用它来做任何事。

用于库Debug的Pragma

PRAGMA integrity_check;

该命令对整个数据库进行完整性检查,查找次序颠倒的记录,丢失的页,残缺的记录以及损坏的索引。若发现任何问题则返回一形容问题所在的字符串,若一切正常返回“ok”。

PRAGMA parser_trace = ON; (1)
PRAGMA parser_trace = OFF;
(0)

打开或关闭SQLite库中的SQL语法分析追踪,用于Debug。只有当SQLite不使用NDEBUG宏进行编译时该pragma才可用。

PRAGMA vdbe_trace = ON; (1)
PRAGMA vdbe_trace = OFF;
(0)

打开或关闭SQLite库中的虚拟数据库引擎追踪,用于Debug。更多信息,查看 VDBE文档

PRAGMA vdbe_listing = ON; (1)
PRAGMA vdbe_listing = OFF;
(0)

打开或关闭虚拟机程序列表,当开启列表功能,整个程序的内容在执行前被打印出来,就像在每条语句之前自动执行EXPLAIN。语句在打印列表之后正常执行。用于Debug。更多信息,查看VDBE文档

REINDEX sql-statement ::=   REINDEX collation name  
sql-statement ::=   REINDEX [database-name .]table/index-name  

REINDEX命令用于删除并从草稿重建索引。当比较顺序改变时该命令显得很有效。

在第一种形式中,所有附加数据库中使用该比较顺序的索引均被重建。在第二种形式中,[database-name.]table/index-name标识出一个表,所有关联该表的索引被重建。若标识出索引,则仅仅该索引被删除并重建。

若不指定database-name而指定表/索引名以及比较顺序,只有关联该比较顺序的索引被重建。在重建索引时总是指定database-name可以消除这一歧义。

REPLACE sql-statement ::=   REPLACE INTO [database-name .]table-name[( column-list )] VALUES ( value-list ) |
REPLACE INTO
[database-name .]table-name[( column-list )]select-statement
 

REPLACE命令用于替代INSERT的“INSERT OR REPLACE”变体,以更好的兼容MySQL。查看INSERT命令文档获取更多信息。

SELECT sql-statement ::=   SELECT [ALL | DISTINCT]result[FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-opselect]*
[ORDER BY sort-expr-list]
[LIMIT integer[( OFFSET | , )integer]]
 
result ::=   result-column[, result-column]*  
result-column ::=   * |table-name . * |expr[[AS]string]  
table-list ::=   table[join-optablejoin-args]*  
table ::=   table-name[AS alias]|
(
select ) [AS alias]
 
join-op ::=   , |[NATURAL][LEFT | RIGHT | FULL][OUTER | INNER | CROSS] JOIN  
join-args ::=   [ON expr][USING ( id-list )]  
sort-expr-list ::=   expr[sort-order][, expr[sort-order]]*  
sort-order ::=   [ COLLATE collation-name][ ASC | DESC ]  
compound_op ::=   UNION | UNION ALL | INTERSECT | EXCEPT  

SELECT语句用于查询数据库。一条SELECT命令的返回结果是零或多行每行有固定字段数的数据。字段的数目由在SELECT和FROM之间的表达式列表定义。任意的表达式都可以被用作结果。若表达式是 *则表示所有表的所有字段。若表达式是表的名字后接.*则结果为该表中的所有字段。

DISTINCT关键字的使用会使返回的结果是原结果的一个不含相同行的子集。NULL值被认为是相同的。缺省行为是返回所有的行,为清楚起见可以使用关键字ALL。

查询对FROM之后定义的一个或多个表进行。若多个表用逗号连接,则查询针对它们的交叉连接。所有的SQL-92连接语法均可以用于定义连接。圆括号中的副查询可能被FROM子句中的任意表名替代。当结果中仅有一行包含表达式列表中的结果的行时,整个的FROM子句会被忽略。

WHERE子句可以限定查询操作的行数目。

GROUP BY子句将一行或多行结果合成单行输出。当结果有聚集函数时这将尤其有用。GROUP BY子句的表达式不须是出现在结果中的表达式。HAVING子句与WHERE相似,只是HAVING用于过滤分组创建的行。HAVING子句可能包含值,甚至是不出现在结果中的聚集函数。

ORDER BY子句对所得结果根据表达式排序。表达式无须是简单SELECT的结果,但在复合SELECT中每个表达式必须精确对应一个结果字段。每个表达式可能跟随一个可选的COLLATE关键字以及用于排序文本的比较函数名称和/或关键字ASC或DESC,用于说明排序规则。

LIMIT子句限定行数的最大值。负的LIMIT表示无上限。后跟可选的OFFSET说明跳过结果集中的前多少行。在一个复合查询中,LIMIT子句只允许出现在最终SELECT语句中。限定对于所有的查询均适用,而不仅仅是添加了LIMIT子句的那一行。注意OFFSET关键字用于LIMIT子句中,则限制值是第一个数字,而偏移量(offset)是第二个数字。若用逗号替代OFFSET关键字,则偏移量是第一个数字而限制值是第二个数字。这是为了加强对遗留的SQL数据库的兼容而有意造成的矛盾。

复合的SELECT由两个或更多简单SELECT经由UNION、UNION ALL、INTERSECT、EXCEPT中的一个运算符连接而成。在一个复合SELECT中,各个SELECT需指定相同个数的结果字段。仅允许一个ORDER BY子句出现在SELECT的末尾。UNION和UNION ALL运算符从左至右将所有SELECT的结果合成一个大的表。二者的区别在于UNION的所有结果行是不相同的而UNION ALL允许重复行。INTERSECT运算符取左右两个SELECT结果的交。EXCEPT从左边SELECT的结果中除掉右边SELECT的结果。三个或更多SELECT复合时,它们从左至右结合。

UPDATE sql-statement ::=   UPDATE [ OR conflict-algorithm][database-name .]table-name
SET
assignment[, assignment]*
[WHERE expr]
 
assignment ::=   column-name = expr  

UPDATE语句用于改变表中所选行的字段值。每个UPDATE的赋值的等号左边为字段名而右边为任意表达式。表达式可以使用其它字段的值。所有的表达式将在赋值之前求出结果。可以使用WHERE子句限定需要改变的行。

在使用这一命令时,利用可选的ON CONFLICT子句可以定义替代的约束冲突判定算法。更多信息,参见ON CONFLICT

VACUUM sql-statement ::=   VACUUM [index-or-table-name]  

VACUUM命令是SQLite的一个扩展功能,模仿PostgreSQL中的相同命令而来。若调用VACUUM带一个表名或索引名,则将整理该表或索引。在SQLite 1.0中,VACUUM命令调用gdbm_reorganize()整理后端数据库文件。

SQLITE 2.0.0中去掉了GDBM后端,VACUUM无效。在2.8.1版中,VACUUM被重新实现。现在索引名或表名被忽略。

当数据库中的一个对象(表、索引或触发器)被撤销,会留下空白的空间。它使数据库比需要的大小更大,但能加快插入速度。实时的插入和删除会使得数据库文件结构混乱,减慢对数据库内容访问的速度。VACUUM命令复制主数据库文件到临时数据库并从临时数据库重新载入主数据库,以整理数据库文件。这将除去空白页,使表数据彼此相邻排列,并整理数据库文件结构。不能对附加数据库文件进行以上操作。

若当前有活动事务,该命令无法起作用。对于In-Memory数据库,该命令无效。

SQLite 3.1中,可以通过使用auto-vacuum模式取代VACUUM命令,使用auto_vacuum pragma开启该模式。

SQLite 的详细介绍请点这里
SQLite 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/608914114f851c1673b5401a61aa0f05.html