关系型数据库
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\n”, ret);
return ret;
}
//–设置事务手动提交
ret = mysql_query(mysql, SET_TRAN);
if (ret != 0)
{
printf(“func mysql_query() err: %d\n”, 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\n”, ret);
return ret;
}
//–恢复事务自动提交标志
ret = mysql_query(mysql, UNSET_TRAN);
if (ret != 0)
{
printf(“func mysql_query() err: %d\n”, 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\n”, ret);
return ret;
}
//–恢复自动提交设置
ret = mysql_query(mysql, UNSET_TRAN);
if (ret != 0)
{
printf(“func mysql_query() err: %d\n”, ret);
return ret;
}
return ret;
}
11.总结:
有了数据库,就可以把想要的数据存储起来,想要用的时候直接取出来,多加练习,再接再厉。
改变自己,从现在做起———–久馆