SQLite 语法大全
一. 如何获取SQLite最新版本官方站点:http://www.sqlite.org/ 从http://www.sqlite.org/网站的Download页面获取 即如下页面下载 http://www.sqlite.org/download.html http://blog.csdn.net/littletigerat 二.Windows下的SQLite的源代码是哪个软件压缩包?sqlite-amalgamation-3_6_22.zip是SQLite的windows下源码文件 三.Window下的SQLite命令行工具sqlite-3_6_22.zip 四.Window下的SQLite开发库,即动态链接库以及DEF文件sqlitedll-3_6_22.zip 五.SQLite最新版本是:3.6.22六.b<=a && a <= c 的SQL语句如何写在SQLite中,表达式"a BETWEEN b AND c"等于表达式 "a >= b AND a <= c",在比较表达式时,a可以是具有任何亲和性 七.a的值是x,y,z其中一个值,SQL语句如何写SQLite把表达式 "a IN (x,z)" 和 "a = z OR a = y OR a = z"视为相等. 八.如何创建制定目录的数据库sqlite3 D:/Project/SyncML/Lib/debug/atsync.db 九.创建数据的注意事项如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库。 十.如何添加一张数据表create table student(name varchar(10),age smallint); 十一.如何往数据表中添加数据insert into student values('张三',20); 十二.如何通过sqlite3.dll与sqlite3.def生成sqlite3.lib文件LIB /DEF:sqlite3.def /machine:IX86 十三.如何查询SQLite工具的软件版本也就是sqlite3.exe应用程序小工具的版本号 方法一:进入sqlite3.exe所在目录,在命令行执行如下命令 sqlite3 –version 方法二: select sqlite_version(); 十四.如何在字符串中使用单引号(')?SQL 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号 十五.如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令vacuum; 十六.在SQLite中,如何在一个表上添加或删除一列?SQLite 有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列,可更改表的名称。 如果需要对表结构做更复杂的改变,则必须重新建表。 重建时可以先将已存在的数据放到一个临时表中,删除原表, 创建新表,然后将数据从临时表中复制回来。 如,假设有一个 t1 表,其中有 "a","b","c" 三列, 如果要删除列 c ,以下过程描述如何做: 开始事物处理 BEGIN TRANSACTION; 创建临时表格t1-backup CREATE TEMPORARY TABLE t1_backup(a,b); 将数据库表t1中的所有数据拷贝到表t1-backup中 INSERT INTO t1_backup SELECT a,b FROM t1; 删除表格t1 DROP TABLE t1; 创建表格t1 CREATE TABLE t1(a,51); font-family:Arial; line-height:25.98958396911621px"> 将数据库表t1-backup中的所有数据拷贝到表t1中 INSERT INTO t1 SELECT a,b FROM t1_backup; 删除备份表格t1-backup DROP TABLE t1_backup; 事物提交 COMMIT; 十七.如何查询当前的编码的编码格式pragma encoding; 十八.SQLite支持哪些数据类型些? NULL 值为NULL 但实际上,sqlite3也接受如下的数据类型: 十九.如果将某个字段设置为INTEGER PRIMARY KEY属性,有什么特性?如果将声明表的一列设置为 INTEGER PRIMARY KEY,则具有: 1.每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数; 2.如果表是空的, 将会是1; 注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。 二十.字段声明中有AUTOINCREMENT属性,有什么与众不同的含义?要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。 2010年SQLite学习笔记之二 一.建立数据库sqlite3.exe test.db 二.双击sqlite-3_6_16目录下的程序sqlite3.exe,即可运行三.退出.exit 或者 .quit 四.SQLite支持如下5种数据类型 1.NULL:空值。 五.联系人表格结构如下create table contact(id integer primary key autoincrement, lastname varchar(20),firstname varchar(20),51); font-family:Arial; line-height:25.98958396911621px"> mobile varchar(30),telephone varchar(20),51); font-family:Arial; line-height:25.98958396911621px"> email varchar(30),company varchar(50),51); font-family:Arial; line-height:25.98958396911621px"> department varchar(16),address varchar(80),51); font-family:Arial; line-height:25.98958396911621px"> id1 interger,id2 integer,updatetime datetime); 六.查看数据库有哪些数据表命令是:.tables 七.如何插入一条记录insert into contact(lastname,firstname,mobile,telephone,updatetime) values('刘','畅','13910128132','010-81749136','2009-07-22'); 八.查看数据表的结构针对整个数据库 .schema 针对仅仅是contact联系人该表 .schema contact 注意没有分号 九.如何打开一个已经创建的数据库sqlite3 test.db 十.如何解决如下问题SQL error: near "sqlite3": syntax error
SQL指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去 十一.如何建立索引create index index_name on table_name(field_to_be_indexed); 十二.如何删除一张数据表drop table contact; 十三.查看当前的数据库.database 十四.如何删除一个数据表的数据delete from contact; 十五.如何导入一个文件到某个表中.import 文件路径 表名 注意这是非SQL语句,所以不加分号 十六.如何设置文件字段的分隔符 .separator “,”
>SQLite3 d:/test.db 回车 就生成了一个test.db在d盘。 这样同时也SQLite3挂上了这个test.db 2) 用.help可以看看有什么命令 >.help 回车即可 3)可以在这里直接输入SQL语句创建表格用;结束,然后回车就可以看到了 4)看看有创建了多少表 >.tables 5)看表结构 >.schema 表名 6)看看目前的数据库 >.database 7)如果要把查询输出到文件 >.output 文件名 > 查询语句; 查询结果就输出到了文件c:/query.txt >.output stdout .dump 表名 9)退出 >.exit 或者.quit 下载了安装,在安装目录中存在System.Data.SQLite.dll 我们只需要拷贝这个文件到引用目录,并添加引用即可对SQLite数据库操作了 所有的Ado.net对象都是以SQLite开头的,比如SQLiteConnection 连接串只需要如下方式 Data Source=d:/test.db 或者DataSource=test.db--应用在和应用程序或者.net能够自动找到的目录 剩下的就很简单了~~ 由于以前用SQLServer或者ISeries,所以DDL的语法很汗颜 1)创建一个单个Primary Key的table CREATE TABLE [Admin] ( [UserName] [nvarchar] (20) PRIMARY KEY NOT NULL, [Password] [nvarchar] (50) NOT NULL, [Rank] [smallint] NOT NULL, [MailServer] [nvarchar] (50) NOT NULL, [MailUser] [nvarchar] (50) NOT NULL, [MailPassword] [nvarchar] (50) NOT NULL, [Mail] [nvarchar] (50) NOT NULL ) ; 2)创建一个多个Primary Key的table CREATE TABLE [CodeDetail] ( [CdType] [nvarchar] (10) NOT NULL, [CdCode] [nvarchar] (20) NOT NULL, [CdString1] [ntext] NOT NULL, [CdString2] [ntext] NOT NULL, [CdString3] [ntext] NOT NULL, PRIMARY KEY (CdType,CdCode) ) ; 3)创建索引 CREATE INDEX [IX_Account] ON [Account]([IsCheck],[UserName]); 还可以视图等等。 4.还有很有用的SQL Select * from Sqlite_master Select datetime('now') Select date('now') Select time('now') 还有就是尽量使用参数化的SQL,估计和商用DB一样能够自动Prepare. sqlite3 film.db "select * from film;" 输出 HTML 表格: sqlite3 -html film.db "select * from film;" 将数据库「倒出来」: sqlite3 film.db ".dump" > output.sql 利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了): sqlite3 film.db < output.sql 在大量插入资料时,你可能会需要先打这个指令: begin; 插入完资料后要记得打这个指令,资料才会写进数据库中: commit; a INTEGER PRIMARY KEY, b INTEGER ); 在该表上,下列语句 在逻辑上等价于: 有一个新的API叫做sqlite3_last_insert_rowid(), 它将返回最近插入的整数值。注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过,INSERT将会失败, 并返回SQLITE_FULL错误代码。 type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT ); 对于表来说,type 字段永远是 'table',name 字段永远是表的名字。所以,要获得数据库中所有表的列表,使用下列SELECT语句: WHERE type='table' ORDER BY name; 对于索引,type 等于 'index',name 则是索引的名字,tbl_name 是该索引所属的表的名字。不管是表还是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),sql字段为NULL。 (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type='table' ORDER BY name CREATE TEMPORARY TABLE t1_backup(a,b); INSERT INTO t1_backup SELECT a,b FROM t1; DROP TABLE t1; CREATE TABLE t1(a,b); INSERT INTO t1 SELECT a,b FROM t1_backup; DROP TABLE t1_backup; COMMIT; 数据库被 VACUUMed 一个用户存储过程定义被删除或改变。 一个 collation 序列定义被删除或改变。 认证函数被改变。 在所有情况下,解决方法是重新编译并执行该SQL语句。 因为一个已准备好的语句可以由于其它进程改变数据库模式而失效,所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代码都应准备处理 SQLITE_SCHEMA 错误。下面给出一个例子: sqlite3_stmt *pStmt; char zSql[] = "SELECT ....."; /* Compile the statement from SQL. Assume success. */ sqlite3_prepare(pDb,zSql,-1,&pStmt,0); /* Do something with the row of available data */ } ** occured,then the above call to sqlite3_step() will have ** returned SQLITE_ERROR. sqlite3_finalize() will return ** SQLITE_SCHEMA. In this case the loop will execute again. */ rc = sqlite3_finalize(pStmt); } while( rc==SQLITE_SCHEMA ); 在做ClinicOS的时候遇到一个问题,在保存病历登记时间时,我使用了“CURRENT_TIMESTAMP”,但这有个问题,它返回的是UTC Time,这对我们中国人没啥用,一直希望能想办法将它转为localtime。今天刚好有空,所以去查了查Sqlite的Mail List,果然也有人遇到了这个问题,我从一篇名为《translate time comparison statement》(http://www.mail-archive.com/sqlite-users@sqlite.org /msg12350.html)中看到这样的回复: |