数据库
一:基础概念
sun
solaris gnu
1、分类: 大型 中型 小型
ORACLE MYSQL/MSSQL SQLITE DBII powdb
关系型数据库
2、名词:
DB 数据库 select update database
DBMS 数据库管理系统
MIS 管理信息系统
OA 办公自动化
3、嵌入式数据库:
sqlite3 www.sqlite.org www.kernal.org
GNU
特点:
1、开源 C语言开发
2、代码量少 1万行左右,总大小10M以内
3、绿色软件无需安装
4、文件型数据库,可以移动。
5、数据容量最大 2T
SQL struct query language
:关系型数据库 非关系 :芒果db
ddl data defination language
建表
dml
新增 修改 删除一行 data modifty
dql
查询 data query language
查询 select
二:sql
命令
C
//系统维护命令
.databases //列出当前库和系统中那个文件在关联
.q or .exit // 退出
.headers on|off //Turn display of headers on or off 显示头信息的开关
.schema ?PATTERN? //列出当前指定的xxx表结构 matching PATTERN
// Add --indent for pretty-printing
.tables ?TABLE? //List names of tables(列出当期数据库中的所有表)
c
//标准SQL语句 //所有的sql语句都以';'结尾
创建一个表:ddl create table 表名(表字段1,表字段2,...);
eg:create table user(id int,name char,age int);
注意:以上表的表字段,支持如下数据类型。int text real(小数) blob(二进制数据)
默认是text类型。char
----------------------------------------------------------------------
删除一个表: drop table 表名;
eg:drop table user;
----------------------------------------------------------------------
向表中增加数据: insert into 表名 (字段名称 ) values (值名称);
eg:insert into user (id,age) values (1,10);
insert into user values(3,"wang",11);
insert into user (age) values ( 12);
----------------------------------------------------------------------
查询表中的数据:
select 列名 from 表名 条件;
eg:select * from user ; 显示表的所有的列
select id from user; 显示id
select id,name from user where age <30 ;
select id,name from user where name = 'lisi' ;
select id,name from user where id>= 2 and id <=5;
//and 和 or 和 not -----对应,用英文,不用符号 && 和 || 和 !
where name like '三一' % 和 _ (通配符)
like + 通配符:模糊查找
%:有任意多的字符(0-任意多),eg:张三,可以 张,可以
可以%张 张%----张结尾的,,,张开头的
_:有一个字符,eg:张_只能匹配张三,张__只能匹配张三三
SELECT * FROM aaa WHERE name LIKE 'zhang%';
asc
select *from user where age>20 or age<50 order by age desc limit 2 ;
-----------------------------------------------------------------------------
修改表中数据:(不加条件的话,可能导致一列都会变)
update 表名 set 表字段 = 值 满足条件:
eg: update user set id = 1 where name = 'li';
update user set id = 1 where name = "li" and passwd = "123";
update user set id = 2 where name = "li" or name = "zhao";
--------------------------------------------------------------------------
删除表中数据:
delete from 表名 满足条件:
eg:delete from user ; ///删除表中所有数据
delete from user where id = 1; ///删除id=1 的数据;
delete from user where id =1 and name = "zhang";
delete from user where id = 1 or id = 2;
c
//插入时间列int int;
插入时间列 int int;
CREATE TABLE user1(id int,name char,age int,dt datetime);'2022-07-01 19:00:00'
insert into user1 values (2,'张三',23,datetime('now','+8 hours'));//该空格,有的地方不要空格
-----------------------------------------------------------------------
自动增长列
sqlite> CREATE TABLE user3(id INTEGER PRIMARY(主键) KEY ASC(升序),name char,age int,dt datetime);
sqlite> insert into user3 (NULL,'李四',23,datetime('now')); //在上一次的对应位置数值上自动 +1
-----------------------------------------------------------------------
asc
where (group by having) order by [desc] limit;//order 以xx方式,desc 倒序,limit 添加限制条件
select * from user where id<10 order by id limit 2;
------------------------------------------------------------
维护命令 //在命令行写
1.数据库的导出
sqlite3 xxx.db .dump > xxx.sql
//将数据库名称为xxx的数据库整体导出到脚本中。
//可以看里面开头和结尾,也是sql语句,用C语言写,程序运行会快
BEGIN TRANSACTION;
COMMIT;
2、数据的导入:
sqlite3 xxx.db < xxx.sql
3、可视化工具安装:
sudo apt-get install sqlitebrowser
三:sql
C语言
c
https://sqlite.org
https://sqlite.org/c3ref/intro.html
c
#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char** argv)
{
sqlite3* db = NULL;
char* errmsg = NULL;
int ret = sqlite3_open("./aaa.db", &db);
if (SQLITE_OK != ret)
{
// 不能perror
fprintf(stderr, "open db error %s\n", sqlite3_errstr(ret));
sqlite3_close(db);
return 1;
}
char sql_cmd[512] =
"insert into user3 "
"values(NULL,'test',110,datetime('now'));";
//因为没有使用回调函数,所以 sql_cmd 只能是除了select 语句之外的其他sql语句
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "exec sql %s error %s\n", sql_cmd, errmsg);
sqlite3_free(errmsg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
return 0;
}
3.1:用sql
导入字典
c
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
sqlite3 *db = NULL;
int ret = sqlite3_open("./aaa.db", &db);
if (SQLITE_OK != ret)
{
fprintf(stderr, "open db error %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
char *errmsg = NULL;
char sql_cmd[1024] = {0};
sprintf(sql_cmd, "drop table dict;");
sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
bzero(sql_cmd, sizeof(sql_cmd));
sprintf(sql_cmd,
"create table dict(id INTEGER PRIMARY KEY ASC,word char,mean text);");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "create table error %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
FILE *fp = fopen("/home/linux/dict.txt", "r");
if (NULL == fp)
{
perror("open");
return 1;
}
while (1)
{
char linebuf[1024] = {0};
if(NULL==fgets(linebuf, sizeof(linebuf), fp))
{
break;
}
char *word = strtok(linebuf, " ");
char *mean = strtok(NULL, "\r");
if (NULL == word || NULL == mean)
{
continue;
}
bzero(sql_cmd, sizeof(sql_cmd));
sprintf(sql_cmd, "insert into dict values(NULL,\"%s\",\"%s\");", word, mean);
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "exec error %s,sql [%s]\n", errmsg,sql_cmd);
sqlite3_free(errmsg);
sqlite3_close(db);
return 1;
}
}
sqlite3_close(db);
fclose(fp);
// system("pause");
return 0;
}
3.2:回调函数
回调函数不一定会调:在通过 by
没有显示,就是show
没有调用
c
对于sqlite3_exec 函数,必须传入,回调函数(因为数据库在返回结果集的,是通过回调函数的result参数反馈出来的)。
如果,结果集有10条记录的话,那么,回调函数会被调用10次。在这个过程中, result 会依次变化,第1条记录,第2条记录,第3条记录,
....第10条记录 。 如果exec 把整个结果集(结果非常多的话),一次性反馈的话。 可能内存不够申请,就会发生异常。
如果没有符合条件的结果集,那么,回调函数不调用。
在回调函数中的返回值,一定要返回0 ; (If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() routine returns SQLITE_ABORT without invoking the callback again and without running any subsequent SQL statements.)
c
#include <sqlite3.h>
#include <stdio.h>
//函数原型:
//查询操作:sqlite3_get_table(); ////select
//int sqlite3_get_table(sqlite3 *db,char *sql,
// char *** rest,int *nrow,int *ncol,
// char ** errmsg);
//show不止一次调用,调用一次,显示一行,一次二重指针,多次调用是三重指针,原函数是三次指针
int show(void*arg,int col,char**result,char** title)
{
static int flag = 0;
if(0 == flag)
{
flag = 1;
for(int i = 0;i<col;i++)
{
printf("%s\t",title[i]);
}
printf("\n");
}
for(int i=0;i<col;i++)
{
printf("%s\t",result[i]);
}
printf("\n");
return 0;
}
int main(int argc, char** argv)
{
sqlite3* db = NULL;
char* errmsg = NULL;
int ret = sqlite3_open("./aaaa.db", &db);
if (SQLITE_OK != ret)
{
// 不能perror
fprintf(stderr, "open db error %s\n", sqlite3_errstr(ret));
sqlite3_close(db);
return 1;
}
char sql_cmd[512] ="select * from aaaa";
//因为没有使用回调函数,所以 sql_cmd 只能是除了select 语句之外的其他sql语句
ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);
if (SQLITE_OK != ret)
{
fprintf(stderr, "exec sql %s error %s\n", sql_cmd, errmsg);
sqlite3_free(errmsg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
return 0;
}
c
id name age dt
2 张三 23 2025-07-29 11:41:46
id name age dt
1 niko 25 2025-07-29 11:50:00
id name age dt
3 k3yoo 24 2025-07-29 11:50:16
//不加标志位的话,标题会多次打印,也说明了show会多次调用
3.3字典查找
c
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
int find(void *arg, int col, char **result, char **title) {
strcpy((char *)arg, result[2]);
return 0;
}
int main(int argc, char **argv) {
sqlite3 *db = NULL;
int ret = sqlite3_open("./aaaa.db", &db);
if (SQLITE_OK != ret) {
fprintf(stderr, "open db error %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
char *errmsg = NULL;
char sql_cmd[1024] = {0};
sprintf(sql_cmd, "drop table dict;");
sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
bzero(sql_cmd, sizeof(sql_cmd));
sprintf(sql_cmd,
"create table dict(id INTEGER PRIMARY KEY ASC,word char,mean text);");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret) {
fprintf(stderr, "create table error %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
FILE *fp = fopen("/home/linux/dict.txt", "r");
if (NULL == fp) {
perror("open");
return 1;
}
bzero(sql_cmd, sizeof(sql_cmd));
strcpy(sql_cmd, "BEGIN TRANSACTION;");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
while (1) {
char linebuf[1024] = {0};
if (NULL == fgets(linebuf, sizeof(linebuf), fp)) {
break;
}
char *word = strtok(linebuf, " ");
char *mean = strtok(NULL, "\r");
if (NULL == word || NULL == mean) {
continue;
}
bzero(sql_cmd, sizeof(sql_cmd));
sprintf(sql_cmd, "insert into dict values(NULL,\"%s\",\"%s\");", word,
mean);
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (SQLITE_OK != ret) {
fprintf(stderr, "exec error %s,sql [%s]\n", errmsg, sql_cmd);
sqlite3_free(errmsg);
sqlite3_close(db);
return 1;
}
}
bzero(sql_cmd, sizeof(sql_cmd));
strcpy(sql_cmd, "COMMIT;");
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
char word[50] = {0};
printf("input word:");
fgets(word, sizeof(word), stdin);
word[strlen(word) - 1] = '\0';
int flag = 0;
sprintf(sql_cmd, "select * from dict where word='%s';", word);
char mean[256] = {0};
ret = sqlite3_exec(db, sql_cmd, find, mean, &errmsg);
if (SQLITE_OK != ret) {
fprintf(stderr, "exec sql %s error %s\n", sql_cmd, errmsg);
sqlite3_free(errmsg);
sqlite3_close(db);
return 1;
}
if (0 == strlen(mean)) {
printf("no such word\n");
} else {
printf("have the word mean is:%s\n",mean);
}
sqlite3_close(db);
fclose(fp);
// system("pause");
return 0;
}
四:网页设计
一:基础概念
html
1.格式 dreamwave
<!DOCTYPE html>
<html >
<head>
<meta charset="utf-8">
<title>中文测试。。。。</title>
</head>
<body>
这里是测试body测试内容。。。
<h1>h1字体</h1>
<h2>h1字体</h>2
<h3>h1字体</h3>
</body>
</html>
------------------------------------------------------------
2.标签 在body内
<h1></h1>双标签 标题 ,加粗,换行 1-6 ---》小
<p></p> 双标签 段落,有换行功效
<hr> 单标签 左到右分割符
<br> 切到下一行
<!-- -->注释
------------------------------------------------------------
3,元素的属性
给元素提供更多的属性,大部分的元素属性
语法:<标签 属性1=参数1 属性2=参数2>
1)align left,right,center
2) bgcolor ,body的属性设置网页的背景色
<body bgcolor="0xff1234" bgcolor="0xff1234">
------------------------------------------------------------
4,文本元素属性
b 元素 <b>内容</b> 加粗
br 换行<br> 如果是p标签中间有间隔
i元素, 字体倾斜<i></i>
del元素 删除文字<del></del>
strong 强调一段文字,效果类似 b标签
u元素,下划线<u></u>
small元素, 超小字体<small></small>
sub 下标<sub></sub>
sup 上标<sup></sup>
<br>h<sub>2</sub>0
<br>100m<sup>2</sup>
ruby,拼音,<ruby>二姐 <rt>(er) (jie)<rt></ruby>,可能部分浏览器不支持。
mark 元素 <mark> </mark> 加黄色背景
--------------------------------------------------------
10,表单 传递参数,数据
<form></form>
<!-- 表单中重要的字元素 input button -->
<!-- 属性 action,指定表单发送的地址 -->
<!-- 属性 method 发送的方式 get,post -->
<!--get方法 数据会附加到url的后面传递给服务器 默认-->
<!--post,将数据包大包发给服务器,等候服务器来读取 -->
13,input元素,(输入框)他是表单的一个字属性
指定表单中的内容项,比如输入内容的文本框
可以指定表单属性,也可以放在表单的外面。
input元素的属性:
type,指定输入框的类型,text单行文本,password密码,submit提交按钮,
reset,重置按键,button按键,普通的按键需要和特定的时间关联。
image:图片式按键
hidden:隐藏字段,该内容不显示在页面上,提交其他的一些变量。
email: 是一个邮箱类型,新特性,可能支持有差异
required:表示内容必须填写,不然不能提交。
name:名称,输入内容识别名称,传递参数时候的参数名称
value: 默认值,输入框默认填入的内容,
maxlength,指定最大长度
placeholder,设置提示信息的
HTML
eg:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> <!-- 设置字符集 -->
<title>中文测试。。。。</title>
<style>
body {
background-color: pink;
}
</style>
</head>
<body>
这里是测试body测试内容。。。
<h1>h1字体</h1>
<h3 style="text-align:center">h3字体</h3>
<h6 align='right'>h6字体</h6>
<h1>
<p>此前,村民守着世界遗产,哈尼梯田却<br><br><br>
生活贫困。2018年,随着"阿者科计划"实施,阿者科村依托特有的资源,村集体旅游公司成立,村民生活改善。
</p>
<hr>
<p>为丰富游客体验,村里推出"自然野趣""哈尼文化"等主题项目,实行菜单式管理。项目带动了本地就业,促使部分外出村民返乡</p>
</h1>
<b>加粗内容</b> <i>字体倾斜</i> <del>删除文字</del> <small>超小字体</small>
h<sub>2</sub>0 100m<sup>2</sup> <ruby>二姐 <rt>(er) (jie)
<rt>
</ruby>
<mark>加黄色背景 </mark>
</body>
</html>
1.1:用html
网页访问,通过数据库判断
c
//ser
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr*(SA);
int send_file(int conn, char* filename)
{
int fd = open(filename, O_RDONLY);
if (-1 == fd)
{
perror("open");
return 1;
}
while (1)
{
char buf[1024] = {0};
int ret = read(fd, buf, sizeof(buf));
if (ret <= 0)
{
break;
}
send(conn, buf, ret, 0);
}
close(fd);
return 0;
}
int main(int argc, char** argv)
{
//监听套接字 功能检测是否有客户端 连连接服务器
int listfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == listfd)
{
perror("socket");
return 1;
}
// man 7 ip
struct sockaddr_in ser, cli;
bzero(&ser, sizeof(ser));
bzero(&cli, sizeof(cli));
ser.sin_family = AF_INET;
// sudo ./s
ser.sin_port = htons(80);//访问1000以下的端口,是系统端口,需要sudo
// 代表本机地址 外部客户端可以连接到服务器
ser.sin_addr.s_addr = INADDR_ANY;
int ret = bind(listfd, (SA)&ser, sizeof(ser));
if (-1 == ret)
{
perror("bind");
return 1;
}
// 同一时刻可以服务器建立连接的排队数
listen(listfd, 3);
socklen_t len = sizeof(cli);
while (1)
{
// 1 建立连接
int conn = accept(listfd, (SA)&cli, &len);
if (-1 == conn)
{
perror("accept");
close(conn);
continue;
}
char buf[1024] = {0};
// 2接收客户端的请求
int rec_ret = recv(conn, buf, sizeof(buf), 0);
if (rec_ret <= 0)
{
close(conn);
continue;
}
printf("%s\n", buf);
// 3 处理请求+回应
//http://127.0.0.1/ 回环,访问自己
// GET / HTTP/1.1\r\n
char* method = strtok(buf, " ");// GET
//统一资源定为符
char* url = strtok(NULL, " ");// /
char* ver = strtok(NULL, "\r");// HTTP/1.1
if (0 == strcmp(url, "/"))
{
send_file(conn, "./02.html"); // login
}
else if (0 == strcmp(url, "/favicon.ico"))//网址图标
{
send_file(conn, "./2.png"); // login
}
// /login?username=zhangsan&userpw=123
else if (0 == strncmp(url, "/login", strlen("/login")))
{
char* name = strchr(url, '=');
name += 1;
char* end = strchr(name, '&');
*end = '\0';
char* pw = strchr(end + 1, '=');
pw += 1;
if (0 == strcmp(name, "zhangsan") && 0 == strcmp(pw, "123"))
{
//账号 ,密码正确 发送功能页面
send_file(conn, "./01.html");
}
else
{
//账号密码错误, 发送密码错误页面
send_file(conn, "./03.html");
}
}
// 4 断开连接
close(conn);
}
close(listfd);
// system("pause");
return 0;
}
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--中文标识 -->
<title>登录</title>
</head>
<body>
<form action='login'> <!-- 属性 action,指定表单发送的地址 -->
用户名: <input type='text' name='username' required='required' placeholder='请输入qq账号'>
<!--type,指定输入框的类型,text单行文本,password密码,submit提交按钮,-->
<!--name:名称,输入内容识别名称,传递参数时候的参数名称-->
<!--required:表示内容必须填写,不然不能提交。 -->
<!--placeholder,设置提示信息的。 -->
密码: <input type='password' name='userpw' required='required' placeholder='请输入qq的密码'>
<!-- password密码-->
<input type='submit'>
<!--submit提交按钮 -->
</form>
<!-- http://127.0.0.1/login?username=niko&userpw=25-->
</body>
</html>
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>密码错误</title>
</head>
<body>
<h1 align="center"><mark>密码错误</mark></h1>
</body>
</html>