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 KEY
AUTO_INCREMENT
自增字段 id INT AUTO_INCREMENT
UNIQUE
字段值唯一 email VARCHAR(50) UNIQUE
FOREIGN KEY
外键约束 FOREIGN KEY (dpt_id) REFERENCES tb_dept(id)
NOT NULL
非空约束 name VARCHAR(20) NOT NULL
DEFAULT
默认值 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语言接口编程。