一、基本操作

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");elseprintf("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]);}} elseprintf("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);}} elseprintf("Initialization fails\n");mysql_free_result(mysql_result);mysql_close(&mysql_conn);return 0;
}

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

SQL操作h和C语言使用SQL相关推荐

  1. mysql一些基本sql操作_MySql数据库的一些基本操作---------------SQL语法

    MySql数据库是比较常用的关系型数据库,操作用的是sql语句,下面来说一说MySql的一些基本操作 MySql数据库是一种C/S型的模式,即客户端/服务器端,对应到具体应用上,便是bin目录下的my ...

  2. 一些比较有用的SQL操作,2011最新整理

    一些比较有用的SQL操作,2011最新整理,SQL批量删除与批量插入,批量删除:wei yuan chuang DELETE FROM MyTable WHERE ID IN (1,2); 批量插入 ...

  3. flask 操作mysql的两种方式-sql操作

    flask 操作mysql的两种方式-sql操作一.用常规的sql语句操作 # coding=utf-8 # model.pyimport MySQLdbdef get_conn():conn = M ...

  4. Spark15:Spark SQL:DataFrame常见算子操作、DataFrame的sql操作、RDD转换为DataFrame、load和save操作、SaveMode、内置函数

    前面我们学习了Spark中的Spark core,离线数据计算,下面我们来学习一下Spark中的Spark SQL. 一.Spark SQL Spark SQL和我们之前讲Hive的时候说的hive ...

  5. r dataframe 转成向量_快速掌握R语言中类SQL数据库操作技巧

    在数据分析中,往往会遇到各种复杂的数据处理操作:分组.排序.过滤.转置.填充.移动.合并.分裂.去重.找重.填充等操作.这时候R语言就是一个很好的选择:R可以高效地.优雅地解决数据处理操作.(本章节为 ...

  6. Hive基本SQL操作

    Hive基本SQL操作 库的创建与删除 建库语句 删除库 修改 表的建删改查 建表语句的结构 表相关的SQL语句 建表语句 创建普通表 创建字段限制的表 创建hive表 create like语法 创 ...

  7. c 语言数据库.pdf,c语言连接sql数据库.pdf

    连接到 SAMPLE 数据库,查询 LASTNAME 为 JOHNSON 的FIRSTNAME 信息. #include #include #include #include "util.h ...

  8. pandas.DataFrame的类SQL操作

    前言 pandas的DataFrame是类似于一张表的结构,但是并没有像数据库表那样的SQL操作.虽然如此,它依然可以使用python语言的风格实现SQL中的所有操作. 文章较长,建议点击右侧目录定位 ...

  9. C语言连接SQL Server数据库并且完成一次简易操纵

    本文旨在针对SQL完全小白的朋友,让其了解C语言连接SQL Server的方法,并且完成一个简易操纵(可以是写入/读出/增删查改).本文使用的是SQL Server 2019,安装教程可参考SqlSe ...

最新文章

  1. webpack从入门到精通(四)优化打包配置总结②
  2. 【Tool】sublime txt的使用
  3. tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式
  4. eval() php,js-eval编码,js-eval解码
  5. 二叉树总结挺好的很好记忆
  6. 锐动SDK应用于行车记录仪
  7. 系统文件-- lsof
  8. python匿名函数调用_python中引用局部变量的匿名函数
  9. 计算机网络 DNS协议 FTP DHCP
  10. 一个人如果控制不住自己乱消费,等同于废物
  11. 牛客 2021年度训练联盟热身训练赛第二场 G题Plate Spinning
  12. C++_二维数组的动态申请内存3种方法
  13. vc830l 说明书_有了解vc830l万用表使用方法的吗?
  14. 用英语说计算机的优点1000,我的英语老师作文1000字
  15. RHEL8.x-RedHat-Podman
  16. jcp jsr_JCP选举结果:LJC和CloudBees赢得EC席位
  17. 基于深度学习的菠萝实时三维坐标定位项目
  18. Word中的字体大小(几号-几磅)
  19. 老板到底能不能,监控到电脑版微信聊天?
  20. 【Linux从无到有】进程的地址空间

热门文章

  1. 计算机系统结构试题汇总,计算机系统结构试题汇总带答案.pdf
  2. 电脑按哪个键录屏?不要再局限固定的按键思维啦
  3. el-table合并表头handerMethod
  4. Java 多线程 终止线程的4中方式
  5. 今日头条android自适应,今日头条解决适配(Android)
  6. Go语言中strings使用
  7. aruco板_naruco
  8. 小程序 显示3个一排 自动换行
  9. 一个同步FIFO的实现
  10. Apache中 RewriteRule说明