一、基本操作
1.1 MySQL基本命令
-
连接MySQL服务器
在命令行下输入mysql –h localhost –u root –p
当显示“Enter password:”时,输入密码mysql -
查看MySQL中有哪些数据库
mysql> show databases; (注意SQL语句结尾的分号!) -
使用数据库mysql
mysql> use mysql; -
查看当前使用的数据库
mysql> select database(); -
查看数据库mysql中有哪些关系
mysql> show tables; -
查看数据库mysql中关系的模式(以关系user为例)
mysql> describe user; -
使用help命令来了解其他命令和变量类型等的含义
mysql> help;
mysql> help use; -
使用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; -
取消命令
若要取消一条正在编辑命令,键入\c并回车 -
断开MySQL服务器连接
mysql> quit 或 mysql> exit
1.2使用SQL语言管理MySQL数据库
-
创建数据库menagerie
mysql> CREATE DATABASE menagerie; -
查看数据库menagerie是否创建成功
mysql> show databases; -
使用menagerie数据库
mysql> use menagerie; -
创建宠物信息关系pet,包含宠物名字、主人、种类、性别、出生和死亡日期
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); -
查看关系pet是否创建成功
mysql> show tables; -
查看关系pet的模式
mysql> describe pet; -
向关系pet中插入元组
mysql> INSERT INTO pet
-> VALUES (‘Puffball’,‘Diane’,‘hamster’,‘f’,‘1999-03-30’,NULL); -
从文件中批量导入数据
设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; -
查询关系pet中所有元组
mysql> SELECT * FROM pet; -
更改关系pet中的数据
mysql> UPDATE pet SET birth = “1989-08-31” WHERE name = “Bowser”; -
查询名叫Bowser的宠物信息
mysql> SELECT * FROM pet WHERE name = “Bowser”; -
查询所有90后小猫和小狗的信息
mysql> SELECT * FROM pet WHERE birth >= “1990-1-1” AND
-> (species = “dog” OR species = “cat”); -
查询所有宠物的主人
mysql> SELECT owner FROM pet;
mysql> SELECT DISTINCT owner FROM pet; -
查询所有宠物的名字及生日,并按其年龄递增排序
mysql> SELECT name, birth FROM pet ORDER BY birth; -
查询所有宠物的名字及生日,并按其年龄递减排序
mysql> SELECT name, birth FROM pet ORDER BY birth DESC; -
查询所有宠物的名字、种类及生日,并先按种类名称递增排序,同种宠物按年龄递减排序
mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC; -
查询所有活着的宠物的信息
mysql> SELECT * FROM pet WHERE death IS NULL; -
查询关系pet中有多少只宠物
mysql> SELECT COUNT(*) FROM pet; -
查询每个主人有多少只宠物
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; -
查询每种宠物的数量
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; -
查询雄狗和雌狗的数量
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = “dog” GROUP BY species, sex; -
查询每种宠物的最大年龄
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函数释放内存的话,很容易发生内存溢出的问题。