前言数据在实际工作中应用广泛,数据库产品很多,oracle、DB2、SQL2000、mySQL;基于嵌入式Linux的数据库主要有SQLite、Firebird、BerkeleyDB、eXtremeDB。本文主要讲解数据库SQLite。通过这个开源的小型嵌入式数据库,将引导您掌握一些基本的数据库操作。这些操作在很多系统中都很常见,可以说是学无止境。SQLiteSQLite,是一个轻量级的数据库,一个符合ACID的关系型数据库管理系统,包含在一个比较小的C库中。作者D.RichardHipp2000年1月,Hipp开始与同事讨论创建一个简单的嵌入式SQL数据库的想法,该数据库将使用GNUDBM哈希库(gdbm)作为后台,并且该数据库不需要安装和管理支持。后来一有空,Hipp就开始着手实施这项工作,并于2000年8月发布了SQLite1.0版本。【在此给大神跪下!】它的设计目标是嵌入式,目前已经在很多嵌入式产品中得到应用。它占用的资源非常少。在嵌入式设备中,可能只需要几百K的内存就足够了。可支持Windows/Linux/Unix等主流操作系统,可与多种编程语言结合,如Tcl、C#、PHP、Java等,具有ODBC接口。就世界著名的数据库管理系统而言,它的处理速度比它们还快。SQLite的特点是零配置——无需安装和管理配置;存储在单个磁盘文件中的完整数据库;数据库文件可以在不同字节序的机器之间自由共享;支持最大2TB的数据库;足够小,所有源代码大约310,000行c代码,250KB;比当前流行的大多数数据库数据操作更快。安装现在主要是运行sqlite3版本,在ubuntu下安装也很方便。sudoapt-getinstallsqlitesqlite3安装应用程序sudoapt-getinstalllibsqlite3-dev安装库+头文件。使用代码操作数据库,必须安装查看版本号:输入命令sqlite3进入操作界面,输入命令.version查看详细版本号。也可以使用如下命令安装图形化运行工具:sudoapt-getinstallsqlitebrowser图形化运行工具创建数据库。另外在windows下也可以部署。本文只讨论ubtuntu,使用命令行操作数据库。数据类型操作数据库,主要是操作表。表的每一列都有一定的数据类型,如整数值、字符串、布尔值等。Sqlite3的主要数据类型如下:数据类型定义数据类型NULL表示值为NULL。INTEGER无符号整数值。真正的浮点值。TEXT文本字符串,用于存储的编码有UTF-8、UTF-16BE、UTF-16LE。BLOB存储的是Blob数据,和输入数据完全一样,1表示真,0表示假。同时,sqlite3还接受以下数据类型:数据类型定义smallint16位整数。整数32位整数。decimal(p,s)精确值p表示一共有多少位小数,s表示小数点后可以有多少位小数。如果不指定,系统默认为p=5s=0。float32位实数。双64位实数。char(n)长度为n的字符串,n不能超过254。varchar(n)长度不固定,最大长度为n的字符串,n不能超过4000。graphic(n)同char(n),但它的单位是两个字节,n不能超过127。这种形式是为了支持长度为两个字节的字体,比如汉字。vargraphic(n)变长双字符字符串,最大长度为n,n不能超过2000date包含年、月、日。time包含小时、分钟和秒。timestamp包含年、月、日、时、分、秒、千分之一秒。约束表的每一列都有一些限制性的属性,比如有些列的数据不能重复,有些限制了数据范围等,约束是用来进一步描述每一列的数据属性的。SQLite数据库中常用的约束如下:名称定义NOTNULL-非空UNIQUE唯一PRIMARYKEY主键FOREIGNKEY外键CHECK条件校验DEFAULT默认非空NOTNULL有一些字段我们可能不知道该填什么一会儿,又没有设置默认值,在添加数据的时候,我们把这样一个字段留空,系统就认为它是NULL。但是还有一类字段必须填写数据。如果不填写,系统会报错。此类字段称为NOTNULL非空字段,需要在定义表时提前声明。UniqueUNIQUE除了主列外,还有一些列不能有重复值。主键PRIMARYKEY一般是整数或者字符串,只要保证唯一即可。在SQLite中,如果主键是整数类型,则该列的值可以自动增加。外键FOREIGNKEY我们的数据库中已经有一个Teachers表。如果我们再创建一张Students表,Students表中的每个学生都需要对应Teachers表中的一位老师。很简单,只需要在Students表中创建一个TeacherId字段,保存对应教师的Id号,这样学生和教师之间的关系就建立起来了。问题是:我们可以用不在Teachers表中的TeacherId值存储一个学生,并且不会捕获错误。这种情况下,可以将Students表中的TeacherId字段声明为外键,使其值对应Teachers表中的Id字段。这样一旦在Students表中存入了一个不存在的teacherId,系统就会报错。默认值DEFAULT有一些特殊的字段列,在每条记录中,他的值基本相同。只是在个别情况下改为其他值。我们可以为这样的字段列设置一个默认值。条件检查CHECK有些值必须满足一定的条件才允许存储,这就需要使用这个CHECK约束。常用命令下面介绍Shell模式下常用命令的用法。命令功能.help可以显示shell模式下可以使用的所有命令列表.database显示数据库信息;包含当前数据库的位置。modecolumn使SQL语句处理的结果以列对齐的方式显示。modelistcolumn.headerson/off打开和关闭列标题显示开关,以便查询结果在屏幕上显示时有列标题。tables列出当前打开的数据库中的表数。exit退出SQLite环境。schemafoods显示创建表foods时的SQL语句。schemadisplayStatementswhenalltablescreated.nullvalueSTRING查询时用指定的字符串替换输出的NULL字符串。默认为.nullvalue''.show显示shell中定义的输出相关的一些设置mode.outputfile.csv设置输出文件格式为CSV,文件名为file.csv.separator,列数据输出通过select语句设置为&ldq哦;,"单独的.outputstdout将输出恢复到标准输出设备(屏幕)【注】sqlite的命令都是以.开头的,操作语句前面没有.。我们用一些例子让大家理解这些数据库基本操作表类型假设我们要创建一个教学管理数据库jxgl.db,数据库中要保存学生表STUDENTsnosnamessexsagesdept95001yikoum21cs95002pengm21cs根据我们的常识,每一列的数据有以下特点:主键;snamename:一般为字符串,可以重复,但不能为空;ssexgender:字符串,可以为空;sageage:整数值,假设年龄大于14;sdeptmajor:字符串可以为空,并且这里我们默认为“CS”。接下来,我们将一步步实现对这个数据库的所有操作。要打开和退出教学管理“jxgl”数据库,请使用以下命令。创建表:CREATETABLEIFNOTEXISTSSTUDENT(Snointegerprimarykey,Snametextnotnull,Ssextext,Sageintegercheck(Sage>14),Sdepttextdefault'CS');表的属性是上一节表属性的执行结果:查看表:看到STUDENT,说明表创建起来了。[注意]操作语句不是命令,所以不要加。在它之前;它后面必须跟有操作语句;末尾,如果缺少,必须用分号填充;操作语句对字母的全角和半角非常敏感,所有符号都必须使用半角。插入数据插入数据使用insertinto语句实现,如下所示:INSERTINTOSTUDENTVALUES('95001','李勇','M',20,'CS');INSERTINTOSTUDENTVALUES('95002','刘晨','F',19,'IS');INSERTINTOSTUDENTVALUES('95003','王敏','F',18,'MA');INSERTINTOSTUDENTVALUES('95004','张丽','M',18,'是');执行结果如下:插入的数据只初始化了部分值,非null的列必须赋值,表名不区分大小写。insertintostudent(sname,sage)values('一口',19);查看表使用SELECT语句查看表的内容:SELECT*FROMSTUDENT;其中*表示查看所有数据信息。有没有看到结果看着不舒服,我们来调整一下显示格式:sqlite>.headerson显示列名sqlite>.modecolumn列对齐删除一行信息deletefromstudentwheresname='onebite';从上图可以看出,名字是“一口咬一口”被删掉了。修改某条记录的某内容UPDATEstudentSETsage=29WHEREsname='张丽';修改数据表结构。要修改表结构,需要使用语句ALTERTABLE。接下来,我们在STUDENT表中增加一个“spwd”列,其数据类型为TEXT,并使用SELECT命令查看表中的内容。ALTERTABLESTUDENTADDspwdTEXTdefault'123456';修改表名altertablestudentrenametostu;删除数据表。DROPTABLESTUDENT;删除列sqlite3并没有实现删除列的命令。实现这个操作需要先将表复制到新表中,但只整合需要的列,要删除的列不会被继承。您可以通过以下方式删除列:sqlite>createtabletestasselectsno,sname,ssex,sage,sdeptfromstu;sqlite>droptablestu;sqlite>altertabletestrenametostu;从上图可以看出,我们刚刚添加的spwd这一列已经被删除了。SQLite高级where子句不想查看所有数据,想查看某个人的信息怎么办?我们需要使用where子句来实现。where子句可以与操作语句结合,对进程进行增删改查,是最常用的子句。根据姓名查找记录:Select*fromstudentwheresname='一口';根据学号查找记录:Select*fromstudentwheresno=95001;同时根据姓名和年龄查找记录:select*fromstudentwheresname='一口'andsage=19;显示两列selectsno、snamefromstudent的数据;数据库备份与恢复现在假设我们要将表foods备份为foodsdb.sql,并通过命令恢复数据库。只需按照以下步骤操作。sqlite>.dump--在屏幕上显示所有建表和向表中插入记录的SQL语句将基础表的SQL语句中的数据插入到output指定的文件中sqlite>.outputstdout--将输出内容恢复到标准输出设备(屏幕)sqlite>.dump——此时,输出SQL语句返回到屏幕sqlite>Droptablefoods;--deletefoodstable语句说明:上面的Drop是一条SQL语句,用于删除指定的表。因为是SQL语句,所以以“;”结尾namesqlite>.dump--将创建并插入到基本表的SQL语句输出到output指定的文件中sqlite>.outputstdout--将输出内容恢复到标准输出设备(屏幕)sqlite>.dump--将SQL此时输出语句回屏sqlite>Droptablefoods;--删除foods表语句说明:嗯,跟着一口君一步步操作,基本就是sqlite3的增删改查操作,相信你应该没问题,sqlite还有其他的子句以及函数的用法,我会在下一篇继续介绍。本文转载自微信公众号“一口Linux”,可通过以下二维码关注。转载本文请联系易口Linux公众号。
