网络编程 第五天 数据库&项目

数据库

1. 基础知识:

1)数据存储三种方式

a. 直接地址存储:没有文件系统的情况,采用直接地址存储(非常不方便,不容易扩充)
b. 文件:(数据量不大,数据规律性不强,而且需要方便读取,那就放到文件中) 用户名, 密码
c. 数据库 :(学生管理系统、库存系统)

2)分类:

大型数据库:(银行、电信、qq、百度、京东、阿里)
大型数据库: Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅
Oracle/sybase/DB2
IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统, 支持包括Linux在内的一系列平台

中型数据库:
中型数据库 Server是微软开发的数据库产品,主要支持windows平台小型数据库 mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购。开放源码
sql server (微软)
mysql (甲骨文,开源)

小型数据库:
SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。
SQLite对于其他数据库有什么优势:

  • 不需要配置,不需要安装和管理 不需要一个单独的服务器进程或操作的系统(无服务器的)
    一个完整的SQLite数据库存储在一个单一的跨平台的磁盘文件上

  • SQLite是非常小的,轻量级的数据库,完全配置时小于400KiB,省略可选功能配置时小于250KiB

  • SQLite是一个自给自足的数据库,这也就意味着不需要任何外部的依赖 SQLite事务是完全兼容ACID的,允许从多个进程或线程安全访问

  • SQLite支持SQL92(SQL2)标准的大多数查询语言的功能 SQLite使用ANSI-C编写的,并提供了简单和易于使用的API

  • SQLite可在UINX(Linux,MaxOS-X,Android,iOS)和Windows(Win32,WinCE,WinRT)中运行

2.数据库中有哪些概念

数据库: 数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
如:my.db 文件,就是一个数据库文件
数据表: 描述某一个事物的基本信息的表
如: 图书管理系统
学生信息表: 编号 姓名 性别 年龄 班级 爱好
图书信息表: 图书编号 书名 出版社 作者 分类
借阅表:
记录 : 表里面的一条信息
字段 : 列名

SQLite3基本操作

  1. a. 命令 和 SQL语句
    b. sql 脚本
    c. c 编程接口

  2. 命令 和 SQL语句 -安装deb安装包的命令
    sqlite软件安装
    sudo dpkg -i *.deb

  3. *常用命令
    显示所有命令  sqlite> .help
    退出sqlite3  sqlite>.quit
    .schema   //查看表
    显示当前打开的数据库文件   sqlite>.database
    .databases    数据库的 基本信息 路径
    显示数据库中所有表名   sqlite>.tables
    .mode column   设置列对齐
    .header on    打开字段名
    .dump      /表格名/ 查看 数据库 表格的 具体信息

  4. 进出
    linux@ubuntu:~/sqlite3$ sqlite3 doudou.db //如果doudou.db不存在 则创建并打开 存在则打开
    SQLite version 3.7.2
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”//SQL语句必须以分号结尾
    //注意:.开头的语句不用分号
    //SQL语句不区分大小写
    sqlite> .help //.help 求帮助
    sqlite> .quit //.quit 退出
    ctrl+l //清屏
    .schema //查看列的类型

  5. 类型:integer 32bit整数 float 32bit实数
    varchar(n) 长度不固定且最大长度为n的字符串 n<=4000

  6. 创建表 create table 表名(变量名 类型,变量名 类型,…)
    sqlite> create table stu_info(name varchar(20),age integer,id integer);

  7. 插入数据
    部分插入全部:insert into 表名(要插入的字段)values(值)
    sqlite> insert into stu_info(id)values(1004);
    sqlite> select *from stu_info;

    全部插入:insert into 表名 values(值1,值2,值3,…)
    sqlite> insert into stu_info values('小明',12,1001);
    sqlite> select *from stu_info; //查询表的详细信息
    小明|12|1001

  8. 查询
    select name, age from info; 查找 表中 的所有 姓名 和 年龄
    实例:
    sqlite> select *from stu_info where age=12;
    小明|12|1001
    sqlite> select *from stu_info where age>12;
    小丽|13|1003

    多条件查询
    a = b ===== a ==
    > < >= <=
    and 与
    or 或

    例子 :
    sqlite> select *from stu_info where age=12 and id=1001;
    小明|12|1001

    模糊查找 : 查找条件 是字符串 like

    已知 一部分信息 ,查找存在信息的 记录
    select * from 表格名 where 列名 like ‘%信息%’; 找 字符串中 存在 信息的 记录
    select * from 表格名 where 列名 like ‘信息%’; 找 字符串中 开头是 信息的 记录
    select * from 表格名 where 列名 like ‘%信息’; 找 字符串中 结尾是 信息的 记录
    例子 :select * from info where name like ‘zhang%’;
    select * from info where name like ‘%a%’;
    select * from info where name like ‘%an’;

  9. 删除 delete from 表名 where 变量名=值
    sqlite> delete from stu_info where id=1004;
    sqlite> select *from stu_info;
    小明|12|1001
    小红|11|1002
    小丽|13|1003
    sqlite>

  10. 求某列平均值 select avg(列) from 表名
    sqlite> select avg(age) from stu_info;
    12.0
    sqlite> select avg(id) from stu_info;
    1002.0

  11. 求某列和 select sum(列) from 表名
    sqlite> select sum(age) from stu_info;
    36
    sqlite> select *from stu_info;
    小明|12|1001
    小红|11|1002
    小丽|13|1003

  12. 修改 : 更新表格信息
    update 表格名 set 列名1 = 修改后的值, … where 条件;
    sqlite> update stu_info set age=35 where name='小明';
    sqlite> select *from stu_info;
    小明|35|1001
    小红|11|1002
    小丽|13|1003

  13. 删除表 : drop table 表名;
    sqlite> drop table stu_info;
    sqlite> select *from stu_info;
    Error: no such table: stu_info

// 练习: 创建学生成绩表。

要求:
(1)表中的字段:name english linux chinese
(2)添加三名同学信息到表中。
(3)查找linux 成绩 高于 90 的学生信息。
(4)更新某个同学的成绩。

sqlite> create table stu_score(name varchar(20),english integer,linux integer);
sqlite> insert into stu_score values("小明",100,80);
sqlite> insert into stu_score values("小丽",90,91);
sqlite> insert into stu_score values("小红\",89,98);
sqlite> select *from stu_score;
小明|100|80
小丽|90|91
小红\|89|98
sqlite> select *from stu_score where linux>90;
小丽|90|91
小红\|89|98
sqlite> update stu_score set english=60 where name='小明';
sqlite> select *from stu_score;
小明|60|80
小丽|90|91
小红\|89|98

如何用c语言操作数据库

C语言中 数据库实现函数: libsqlite3.so
需要加头文件   #include<sqlite3.h>
编译时 必须加  -lsqlite3

  1. 打开或创建数据库

    #include<sqlite3.h>
    int sqlite3_open(char *pathname,sqlite3 **db)

    功能:打开或创建数据库
    参数1:数据库名 包括路径 如果存在则打开 不存在则创建并打开
    参数2:创建或打开的数据库连接对象
    返回值:成功0 失败返回非0值

    编译:gcc 1.c -lsqlite3

#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
int main()
{
	sqlite3 *db=NULL;
	if(sqlite3_open("stu.db",&db)!=0)	//打开或创建数据库
	{
		perror("sqlite3_open");
		exit(-1);
	}
	return 0;
}
  1. 关闭数据库

    sqlite3_close(sqlite3*db);

    功能:关闭数据库
    返回值:成功返回0 失败返回非0值
    sqlite3_close(db);

  2. 执行SQL语句

    int sqlite3_exec(sqlite3*db,char*sql,NULL,NULL,char**errmsg)

    功能:执行sql语句
    参数1:打开的数据库
    参数2:要执行的sql语句
    参数3: 参数4:传NULL
    参数5:错误信息
    返回值:成功0 失败非0值

实例:

 #include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
int main()
{
	sqlite3 *db=NULL;
	if(sqlite3_open("stu.db",&db)!=0)		//打开或创建数据库
	{
		perror("sqlite3_open");
		exit(-1);
	}
	char *errmsg=NULL;						//数据库错误信息集
	char *sql="create table info(usrname varchar(20),passwd varchar(20))";		//设置SQL语句
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=0)		//执行SQL语句
	{
		//perror("sqlite3_exec");		//错误处理
		exit(-1);
	}
	//printf("%s\n",errmsg);
	sqlite3_close(db);					//关闭数据库
	return 0;
}
  1. 获取最近调用的API接口返回的错误说明

    const char *sqlite3_errmsg((sqlite3 *pdb) //perror

    功能:获取最近调用的API接口返回的错误说明 下一次调用API后 说明会自动清除
    参数:指向数据库的指针
    返回值:错误说明的字符串指针

#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
int main()
{
	sqlite3 *db=NULL;
	if(sqlite3_open("stu.db",&db)!=0)
	{
		printf("sqlite3_errmsg:%s\n",sqlite3_errmsg(db));
		exit(-1);
	}
	char *errmsg=NULL;
	char *sql="create able info(usrname varchar(20),passwd varchar(20))";
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=0)
	{
		printf("sqlite3_errmsg:%s\n",sqlite3_errmsg(db));//报错
		//exit(-1);
	}
	//printf("errmsg:%s\n",errmsg);//报错
	sqlite3_close(db);
	return 0;
}


实例: 
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
int main()
{
	sqlite3 *db=NULL;
	if(sqlite3_open("stu.db",&db)!=0)				//打开或创建库
	{
		printf("sqlite3_errmsg:%s\n",sqlite3_errmsg(db));
		exit(-1);
	}

	
	char *sql="create table info(usrname varchar(20),passwd varchar(20))";
	sqlite3_exec(db,sql,NULL,NULL,NULL);			//创建表
													//向表添加数据		
	sqlite3_exec(db,"insert into info values('linux','123')",NULL,NULL,NULL);
	sqlite3_exec(db,"insert into info values('小明','1')",NULL,NULL,NULL);
	sqlite3_exec(db,"insert into info values('大名','123456')",NULL,NULL,NULL);
	//printf("%s\n",sqlite3_errmsg(db));
	sqlite3_close(db);
	return 0;

}

  1. 获取查询结果

    sqlite3_get_table(sqlite3 *db,char *sql,char ***result,int *row,int *col,char**errmsg);

    功能: 获取查询结果
    参数1: 数据库
    参数2: 要执行的语句
    参数3: 查询后的结果集
    参数4: 结果集的行数
    参数5: 结果集的列数
    参数6: 错误信息
    返回值:成功返回0 失败返回非0值
    注意:返回的查询结果是字符串 每个字段及值都是字符串 返回的行数不包括字段 所以打印时 行数+1(row+1)
    结果集打印:(row+1)*col

  2. 释放结果集空间

    sqlite3_free_table(char**result);

    功能:释放结果集空间

实例: 
#include<stdio.h>
#include<sqlite3.h>

int main()
{
	sqlite3 *db=NULL;
	char **result=NULL;	//设置结果集
	int row,col;		//设置行列
	int i;
	
	sqlite3_open("stu.db",&db);		//创建数据库
	char *sql="select *from info";
	
	sqlite3_get_table(db,sql,&result,&row,&col,NULL);		//查询全部结果,把每个元素放到结果集
	for(i=0;i<(row+1)*col;i++)								//依次输出表中每个元素
	{
		printf("%8s",result[i]);	//1 3 5
		if(i%2!=0)
		{
			putchar('\n');
		}
	}
	sqlite3_free_table(result);		//释放结果集空间
	sqlite3_close(db);				//关闭数据库
	return 0;
}

练习:

键盘输入用户名和密码 程序去数据库中查询 用户名和密码是否正确 如果正确 输出"登录成功!" 错误则输出"登录失败"
create table stu_info(name varchar(20),passwd integer)
1.数据库中存入用户名和密码
2.键盘输入用户名和密码
char usrname[40];
int password;
scanf("%s%d",usrname,&password);

3.去库中匹配 用户名密码是否正确

char sql[100]="\0";
sprintf(sql,"select *from stu_info where name='%s' and passwd=%d",usrname,password);
sqlite3_get_table(db,sql,result,row,col,NULL);

4.打印输出

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
sqlite3 *db=NULL;

void input_data()
{
	char buf[100]="\0";
	char usr[40]="\0";
	int password;
	char sql[100]="\0";
	puts("请输入用户名和密码( 输入‘end’结束)");
	while(1)
	{
		scanf("%s",usr);
		if(strcmp(usr,"end")==0)
		{
			break;
		}
		scanf("%d",&password);			//输入完用户名和密码循环录入表中
		sprintf(sql,"insert into usr_info values('%s',%d)",usr,password);	//插入 
		sqlite3_exec(db,sql,NULL,NULL,NULL);		
		bzero(buf,sizeof(buf));
	}
}

void log_in()
{
	char buf[100]="\0";
	char usr[40]="\0";
	int password,row,col;
	char sql[100]="\0";
	char **result=NULL;

	puts("请输入要登录的用户名和密码:");
	scanf("%s%d",usr,&password);
	//发送格式化输出到 sql 所指向的字符串
	sprintf(sql,"select *from usr_info where name='%s' and passwd=%d",usr,password);
	//在name列中寻找与输入的用户名相同的姓名
	sqlite3_get_table(db,sql,&result,&row,&col,NULL);
	
	if(0==row)		//结果集的行数等于0的时候没查询到
		puts("登录失败!");
	else			//不等于零的时候证明查询成功
		puts("登录成功!");
		
	sqlite3_free_table(result);		//释放错误集空间
}

int main()
{
	char *errmsg=NULL;
	const char*p=NULL;
	int ret = sqlite3_open("kitty.db",&db);		//创建或打开库
	if(ret!=0)
	{
		p =  sqlite3_errmsg(db);
		puts(p);
		exit(-1);
	}

	char sql[100]="create table usr_info(name varchar(40),passwd integer)";		//创建表
	sqlite3_exec(db,sql,NULL,NULL,&errmsg);

	input_data();	//insert 	相当于注册函数
	log_in();		//登录函数
	
	sqlite3_close(db);	//关闭数据库
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值