网络编程 day05
- 12. SQL 数据库
- 概念
- 常用数据库
- MySQL与SQLite的区别
- SQL基础
- SQL语句使用
- 基本语句的使用—命令行操作
- sqlite3系统命令
- sqlite命令
- sqlite3编程—函数接口
- 13. setsockopt:设置套接字属性
12. SQL 数据库
概念
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库是存放数据的仓库。它的存储空间很大。以一定规则进行存放。
常用数据库
大型数据库 :Oracle
中型数据库 :Server是微软开发的数据库产品,主要支持windows平台
小型数据库 : MySQL是一个小型关系型数据库管理系统。开放源码 (嵌入式不需要存储太多数据)
MySQL与SQLite的区别
- 性能和规模:
MySQL通常用于大型应用程序和网站,用来处理大量数据和高并发访问。
SQLite适合于小型应用程序或移动设备,它是一个轻量级的数据库引擎,不需要独立的服务器进程,可以直接访问本地文件。 - 部署和配置:
MySQL需要单独的服务器进程来运行,需要配置和管理数据库服务器。
SQLite是一个嵌入式数据库,可以直接嵌入到应用程序中,不需要单独的服务器进程。 - 功能和特性:
MySQL提供了更多的功能和高级特性,比如存储过程、触发器、复制和集群支持等。
SQLite则是一个轻量级的数据库引擎,功能相对较少,但对于简单的数据存储和检索已经足够。 - 跨平台支持:
SQLite在各种操作系统上都能够运行
MySQL需要在特定的操作系统上安装和配置数据库服务器。 - 总结:
MySQL适用于大型应用程序和网站,需要处理大量数据和高并发访问。
SQLite适用于小型应用程序或移动设备,对性能和规模要求没有那么高。
SQL基础
SQL特性:
- 无需安装和管理配置
- 储存在单一磁盘文件中的一个完整的数据库
- 数据库文件可以在不同字节顺序的机器间自由共享
- 支持数据库大小至2TB(1024G = 1TB)
- 全部源码大致3万行c代码,250KB
- 比目前流行的大多数数据库对数据的操作要快
SQL语句使用
基本语句的使用—命令行操作
sqlite3系统命令
以”.“开头
- .help // 查看所有支持的命令
- .quit // 退出
- .tables // 查看数据库中的表
- .schema listname // 查看表的表头
sqlite命令
以“;”结尾
- 创建表
create table <表名>(表头 数据类型,表头 数据类型……);
1. 先写变量名,后写数据类型
2. char 既可以表示字符,又可以表示字符串
3. 设置主键:数据类型后面加上primary key
- 删除表
drop table <表名>;
- 向表中插入数据
insert into <表名> values(value1, value2……);
1. 只插入部分字段:insert into <表名>(表头1) values(value1);
- 查找数据
1. 查询表中所有数据:select * from <表名>;
*
表示查询到的内容显示全部的表头
2. 按照条件查询:select * from <表名> where <条件>;
1. 多个条件:条件1 and 条件2……
;条件1 or 条件2……
2. 字符串作为条件:name = "xiaoming"
3. 满足条件的列:select <某列的表头> from <表名> where <条件>;
1. 多个列:<列1,列2……>
4. 查询前n条记录:select * from <表名> limit n;
5. 按照某列从大到小排序:select * from <表名> order by <表头> desc;
- 更新(修改)数据
update <表名> set <修改内容1>,<修改内容2>,……where <条件>;
修改内容:表头 = 内容
- 增加字段,增加一列
alter table <表名> add column <变量名> <数据类型> default <默认值>;
- 删除字段,数据库不支持删除一个字段,删除是伪删除
1. 创建一个新表,从旧表中将需要保留的字段复制到新表中
create table <表名> as select <另一个表的表头>,<另一个表的表头>…… from <另一个表>;
2. 删除原来的表
3. 将新表重命名成旧表
alter table <旧名> rename to <新名>;
- 删除一行
delete from <表名> where <条件>;
sqlite3编程—函数接口
头文件
#include <selite3.h>
静态库编译方式
gcc sqlite.c -lsqlite3
官方手册
- 打开数据库
int splite3_open(char *path, sqlite3 **db);
功能:打开数据库
参数:
char *path
:数据库文件路径
sqlite3 **db
:数据库文件的句柄(相当于文件描述符)
返回值:成功返回SQLITE_OK(0),失败返回错误码
补充:句柄定义成一级指针,使用时传指针的地址
- 返回错误信息
char *sqlite3_errmsg(sqllite3 *db);
功能:获取错误信息
参数:sqlite3 **db
:数据库文件的句柄
返回值:返回错误信息
函数的使用:
fprintf(stderr, "errmsg:%s\n", sqlite3_errmsg(db));
- 关闭数据库
int sqlite3_close(sqlite3 *db);
功能:关闭sqlite数据库
参数:sqlite3 **db
:数据库文件的句柄
返回值:成功返回SQLITE_OK(0),失败返回错误码
- SQL语句
int sqlite3_exec(sqlite3 *db,const char *sql,int (*callback)(void*,int,char**,char**),void *arg,char **errmsg);
功能:执行SQL操作
参数:
sqlite3 **db
:数据库文件的句柄
const char *sql
:要执行的SQL命令,以字符串的形式
int (*callback)(void*,int,char**,char**)
:回调函数
void *arg
:传递给回调函数的参数
char **errmsg
错误信息指针的地址
返回值:成功返回SQLITE_OK(0),失败返回错误码
回调函数:
int callback(void *buf, int num, char **value, char **name)
{static int i = 0;if(i == 0){for(int j = 0; j < num; j++)printf("%s ", name[j]);putchar(10);}for(int j = 0; j < num; j++)printf("%S ", value[j]);putchar(10);
}
功能:select
函数每次找到一个符合条件的记录就自动调用一次回调函数
参数:
void *buf
:sqlite3_exec()
的第4个参数传递
int num
:打印的列数
char **value
:找到符合条件的数据,传递指针的地址
char **name
:需要的表头,传递指针的地址
返回值:成功返回SQLITE_OK(0),失败返回-1,只有每次都饭hi0才会继续下一次回调
- 查询函数
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);
功能:执行SQL的查询操作
参数:
sqlite3 **db
:数据库文件的句柄
const char *sql
:要执行的SQL的查询命令,以字符串的形式
char ***resultp
:用来存放查询的结果,包含表头,二级指针地址传递
int *nrow
:存放查询到的行数,不包含表头,变量地址传递
int *ncolumn
:存放查询到的列数,变量地址传递
char **errmsg
:错误信息,一级指针地址传递
返回值:成功返回SQLITE_OK(0),失败返回错误码
- SQL命令的输入过程
char sql[256] = {};
char ch[128] = {};
int in = -1;
for(int i = 0; i < num;i++)
{sacnf(%s %d, ch, &in);sprintf(sql, "insert into stu values(%d, '%s')", in. ch);sqlite3_exec(db, sql, NULL, NULL.&errmsg);
}
13. setsockopt:设置套接字属性
int setsockopt(int sockfd,int level,int optname,void *optval,socklen_t optlen);
功能:设套接字属性
参数:
int sockfd
:套接字的文件描述符
int level
:协议层
int optname
:选项名
void *optval
:选项值
socklen_t optlen
:选项值大小,int类型:允许1,不允许0
返回值:成功返回0,失败返回-1
SOL_SOCKET 应用层
选项名称 | 说明 | 数据类型 |
---|---|---|
SO_BROADCAST | 允许发送广播数据 | int |
SO_DEBUG | 允许调试 | int |
SO_DONTROUTE | 不查找路由 | int |
SO_ERROR | 获得套接字错误 | int |
SO_KEEPALIVE | 保持连接 | int |
SO_LINGER | 延迟关闭连接 | struct linger |
SO_OOBINLINE | 带外数据放入正常数据流 | int |
SO_RCVBUF | 接收缓冲区大小 | int |
SO_SNDBUF | 发送缓冲区大小 | int |
SO_RCVLOWAT | 接收缓冲区下限 | int |
SO_SNDLOWAT | 发送缓冲区下限 | int |
SO_RCVTIMEO | 接收超时 | struct timeval |
SO_SNDTIMEO | 发送超时 | struct timeval |
SO_REUSEADDR | 允许重用本地地址和端口 | int |
SO_TYPE | 获得套接字类型 | int |
SO_BSDCOMPAT | 与BSD系统兼容 | int |
IPPROTO_IP IP层/网络层
选项名称 | 说明 | 数据类型 |
---|---|---|
IP_HDRINCL | 在数据包中包含IP首部 | int |
IP_OPTINOS | IP首部选项 | int |
IP_TOS | 服务类型 | int |
IP_TTL | 生存时间 | int |
IP_ADD_MEMBERSHIP | 将指定的IP加入多播组 | struct ip_mreq |
IPPRO_TCP 传输层
选项名称 | 说明 | 数据类型 |
---|---|---|
TCP_MAXSEG | TCP最大数据段的大小 | int |
TCP_NODELAY | 不使用Nagle算法 | int |