数据库—sqlite3与SQL命令

1.  SQL功能与主要命令动词

SQL功能释义命令动词
数据定义(DDL)用于定义、删除、和修改数据模式CREATE(创建表)、DROP(删除表)、ALTER(alter table有两个功能,一个是增加列,一个是修改表的名字)
数据查询(DQL)用于查询数据SELECT
数据操纵(DML)用于增、删、改数据INSERT、UPDATE、DELETE
数据控制(DCL)用于控制数据访问权限GRANT、REVOKE、DENY(此类命令本阶段不介绍)

2.  语法

SQL的语法:类似自然语言,每句都以动词开头,表示主要动作;

SQL命令特点:前面没有.,最后以;结束    //例如:select * from mytable;

sqlite3命令特点:前面以.开头,最后没有;  //例如:.tables

示例:  select  id  from  foods  where  name = 'JujyFruit' ;

语句结尾:SQL每个命令语句以“ ;”结尾;

常量:有三种(字符串常量、数据常量、二进制常量);

字符串常量'Jerry'    'Newman'   'JujyFruit'     注意是单引号
数据常量-1   3.142
二进制常量

x'01'   x'0fff'   x'0F0EFF'

保留字:第一个表内的命令均是保留字,不能用作其他标识符;

大小写:SQL不区分大小写;

3.  创建数据库的完整过程:

sqlite3 batabase.db
.database    //查看数据库有无创建成功;
.tables
create table mytable (id integer primary key,name text);
.tables    //查看表有无创建成功;
select * from mytable;
insert into mytable (id,name)values(1,'chen');  //插入记录,注意字符串使用单引号
select * from mytable;  //查看表内所有数据;
//重复insert into...c插入多条记录;
.mode column  //左右分开显示格式;
.head on  //带表头显示;
select * from mytable;
delete from mytable where id=3;  //删除id=3的那条记录;
select * from mytable;
update mytable set name='liang' where name='lang';  //将‘lang'修改为‘liang’;
alter table mytable add column email text not null default '';  //增加列,字段名(列明)是email,text数据类型,not null不空,default‘’是初始化为空字符串,避免为空类型;
select * from mytable;
//以下开始删除一列,采用的办法是复制一个新表,从而只复制需要的列;
create table  newtable as select id,name from mytable;
.table  //此时一共两个表
select * from newtable;
drop table mytable;  //删除旧表;
alter table newtable rename to mytable;  //将新表更名为旧表的名称;
.tables
select * from mytable;
.q  //退出数据库模式;

数据定义(DDL)与数据操纵(DML)类命令具体使用可参考上述例子,下面详细介绍一下数据查询(DQL)命令:select

  • select 命令的基本结构:select <目标列名> from<表的名字> [ where <检索条件表达式> ] [ group by<分组依据列> ] [ having <分组提取条件> ] [ order by <排序依据列> ];
  • SELECT  <目标列名序列> ——(需要哪些列)

     FROM   <表名序列>  ——(从哪些表)

     WHERE <查询条件> ——(根据什么条件)

  • (表名:student)

  • 例子1:查询全体学生的学号与姓名:select sno ,sname from student;

    例子2:查询全体学生的详细记录:select sno, sname, ssex, sage, sdept from student;

                                              等价于:select * from student;

    例子3:查询计算机系(CS)的全体学生:select sname from student where sdept='cs';

    例子4:查询所有年龄在20岁以下的学生及其年龄:select sname, sage, from student where sage < 20;

    例子5:查询年龄在20~23岁之间的学生的姓名、所在系、年龄:select sname,  sdept, sage from student where age between 20 and 23;

  • 例子6:查询年龄不在20~23岁之间的学生姓名、所在系、年龄:select sname,  sdept, sage from student where age  not between 20 and 23;

    例子7:查询信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别:select sname, ssex from student where sdept in ('IS', 'CS', 'MA');

    例子8:查询既不是信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别:select sname, ssex from student where sdept not in ('IS', 'CS', 'MA');

    例子9:查询名字中第2个字为“海”字的学生的姓名和学号:select sname, sno, from, student where sname like '_海%';

    例子10:查询所有不姓“刘”的学生:select sname from student where sname not like '刘%';

    例子11:查询所有以a,b,c开始的产品名称:select productname from products where productname like '[ a-c ]%';

    例子12:查询无成绩的学生的学号和相应的课程号:select sno, cno from student where grade is NULL;

    注意:NULL(空值)不是一个确定的值,所以不能用等于或不等于来比较或者衡量,只能说是空值(is NULL)不是空值(is not NULL)

    多重条件查询,利用逻辑运算符and和or组成多条件查询:例子13:select sname from student where sdept='cs' and sage<20;

    对查询结果进行排序,按<列名>进行升序(ASG)或降序(DESC)排序:例子14:查询全体学生情况,查询结果按所在系的系号升序排列同一系的学生按年龄降序排列select * from student order by sdept asg, sage desc;  //其中asg可省略,系统默认升序;

  • SQL提供的计算函数
    函数名作用举例
    COUNT(*)统计表格中国元组的个数

    select count( id )from mytable;    //其中id是主键,没有空的;

    COUNT(<列名>)统计本列非空列值个数
    SUM(<列名>)计算列值总和(必须是数值型列)
    AVG(<列名>)计算列值平均值(必须是数值型列)
    MAX(<列名>)求列值最大值
    MIN(<列名>)求列值最小值
  •  例子15:统计每门课的选课人数,列出课程号和人数:select cno, COUNT(sno) from student group by cno;对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求得每组的学生人数。

  • hanving 用于对分组自身进行限制,有点像where子句,但他用于组而不是单个记录;例子16:查询选修了三门以上课程的学生学号和选课门数:select sno , COUNT(*) from student group by sno hanving COUNT(*)>3;

4.  数据库C语言API函数(使用例子详情可参考0407中address_v4.0)

        (1)打开数据库

函数原型int sqlite3_open(const char* filename, sqlite** pdb);
函数功能打开一个数据库,若数据库不存在,则自动创建;打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行;
参数1const char* filename 是待打开数据库文件名称,包括路径与名称,一般以.db结尾;
参数2sqlite3** pdb,具体使用时现在外边声明char * pdb,表示pdb是一个指向数据库的指针,然后作为参数时取其地址,就变成二级指针;那么函数调用成功后pdb就指向了该数据库文件;
返回值执行成功返回SQLITE_OK,否则返回其他值;
头文件#include<sqlite3.h>

        (2)关闭数据库

函数原型int sqlite3_close(sqlite* pdb);
函数功能关闭一个已经打开的数据库;
参数1pdb,指向数据库的指针(也叫做数据库句柄);
返回值执行成功就返回SQLITE_OK,否则返回其他值;
头文件#include<sqlite3.h>

        (3)调试数据库

函数原型const char * sqlite3_errmsg( sqlite* pdb );    //一般配合exec使用
函数功能获取最近调用的API接口返回的错误说明,这些错误信息以返回自的形式传给字符串指针,通过该指针可以找到错误信息;并在希望一次调用任何sqlite3 API函数时被自动清除;
参数pdb,打开数据库的句柄
返回值错误说明的字符串指针
头文件#include<sqlite3.h>
函数原型int sqlite3_errcode( sqlite* pdb );    //使用较少
函数功能获取最近调用的API接口返回的错误代码;可以配合perror函数使用,将错误代码的说明打印出来;
参数pdb,打开数据库的句柄
返回值错误代码
头文件#include<sqlite3.h>

        (4)具体SQL命令执行——exec函数

函数原型int sqlite3_exec(sqlite3* pdb, const char* sql, sqlite_callback callback, void* para, char** errmsg);
函数功能编译和执行零个或多个SQL语句,查询的结果返回给回调函数callback;需要配合回调函数使用;
参数1pdb,打开数据库的句柄
参数2

sql,待执行的sql语句字符串,通常以双引号形式字符串;通常直接:

char *sql = NULL;

sql = "select...;";

参数3callback是回调函数,用来处理查询结果,如果不需要回调(比如做insert或者delete时),可以输入NULL;
参数4para,exec函数传给回调函数的值,例如一个标志位(int flag);
参数5接收回调函数返回的异常情况,一般在外边定义成一级字符指针,作为参数是取地址,形成二级指针;
返回值若正常调用返回SQLITE3_OK,异常则是其他值;
头文件#include<sqlite3.h>

        (5)回调函数——配合exec成对使用

函数原型int count_back(void* para,  int columncount, char** columnvalue,  char** columnname);
函数功能在exec函数中执行select功能的SQL命令时,调用该函数,函数名可自定义,适用于分条处理记录值(区别于get_table);
参数1para,从exec函数中传过来的参数指针,比如是标志位(flag,作为参数时要取其地址,作为一级指针);
参数2

columncount,是查询到这一条记录有多少个字段,就是说这条记录有多少列;可以作为for循环打印的终止条件(一列一列地打印);

参数3columnvalue,查询出来的数据都保存在这里,实际上是一个一位数组,每一个元素都是一个指向字符串的指针,指的内容也就是一个字段内容;可以按照二维数组理解和使用,但是它不是二维数组;
参数4columnname,是这一列表头名字,例如“学号”、“姓名”等,
返回值若正常调用返回SQLITE3_OK,异常则是其他值;
头文件#include<sqlite3.h>

        (6)具体SQL命令执行——get_table(与exec函数不同)、free_table;

函数原型int sqlite3_get_table(sqlite3* pdb, const char* sql, char ***presult, int* rowcount, int* columncount, char** errmsg);
函数功能执行SQL语句,通过一维数组返回结果,一般用于数据记录的整体查询,且适用于处理指定的第几条记录;(区别于get_table);
参数1pdb, 打开的数据库句柄;
参数2sql, 待执行的sql语句字符串;
参数3

presult是一个三级指针,本质是一个一位数组,用于存放查询结果的指针,数组(二级指针)若想要带回去由malloc分配的地址,则需要取该指针数组的地址(三级指针);

注意循环打印时,需要将(rowcount+1)*cloumncount的整体作为该一维数组的下标,以%s字符串形式打印出来;

参数4

rowcout, 符号要求的查询出多少条记录(即查询出多少行),但是不包括表头那一行,但是显示有表头;输出参数通过该指针型带回去;

参数5columncount,符号要求的一共多少列,输出参数通过该指针带回;
参数6errmsg,同exec中的参数,通过二级指针带回错误信息说明;
返回值若正常调用返回SQLITE3_OK,异常则是其他值;
头文件#include<sqlite3.h>
函数原型void sqlite3_free_table(char **result);
函数功能释放查询结果占用的内存;
参数1result,通过函数sqlite3_get_table()查询到的记录结果数组(二级指针);
返回值无;
头文件#include<sqlite3.h>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值