Sqlite 入门语法

SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,同时它还支持事务处理功能等等。我觉得它像MySQL,但SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库。

一、结构定义

1、CREATE TABLE

创建新表。

语法:

?
1
2
3
4
5
6
7
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

例子:

?
1
create table film(title,length, year ,starring);

说明:

建立了一个名叫film的资料表,里面有name、length、year、starring四个字段。

2、CREATE VIEW

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

语法:

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

例子:

?
1
CREATE VIEW master_view AS SELECT * FROM sqlite_master WHERE type= 'view' ;

说明:

创建一个名为master_view的视图,其中包括sqlite_master这个表中的所有视图表。

3、CREATE TRIGGER

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

语法:

?
1
2
3
4
5
6
7
8
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

例子:

?
1
2
3
4
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字段为新的值。

比如执行如下一条语句:

?
1
UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones' ;

数据库将自动执行如下语句:

?
1
UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones' ;

4、CREATE INDEX

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

语法:

?
1
2
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 ]

例子:

?
1
CREATE INDEX idx_email ON customers (email);

说明:

为customers表中的email创建一个名为idx_email的索引。

二、结构删除

1、DROP TABLE

删除表定义及该表的所有索引。

语法:

?
1
sql-command ::= DROP TABLE [ database - name .] table - name

例子:

?
1
DROP TABLE customers;

2、DROP VIEW

删除一个视图。

语法:

?
1
sql-command ::= DROP VIEW view - name

例子:

?
1
DROP VIEW master_view;

3、DROP TRIGGER

删除一个触发器。

语法:

?
1
sql-statement ::= DROP TRIGGER [ database - name .] trigger - name

例子:

?
1
DROP TRIGGER update_customer_address;

4、DROP INDEX

删除一个索引。

语法:

?
1
sql-command ::= DROP INDEX [ database - name .] index - name

例子:

?
1
DROP INDEX idx_email;

三、数据操作

1、INSERT

将新行插入到表。

语法:

?
1
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

2、UPDATE

更新表中的现有数据。

语法:

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

3、DELETE

从表中删除行。

语法:

?
1
sql-statement ::= DELETE FROM [ database - name .] table - name [ WHERE expr]

4、SELECT

从表中检索数据。

语法:

?
1
2
3
4
5
6
7
8
9
10
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

5、REPLACE

用于替代INSERT的“INSERT OR REPLACE”变体,以更好的兼容MySQL。

语法:

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

四、事务处理

1、BEGIN TRANSACTION

标记一个事务的起始点。

语法:

?
1
sql-statement ::= BEGIN [ TRANSACTION [ name ]]

2、END TRANSACTION

标记一个事务的终止。

语法:

?
1
sql-statement ::= END [ TRANSACTION [ name ]]

3、COMMIT TRANSACTION

标志一个事务的结束。

语法:

?
1
sql-statement ::= COMMIT [ TRANSACTION [ name ]]

4、ROLLBACK TRANSACTION

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

语法:

?
1
sql-statement ::= ROLLBACK [ TRANSACTION [ name ]]

五、其他操作

1、COPY

主要用于导入大量的数据。

语法:

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

例子:

?
1
COPY customers FROM customers.csv;

2、EXPLAIN

EXPLAIN命令修饰语是一个非标准的扩展功能,灵感来自PostgreSQL中的相同命令,但操作完全不同。若EXPLAIN关键字出现在任何SQLite的SQL命令之前,则SQLite库返回不加EXPLAIN时执行该命令所需要使用的虚拟机指令序列,而不是真正执行该命令。

语法:

?
1
sql-statement ::= EXPLAIN sql-statement

3、PRAGMA

用于修改SQlite库或查询SQLite库内部数据(non-table)的特殊命令。

语法:

?
1
sql-statement ::= PRAGMA name [= value] | PRAGMA function (arg)

使用整数值value的pragma也可以使用符号表示,字符串“on”、“true”和“yes”等同于1,“off”、“false”和“no”等同于0。这些字符串大小写不敏感且无须进行引用。无法识别的字符串被当作1且不会报错。value返回时是整数。

4、VACUUM

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开启该模式。

语法:

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

5、ATTACH DATABASE

ATTACH DATABASE语句将一个已存在的数据库添加到当前数据库连接。若文件名含标点符号,则应用引号引起来。数据库名’main’和’temp’代表主数据库和用于存放临时表的数据库,它们不能被拆分。拆分数据库使用DETACH DATABASE语句。

你可以读写附加数据库,或改变其结构。这是SQLite 3.0提供的新特性。在SQLite 2.8中,改变附加数据库的结构是不允许的。

在附加数据库中添加一个与已有表同名的表是不允许的。但你可以附加带有与主数据库中的表同名的表的数据库。也可以多次附加同一数据库。

使用database-name.table-name来引用附加数据库中的表。若附加数据库中的表与主数据库的表不重名,则不需加数据库名作为前缀。当数据库被附加时,它的所有不重名的表成为该名字指向的缺省表。之后附加的任意与之同名的表需要加前缀。若“缺省”表被拆分,则最后附加的同名表变为“缺省”表。

若主数据库不是“:memory:”,多附加数据库的事务是原子的。若主数据库是“:memory:”则事务在每个独立文件中依然是原子的。但若主机在改变两个或更多数据库的COMMIT语句进行时崩溃,则可能一部分文件被改变而其他的保持原样。附加数据库的原子性的提交 是SQLite 3.0的新特性。在SQLite 2.8中,所有附加数据库的提交类似于主数据库是“:memory:”时的情况。

对附加数据库的数目有编译时的限制,最多10个附加数据库。

语法:

?
1
sql-statement ::= ATTACH [ DATABASE ] database -filename AS database - name

6、DETACH DATABASE

拆分一个之前使用ATTACH DATABASE语句附加的数据库连接。可以使用不同的名字多次附加同一数据库,并且拆分一个连接不会影响其他连接。若SQLite在事务进行中,该语句不起作用。

语法:

?
1
sql-command ::= DETACH [ DATABASE ] database - name

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="