分类: c/c+程序设计 2012-10-26 13:45 6089人阅读
评论(1) 收藏 举报 目录(?)[+] 建立
数据库档案 用
sqlite3建立
数据库的
方法很简单,只要在shell下键入(以下$符号为shell
提示号,请勿键入): $
sqlite3 foo.db 如果目录下没有foo.db,
sqlite3就会建立这个
数据库。
sqlite3并没有强制
数据库档名要怎么取,因此如果你喜欢,也可以取个例如foo.icannameitwhateverilike的档名。 在
sqlite3
提示列下操作 进入了
sqlite3之后,会看到以下
文字:
sqlite version 3.1.3 Enter ".help" for instructions
sqlite> 这时如果使用.help可以取得求助,.quit则是离开(请注意:不是quit)
sql的指令格式 所以的
sql指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,
sqlite3会略过去。 建立资料表 假设我们要建一个名叫film的资料表,只要键入以下指令就可以了: create table film(title,length,year,starring); 这样我们就建立了一个名叫film的资料表,里面有name、length、year、starring四个字段。 这个create table指令的语法为: create table table_name(field1,field2,field3,...); table_name是资料表的
名称,fieldx则是字段的名字。
sqlite3与许多
sql数据库软件不同的是,它不在乎字段属于哪一种资料型态:
sqlite3的字段可以储存任何东西:
文字、数字、大量
文字(blub),它会在适时
自动转换。 建立索引 如果资料表有相当多的资料,我们便会建立索引来加
快速度。好比说: create index film_title_index on film(title); 意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为 create index index_name on table_name(field_to_be_indexed); 一旦建立了索引,
sqlite3会在针对该字段作
查询时,
自动使用该索引。这一切的操作都是在幕后
自动发生的,无须使用者特别指令。 加入一笔资料 接下来我们要加入资料了,加入的
方法为使用insert into指令,语法为: insert into table_name values(data1,data2,data3,...); 例如我们可以加入 insert into film values ('Silence of the Lambs,The',118,1991,'Jodie Foster'); insert into film values ('Contact',153,1997,'Jodie Foster'); insert into film values ('Crouching Tiger,Hidden Dragon',120,2000,'Yun-Fat Chow'); insert into film values ('Hours,114,2002,'Nicole Kidman'); 如果该字段没有资料,我们可以填NULL。
查询资料 讲到这里,我们终于要开始介绍
sql最强大的select指令了。我们首先简单介绍select的基本句型: select columns from table_name where expression; 最常见的
用法,当然是倒出所有
数据库的
内容: select * from film; 如果资料太多了,我们或许会想限制笔数: select * from film limit 10; 或是照着电影年份来排列: select * from film order by year limit 10; 或是年份比较近的电影先列出来: select * from film order by year desc limit 10; 或是我们只想看电影
名称跟年份: select title,year from film order by year desc limit 10; 查所有茱蒂佛斯特演过的电影: select * from film where starring='Jodie Foster'; 查所有演员名字开头叫茱蒂的电影('%' 符号便是
sql 的万用字符): select * from film where starring like 'Jodie%'; 查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影
名称和年份: select title,year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10; 有时候我们只想知道
数据库一共有多少笔资料: select count(*) from film; 有时候我们只想知道1985年以后的电影有几部: select count(*) from film where year >= 1985; (进一步的各种组合,要去看
sql专书,不过你大概已经知道
sql为什么这么流行了:这种语言允许你将各种
查询条件组合在一起──而我们还没提到「跨
数据库的联合
查询」呢!) 如何更改或
删除资料 了解select的
用法非常重要,因为要在
sqlite更改或
删除一笔资料,也是靠同样的语法。 例如有一笔资料的名字打错了: update film set starring='Jodie Foster' where starring='Jodee Foster'; 就会把主角字段里,被打成'Jodee Foster'的那笔(或多笔)资料,改回成Jodie Foster。 delete from film where year < 1970; 就会
删除所有年代早于1970年(不含)的电影了。 其他
sqlite的特别
用法 sqlite可以在shell底下直接执行命令:
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; =========================================================================
sqlite3.exe test.db 二.双击
sqlite-3_6_16目录下的程序
sqlite3.exe,即可运行 三.
退出 .exit 或者 .quit 四.
sqlite
支持如下5种数据类型 1.NULL:空值。 2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。 3.REAL:浮点数字,存储为8-byte IEEE浮点数。 4.TEXT:字符串文本。 5.BLOB:二进制对象。 五.联系人表格结构如下 create table contact(id integer primary key autoincrement,lastname varchar(20),firstname varchar(20),mobile varchar(30),telephone varchar(20),email varchar(30),company varchar(50),department varchar(16),address varchar(80),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 “,” .import e:/contact.txt contact 十七.如何查看当前
sqllite字段的分隔符是什么? .show 十八.如何将
查询结果导出到一个
文件 第一步:.output a.txt 第二步:执行要导出的
sql语句 第三步:.output stdout 十九.
SQL查询语句 select * from film order by year limit 10; select * from film order by year desc limit 10; select count(*) from film; select * from film where starring like 'Jodie%'; select * from film where starring='Jodie Foster'; select title,year from film order by year desc limit 10; select columns from table_name where expression; 最常见的
用法,当然是倒出所有
数据库的
内容: select * from film; 如果资料太多了,我们或许会想限制笔数: select * from film limit 10; 或是照着电影年份来排列: select * from film order by year limit 10; 或是年份比较近的电影先列出来: select * from film order by year desc limit 10; 或是我们只想看电影
名称跟年份: select title,year from film order by year desc limit 10; 查所有茱蒂佛斯特演过的电影: select * from film where starring='Jodie Foster'; 查所有演员名字开头叫茱蒂的电影('%' 符号便是
sql 的万用字符): select * from film where starring like 'Jodie%'; 查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影
名称和年份: select title,year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10; 有时候我们只想知道
数据库一共有多少笔资料: select count(*) from film; 有时候我们只想知道1985年以后的电影有几部: select count(*) from film where year >= 1985; (进一步的各种组合,要去看
sql专书,不过你大概已经知道
sql为什么这么流行了:这种语言允许你将各种
查询条件组合在一起──而我们还没提到「跨
数据库的联合
查询」呢!) 如何更改或
删除资料 了解select的
用法非常重要,因为要在
sqlite更改或
删除一笔资料,也是靠同样的语法。 例如有一笔资料的名字打错了: update film set starring='Jodie Foster' where starring='Jodee Foster'; 就会把主角字段里,被打成'Jodee Foster'的那笔(或多笔)资料,改回成Jodie Foster。 delete from film where year < 1970; 就会
删除所有年代早于1970年(不含)的电影了。 其他
sqlite的特别
用法 sqlite可以在shell底下直接执行命令:
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; 创建
数据库文件: >
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 8)把表结构
输出,同时索引也会
输出 .dump 表名 9)
退出 >.exit 或者.quit 2。从http://
sqlite.phxsoftware.com/ 下载Ado.net驱动。 下载了安装,在安装目录中存在System.Data.
sqlite.dll 我们只需要拷贝这个
文件到引用目录,并
添加引用即可对
sqlite
数据库操作了 所有的Ado.net对象都是以
sqlite开头的,比如
sqliteConnection 连接串只需要如下方式 Data Source=d:/test.db 或者DataSource=test.db--应用在和应用程序或者.net能够
自动找到的目录 剩下的就很简单了~~ 3。
sql语法 由于以前用
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')
sqlite 内建
函数表 算术
函数 abs(X) 返回给定数字表达式的绝对值。 max(X,Y[,...]) 返回表达式的最大值。 min(X,...]) 返回表达式的最小值。 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,...]) 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() oh,还有就是看到有人说,好像成批插入的时候,启动事务,比不启动事务快n倍 还有就是尽量使用参数化的
sql,估计和商用DB一样能够
自动Prepare. ===========
sqlite可以在shell/dos command底下直接执行命令:
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;
sqlITE深入------常见问题 如何建立
自动增长字段? 简短回答:声明为 INTEGER PRIMARY KEY 的列将会
自动增长 。 长一点的答案: 如果你声明表的一列为 INTEGER PRIMARY KEY,那么, 每当你在该列上插入一NULL值时, NULL
自动被转换为一个比该列中最大值大1的一个整数,如果表是空的, 将会是1。 (如果是最大可能的主键9223372036854775807,那个,将键值将是
随机未使用的数。) 如,有下列表: CREATE TABLE t1( a INTEGER PRIMARY KEY,b INTEGER ); 在该表上,下列语句 INSERT INTO t1 VALUES(NULL,123); 在逻辑上等价于: INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123); 有一个新的API叫做
sqlite3_last_insert_rowid(), 它将返回最近插入的整数值。 注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中
删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上
增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过,INSERT将会失败, 并返回
sqlITE_FULL
错误代码。 多个应用程序或一个应用程序的多个实例可以同时访问同一个
数据库文件吗? 多个进程可同时打开同一个
数据库。多个进程可以同时进行SELECT 操作,但在任一时刻,只能有一个进程对
数据库进行更改。
sqlite使用读、写锁控制对
数据库的访问。(在Win95/98/ME等
不支持读、写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意: 如果
数据库文件存放于一个NFS
文件系统上,这种锁机制可能不能正常工作。 这是因为fcntl()
文件锁在很多NFS上没有正确的实现。 在可能有多个进程同时访问
数据库的时候,应该避免将
数据库文件放到NFS上。在Windows上,Microsoft的文档中说:如果使用 FAT
文件系统而没有运行 share.exe 守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络
文件,
文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享
数据库可能会引起不期望的问题。 我们意识到,没有其它嵌入式的
sql 数据库引擎能象
sqlite 这样处理如此多的并发。
sqlite允许多个进程同时打开一个
数据库,同时读一个
数据库。当有任何进程想要写时,它必须在更新过程中锁住
数据库文件。但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的
sql数据库引擎同时只允许一个进程连接到
数据库。 但是,Client/Server
数据库引擎(如 Postgre
sql,
MysqL,或 Oracle)通常
支持更高级别的并发,并且允许多个进程同时写同一个
数据库。这种机制在Client/Server结构的
数据库上是可能的,因为总是有一个单一的服务器进程很好地控制、协调对
数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server 结构的
数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。 当
sqlite试图访问一个被其它进程锁住的
文件时,缺省的行为是返回
sqlITE_BUSY。 可以在C
代码中使用
sqlite3_busy_handler() 或
sqlite3_busy_timeout() API
函数调整这一行为。 在
sqlite
数据库中如何列出所有的表和索引? 如果你运行
sqlite3 命令行来访问你的
数据库,可以键入 “.tables”来获得所有表的列表。或者,你可以输入“.schema” 来看整个
数据库模式,
包括所有的表的索引。输入这些命令,后面跟一个LIKE模式匹配可以限制
显示的表。 在一个 C/C++ 程序中(或者脚本语言使用 Tcl/Ruby/Perl/Python 等) 你可以在一个特殊的名叫
sqlITE_MASTER 上执行一个SELECT
查询以获得所有 表的索引。每一个
sqlite
数据库都有一个叫
sqlITE_MASTER 的表, 它定义
数据库的模式。
sqlITE_MASTER 表看起来如下: CREATE TABLE
sqlite_master ( type TEXT,name TEXT,tbl_name TEXT,rootpage INTEGER,
sql TEXT ); 对于表来说,type 字段永远是 'table',name 字段永远是表的名字。所以,要获得
数据库中所有表的列表,使用下列SELECT语句: SELECT name FROM
sqlite_master WHERE type='table' ORDER BY name; 对于索引,type 等于 'index',name 则是索引的名字,tbl_name 是该索引所属的表的名字。不管是表还是索引,
sql字段是原先用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。对于
自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),
sql字段为NULL。
sqlITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。 它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令
自动更新。 临时表不会出现在
sqlITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫
sqlITE_TEMP_MASTER 的表中。
sqlITE_TEMP_MASTER 跟
sqlITE_MASTER 差不多,但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表, 不管是永久的还是临时的,可以使用类似下面的命令: SELECT name FROM (SELECT * FROM
sqlite_master UNION ALL SELECT * FROM
sqlite_temp_master) WHERE type='table' ORDER BY name 在
sqlite中,VARCHAR字段最长是多少?
sqlite 不强制 VARCHAR 的长度。 你可以在
sqlITE 中声明一个 VARCHAR(10),
sqlite还是可以很高兴地允许你放入500个字符。 并且这500个字符是原封不动的,它永远不会被截断。
sqlite
支持二进制大对象吗?
sqlite 3.0 及以后版本允许你在任何列中存储 BLOB 数据。 即使该列被声明为其它类型也可以。 在
sqlite中,如何在一个表上
添加或
删除一列?
sqlite 有有限地 ALTER TABLE
支持。你可以使用它来在表的末尾
增加一列,可更改表的
名称。 如果需要对表结构做更复杂的改变,则必须重新建表。重建时可以先将已存在的数据放到一个临时表中,
删除原表, 创建新表,然后将数据从临时表中复制回来。 如,假设有一个 t1 表,其中有 "a","b","c" 三列, 如果要
删除列 c ,以下过程描述如何做: BEGIN TRANSACTION; 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; 在
数据库中
删除了很多数据,但
数据库文件没有变小,是Bug吗? 不是。当你从
sqlite
数据库中
删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。 当你下次插入数据时,这部分空间可以重用。磁盘空间
不会丢失,但也不会返还给操作系统。 如果
删除了大量数据,而又想缩小
数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头重新组织
数据库。这将会使用
数据库有一个空的“自由链表”,
数据库文件也会最小。但要注意的是,VACUUM 的执行会需要一些时间(在
sqlite开发时,在Linux上,大约每M字节需要半秒种),并且, 执行过程中需要原
数据库文件至多两倍的临时磁盘空间。 对于
sqlite 3.1版本,一个 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打开。
sqlITE_SCHEMA error是什么
错误?为什么会出现该
错误? 当一个准备好的(prepared)
sql语句不再有效或者无法执行时, 将返回一个
sqlITE_SCHEMA
错误。发生该
错误时,
sql语句必须使用
sqlite3_prepare() API来重新编译. 在
sqlite 3 中,一个
sqlITE_SCHEMA
错误只会发生在用
sqlite3_prepare()/
sqlite3_step()/
sqlite3_finalize() API 执行
sql 时。而不会发生在使用
sqlite3_exec()时。 在版本2中不是这样。 准备好的语句失效的最通常原因是:在语句准备好后,
数据库的模式又被
修改了。另外的原因会发生在:
数据库离线:DETACHed.
数据库被 VACUUMed 一个
用户存储过程定义被
删除或改变。 一个 collation 序列定义被
删除或改变。 认证
函数被改变。 在所有情况下,
解决方法是重新编译并执行该
sql语句。 因为一个已准备好的语句可以由于其它进程改变
数据库模式而失效,所有使用
sqlite3_prepare()/
sqlite3_step()/
sqlite3_finalize() API 的
代码都应准备处理
sqlITE_SCHEMA
错误。下面给出一个例子: int rc;
sqlite3_stmt *pStmt; char z
sql[] = "SELECT ....."; do { /* Compile the statement from
sql. Assume success. */
sqlite3_prepare(pDb,z
sql,-1,&pStmt,0); while(
sqlITE_ROW==
sqlite3_step(pStmt) ){ /* Do something with the row of available data */ } /* Finalize the statement. If an
sqlITE_SCHEMA error has ** 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 ); 如何在字符串中使用单引号(')?
sql 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。在这方面
sql 用起来类似Pascal 语言。
sqlite 尊循标准。如: INSERT INTO xyz VALUES('5 O''clock');
sqlite中如何返回本地化当前时间? 在做ClinicOS的时候遇到一个问题,在保存病历登记时间时,我使用了“CURRENT_TIMESTAMP”,但这有个问题,它返回的是UTC Time,这对我们中国人没啥用,一直希望能想办法将它转为localtime。今天刚好有空,所以去查了查
sqlite的Mail List,果然也有人遇到了这个问题,我从一篇名为《translate time comparison statement》(http://www.mail-archive.com/
sqlite-users@
sqlite.org /msg12350.html)中看到这样的
回复: 二十.如何更新表中数据 update contact set lastname=’江南七怪’where id = 1028 update contact set lastname='江南七怪',mobile='13912345678' where id=1028; 二十一.如何一次插入多个数据 Insert into SAMPLE(PRJNUM,PRJNAME,EMYNUM,EMYNAME,SALCATEGORY,SALPACKAGE) values(100001,'TPMS',200001,'Johnson','A',2000),(100001,200002,'Christine','B',3000),200003,'Kevin','C',4000),(100002,'TCT',200004,'Apple',3000);