关系型数据库

1、今天讲讲MySQL数据库:

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。

表头(header): 每一列的名称;

列(row): 具有相同数据类型的数据的集合;

行(col): 每一行用来描述某个人/物的具体信息;

值(value): 行的具体信息, 每个值必须与该列的数据类型相同;

键(key): 表中用来识别某个特定的人/物的方法, 键的值在当前列中具有唯一性。

2、Mysql用户设置:

如果需要添加 MySQL 用户,只需要在 mysql 数据库中的 user 表添加新用户即可。

以下为添加用户的的实例,用户名为ly,密码为123456,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

1) // 使用mysql数据库

 use mysql;

2) // 添加用户

insert into user(host, user, password, select_priv, insert_priv, update_priv) values('localhost', 'ly', PASSWORD('123456'), 'Y',  'Y',  'Y'); 

3) // 重新载入授权表

flush privileges;

4)  // 查询

select host, user, password from user where user = 'ly';  

注意:

(1)在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。

(2)在添加后需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。如果不使用该命令,你就无法使用新          

创建的用户来连接mysql服务器,除非你重启mysql服务器。

(3)可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:

 Select_priv   、  Insert_priv  、  Update_priv   、  Delete_priv    、  Create_priv    、   Drop_priv   、  Reload_priv

 Shutdown_priv    、  Process_priv     、  File_priv    、  Grant_priv    、   References_priv   、 Index_priv   、 Alter_priv 

3、管理MySql的命令:

use 数据库名            //选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

show databases      //列出 MySQL 数据库管理系统的数据库列表。

Subtopic

show tables             //显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。

4、MySQL数据类型:

1)整形 

2)浮点型

设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。

3)定点型

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。 

例:decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位

4)字符串

char和varchar:

(1).char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。 

(2).char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符

将占用4个字节。 

(3).char类型的字符串检索速度要比varchar类型的快。

varchar和text: 

a.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。 

b.text类型不能有默认值。 

c.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

5)二进制数据

(1).BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。 

(2).BLOB存储的数据只能整体读出。 

(3).TEXT可以指定字符集,BLOB不用指定字符集。

6)日期时间类型

若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

7)数据类型的属性

MySql的使用:

(1)、登录Mysql

当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:

mysql -h 主机名 -u 用户名 -p

-h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;

-u : 所要登录的用户名;

-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

以登录刚刚安装在本机的MySQL数据库为例, 在命令行下输入 mysql -u root -p 按回车确认, 如果安装正确且MySQL正在运行, 会得到以下响应。

Enter password:

若密码存在, 输入密码登录, 不存在则直接按回车登录, 按照本文中的安装方法, 默认 root 账号是无密码的。登录成功后你将会看到

Welecome to the MySQL monitor... 的提示语。

然后命令提示符会一直以 mysql> 加一个闪烁的光标等待命令的输入, 输入 exit 或 quit 退出登录。

(2)、创建一个数据库

使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:

create database 数据库名 其他选项];

例如我们需要创建一个名为 my_db 的数据库, 在命令行下执行以下命令:

create database my_db character set gbk;

为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。创建成功时会得到 Query OK, 1 row affected(0.02 sec) 的响应。

注意: MySQL语句以分号(;)作为语句的结束, 若在语句结尾不添加分号时, 命令提示符会以 -> 提示你继续输入(有个别特例, 但加分号是一定不会错的); 

提示: 可以使用 show databases; 命令查看已经创建了哪些数据库。

选择所要操作的数据库:

要对一个数据库进行操作, 必须先选择该数据库, 否则会提示错误:

 ERROR 1046(3D000): No database selected

***两种方式对数据库进行使用的选择:

a.在登录数据库时指定, 命令: mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p

例如登录时选择刚刚创建的数据库: mysql -D my_db -u root -p

b. 在登录后使用 use 语句指定, 命令: use 数据库名;

use 语句可以不加分号, 执行 use my_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed。

(3)、创建数据库表

使用 create table 语句可完成对表的创建, create table 的常见形式:

create table 表名称(列声明);

以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:

  create table students

  (

    id int unsigned not null auto_increment primary key,

    name char(8) not null,

    sex char(4) not null,

    age tinyint unsigned not null,

    tel char(13) null default "-"

  );   

对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中,

通过命令提示符下的文件重定向执行执行该脚本。 

打开命令提示符, 输入: mysql -D my_db -u root -p < createtable.sql

 (提示: 1.如果连接远程主机请加上 -h 指令; 2. createtable.sql 文件若不在当前工作目录下需指定文件的完整路径。)

5、数据插入

insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下: 

insert into] 表名 (列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

例如:

(1)要给 my_db 数据库中的 students 表插入一条记录, 执行语句:                 

         insert into students values(NULL, "王三", "男", 20, "13811371377");

(2)需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:

          insert into students (name, sex, age) values("孙丽华", "女", 21);

6、数据查询

(1)普通查询:

select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:

select 列名称 from 表名称 查询条件];

例如:

要查询 students 表中所有学生的名字和年龄, 输入语句 select name, age from students;

也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;

(2)按特定条件查询:

*where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;

以查询所有性别为女的信息为例, 输入查询语句: select * from students where sex="女";

*where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的,

例如 =、>、<、>=、<、!= 以及一些扩展运算符 is not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询。

示例:

查询年龄在21岁以上的所有人信息: select * from students where age > 21;

查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";

查询id小于5且年龄大于20的所有人信息: select * from students where id<5 and age>20;

7、数据更新

update 语句可用来修改表中的数据, 基本的使用形式为:

update 表名称 set 列名称=新值 where 更新条件;

使用示例:

将id为5的手机号改为默认的"-": update students set tel=default where id=5;

将所有人的年龄增加1: update students set age=age+1;

8、数据删除

delete 语句用于删除表中的数据, 基本用法为:

delete from 表名称 where 删除条件;

使用示例:

删除id为2的行: delete from students where id=2;

删除所有年龄小于21岁的数据: delete from students where age<20;

删除表中的所有数据: delete from students;

9、数据库表的修改

(1)添加列

基本形式: alter table 表名 add 列名 列数据类型 after 插入位置];

示例:

在表的最后追加列 address: alter table students add address char(60);

在名为 age 的列后插入列 birthday: alter table students add birthday date after age;

(2)修改列

基本形式: alter table 表名 change 列名称 列新名称 新数据类型;

示例:

将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";

将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;

(3)删除列

基本形式: alter table 表名 drop 列名称;

示例:

删除 birthday 列: alter table students drop birthday;

(4)重命名表

基本形式: alter table 表名 rename 新表名;

示例:

重命名 students 表为 workmates: alter table students rename workmates;

(5)删除整张表

基本形式: drop table 表名;

示例: 删除 workmates 表: drop table workmates;

10、删除整个数据库

基本形式: drop database 数据库名; 

示例: 删除 my_db 数据库: drop database my_db;

-- 创建用户

create user "xt"@"localhost" identified by "xt";

-- 查询数据库

show databases;

-- 使用数据库

use mysql -- 可不加分号

-- 查询表

show tables;

-- 查询用户

select user from user;

-- 修改密码

set password for "xt"@"localhost" = PASSWORD("123456");

-- 授权操作

grant insert , create , update on *.* to "xt"@"localhost";

-- 删除用户

drop user "xt"@"localhost";

-- 登录用户

mysql -u xt -p

-- 创建数据库

create database xxtt;

-- 删除数据库

drop database xxtt;

-- 创建表

create table student(

id int unsigned not null primary key auto_increment,

name char(10) not null,

age tinyint unsigned not null);

-- 查看表结构

describe student;

-- 修改表

alter table student add birthday date after id;

alter table student drop id;

alter table student add id int unsigned not null primary key auto_increment first;

alter table student add tel char(11) default "-";

alter table student rename stu;

-- 插入数据

insert into student(id , birthday , name , age , tel) values (1 , "1998-12-17" , "xt" , 21 , "111");

insert into student(birthday , name , age , tel) values ("1995-9-17" , "twb" , 24 , "222");

insert into student values

(3 , "2010-3-12" , "许苗苗" , 8 , "333"),

(4 , "1997-9-7" , "陈秋芝" , 22 , "444");

-- 删除表

drop table student;

-- 删除数据库

delete from student where id = 4;

-- 查询数据

select * from student;

select name from student where id > 3;

MySql接口使用:

1、获取错误信息

mysql_errno

mysql_error

2、连接远程服务器

mysql_init

mysql_close

mysql_real_connect

3、数据查询

mysql_query(&mysql, "set names utf8");                      //解决显示中文乱码

mysql_store_result                                                      //检索完整的结果集至客户端

mysql_fetch_fields                                                       //返回所有字段结构的数组

mysql_num_fields                                                        //返回结果集中的列数

mysql_field_count                                                        //返回上次执行语句的结果列的数目

mysql_fetch_row                                                          //从结果集中获取下一行

mysql_fetch_lengths                                                   //返回当前行中所有列的长度

mysql_use_result                                                        //初始化逐行的结果集检索

mysql_free_result                                                       //释放结果集使用的内存

4、MySql的事务处理

开启事务:START TRANSACTION

禁止自动提交:set autocommit=0

开启自动提交:set autocommit=1

提交事务:commit

事务回滚:rollback

事务封装:

#define BEGIN_TRAN "START TRANSACTION"

#define SET_TRAN "SET AUTOCOMMIT=0"

#define UNSET_TRAN "SET AUTOCOMMIT=1"

#define COMMIT_TRAN "COMMIT"

#define ROLLBACK_TRAN "ROLLBACK"

int mysql_BeginTran(MYSQL *mysql)

{

int ret = 0;

//--执行事务开始SQL

ret = mysql_query(mysql, BEGIN_TRAN);

if (ret != 0)

{

printf("func mysql_query() err: %d ", ret);

return ret;

}

//--设置事务手动提交

ret = mysql_query(mysql, SET_TRAN);

if (ret != 0)

{

printf("func mysql_query() err: %d ", ret);

return ret;

}

return ret;

}

int mysql_Rollback(MYSQL *mysql)

{

int ret = 0;

//--事务回滚操作

ret = mysql_query(mysql, ROLLBACK_TRAN);

if (ret != 0)

{

printf("func mysql_query() err: %d ", ret);

return ret;

}

//--恢复事务自动提交标志

ret = mysql_query(mysql, UNSET_TRAN);

if (ret != 0)

{

printf("func mysql_query() err: %d ", ret);

return ret;

}

return ret;

}

int mysql_Commit(MYSQL *mysql)

{

int ret = 0;

//--执行事务提交SQL

ret = mysql_query(mysql, COMMIT_TRAN);

if (ret != 0)

{

printf("func mysql_query() err: %d ", ret);

return ret;

}

//--恢复自动提交设置

ret = mysql_query(mysql, UNSET_TRAN);

if (ret != 0)

{

printf("func mysql_query() err: %d ", ret);

return ret;

}

return ret;

}

11.总结:

有了数据库,就可以把想要的数据存储起来,想要用的时候直接取出来,多加练习,再接再厉。

                              改变自己,从现在做起-----------久馆

原文地址:https://www.cnblogs.com/zzw19940404/p/14045055.html