【数据库】深入了解MySQL数据库:操作指令、数据约束、联结表和视图的使用

一、数据库相关概念

1、数据库的概述

        数据库( DataBase,DB)从本质上讲就是一个文件系统,它能够将数据有组织地集 合在一起,按照一定的规则长期存储到计算机的磁盘中,并且能够供多个用户共享和使用, 同时,用户能够对数据库中的数据进行插入、删除、修和查询操作。

2、数据库管理系统

        数据库管理系统(DataBase Management System,DBMS从本质讲就是一个为管理 数据库中的数据而设计的一套管理系统。它依托数据库,对外提供统一管理数据库中数据的 功能和接口能够有效地对数据库的安全、认证、数据 备份、数据恢复、数据传输等进行统 一的管理。同时,数据库管理系统能够根据所依托的数据库模型对数据库进行相应的分类。 大多数的数据库都是通过数据库管理系统对数据库中的数据进行管理和维护的。

3、DB和DBMS的关系

二、数据库模型 

        数据库管理系统根据数据模型对数据进行存储和管理 

数据结构、数据操作完整性约束是构成数据模型的三要素

数据模型应满足三方面要求:

  • 一是能比较真实地模拟现实世界;
  • 二是容易为人所理解
  • 三是便于在计算机上实现 

完整性约束: 数据完整性约束指的是为了防止不符合规范的数据进入数据库。在用户对数据进行插入、修改、删除等操作时,DBMS 自动按照一定的约束条件对数据进行监测,使不符合 规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。

数据库管理系统数据模型:

         数据库管理系统采用的数据模型主要有:层次模型、网状模型和关系模型

层次模型是种典型的树形结构

特点:

  • 1、有且仅有一个节点无父节点,这个节点被称为根节点。
  • 2、其他节点有且仅有一个父节点。
  • 3、同一父节点的子节点被称为兄弟节点。
  • 4、没有子节点的节点称为叶节点 

        在现实世界中,事物之间的联系更多的是非层次关系的,用层次模型表示非树型结构是很不直观的,网状模 型则可以克服这一缺点。 网状模型构成了比层次结构模型更加复杂的网状结构

特点:

  • 1、允许一个以上的节点无父节点
  • 2、一个节点可以有多个的父节点 

 关系模型数据的逻辑结构是一张二维表,一行为一个对象成员,每一列为对象的一个属性。

特点:

  • 1、每一列中的分量是类型相同的数据。
  • 2、列的顺序可以是任意的。
  • 3、行的顺序可以是任意的。
  • 4、表中的分量是不可再分割的最小数据项,即表中不允许有子表。 

        关系数据库采用关系模型作为数据的组织方式,因其严格的数学理论、使用简单灵活、数据独立性强等特点,而被公认为最有前途的一种数 据库管理系统。

        它目前已成为占据主导地位的数据库管理系统。自 20 世纪 80 年代以来,作为商品推出的数据库管理系统几乎都是关系型的,例如:Oracle、Sybase 等。 常用的关系型数据库有: Oracle、Mysql、SQL server、Access、 Sybase、SQLite        

 三、数据库的分类

1、关系型数据库

        依据所有存储数据的模型之间的关系建立的数据库。所谓关系模型,指的是“一对 一、一对多、多对多”等关系型。常见的关系型数据库如下:

(1)Oracle:甲骨文大型商业数据库,是Oracle公司的数据库产品

(2)Mysql: 开放源码的中小型数据库,最早属于瑞典的MysqlAB公司的,后被Sun公司收购,Sun在2009年4月20号被Oracle收购。体积小、速度快、成本低,许多中小型网站为了降低网站总体拥有成本而选择了 MySQL作为网站数据库。

(3)SQLServer:微软旗下的数据库产品,真正的客户机/服务器体系结构,图形化用户界面,使系统管理和数据库管理更加直观/简单,具有很好的伸缩性,可跨越从运行 Windows 95/98 型电脑到运行 Windows 2000 的大型多处理器等多种平台使用。

(4)Access:微软旗下的单机数据库产品,是一种桌面数据库,只适合数据量少的应用。同时访问客户端不能多于 4 个。数据量大容易出现系统问题

(5)DB2:IBM公司旗下的数据库产品

(6)SQLite 是一个开源的、内嵌式的关系型数据库。

(7)Sybase:sybase 公司 1987 年推出了 Sybase 高性能数据库产品,Sybase 主要有三种版本,一是 UNIX 操作系统下运行的版本,二是 Novell Netware 环境下运行的版本, 三是 Windows NT 环境下运行的版本。

Sybase 数据库特点:

        1:基于客户/服务器体系结构的数据库。

        2:它是真正开放的数据库 ,容易移植。

        3:它是一种高性能的数据库。

2、非关系型数据库

        泛指非关系型的数据库,区别于关系数据库。采用了没有特定关系模型来组织数据。 常见的非关系型数据库如下:

(1)MongoDB:是一个面向文档(文件存储)的开源NoSQL数据库。MongoDB使用JSON之类的文档 来存储任何数据。它是用c++写的。

(2)Cassandra:是Facebook为收件箱搜索开发的。Cassandra是一个用于处理大量结构 化数据的分布式数据存储系统。 Redis:是最著名的键值存储。

(3)Redis:是用C语言编写的。它是根据BSD授权的。

(4)HBase:是谷歌为BigTable数据库设计的分布式非关系数据库

四、数据库管理系统的安装

1、安装命令

sudo apt-get update #更新软件源

sudo apt-get install mysql-server #安装mysql 

 

2、启动或关闭MySQL服务 

默认安装完成后,MySQL为启动状态

启动:service mysql start

关闭:service mysql stop 

3、确认是否启动成功 

 mysql节点处于LISTEN状态表示启动成功 

sudo netstat -tap | grep mysql

4、进入mysql shell界面 

mysql -u root -p或sudo mysql

5、退出mysql 

6、解决mysql中文乱码问题 

用sqoop(可以插入中文,但不能用sqoop导入中文)导入时中文乱码的原因:character_set_server默认设置是latin1 

 修改方式:

  • 1、编辑配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
  • 2、在[mysqld]下添加一行character_set_server=utf8。记得保存退出如下图

  • 3、重启MySQL服务器service mysql restart
  • 4、登录MySQL,并查看MySQL目前设置的编码。show variables like "char%"; 

五、 MySQL数据库管理操作指令

1、SQL的操作分类 

 注: sql语句以;结尾 

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列 等;
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数 据);
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级 别;
  • DQL(重要)(Data Query Language):数据查询语言,用来查询记录(数据)。

2、 创建数据库create database

使用create database语句创建数据库:

语法:CREATE DATABASE / create database database_name(库名); 

创建名为person的数据库:create database person; 

查看创建好的数据库:show databases; 

使用create database if not exists语句创建数据库(推荐):

        如果数据库中已经存在名称为person的数据库,再次使用CREATE DATABASE database_ name语句创建名称为 person的数据库时会报错。 

使用CREATE DATABASE IF NOT EXISTS database_ name语句创建数据库时将不再报错。 

 

 3、查看MySQL命令行所在的数据库

        语法:select database(); 

4、切换要操作的数据库 

        语法:use person; 

5、查看数据库的创建信息 

语法:show create database person \g 

6、修改数据库的名字(已丢弃)

5.1.23版本后,就将此SQL语句抛弃了,原因是此SQL语句可能造成数据丢失。

语法:rename database db_name to new_db_name;

查看MySQL的版本 :status;

7、 修改数据库的字符编码

 修改字符编码为utf8命令 语法:alter database person character set utf8;

查看数据库的字符编码命令 语法:show create database person \G 

8、 删除数据库

语法:drop database if exists person; 

六、数据库操作

1、数据库的DDL操作 

        DDL操作 主要管理数据库、表、列等操作 

(1)MySQL操作数据表 

        创建完数据库之后,接下来就是在数据库中创建数据表。在MySQL中,数据表以二维 表格的形式展示,表格中的一行代表一条完整的数据记录,表格中的一列代表数据的某个特定属性。 

需要注意: 在数据库中创建表之前,需要查看当前使用的数据库 语法:select database(); 然后切换到你需要操作的数据库 Use db_name;  

(2)常用数据类型

 int:整型

double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为 999.99; char:固定长度字符串类型;

char(10): 'aaa ' 占10位

varchar:可变长度字符串类型;

varchar(10): 'aaa' 占3位 

text:字符串类型;

blob:字节类型;

date:日期类型,格式为:yyyy-MM-dd;

time:时间类型,格式为:hh:mm:ss

timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值

datetime:日期时间类型 yyyy-MM-dd hh:mm:ss

boolean:mysql不支持,oracle支持

(3)在数据库中创建表

 语法:create table 表名(字段1 字段类型,字段2 字段类型, ...字段n 字段类型);

(4)查看当前数据库中的所有表 

SHOW TABLES; 

 

(5)查看表的字段信息

DESC table_name; 

(6)添加列信息

在上面stu表的基础上增加一个addr列:ALTER TABLE stu ADD addr text; 

 修改addr列,使其长度为60: alter table stu modify addr varchar(60);

(7)删除表中列

删除addr列,一次只能删一列: alter table stu drop addr; 

(8)表名的重命名 

 表名改为new_stu:rename table stu to new_stu;

 (9)查看表格的创建细节

 SHOW CREATE TABLE new_stu;

(10)修改表的字符集为utf8

ALTER TABLE new_stu CHARACTER SET utf8; 

(11) 列名称重命名

列名name修改为new_name: ALTER TABLE new_stu CHANGE name new_name varchar(100); 

(12)备份表结构和表数据

create table tname2(表2) as select * from tname1(表1); 

(13)备份表结构

create table tname2(表2) like tname1(表1); 

(14)删除表

DROP TABLE table_name ; 

2、数据库的DML操作 

         DML是对表中的数据进行增(INSERT)、删( DELETE)、改(UPDATE)的操作。

(1)插入操作 insert into

语法:INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);

注意:列名与列 值的类型、个数、顺序要一一对应。语法中当每列都插入数据时列名可省。 

(2)查询操作 select * from 表名;

        注:*表示全部,也可换成指定名称查看

(3)复制表操作

首先创建或备份一张表和需要复制的表所有列 尽量列名称、列类型保持一致。否则容易出现数据错误 create table new_stu(num int, name text, age int); 或create table tname2(表2) like tname1(表1); 

语法:insert into new_stu(新表) select * from stu(已存在的表); 

 

(4)修改操作update

语法:UPDATE 表名 SET 列名1=列值1(新值),列名2=列值2 ...... WHERE 列名=值

将stu表中的姓名’lucy’修改成’tom’ :

 

(5)删除操作 delete 

 语法:DELETE FROM 表名 【WHERE 列名=值】

删除上表中name=’tom’所在的行: 

语句:delete from stu where name=’tom’; 

 

删除整个表的内容:delete from 表名; 

3、数据库的DQL操作 

        数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回 的结果集是一张虚拟表。 

(1)查询所有列

语法:select * from 表名; 

(2)查询指定列

语法:select 列名1,列名2,… from 表名; 

(3)条件查询

        条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字: =、!=、<>(不等于)、<、<=、>、>=;BETWEEN…AND;IN(set);IS NULL; AND;OR; NOT,XOR (逻辑异或);

案例1:查询姓名为lucy,并且年龄小于21的信息

select * from stu where name='lucy' and age<21; 

案例2:查询学号为2,或者姓名为lisa的信息

select * from stu where num=2 or name='lisa';

 

案例3:查看学号为1,3,5的信息 

select * from stu where num in(1,3,4);

 

(4)模糊查询之通配符 

当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字 LIKE。 

_ 任意一个字母

%:任意0~n个字母 '张%' 

案例1:查找姓名为3个字母的学生信息 

案例2:查找以字母b开头的学生信息 

(5)模糊查询之正则表达式 

        MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表 达式匹配。 

案例1:查找姓名以l开头且以y结尾的学生信息 

 (6)字段控制查询

        去除重复记录 :两行或两行以上记录中系列的上的数据都相同时,想去除重复记 录,需要使用DISTINCT。

 案例1:上面中age有重复的17,去掉重复部分

案例2、查看学生的学号与年龄之和 

 

注意: 

  1. num和age两列的类型都是数值类型,所以可以做加运算。如果num或age中有一个字 段不是数值类型,那么会出错。
  2. age列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果 可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL: 

 

案例3、给列名添加别名as 

SELECT *, sal(列选项)+IFNULL(comm,0) AS total FROM emp(表名);

给列起别名时,是可以省略AS关键字的: 

SELECT *,sal+IFNULL(comm,0) total FROM emp; 

 

(7)排序 

 案例1:查询所有学生记录,按年龄升序排序

SELECT * FROM stu ORDER BY age ASC; 或者 SELECT * FROM stu ORDER BY age; 

案例2::查询所有学生记录,按年龄降序排序 

SELECT * FROM stu ORDER BY age DESC; 

案例3:查询所有学生,按年龄降序排序,如果年龄相同时,按编号升序排序 

 select * from stu order by age desc, num asc;

(8)聚合函数 

 sum avg max min count 聚合函数是用来做纵向运算的函数。

  • COUNT():统计指定列不为NULL的记录行数;
  • MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  • MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  • SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  • AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

案例1:统计年龄大于18的学员人数 

案例2:统计学员的总年龄 

案例3:统计学员的平均年龄 

案例4:统计学员的最低年龄以及最高年龄 

(9)分组查询 

        当需要分组查询时需要使用GROUP BY子句,例如查询每个班级的年龄和,这说明要使用班级来分组。 注:凡和聚合函数同时出现的列名,则一定要写在group by 之后 

        由于上面stu中没有班级列名称,所以接下来需要将stu中添加class列: ALTER TABLE stu ADD class text; 

 

为每一列class中添加数据:

update stu set class='class_A' where num=1; update stu set class='class_B' where num=2; update stu set class='class_A' where num=3; update stu set class='class_B' where num=4; update stu set class='class_A' where num=5; 

案例1:查询每个班的总年龄(分组查询) 

select class,sum(age) from stu group by class; 

案例2:查询班级学生总年龄>50的班级 

select class,sum(age) from stu group by class having sum(age)>50; 

 (10)LIMIT限定查询结果的起始行

        LIMIT用来限定查询结果的起始行,以及总行数 

案例1:查询3行纪录 起始行从0行开始

select * from stu limit 0,3;

七、数据约束和域完整性 

        保证用户输入的数据保存到数据库中的正确性。确保数据的完整性 = 在创建表时给表中添加约束实体

 数据约束类型

  • 主键约束(primary key)
  • 唯一约束(unique)
  • 自动增长列(auto_increment)

1、数据约束 

(1)主键约束(primary key) 

        每个表中只有一个主键。特点:数据唯一,且不能为null

 方式一:

CREATE TABLE student( id int primary key, name varchar(50) );

方式二:此种方式优势在于,可以创建联合主键 

  1. CREATE TABLE student( id int, name varchar(50), primary key(id) ); 
  2. CREATE TABLE student( classid int, stuid int, name varchar(50), primary key(classid,stuid) );

方式三:单独添加主键 

CREATE TABLE student( id int, name varchar(50) );

ALTER TABLE student ADD PRIMARY KEY (id)

(2)唯一约束(unique) 

         数据不能重复,表中的唯一约束可以多个(null不算重复)

 CREATE TABLE student( Id int primary key, Name varchar(50) unique );

 (3)自动整长列(auto_increment)

        特点:默认从最大值开始+1操作 给主键添加自动增长的数值,列只能是整数类型 

CREATE TABLE student( Id int primary key auto_increment, Name varchar(50) ); 

 域完整性约束分类

  • 非空约束(not null)
  • 默认值约束(default)
  • check约束(mysql不支持)check(sex='男' or sex='女') 

数据类型完整性 

        数值类型、日期类型、字符串类型 

 2、域完整性

         限制此单元格的数据正确,不对照此列的其它单元格比较,域代表当前单元格。

(1)非空约束:not null 

CREATE TABLE student( Id int primary key, Name varchar(50) not null, Sex varchar(10) ); 

(2)默认值约束 default

CREATE TABLE student( Id int primary key, Name varchar(50) not null, Sex varchar(10) default '男' );

insert into student values(1,'tom','女');

insert into student values(2,'jerry',default); 

 八、MySQL语句进阶

 1、联结表(多表操作)

(1)概述 

        保存数据时往往不会将所有数据保存在一个表中,而是在多个表中存储,联结表就是从 多个表中查询数据。 在一个表中不利于分解数据,也容易使相同数据出现多次,浪费存储空间;使用联结表 查看各个数据更直观,这使得在处理数据时更简单。

        例如:学生每年的考试成绩,学生个人信息基本固定(包括学号、姓名、地址等);把所有信 息放在同一个表中必然会造成学生的学号等基本信息重复 

        单表缺点: 每年记录的成绩都需要添加重复的学生信息,如:name,num;

分表存储:

学生信息表: 

学生成绩表(grade表) 

优点:

  1. 将学生信息和成绩分开存储,节省空间,处理简单,效率更高,在处理大量数据时尤为 明显。
  2. 使用关系型数据库存储数据,各个表的设计是非常重要的,良好的表设计,能够简 化数据的处理,提高效率,提高数据库的健壮性 。

 (2)使用联结表

语法:select 列名1,列名2,.. from 表1,表2,.. where 判断语句;

案例:查看stu和grade表中的学生学号、姓名、班级、成绩信息 

2、 视图(虚拟表)

(1)创建视图 

目的:简化复杂的MySQL操作(如:多表查询)

语法:create view 视图名 as 语句; 

create view StuGrade as select stu.num,name,score,class from stu,grade where stu.num=grade.num; 

 (2)删除视图

        语法:drop view 视图名; 

案例1:从视图StuGrade中查询班级为class_A的学生信息 

案例2:统计每个班级的平均成绩 

案例3:统计每个班级的及格的次数

3、触发器 

(1)概念 

        SQLite的触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行调用

  • 只有每当执行delete,insert或update操作时,才会触发,并执行指定的一条或多条 SQL语句。 例如: 可以设置触发器,当删除persons表中lucy的信息时,自动删除grade表中与lucy相关 的信息
  • 触发器常用于保证数据一致,以及每当更新或删除表时,将记录写入日志表 

(2)创建触发器

语法:

delimiter ||

create trigger 触发器名 [after|before] [delete|update|delete] on 表名 for each row

begin

语句;

end ||

delimiter ; 

案例:删除stu表中的数据后 触发 删除grade中相同num的所有数据 

测试触发器: 

(3)查看触发器

语法:show triggers; 

(4)删除触发器 

 Drop trigger 触发器名;

九、c语言操作MySQL 

1、下载c语言编译时需要的库函数 

sudo apt-get install libmysqld-dev

编程结构文档在MySQL官网文档查看c语言的API即可: https://dev.mysql.com/doc/c-api/5.7/en/ 

2、解决ubuntu下MySQL远程连接的问题 

        Ubuntu下默认安装MySQL只支持本地机的localhost和127.0.0.1进行连接访问,不能通过 虚拟机的IP地址进行远程访问MySQL.需要修改权限,具体操作步骤如下: 

(1)首先从localhost本机连接mysql

ubuntu下执行如下命令 :

mysql -u root -p 或sudo mysql

         这时会提示你输入root的密码,输入root密码后登陆进入mysql控制台。 在mysql控制台中执行如下sql语句 :

        use mysql;//打开mysql库。

        update user set host = '%' where user = 'root';//修改权限表,将root的登陆host改为‘%’,即允许所有ip

        flush privileges;//立刻刷新权限。

        如果你的mysql版本较早,则此时即已完成权限修改,可以通过远程ip连接mysql了。 如果你还是不能远程连接,则继续执行下一步操作: 

(2)修改mysqld.cnf配置文件 

ubantu终端下输入命令: 

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

修改其中的bind-address后面的ip值为0.0.0.0,如下: 

bind-address = 0.0.0.0 

保存修改,重启mysql,即可。命令如下: 

service mysql restart 

至此,即可通过远程ip登陆mysql了。

3、MySQL C API 

(1)所需头文件 

#include<mysql/mysql.h> 

(2)获取或初始化MYSQL结构 

 MYSQL *mysql_init(MYSQL *mysql)

描述: 分配或初始化与mysql_real_connect()相适应的MYSQL对象

参数: mysql :MYSQL*句柄

返回值: 初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。 

(3)与远程主机上的MySQL数据库建立连接

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

描述: mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。

参数:

mysql:MySQL句柄

host:“host”的值必须是主机名或IP地址. 如果“host”是NULL或字符串"localhost"、”127.0.0.1”,连接将被视为与本地主机的连接.

user: MySQL登录的用户名

passwd: MySQL登录的密码

db:数据库名称

port:MySQL服务器监听客户端连接到来的端口号(默认:3306)

unix_socket:如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名 管道(默认为NULL)

client_flag: 通常为0,可以更改其值,以允许特定功能(详情见手册)

返回值: 如果连接成功,返回MYSQL*连接句柄。

返回值与第1个参数的值相同。 如果连接失败,返回NULL。 

(3)执行MySQL语句 

 Int mysql_real_query(MYSQL *mysql,const char * query,unsigned long length)

描述: 执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字 符串必须包含1条SQL语句,而且不 应为语句添加终结分号(‘;’)或“\g”。如果允许 多语句执行,字符串可包含由分号隔开的多条语句。

参数:

mysql:MySQL句柄

query:需要执行的MySQL语句

length:需要执行的MySQL语句的长度

返回值: 如果查询成功,返回0。 如果查询失败,返回非0值 

(4)获取执行MySQL语句的结果 

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

描述: 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调 用mysql_store_result()或mysql_use_result() 。 对于其他查询,不需 要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result() 是否返回0,可检测查询 是否没有结果集(以后会更多)

参数: Mysql:MySQL句柄

返回值: 成功 返回具有多个结果的MYSQL_RES结果集合。 失败 返回NULL 

(5)获取结果集中的列数 

unsigned int mysql_num_fields(MYSQL_RES *result)

描述: 返回结果集中的列数

参数: result :MYSQL_RES结果集句柄

返回值: 表示结果集中行数的无符号整数 

(6)获取结果集中的行数 

my_ulonglong mysql_num_rows(MYSQL_RES *result)

描述: 返回结果集中的行数

参数: result:MYSQL_RES结果集句柄

返回值: 结果集中的行数 

(7)获取结果集中的列名称 

MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result)

描述: 返回采用MYSQL_FIELD结构的结果集的列。重复调用该函数,以检索关于结果集中 所有列的信息。未剩余字段时,mysql_fetch_field()返回NULL。

参数: result:MYSQL_RES结果集句柄

返回值: 当前列的MYSQL_FIELD结构。如果未剩余任何列,返回NULL 

(8)获取结果集中的每列数据(重要) 

 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述: 检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行, mysql_fetch_row()返回NULL

参数: MYSQL_RES结果集句柄

返回值: 下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL

(9)释放结果集

Void mysql_free_result(MYSQL_RES *result)

描述: 释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分 配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存

参数: MYSQL_RES结果集句柄         返回值: 无 

(10)释放MySQL句柄

Void mysql_close(MYSQL *mysql)

描述: 关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的, mysql_close()还将解除分配 由mysql指向的连接句柄

参数: MySQL连接句柄         返回值: 无 

案例代码: 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
int main(int argc, char const *argv[])
{
    MYSQL mysql, *sock;
    //初始化数据库环境
    mysql_init(&mysql);

    //连接数据库
    sock = mysql_real_connect(&mysql, "127.0.0.1", "root", "111111", "person", 3306,                     NULL, 0);
    if (sock == NULL)
    {
        perror("连接失败\n");
        return 0;
    }
    printf("连接成功\n");

    //执行MySQL语句
    //char *sql_str = "select * from stu where num=102";
    char *sql_str = "insert into stu values(200,'bob',23,'class_A')";
    int ret = mysql_real_query(&mysql, sql_str, strlen(sql_str));
    if (ret != 0)
    {
        perror("mysql_query");
        return 0;
    }
    //获取MySQL执行语句的结果
    MYSQL_RES *res = mysql_store_result(&mysql);
    if (res)
    {
        //获取结果集中的列数(字段数)
        //获取结果集中的行数、列数
        int column = mysql_num_fields(res);
        int row = mysql_num_rows(res);
        printf("row=%d, column=%d\n", row, column);
        if (column > 0)
        {
            //获取属性名
            MYSQL_FIELD *field;
            while ((field = mysql_fetch_field(res)))
            {
                printf("%s ", field‐>name);
            }
            printf("\n");
            //获取下一行的结果
            MYSQL_ROW *nextRow;
            while (nextRow = mysql_fetch_row(res))
            {
                int j = 0;
                for (j = 0; j < column; j++)
                {
                    printf("%s ", nextRow[j]);
                }
            printf("\n");
            }
        }
    }
    //释放结果
    mysql_free_result(res);

    //关闭连接
    mysql_close(sock);
    return 0;
}

(11)终端执行如下命令连接 

 gcc 00_code.c ‐lmysqlclient

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值