news 2026/10/14 6:48:18

数据库及数据库编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库及数据库编程

一.数据库编程
1.什么是数据库(DataBase)?
数据库是用来存储和管理数据的软件,在数据存储的同时给用户提供
方便的数据访问操作接口。

2. 数据库的作用?
存储和管理数据

3. 数据库的核心?
数据库管理系统(DBMS):
原则:用户访问数据库中的数据是要通过 DBMS 来完成的。

4. 应用程序(用户)与 DBMS 的交互方式?
SQL(结构化查询语言):也被称为数据库语言。

5. DBMS(SQL)提供的功能有哪些?
5.1 数据定义语言 DDL
5.2 数据操作语言 DML
5.3 数据查询语言 DQL
5.4 数据控制语言 DCL

6. 数据库对数据的管理方式(层级)
库(DataBase) --> 数据表(Table) ---> 数据(Data)

7. 数据库的基础操作:

预备操作:
1. 登录MYSQL:
terry@ubuntu16:~$ mysql [-h 远程主机IP] -u root -p
省略 -h 选择,表明登录本地MYSQL
2. 退出MYSQL:
mysql> quit / exit

7.1 库的操作:
1.1 查看库
mysql> show databases;
1.2 创建库
mysql> create database [if not exists] 库名;
1.3 删除库
mysql> drop database [if exists] 库名;
1.4 选择库
mysql> use 库名;

7.2 表的操作:

预备知识:
1. MYSQL支持的数据类型:
1) 数值型 (tinyint int float ...)
2) 字符串型 (varchar(20) blob text ... )
3) 时间日期型 (date time datetime ... )
4) 空值类型 NULL
2. MYSQL的完整性约束
1) 非空约束(not null) 作用: 设置某字段取值不能为 NULL
2) 唯一约束(unique key) 作用: 设置某字段取值不能重复
3) 主键约束(primary key) 作用: 唯一区分一条记录,相当于唯一约束和非空约束
4) 默认约束(default) 作用:被默认约束约束的字段,如果未插入数据,则系统将默认值插入
5) 自增约束(auto_increment) 作用:设置某字段取值自动增1,只能修饰整型类型的字段,且与主键连用
6) 外键约束(foreign key) 作用:往往是用来约束两张表,如何避免垃圾数据产生。

引入概念 : 1. 记录: 数据表中一行数据被称为一条记录
2. 字段: 数据表中一列数据被称为一个字段

7.2.1 查看表
mysql> show tables;
7.2.2 创建表
mysql> create table [if not exists] 表名 (字段1 字段类型 [约束],字段2 字段类型 [约束],...);
7.2.3 删除表
mysql> drop table 表名;
7.2.4 查看表结构
mysql> describe/desc 表名;
mysql> show create tabl 表名;
7.2.6 修改表结构
SQL修改表结构的一般格式:alter table 表名 动作 参数
1) 数据表的重命名
mysql> alter table 原表名 rename 新表名;
2) 字段
2.1 增加字段:
mysql> alter table 表名 add 字段名 字段类型 [约束] [位置];

位置: 缺省 代表增加到最末尾
first 代表增加到所有字段头部
after 字段 代表增加到指定字段之后
2.2 删除字段
mysql> alter table 表名 drop 字段名;

2.3 修改字段
2.3.1 修改字段名称
mysql> alter table 表名 change 旧字段名 新字段名 字段类型;
2.3.2 修改字段类型
mysql> alter table 表名 modify 字段名 字段新类型;
2.3.3 调整字段顺序
mysql> alter table 表名 modify 字段名 字段类型 新位置;

新位置: first 代表调整到所有字段头部
after 字段 代表调整到指定字段之后

3) 字符集(charset)
3.1 创建表的同时指定默认字符集
mysql> create table 表名 (字段1 字段类型 [约束],...)default charset=utf8;
3.2 表创建后修改默认字符集
mysql> alter table 表名 convert to character set utf8;

4) 约束
4.1 创建表的同时给相关字段指定约束
4.2 表创建后,如何操作约束:

1) 设置约束:
1.1 设置 主键约束 和 唯一约束
mysql> alter table 表名 add primary key / unique key (字段名);
1.2 设置 非空约束 和 自增约束
mysql> alter table 表名 modify 字段名 字段类型 not null / auto_increment;
1.3 设置默认约束
mysql> alter table 表名 alter 字段名 set default '值';
1.4 设置外键约束
mysql> alter table 表名 add constraint 外键名 foreign key (字段名)
references 主表名(主键字段) [on delete / on update ...]
2) 取消约束:
2.1 取消 主键约束 和 外键约束
mysql> alter table 表名 drop primary key / foreign key 外键名
2.2 取消 非空约束 和 自增约束
mysql> alter table 表名 modify 字段名 字段类型;
2.3 取消默认约束
mysql> alter table 表名 alter 字段名 drop default;
2.4 取消唯一约束
mysql> alter table 表名 drop index 字段名 ;

7.3 数据的操作:
1) DML
1.1 数据增加 (insert into 表名....)
mysql> insert into 表名 [(字段1,字段2,...)] values (值1,值2,...);
mysql> insert into 表名 [(字段1,字段2,...)] values (值11,值12,...),(值21,值22,...)...;

1.2 数据删除 (delete from 表名....)
mysql> delete from 表名; //删除所有数据, 危险(****************)
mysql> delete from 表名 where 条件; //有条件删除数据,实际上操作规范

引出问题:SQL语句中如何构建条件?
SQL提供了比较运算符和逻辑运算符用于条件的构建:
比较运算符; > < >= <= = !=
逻辑运算符: && || ! xor

例子: 字段 > 值
1.3 数据更新 (update 表名 set ....)
mysql> update 表名 set 字段1=值1,字段2=值2...; //更新字段所有数据,
mysql> update 表名 set 字段1=值1,字段2=值2...where 条件; //有条件更新数据

2) DQL (select ... from 表)
2.1 单表基础查询
1) 查询所有数据:
mysql> select * from 表;
2) 查询指定字段数据
mysql> select 字段1,字段2,... from 表;
3) 避免重复查询
mysql> select distinct 字段1,字段2,... from 表;
4) 四则运算查询
mysql> select 字段1 算术运算符 操作数 ,字段2 ... from 表;
5) 带条件的查询
mysql> select 字段1,字段2,... from 表 where 条件;
mysql> select 字段1,字段2,... from 表 where 条件1 && 条件2;
6) 范围查询
mysql> select 字段1,字段2,... from 表 where 字段 between 值1 and 值2;
mysql> select 字段1,字段2,... from 表 where 字段 not between 值1 and 值2;
7) 集合查询
mysql> select 字段1,字段2,... from 表 where 字段 in (值1,值2,值3,....);
mysql> select 字段1,字段2,... from 表 where 字段 not in (值1,值2,值3,....);
8) 空值查询
mysql> select 字段1,字段2,... from 表 where 字段 is null;
mysql> select 字段1,字段2,... from 表 where 字段 is not null;
9) 模糊查询
mysql> select 字段1,字段2,... from 表 where 字段 like '值'

说明: 模糊查询需要借助通配符:
支持的通配符:
%: 通配0,1,多个字符
_: 通配单个字符

例子:select name,salary from employee where name like '_王%';
10) 排序查询:
mysql> select 字段1,字段2,... from 表 order by 字段1 [排序方式],字段2 [排序方式]...;
排序方式: asc 升序 (缺省)
desc 降序
11) 分组查询:
mysql> select 字段1,字段2,... from 表 [where 条件] group by 字段 [having 条件];

注意: 1. 分组查询的目的适用于数据统计
2. 如果想对分组后的结果进行条件过滤,要使用having,不能使用where子句
12) 分页查询
mysql> select 字段1,字段2,... from 表 limit [start,] num;

2.2 多表连接查询
核心思想: 将多张数据表连接生成一张临时的 "大表",大表中集成多个表中的相关数据,
将多表连接查询转换为单表基础查询。

2.2.1 内连接
将多张表同时满足连接条件的记录,组成一条"新纪录"
mysql> select ... from 表1 [inner] join 表2 on 条件1
[inner] join 表3 on 条件3 ...;]
特点: 内连接会筛掉不满足连接条件的记录,
无法保证某个表所有的记录数据都出现在连接后的"大表"中;
如果在连接后的"大表"中要存在某个表的所有记录,表又该如何连接?
2.2.2 外连接
1) 左外连接
在连接后的"大表"中确保存在左表的所有记录,不满足连接条件的
记录,在"大表"右边填充NULL。

mysql> select ... from 表1 left join 表2 on 条件1
left join 表3 on 条件3 ...;
2) 右外连接
在连接后的"大表"中确保存在右表的所有记录,不满足连接条件的
记录,在"大表"左边填充NULL。

mysql> select ... from 表1 right join 表2 on 条件1
right join 表3 on 条件3 ...;
3) 全外连接 (注意:MYSQL不支持全外连接)
在连接后的"大表"中确保既存在左表的所有记录,又存在右表的所有记录
不满足连接条件的记录,在"大表"响应位置填充NULL。

mysql> select ... from 表1 full join 表2 on 条件1
full join 表3 on 条件3 ...;
2.3 子查询(嵌套查询)

子查询: 在一个查询语句的内部又存在一个完整的查询语句
子查询(内部查询)的结果,往往是作为外部查询的条件。

子查询可以针对单表,也可以针对多表。

子查询的形式:
2.3.1 带有 any/some 关键字的子查询
往往针对子查询的结果不唯一,借助查询结果(利用 || or)用来构建多条件

mysql> select ... from 表1 where 字段 运算符 any (select ... from 表...);

2.3.2 带有 all 关键字的子查询
往往针对子查询的结果不唯一,借助查询结果(利用 && and)用来构建多条件

mysql> select ... from 表1 where 字段 运算符 all (select ... from 表...);

2.3.3 带有 in 关键字的子查询
往往针对子查询的结果不唯一,借助查询结果(利用 && and)用来构建多条件

mysql> select ... from 表1 where 字段 in (select ... from 表...);
等价于
mysql> select ... from 表1 where 字段 = any (select ... from 表...);

2.3.4 带有 exists 关键字的子查询
子查询往往不产生结果数据,仅仅用来测试子查询是否存在结果,如果存在结果
执行外部查询,否则外部查询不执行。

mysql> select ... from 表 where exists (select ... from 表...);

2.3.5 利用运算符形成的子查询
子查询往往针对查询结果是唯一的。
mysql> select ... from 表1 where 字段 运算符 (select ... from 表...);

8. 数据库的备份与加载:

MYSQL备份工具: mysqldump

8.1. 备份方法:
terry@ubuntu16:~$ mysqldump -u root -p 待备份的库名 > 目标文件

8.2 数据库文件加载:
1) 创建一个新的库
mysql> create database [if not exists] 库名;

2) 向库中导入数据
2.1 在系统命令行执行如下指令:
terry@ubuntu16:~$ mysql -u root -p 库名 < 备份文件

2.2 在mysql命令行执行如下指令:
mysql> use 库名;
mysql> source 备份文件路径;

9. MYSQL编程操作

原则:利用 MYSQL 提供的 API 来访问数据库

涉及头文件: #include <mysql/mysql.h>
待链接的库文件: -lmysqlclient
涉及的数据类型:
1. MYSQL : mysql的连接对象/句柄类型
2. MYSQL_RES : 结果集合的类型
3. MYSQL_FIELD: 字段信息类型
4. MYSQL_ROW : 记录类型
5. my_ulonglong: 记录的数量类型

9.1 MYSQL 编程操作的流程步骤

1) 初始化连接对象
mysql_init
函数头文件 #include <mysql/mysql.h>
函数原型: MYSQL* mysql_init(MYSQL* mysql);
函数功能: 创建或初始化连接对象/句柄
函数参数: mysql: [Out] 接收待初始化的连接对象
函数返回值: MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。

实际应用:
1. MYSQL mysql;
mysql_init(&mysql);

2. MYSQL *mysql = mysql_init(NULL);

2) 利用连接对象连接数据库
mysql_real_connect
头文件: #include <mysql/mysql.h>
函数原型: MYSQL* mysql_real_connect(MYSQL* mysql,const char* host,const char* user,
const char* passwd,const char* db,uint16_t port,
const char* unix_socket,uint64_t client_flag);
函数功能: 连接数据库
函数参数: mysql: 已经成功初始化的连接句柄
host: MYSQL主机名,NULL 或者 "localhost" 代表连接本地数据库
user: MYSQL登录名
passwd:MYSQL登录密码
db: 连接库名,NULL代表连接MYSQL默认库
port: MYSQL服务端端口,0代表默认端口
unix_socket: 连接套接字文件名,一般写NULL
client_flag: 客户端连接标记,一般写0,若指定为 CLIENT_MULTI_STATMENTS 代表
连接对象可支持多语句同时执行,但也需要逐一处理结果集。
函数返回值: 成功返回第一个参数值
失败返回NULL。

3) 执行SQL语句,完成数据库实际操作
mysql_real_query
头文件: #include <mysql/mysql.h>
函数原型: int mysql_real_query(MYSQL* mysql,const char* sql,size_t sqllen);
函数功能: 执行sql语句,完成数据库相应操作
函数参数: mysql: 已经成功连接连接句柄
sql: 待执行的sql语句
sqllen: sql语句的长度

函数返回值: 0, 成功
非0, 失败

如果操作是一个查询操作:
3.1 存储结果集
mysql_store_result
头文件: #include <mysql/mysql.h>
函数原型: MYSQL_RES* mysql_store_result(MYSQL* mysql);
函数功能: 存储结果集
函数参数: mysql: 已经成功连接连接句柄

函数返回值: 成功 返回指向结果集合的指针
失败 NULL
3.2 获取结果数据
1) 获取记录数据
my_ulonglong mysql_num_rows (MYSQL_RES* result);
MYSQL_ROW mysql_fetch_row (MYSQL_RES* result);
unsigned int mysql_num_fields(MYSQL_RES* result);
MYSQL_FIELDS mysql_fetch_fields(MYSQL_RES* result);

3.3 释放结果集
mysql_free_result
头文件: #include <mysql/mysql.h>
函数原型: void mysql_free_result(MYSQL_RES* result);
函数功能: 存储结果集
函数参数: result:待释放的结果集
函数返回值: 无
4) 关闭连接,释放连接对象
mysql_close
函数头文件 #include <mysql/mysql.h>
函数原型: void mysql_close(MYSQL* mysql);
函数功能: 关闭连接,释放连接对象
函数参数: mysql: 待关闭连接对象地址
函数返回值: 无

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 6:48:16

双指针算法三大模板:左右指针、快慢指针与滑动窗口实战

刷算法题刷到一定量&#xff0c;你会发现“双指针”这三个字几乎无处不在。数组里找两数之和、链表里判断有没有环、字符串里找最长不重复子串&#xff0c;表面上看是完全不同的题型&#xff0c;底层用的却是同一套思想&#xff1a;用两个指针代替多重循环&#xff0c;把暴力枚…

作者头像 李华
网站建设 2026/10/14 6:48:15

IFN-γ ELISPOT技术在肿瘤免疫治疗中的应用与优化

1. IFN-γ ELISPOT技术基础解析IFN-γ ELISPOT&#xff08;酶联免疫斑点&#xff09;技术是检测单个细胞分泌细胞因子的金标准方法。其核心原理是在96孔板底部包被抗IFN-γ抗体&#xff0c;当被激活的T细胞分泌IFN-γ时&#xff0c;会被邻近的捕获抗体立即固定&#xff0c;形成…

作者头像 李华
网站建设 2026/10/14 6:48:11

弱电网下并网变流器次同步谐振的阻抗建模与仿真分析

调试并网变流器的时候&#xff0c;我最怕看到一种波形&#xff1a;功率还没拉满&#xff0c;并网点电压和电流里突然冒出一对“镜像”频率——比如工频 50Hz 旁边蹦出 25Hz 和 75Hz&#xff0c;幅值相当、一起长一起落。设备没有报任何硬件故障&#xff0c;但电压畸变和功率摇摆…

作者头像 李华
网站建设 2026/10/14 6:48:03

线性回归工程实战:从最小二乘到正则化与特征工程的避坑指南

线性回归大概是机器学习里最"不起眼"的算法了。面试的时候大家都不好意思说自己的项目核心是它&#xff0c;论文里不把它当baseline都不好意思投稿&#xff0c;甚至很多教程把它放在第一章讲完就翻篇了。但我在实际项目里摸爬滚打这些年&#xff0c;真正让我栽跟头的…

作者头像 李华
网站建设 2026/10/14 6:47:47

RevokeMsgPatcher 完整教程:5 分钟给微信 QQ 装好防撤回补丁与多开

RevokeMsgPatcher 完整教程&#xff1a;5 分钟给微信 QQ 装好防撤回补丁与多开 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https:…

作者头像 李华
网站建设 2026/10/14 6:47:39

Oracle补丁安装实战:从文件名识别到OPatch操作与避坑指南

简介&#xff1a;这是Oracle数据库11.2.0.3版本的官方补丁集更新包&#xff0c;补丁编号20760997&#xff0c;面向Linux x86-64架构环境&#xff0c;对应DATABASE PATCH SET UPDATE 11.2.0.3.15&#xff0c;集中收录2015年7月关键补丁更新&#xff08;CPUJUL2015&#xff09;&a…

作者头像 李华