1、新增记录
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
如果数据是字符型,必须使用单引号或者双引号,如:“value”
2、删除记录
DELETE FROM table_name WHERE Clause
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在单个表中一次性删除记录。
- 当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。
3、记录更新
UPDATE table_name SET field1=new-value1, field2=new-value2,... WHERE Clause
- 你可以同时更新一个或多个字段。
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在一个单独表中同时更新数据。
- 当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。
- WHERE 里面可以使用
AND
以外,还可以使用OR
,来合并多个条件,形成一个更为复杂的条件。
4、记录查询
SELECT table_name.column_name,column_name,... FROM table_name,table_name2,... WHERE Clause
LIMIT N OFFSET M
- 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用 WHERE 语句来设定查询条件。
- SELECT 命令可以读取一条或者多条记录。
- 你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据。
- 你可以使用 WHERE语句来包含任何条件。
- 你可以使用 LIMIT 属性来设定返回的记录数。
- 你可以通过 OFFSET 指定 SELECT语句开始查询的数据偏移量。默认情况下偏移量为 0。
记录查询代码范例:
void show_result(MYSQL_RES* res) {
unsigned int nFields = mysql_num_fields(res); // 获取列数
my_ulonglong rows = mysql_num_rows(res); // 获取行数
MYSQL_FIELD* fields = mysql_fetch_fields(res); // 获取所有列的定义
for (unsigned int i = 0; i < rows; ++i) {
MYSQL_ROW row = mysql_fetch_row(res); // 取一行数据
if (row) {
// 获取每行每列的名称
for (unsigned int j = 0; j < nFields; ++j) {
std::cout << "type:" << fields[j].type << " " << fields[j].name << ";" << row[j] << std::endl;
}
}
}
}
int make_query(MYSQL* pDB) {
std::string sql = "SELECT * FROM `hello`";
int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return ret;
}
MYSQL_RES* res = mysql_use_result(pDB);
if (res) {
show_result(res);
mysql_free_result(res);
}
return 0;
}
4.1、mysql_use_result和mysql_store_result的区别
mysql_use_result
这个函数,执行后,并不会立刻查询,而是要等到 mysql_fetch_row
这个函数执行后,才会执行查询。
mysql_store_result
这个函数,执行后,会立刻查询,并且获取完整结果给客户端。
具体参考:mysql_use_result和mysql_store_result
完整代码范例:
MYSQL* mysql = new MYSQL();
MYSQL* pDB = mysql_init(mysql);
if (pDB == NULL) {
std::cout << "mysql_init failed" << std::endl;
return -1;
}
pDB = mysql_real_connect(pDB, "localhost", "root", "root", "mysql", 3306, NULL, 0);
if (pDB) {
std::string sql = "CREATE DATABASE hello"; // SQL语句可替换为自己实际需要执行的语句
// 创建数据库
int ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
// 授予权限
sql = "GRANT ALL ON hello.* TO 'hello'@'localhost';"; // SQL语句可替换为自己实际需要执行的语句
ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
// 指定数据库
sql = "USE hello"; // SQL语句可替换为自己实际需要执行的语句
ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
// 创建表
sql = "CREATE TABLE IF NOT EXISTS `hello` (`id` NVARCHAR(16) PRIMARY KEY)ENGINE=InnoDB DEFAULT CHARSET=utf8;";
ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
// TODO: 进行增删改查
sql = "INSERT INTO `hello` (`id`) VALUES(\"9527\")";
ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
// 删除表
sql = "DROP TABLE `hello`";
ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
// 删除数据库
sql = "DROP DATABASE hello"; // SQL语句可替换为自己实际需要执行的语句
ret = mysql_real_query(mysql, sql.c_str(), (unsigned long)sql.size());
if (ret != 0) {
std::cout << "mysql error: " << mysql_error(pDB) << std::endl;
return -1;
}
mysql_close(pDB);
std::cout << pDB << std::endl;
delete mysql;
}
mysql = nullptr;
return 0;