sqlite 研究

SQLite是一个很小的C语言链接库。这个链接库本身就完全包含数据库引擎的功能,而且可以嵌入至其它程序中,完全不用额外的设定。其特性如下:
* 支持ACID (Atomic, Consistent, Isolated, Durable) 交易。
* 零组态设定(Zero-configuration),无须管理者的设定及管理。
* 支持大部分SQL92的语法。
* 数据库存在于一个单一的文件中。
* 数据库系统所在机器的字节顺序(Byte order)无关。
* 支援大小至2 TB (2^41 bytes)。
* 极小的内存需求:小于3万行的C语言程序代码。小于250KB的程序空间。
* 大部分的数据库操作皆快于一般流行的数据库系统。
* 简单易用的API。
* 支援TCL。也有其它语言的支持可用。
* 注释详细的程序代码,以及超过90%的测试。
* 链接库自己包含完整的功能,无须其它额外的程序或链接库。
* 程序代码版权为public domain。任何用途皆可免费使用。

SQLite的SQL从很大程度上实现了ANSI SQL92标准. 特别的SQLite支持视图, 触发器, 事务, 支持嵌套SQL. 这些都会在下面应用的过程中讲到, 故这边先暂时放下, 而主要说说SQLite所不支持的一些SQL.
1.不支持Exists, 虽然支持in(in是Exists的一种情况)
2.不支持多数据库, 如: create table db1.table1 as select * from db2.table1;
3.不支持存储过程
4.不支持Alter View/Trigger/Table
5.不支持Truncate, 在SQLite中Delete不带Where字句时和Truncate的效果是一样的.
6.不支持Floor和Ceiling函数, 还有其他蛮多的函数
7.没有Auto Increment(自增)字段, 但是SQLite其实是支持Auto Increment的, 即在将该字段设置为” INTEGER PRIMARY KEY”的时候.
8.不支持If Exists
详细的SQL支持可以访问: [url]http://www.sqlite.org/lang.htm[/url]
详细的不支持SQL可以访问: [url]http://www.sqlite.org/cvstrac/wiki?p=UnsupportedSql[/url]

SQLite的数据类型
  首先你会接触到一个让你惊讶的名词: Typelessness(无类型). 对! SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么(只有在一种情况下不是, 稍后解释). 对于SQLite来说对字段不指定类型是完全有效的. 如:
Create Table ex1(a, b, c);
诚然SQLite允许忽略数据类型, 但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎. SQLite支持常见的数据类型, 如:
CREATE TABLE ex2(
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
);
  前面提到在某种情况下, SQLite的字段并不是无类型的. 即在字段类型为”Integer Primary Key”时.

SQLite的Wrapper
  由于SQLite有别于其他数据库引擎的TCP/IP或RPC访问方式, 完全地是本地的操作, 从某种角度来说你可以说SQLite和MS的Access很相似, 但是更小更强大. 所谓Wrapper即使对SQLite提供的接口进行封装, 使其他语言可以访问, 使用SQLite.
  SQLite本身是提供C和Tcl的接口的. 所以可以非常轻易的和PHP相结合. 除了PHP的Wrapper以外, 还有许多世界各地的程序员提供了各种语言的SQLite的接口封装, 如Python, C++, Java, .Net…… 所流行的语言基本都有. [/quote]
2005-11-30 00:30 99大话王
[url]http://www-128.ibm.com/developerworks/cn/opensource/os-sqlite/[/url]
[quote]开放源码嵌入式数据库 SQLite 简介
零配置数据库:照亮应用开发之路
 

  文档选项
   将此页作为电子邮件发送

 

对此页的评价
  帮助我们改进这些内容

 


级别: 初级

Nils-Erik Frantzell , 计算机科学系, University of California, Santa Cruz


2005 年 8 月 22 日

自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性。随着软件应用程序逐渐模块模块化,一种新型数据库会比大型复杂的传统数据库管理系统更适应。嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少。本文将介绍流行的 SQLite 数据库引擎,并描述如何在应用程序开发中使用它。
SQLite 是 D. Richard Hipp 用 C 语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。它是作为 PHP V4.3 中的一个选项引入的,构建在 PHP V5 中。SQLite 支持多数 SQL92 标准,可以在所有主要的操作系统上运行,并且支持大多数计算机语言。SQLite 还非常健壮。其创建者保守地估计 SQLite 可以处理每天负担多达 100,00 次点击率的 Web 站点,并且 SQLite 有时候可以处理 10 倍于上述数字的负载。

功能

SQLite 对 SQL92 标准的支持包括索引、限制、触发和查看。SQLite 不支持外键限制,但支持原子的、一致的、独立和持久 (ACID) 的事务(后面会提供有关 ACID 的更多信息)。

为什么要进行嵌入?

嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。它们是使用精简代码编写的,对于嵌入式设备,其速度更快,效果更理想。嵌入式运行模式允许嵌入式数据库通过 SQL 来轻松管理应用程序数据,而不依靠原始的文本文件。嵌入式数据库还提供零配置运行模式,这样可以启用其中一个并运行一个快照。

要知道,SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器,并且可以实现多数 SQL92 标准(但不是全部)。SQL92 标准的其他一些主要功能是外键和检查限制。了解哪些 SQL92 功能未实现。


这意味着事务是原子的,因为它们要么完全执行,要么根本不执行。事务也是一致的,因为在不一致的状态中,该数据库从未被保留。事务还是独立的,所以,如果在同一时间在同一数据库上有两个执行操作的事务,那么这两个事务是互不干扰的。而且事务是持久性的,所以,该数据库能够在崩溃和断电时幸免于难,不会丢失数据或损坏。

SQLite 通过数据库级上的独占性和共享锁定来实现独立事务处理。这意味着当多个进程和线程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写入操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

SQLite 网站上记录了完整的 SQLite locking semantics。

 


回页首

 


内部结构

在内部,SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。所有 SQL 语句都被编译成易读的、可以在 SQLite 虚拟机中执行的程序集。


图 1. SQLite 的内部结构


SQLite 支持大小高达 2 TB 的数据库,每个数据库完全存储在单个磁盘文件中。这些磁盘文件可以在不同字节顺序的计算机之间移动。这些数据以 B+树(B+tree)数据结构的形式存储在磁盘上。SQLite 根据该文件系统获得其数据库权限。

数据类型

SQLite 不支持静态数据类型,而是使用列关系。这意味着它的数据类型不具有表列属性,而具有数据本身的属性。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成列类型。如果不能转换,则该值将作为其本身具有的类型存储。

SQLite 支持 NULL、INTEGER、REAL、TEXT 和 BLOB 数据类型。

 


回页首

 


管理 SQLite

SQLite 附带一个可下载的 command-line interface for database administration。通过数据库名称可以调用此命令行程序,并且可以按照下面的方式创建新的数据库和表:


清单 1. 创建新的数据库和表

C:/minblogg>sqlite3 c:/minblogg/www/db/alf.db
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> create table mytable(name varchar(40), age smallint);
sqlite> insert into mytable values('Nils-Erik',23);
sqlite> select * from mytable;
Nils-Erik|23
sqlite>


然后,可以再次打开该数据库,列出它的表和架构,并继续进行插入和删除值的操作。


清单 2. 列出表和架构

C:/minblogg>sqlite3 c:/minblogg/www/db/alf.db
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> .tables
mytable
sqlite> select * from mytable;
Nils-Erik|23
sqlite> .schema
CREATE TABLE mytable(name varchar(40), age smallint);
sqlite>

 

SQLite 还附带命令行数据库分析器,该分析器允许您显示关于任何 SQLite 数据库当前状态的详细信息。


清单 3. SQLite 分析器

C:/minblogg>sqlite3_analyzer www/db/alf.db
Analyzing table mytable...
Analyzing table sqlite_master...
/** Disk-Space Utilization Report For www/db/alf.db
*** As of 2005-Apr-24 18:56:40

Page size in bytes.................... 1024
Pages in the whole file (measured).... 2
Pages in the whole file (calculated).. 2
Pages that store data................. 2          100.0%
Pages on the freelist (per header).... 0            0.0%
Pages on the freelist (calculated).... 0            0.0%
Pages of auto-vacuum overhead......... 0            0.0%
Number of tables in the database...... 2
Number of indices..................... 0
Number of named indices............... 0
Automatically generated indices....... 0
Size of the file in bytes............. 2048
Bytes of user payload stored.......... 13           0.63%

*** Page counts for all tables with their indices ********************

MYTABLE............................... 1           50.0%
SQLITE_MASTER......................... 1           50.0%

*** All tables *******************************************************

Percentage of total database.......... 100.0%
Number of entries..................... 2
Bytes of storage consumed............. 2048
Bytes of payload...................... 91           4.4%
Average payload per entry............. 45.50
Average unused bytes per entry........ 916.50
Maximum payload per entry............. 78
Entries that use overflow............. 0            0.0%
Primary pages used.................... 2
Overflow pages used................... 0
Total pages used...................... 2
Unused bytes on primary pages......... 1833        89.5%
Unused bytes on overflow pages........ 0
Unused bytes on all pages............. 1833        89.5%

*** Table MYTABLE ****************************************************

Percentage of total database..........  50.0%
Number of entries..................... 1
Bytes of storage consumed............. 1024
Bytes of payload...................... 13           1.3%
Average payload per entry............. 13.00
Average unused bytes per entry........ 999.00
Maximum payload per entry............. 13
Entries that use overflow............. 0            0.0%
Primary pages used.................... 1
Overflow pages used................... 0
Total pages used...................... 1
Unused bytes on primary pages......... 999         97.6%
Unused bytes on overflow pages........ 0
Unused bytes on all pages............. 999         97.6%

 

由于完全能够使用命令行界面来管理数据库,因此它可以为数据库管理员带来很大的方便。目前有许多优秀的基于 Web 的 SQLite 数据库管理系统。其中有一个是基于 PHP 的 SQLiteManager。


图 2. 使用 SQLiteManager 管理数据库

 


回页首

 


备份

备份 SQLite 数据库有两种方法。如果数据库正在使用中,则应从命令行界面使用 .dump 命令。这样可以创建一个包含必要命令和数据的文件,从而重新创建数据库。.dump 命令也可以用于备份数据库表。


清单 4. .dump 命令

sqlite> .dump
BEGIN TRANSACTION;
CREATE TABLE mytable(name varchar(40), age smallint);
INSERT INTO "mytable" VALUES('Nils-Erik', 23);
COMMIT;
sqlite>

 

如果数据库没有处于使用状态,则可以直接将数据库文件复制到安全位置。

 


回页首

 


在 PHP V5 中使用 SQLite

一个好的做法是将 SQLite 数据库与 PHP 代码分开。完成此操作的一个简便方法是创建一个 www 目录。在此目录中,创建一个用于存放 SQLite 数据库的 db 目录、一个用于存放数据库和表创建脚本的 dbscripts 目录和一个用于存放数据库备份的 backups 目录。


清单 5. 使用 PHP V5 组织 SQLite 数据库

2004-12-06  15:43    DIR          .
2004-12-06  15:43    DIR          ..
2005-04-23  19:55    DIR          db
2005-01-02  11:46    DIR          dbscripts
2005-01-02  11:46    DIR          backups

 

在 PHP V5 中创建 SQLite 数据库与在命令行界面中创建该数据库非常相似。如果该数据库不存在,则创建一个空数据库。


$db = sqlite_open('../db/ac.db');


创建一个表也非常容易:


清单 6. 创建表


$db = sqlite_open('../db/ac.db');

sqlite_query($db, 'DROP TABLE post');

sqlite_query($db, 'CREATE TABLE post (id INTEGER PRIMARY KEY, kategori VARCHAR(20) NOT NULL,
titel VARCHAR(75) NOT NULL, referens VARCHAR(75), status VARCHAR(20) not null,
date varchar(10)not null, synopsis VARCHAR(120), inlaegg varchar(8192))');

 

插入一条记录:


$sqldb = sqlite_open("../db/ac.db");
sqlite_query($sqldb, "INSERT INTO isvs VALUES ('$isvurl' , '$isvname', '$comment')");

 


并选择数据:


清单 7. 从 SQLite 数据库中选择数据

$sqldb = sqlite_open("www/db/ac.db");

$results = sqlite_query($sqldb, "SELECT * FROM isvs order by isvurl asc ");
  
while (list($isvurl, $isvname) = sqlite_fetch_array($results)) {
  sqlite_close($sqldb);

 

 

 

回页首

 


使用 SQLite 和数据库抽象层

两个先进的开源数据库抽象层对 SQLite 提供支持:PEAR::DB,它们包含在 PHP V5 中,并且被认为是更轻量级的 ezSQL。通过预先使用 PHP 扩展和应用程序库 (PEAR) 或 ezSQL,可将 SQLite 用于应用程序的快速复原,在以后需要时,可以将其无缝转向更具工业性质的数据库。


清单 8. 使用 ezSQL 和 SQLite

$users = $db->get_results("SELECT name, age FROM table1");
foreach ( $users as $user )
{
            echo $user->name;
            echo $user->age;
}

城中另一个游戏

SQLite 不是惟一的开源嵌入式数据库引擎。如果 SQLite 不能满足您的要求,请使用 Derby(是 Apache 孵化器项目)和 Cloudscape(IBM 公司的 Derby 商业版本,包括 IBM 支持和服务)。Cloudscape 于 1996 年诞生于 Cloudscape 公司。三年以后,Informix 软件公司并购了 Cloudscape,2001 年,IBM 并购了 Informix 软件公司的数据库资产,其中包括 Cloudscape。去年,IBM 将此代码像 “Derby”一样作为孵化器项目献给了 Apache Software Foundation。

Derby 是100 % 的 Java 编程语言关系数据库,并提供了存储过程和触发器,行级锁定,可以执行事务提交和回退操作,并支持加密。

最近,Zend 公司为 IBM 发布了 Zend Core,该软件可以看作是基于 PHP V5 的解决方案,其中包括用于 Cloudscape 的 PHP 扩展和绑定的 Cloudscape 数据库服务器。

 

 

回页首

 


SQLite 使用注意事项

在确定是否在应用程序中使用 SQLite 之前,应该考虑以下几种情况:

目前没有可用于 SQLite 的网络服务器。从应用程序运行位于其他计算机上的 SQLite 的惟一方法是从网络共享运行。这样会导致一些问题,像 UNIX® 和 Windows® 网络共享都存在文件锁定问题。还有由于与访问网络共享相关的延迟而带来的性能下降问题。
SQLite 只提供数据库级的锁定。虽然有一些增加并发的技巧,但是,如果应用程序需要的是表级别或行级别的锁定,那么 DBMS 能够更好地满足您的需求。
正如前面提到的,SQLite 可以支持每天大约 100,00 次点击率的 Web 站点 —— 并且,在某些情况下,可以处理 10 倍于此的通信量。对于具有高通信量或需要支持庞大浏览人数的 Web 站点来说,应该考虑使用 DBMS。
SQLite 没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。
SQLite 支持多数(但不是全部)的 SQL92 标准。不受支持的一些功能包括完全触发器支持和可写视图。请参阅 unimplemented SQL92 features。
如果您感到其中的任何限制会影响您的应用程序,那么您应该考虑使用完善的 DBMS。如果您可以解除这些限制问题,并且对快速灵活的嵌入式开源数据库引擎很感兴趣,则应重点考虑使用 SQLite。

一些能够真正表现 SQLite 优越性能的领域是 Web 站点,可以使用 SQLite 管理应用程序数据、快速应用程序原型制造和培训工具。

 


回页首

 


结束语

由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,它将为那些以前无法提供用作持久数据的后端的数据库的应用程序提供了高效的性能。现在,没有必要使用文本文件来实现持久存储。SQLite 之类的嵌入式数据库的易于使用性可以加快应用程序的开发,并使得小型应用程序能够完全支持复杂的 SQL。这一点对于对于小型设备空间的应用程序来说尤其重要。

嵌入式数据库对于加快应用程序开发也很重要,尤其是在用于数据库抽象层(例如 PEAR::DB 或 ezSQL)时。最后,SQLite 正在积极开发中,未来一定会有新的功能,会对开源社区更有用。

 


回页首

 


参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文。


请访问 SQLite,以下载最新版本的 SQLite、命令行界面、文档和最新消息。


下载 SQLiteManager,使 SQLite 数据库管理更方便。


从 PHP.net 下载包括 SQLite 的 PHP V5。


请参阅 developerWorks 上的文章“ 审计 PHP,第 1 部分: 理解 register_globals”,了解开发人员创建 PHP 应用程序时需要牢记的一些基本问题。


“PHP 简介”是对 PHP 脚本语言的一个简要介绍,并讨论了 PHP 的起源、功能及其使用的平台。


“PHP 例解,第 1 部分”是系列文章中第一部分,它介绍了 PHP 的一些基础知识。描述了包括作者页和前端的 Webzine,在作者页中,内容提供者可以输入文章的正文,前端用于将这些内容介绍给全世界的读者。


“学习 PHP,第 1 部分” 是由三个部分组成的文章列系中的第 1 部分,通过记录文档工作流系统的构建过程,全面介绍 PHP,从文件系统的最基本的 PHP 脚本,到使用数据库和流。


可以从 The PHP Extension and Application Repository 获得 PEAR::DB 数据库抽象层。


请访问 jvmultimedia,下载 ezSQL 数据库抽象层。


请购买 Chris Newman 撰写的 SQLite 一书,该书主要介绍了开源的嵌入式数据库。


了解关于 Apache 孵化项目 Derby 和 IBM Cloudscape 的更多信息。


请下载包括 Cloudscape 的 combined PHP V5 binary distribution。


请参阅 developerWorks 的 开源专区,了解更多的 how-to 信息、工具和项目更新,帮助您使用开源技术进行开发,并将这些技术用于 IBM 的产品中。


使用 IBM 试用软件 改进您的下一个开源开发项目,可以通过下载或从 DVD 中获得这些软件。


通过参与 developerWorks blogs 加入 developerWorks 社区。

 


回页首

 


关于作者

 

Nils-Erik Frantzell 是一名位于圣克鲁斯的加州大学的大学四年级学生。他的兴趣包括数据库(尤其是内部数据库)、信息管理、Web 技术以及一些计算机硬件。他的业余爱好是饲养热带鱼和欣赏电子音乐。


[/quote]
2005-11-30 00:38 99大话王
打算写几个小应用程序,都可能要用到数据库,看来sqlite比较合适:victory:
2005-11-30 00:39 99大话王
[url]http://dev.csdn.net/article/33/article/38/38526.shtm[/url]
[quote]标题   SQLite语法备忘录     选择自 ezdevelop 的 Blog 
关键字   SQLite语法备忘录
出处   

记录一下自己开发ezSqliteAdmin时所掌握的SQLite资料。

SQLite内建语法表

结构定义
CREATE TABLE 创建新表。

语法:
sql-command ::= CREATE [TEMP | TEMPORARY] TABLE table-name (
    column-def [, column-def]*
    [, constraint]*
)
sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
column-def ::= name [type] [[CONSTRAINT name] column-constraint]*
type ::= typename |
typename ( number ) |
typename ( number , number )
column-constraint ::= NOT NULL [ conflict-clause ] |
PRIMARY KEY [sort-order] [ conflict-clause ] |
UNIQUE [ conflict-clause ] |
CHECK ( expr ) [ conflict-clause ] |
DEFAULT value |
COLLATE collation-name
constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |
UNIQUE ( column-list ) [ conflict-clause ] |
CHECK ( expr ) [ conflict-clause ]
conflict-clause ::= ON CONFLICT conflict-algorithm


CREATE VIEW 创建一个视图(虚拟表),该表以另一种方式表示一个或多个表中的数据。

语法:
sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [database-name.] view-name AS select-statement

例子:
CREATE VIEW master_view AS
    SELECT * FROM sqlite_master WHERE type='view';
说明:
创建一个名为master_view的视图,其中包括sqlite_master这个表中的所有视图表。

CREATE TRIGGER 创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。

语法:
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ]
database-event ON [database-name .] table-name
trigger-action
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name INSTEAD OF
database-event ON [database-name .] view-name
trigger-action
database-event ::= DELETE |
INSERT |
UPDATE |
UPDATE OF column-list
trigger-action ::= [ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN expression ]
BEGIN
    trigger-step ; [ trigger-step ; ]*
END
trigger-step ::= update-statement | insert-statement |
delete-statement | select-statement


例子:
CREATE TRIGGER update_customer_address UPDATE OF address ON customers
  BEGIN
    UPDATE orders SET address = new.address WHERE customer_name = old.name;
  END;
说明:
创建了一个名为update_customer_address的触发器,当用户更新customers表中的address字段时,将触发并更新orders表中的address字段为新的值。
比如执行如下一条语句:
UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';
数据库将自动执行如下语句:
UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';

CREATE INDEX 为给定表或视图创建索引。

语法:
sql-statement ::= CREATE [UNIQUE] INDEX index-name
ON [database-name .] table-name ( column-name [, column-name]* )
[ ON CONFLICT conflict-algorithm ]
column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]


例子:
CREATE INDEX idx_email ON customers (email);
说明:
为customers表中的email创建一个名为idx_email的字段。

结构删除
DROP TABLE 删除表定义及该表的所有索引。

语法:
sql-command ::= DROP TABLE [database-name.] table-name


例子:
DROP TABLE customers;
DROP VIEW 删除一个视图。

语法:
sql-command ::= DROP VIEW view-name


例子:
DROP VIEW master_view;

DROP TRIGGER 删除一个触发器。

语法:
sql-statement ::= DROP TRIGGER [database-name .] trigger-name


例子:
DROP TRIGGER update_customer_address;

DROP INDEX 删除一个索引。

语法:
sql-command ::= DROP INDEX [database-name .] index-name


例子:
DROP INDEX idx_email;

数据操作
INSERT 将新行插入到表。

语法:
sql-statement ::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list) |
INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement


UPDATE 更新表中的现有数据。

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


DELETE 从表中删除行。

语法:
sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]


SELECT 从表中检索数据。

语法:
sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select]*
[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-op table join-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


REPLACE 类似INSERT

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


事务处理
BEGIN TRANSACTION 标记一个事务的起始点。

语法:
sql-statement ::= BEGIN [TRANSACTION [name]]


END TRANSACTION 标记一个事务的终止。

语法:
sql-statement ::= END [TRANSACTION [name]]


COMMIT TRANSACTION 标志一个事务的结束。

语法:
sql-statement ::= COMMIT [TRANSACTION [name]]


ROLLBACK TRANSACTION 将事务回滚到事务的起点。

语法:
sql-statement ::= ROLLBACK [TRANSACTION [name]]


其他操作
COPY 主要用于导入大量的数据。

语法:
sql-statement ::= COPY [ OR conflict-algorithm ] [database-name .] table-name FROM filename
[ USING DELIMITERS delim ]


例子:
COPY customers FROM customers.csv;
EXPLAIN 

语法:
sql-statement ::= EXPLAIN sql-statement


PRAGMA 

语法:
sql-statement ::= PRAGMA name [= value] |
PRAGMA function(arg)


VACUUM 

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


ATTACH DATABASE 附加一个数据库到当前的数据库连接。

语法:
sql-statement ::= ATTACH [DATABASE] database-filename AS database-name


DETTACH DATABASE 从当前的数据库分离一个使用ATTACH DATABASE附加的数据库。

语法:
sql-command ::= DETACH [DATABASE] database-name

 

SQLite内建函数表

算术函数
abs(X) 返回给定数字表达式的绝对值。
max(X,Y[,...]) 返回表达式的最大值。
min(X,Y[,...]) 返回表达式的最小值。
random(*) 返回随机数。
round(X[,Y]) 返回数字表达式并四舍五入为指定的长度或精度。
字符处理函数
length(X) 返回给定字符串表达式的字符个数。
lower(X) 将大写字符数据转换为小写字符数据后返回字符表达式。
upper(X) 返回将小写字符数据转换为大写的字符表达式。
substr(X,Y,Z) 返回表达式的一部分。
randstr() 
quote(A) 
like(A,B) 确定给定的字符串是否与指定的模式匹配。
glob(A,B) 
条件判断函数
coalesce(X,Y[,...]) 
ifnull(X,Y) 
nullif(X,Y) 
集合函数
avg(X) 返回组中值的平均值。
count(X) 返回组中项目的数量。
max(X) 返回组中值的最大值。
min(X) 返回组中值的最小值。
sum(X) 返回表达式中所有值的和。
其他函数
typeof(X) 返回数据的类型。
last_insert_rowid() 返回最后插入的数据的ID。
sqlite_version(*) 返回SQLite的版本。
change_count() 返回受上一语句影响的行数。
last_statement_change_count() 

你可能感兴趣的:(数据库,PHP,sqlite,table,Integer,嵌入式)