MySQL数据库编程总结
一、数据库概述
-
数据库定义
• 数据库是管理数据的软件系统,用于高效存储、管理和检索数据,减少冗余。
• 核心功能:通过SQL语言定义、操作数据,维护完整性和安全性。
-
常见数据库
• MySQL、Oracle、SQL Server、PostgreSQL等。
-
SQL分类
| 类别 | 全称 | 功能 | 常用命令 |
| DDL | 数据定义语言 | 管理数据对象(库、表) |
CREATE,DROP,ALTER|| DML | 数据操作语言 | 操作数据记录 |
INSERT,UPDATE,DELETE|| DQL | 数据查询语言 | 查询数据 |
SELECT|| DCL | 数据控制语言 | 权限管理 |
GRANT,COMMIT,ROLLBACK|
二、环境搭建
-
安装MySQL
bash# Ubuntu安装服务端和客户端 sudo apt-get install mysql-server mysql-client # 安装开发库(编程依赖) sudo apt-get install libmysqlclient-dev• 注意:安装时需为root用户设置密码。
三、MySQL基础操作
-
数据库操作
sql-- 登录 mysql -h主机名 -u用户 -p密码 -- 显示所有库 SHOW DATABASES; -- 创建库 CREATE DATABASE IF NOT EXISTS 库名; -- 删除库 DROP DATABASE IF EXISTS 库名; -- 选择库 USE 库名; -
数据类型
• 数值型 :
INT,FLOAT,DOUBLE,TINYINT• 字符串型 :
CHAR(定长),VARCHAR(变长),TEXT• 时间型 :
DATE,TIME,DATETIME,TIMESTAMP -
表约束
约束 作用 示例 PRIMARY KEY唯一标识记录 id INT PRIMARY KEYAUTO_INCREMENT自增字段 id INT AUTO_INCREMENTUNIQUE字段值唯一 email VARCHAR(50) UNIQUEFOREIGN KEY外键约束 FOREIGN KEY (dpt_id) REFERENCES tb_dept(id)NOT NULL非空约束 name VARCHAR(20) NOT NULLDEFAULT默认值 gender ENUM('M','F') DEFAULT 'M' -
表操作
sql-- 创建表 CREATE TABLE 表名 ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, dpt_id INT, FOREIGN KEY (dpt_id) REFERENCES dept(id) ON DELETE CASCADE ); -- 修改表 ALTER TABLE 表名 ADD COLUMN 字段名 类型; -- 添加字段 ALTER TABLE 表名 DROP COLUMN 字段名; -- 删除字段 ALTER TABLE 表名 MODIFY 字段名 新类型; -- 修改字段类型 -
数据操作
sql-- 插入 INSERT INTO 表名 (字段1, 字段2) VALUES (值1, 值2), (值3, 值4); -- 更新 UPDATE 表名 SET 字段=值 WHERE 条件; -- 删除 DELETE FROM 表名 WHERE 条件;
四、查询操作
-
单表查询
sql-- 基础查询 SELECT * FROM 表名; SELECT name, age FROM 表名 WHERE age > 18; -- 去重
DISTINCT dept FROM employee;
-- 聚合函数
SELECT COUNT(), AVG(salary), MAX(age) FROM employee;
-- 分组
SELECT dept, COUNT() FROM employee GROUP BY dept HAVING COUNT(*) > 5;
2. **多表连接**
• **内连接**(仅匹配记录)
```sql
SELECT a.name, b.dept_name
FROM employee a
INNER JOIN dept b ON a.dpt_id = b.id;
```
左外连接**(左表全部+右表匹配)
```sql
SELECT a.name, b.dept_name
FROM employee a
LEFT JOIN dept b ON a.dpt_id = b.id;
```
• **右外连接**(右表全部+左表匹配)
```sql
SELECT a.name, b.dept_name
FROM employee a
RIGHT JOIN dept b ON a.dpt_id = b.id;
```
3. **子查询**
```sql
-- IN子查询
SELECT name FROM employee
WHERE dpt_id IN (SELECT id FROM dept WHERE locate = '上海');
-- EXISTS子查询
SELECT name FROM employee a
WHERE EXISTS (SELECT 1 FROM dept b WHERE a.dpt_id = b.id);
五、C API编程接口
-
核心函数
函数 作用 mysql_init()初始化连接对象 mysql_real_connect()连接数据库 mysql_query()执行SQL语句 mysql_store_result()获取结果集 mysql_fetch_row()逐行读取数据 mysql_free_result()释放结果集内存 mysql_close()关闭连接 -
示例代码
c#include <mysql/mysql.h> #include <stdio.h> int main() { MYSQL *conn = mysql_init(NULL); if (!mysql_real_connect(conn, "localhost", "root", "password", "testdb", 0, NULL, 0)) { fprintf(stderr, "连接失败: %s\n", mysql_error(conn)); return 1; } // 设置字符集 mysql_set_character_set(conn, "utf8"); // 执行查询 if (mysql_query(conn, "SELECT * FROM employee")) { fprintf(stderr, "查询失败: %s\n", mysql_error(conn)); return 1; } // 处理结果集 MYSQL_RES *result = mysql_store_result(conn); MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { printf("ID: %s, Name: %s\n", row[0], row[1]); } // 释放资源 mysql_free_result(result); mysql_close(conn); return 0; }
六、数据库备份与恢复
-
备份数据库
bashmysqldump -u root -p 数据库名 > backup.sql -
恢复数据库
bashmysql -u root -p 新数据库名 < backup.sql
七、注意事项
-
外键约束
• 需使用InnoDB引擎,设置
ON DELETE和ON UPDATE行为(如CASCADE或SET NULL)。 -
字符集
• 推荐使用
utf8mb4以支持Emoji等特殊字符,建表时指定:sqlCREATE TABLE 表名 (...) DEFAULT CHARSET=utf8mb4; -
性能优化
• 避免
SELECT *,索引关键字段,合理使用事务。
通过以上内容,可全面掌握MySQL数据库的核心操作、SQL语法及C语言接口编程。