SQL操作h和C语言使用SQL

本文详细介绍了如何使用MySQL的基本命令进行数据库管理,包括连接、查询、更新和删除等操作。同时,讲解了如何在C语言中连接MySQL服务器,执行SQL语句以及处理查询结果。内容涵盖连接初始化、查询、结果提取等关键步骤,为读者提供了完整的示例代码。
摘要由CSDN通过智能技术生成

一、基本操作

1.1 MySQL基本命令

  1. 连接MySQL服务器
    在命令行下输入mysql –h localhost –u root –p
    当显示“Enter password:”时,输入密码mysql

  2. 查看MySQL中有哪些数据库
    mysql> show databases; (注意SQL语句结尾的分号!)

  3. 使用数据库mysql
    mysql> use mysql;

  4. 查看当前使用的数据库
    mysql> select database();

  5. 查看数据库mysql中有哪些关系
    mysql> show tables;

  6. 查看数据库mysql中关系的模式(以关系user为例)
    mysql> describe user;

  7. 使用help命令来了解其他命令和变量类型等的含义
    mysql> help;
    mysql> help use;

  8. 使用SQL语言在数据库mysql上进行简单查询
    mysql> select * from user;
    mysql> select user, host, password from user;
    mysql> select count() from user;
    mysql> select count(
    ) as ucount from user;

  9. 取消命令
    若要取消一条正在编辑命令,键入\c并回车

  10. 断开MySQL服务器连接
    mysql> quit 或 mysql> exit

1.2使用SQL语言管理MySQL数据库

  1. 创建数据库menagerie
    mysql> CREATE DATABASE menagerie;

  2. 查看数据库menagerie是否创建成功
    mysql> show databases;

  3. 使用menagerie数据库
    mysql> use menagerie;

  4. 创建宠物信息关系pet,包含宠物名字、主人、种类、性别、出生和死亡日期
    mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
    -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

  5. 查看关系pet是否创建成功
    mysql> show tables;

  6. 查看关系pet的模式
    mysql> describe pet;

  7. 向关系pet中插入元组
    mysql> INSERT INTO pet
    -> VALUES (‘Puffball’,‘Diane’,‘hamster’,‘f’,‘1999-03-30’,NULL);

  8. 从文件中批量导入数据
    设D:\pet.txt是一个由字符Tab分隔的文本文件
    Fluffy Harold cat f 1993-02-04 \N
    Claws Gwen cat m 1994-03-17 \N
    Buffy Harold dog f 1989-05-13 \N
    Fang Benny dog m 1990-08-27 \N
    Bowser Diane dog m 1998-08-31 1995-07-29
    Chirpy Gwen bird f 1998-09-11 \N
    Whistler Gwen bird \N 1997-12-09 \N
    Slim Benny snake m 1996-04-29 \N
    在MySQL提示符下执行
    mysql> LOAD DATA LOCAL INFILE “D:\pet.txt” INTO TABLE pet;

  9. 查询关系pet中所有元组
    mysql> SELECT * FROM pet;

  10. 更改关系pet中的数据
    mysql> UPDATE pet SET birth = “1989-08-31” WHERE name = “Bowser”;

  11. 查询名叫Bowser的宠物信息
    mysql> SELECT * FROM pet WHERE name = “Bowser”;

  12. 查询所有90后小猫和小狗的信息
    mysql> SELECT * FROM pet WHERE birth >= “1990-1-1” AND
    -> (species = “dog” OR species = “cat”);

  13. 查询所有宠物的主人
    mysql> SELECT owner FROM pet;
    mysql> SELECT DISTINCT owner FROM pet;

  14. 查询所有宠物的名字及生日,并按其年龄递增排序
    mysql> SELECT name, birth FROM pet ORDER BY birth;

  15. 查询所有宠物的名字及生日,并按其年龄递减排序
    mysql> SELECT name, birth FROM pet ORDER BY birth DESC;

  16. 查询所有宠物的名字、种类及生日,并先按种类名称递增排序,同种宠物按年龄递减排序
    mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

  17. 查询所有活着的宠物的信息
    mysql> SELECT * FROM pet WHERE death IS NULL;

  18. 查询关系pet中有多少只宠物
    mysql> SELECT COUNT(*) FROM pet;

  19. 查询每个主人有多少只宠物
    mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;

  20. 查询每种宠物的数量
    mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;

  21. 查询雄狗和雌狗的数量
    mysql> SELECT species, sex, COUNT(*) FROM pet
    -> WHERE species = “dog” GROUP BY species, sex;

  22. 查询每种宠物的最大年龄
    mysql> SELECT species, MAX(birth) FROM pet GROUP BY species;

二、配置和启动

  • 配置
    在环境变量中path中添加C:\ Program Files\MySQL\ MySQL Server 8.0\bin
  • 启动
搜索cmd
管理员身份打开
net start mysql
mysql -u root -p123456 //123456为密码

三、SQL和C语言

1.codeblocks 设置

在这里插入图片描述
在这里插入图片描述
最后,添加需要的库文件%MySQL安装路径%/lib/下的库文件libmysql.lib和mysqlclient.lib
在这里插入图片描述

2. 连接、断开MySQL服务器

在程序中必须加入#define _LCC_,以避免在Windows操作系统下进行编译时产生的错误。然后,在程序中加入#include <mysql.h>,让编译器能够找到所有MySQL Client的函数定义。
随后,使用mysql_init函数准备连接,mysql_init函数的声明为

MYSQL *mysql_init(MYSQL *mysql);

其参数和返回值均为类型为MYSQL的结构体的指针。MYSQL结构体是连接MySQL服务器的句柄,每一个句柄代表程序与MySQL 服务器唯一的连接,所有insert,select,delete等操作都需要MySQL句柄作为参数以识别不同用户、数据库以及程序。若mysql_init操作成功,则返回刚刚初始化的句柄;否则,返回NULL。
下面是一个简单的例子。

#ifndef __LCC__
#define __LCC__
#endif

#include <stdio.h>
#include <mysql.h>

int main(int argc, char **argv)
{
	MYSQL mysql_conn; /* Connection handle */

	if (mysql_init(&mysql_conn) != NULL)
{
		printf("Init succeeds!\n");
	}
else
{
		printf("Init fails!\n");
	}
	return 0;
}

编译并运行该程序,若句柄初始化成功,则打印”Init succeeds!”;否则,打印”Init fails!”。
在句柄被初始化后,就可以使用mysql_real_connect函数或者mysql_connect函数连接MySQL 服务器了,这两个函数的声明如下:

MYSQL *mysql_real_connect(
MYSQL *mysql, const char *host, const char *user, 
const char *passwd, const char *db, unsigned int port, 
const char *socket, unsigned long client_flag);

其中,第1个参数是MySQL句柄,第2至第4个参数分別为host name、user name及password,第5个参数是待使用的数据库的名字,你也可把第5个参数设为NULL,之后使用mysql_select_db函数来选择数据库,第6个参数是MySQL 服务器的连接池,通常把它设为MYSQL_PORT,第7个参数是MySQL 服务器及client之间传输的渠道(socket或named pipe),但MySQL 服务器会根据host name建立另一渠道,除非你有真的需要,否则你需在第7个参数填上NULL。最后是client_flag,包括压缩协议、查询协议、加密协议等。
与MySQL服务器的连接成功后,使用mysql_close函数断开连接,其函数声明为:

int mysql_close(MYSQL*);

下面是一个简单的例子:

#ifndef __LCC__
#define __LCC__
#endif

#include <stdio.h>
#include <mysql.h>

int main(int argc, char **argv) {
   MYSQL mysql_conn; /* Connection handle */

    if (mysql_init(&mysql_conn) != NULL) {
        if (mysql_real_connect(
&mysql_conn, "localhost", "root",
123456, "company", MYSQL_PORT, 
NULL, 0) != NULL)
            printf("GOOD!\n");
        else
            printf("Connection fails.\n");
    } else {
        printf("Initialization fails.\n");
        return -1;
    }

    mysql_close(&mysql_conn);
    return 0;
}

至此,我们学会了如何连接、断开MySQL服务器。

3.查询MySQL数据库

在成功连接MySQL 服务器后,便可以使用mysql_query函数查询数据库。mysql_query函数的声明如下:

int mysql_query(MYSQL *mysql, const char *query);

第1个参数是MySQL连接的句柄,第2个参数是SQL语句。如果查询成功,mysql_query返回0,否则返回非0。
如果你的查询语句不需要结果返回,例如DELETE、UPDAE、INSERT等,mysql_query被执行后便完成整个操作了;如果你要执行SELECT、SHOW、DESCRIBE等,在存取结果前,必须使用mysql_store_result函数建立查询结果的句柄。mysql_store_result的函数声明如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

其输入参数为MySQL的连接句柄,其输出为MYSQL_RES结构体指针类型。MYSQL_RES结构体表示的是MySQL数据库传递回来的查询结果,但我们并不会直接读取MYSQL_RES的数据,而是使用MYSQL_ROW,也即是以行为单位读取数据。
例子如下所示:

#ifndef __LCC__
#define __LCC__
#endif

#include <stdio.h>
#include <mysql.h>

int main(int argc, char **argv) {
    MYSQL mysql_conn; /* Connection handle */
    MYSQL_RES *mysql_result;

    if (mysql_init(&mysql_conn) != NULL) {
        if (mysql_real_connect(
&mysql_conn, "localhost", "root", 
NULL, "company", MYSQL_PORT, 
NULL, 0) != NULL) {
            mysql_query(
&mysql_conn, "select * from table1");
            mysql_result = mysql_store_result(&mysql_conn);

            /* Free the result to release the heap memory*/
            mysql_free_result(mysql_result);
        } else {
            printf("Connection fails.\n");
        }
    } else {
        printf("Initialization fails.\n");
        return -1;
    }

    mysql_close(&mysql_conn);
    return 0;
}

请注意mysql_result是一个指针。因为mysql_store_result函数会自动分配内存存储查询结果,所以需要执行mysql_free_result(MYSQL_RES*)来释放内存。

4. 提取查询结构

在提取结果前必须使用上面介绍过的mysql_store_result函数为查询结果分配内存,然后使用mysql_fetch_row函数逐行提取数据。mysql_fetch_row函数的声明如下:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

其输入参数为查询结果句柄,输出的类型为MYSQL_ROW。MYSQL_ROW是一个数组结构,数组中每一个元素依次为该元组各个属性上的值。
结果的元组数可以用mysql_num_rows函数返回。mysql_num_rows函数的声明为

int mysql_num_rows(MYSQL_RES*);

其输入参数为查询结果句柄,输出结果为元组数量。
下面是一个简单的例子:

#ifndef __LCC__
#define __LCC__
#endif

#include <stdio.h>
#include <malloc.h>
#include <mysql.h>

int main(int argc, char **argv) {
    MYSQL mysql_conn; /* Connection handle */
    MYSQL_RES *mysql_result; /* Result handle */
    MYSQL_ROW mysql_row; /* Row data */
    int f1, f2, num_row, num_col;

    if (mysql_init(&mysql_conn) != NULL) {
        if (mysql_real_connect(
&mysql_conn, "localhost", "root", 
NULL, "company", MYSQL_PORT, NULL, 0) != NULL){
            if (mysql_query(
&mysql_conn, 
"select * from testtable limit 10") == 0) {
                mysql_result = mysql_store_result(&mysql_conn);
                num_row = mysql_num_rows(mysql_result);
                num_col = mysql_num_fields(mysql_result);
 
                for (f1 = 0; f1 < num_row; f1++) {
                    mysql_row = mysql_fetch_row(mysql_result);

                    for (f2 = 0; f2 < num_col; f2++)
                        printf(
"[Row %d, Col %d] ==> [%s]\n", 
f1+1, f2+1, mysql_row[f2]);
                }
            } else
                printf("Query fails\n");
        } else {
        		int i = mysql_errno(&mysql_conn);
        		const *s = mysql_error(&mysql_conn);
            	printf("Connection fails(ERROR %d): %s\n", i, s);
        }
    } else
        printf("Initialization fails\n");

    mysql_free_result(mysql_result);
    mysql_close(&mysql_conn);
    return 0;
}

请注意如果数据库很大,而又没有用mysql_free_result函数释放内存的话,很容易发生内存溢出的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值