之前的一篇博客中稍微写了一些关于MySQL数据库的简单介绍,主要还是将更多的篇幅集中在了编译安装,现在回过头来,将目光聚焦在数据库原理上
数据库的基本概念
数据库平时肯定听的很多,没听过数据库,那也肯定听过数据,如果连数据都没听过,那还能看到这篇博客,属实有些不可思议了。数据库数据库,顾名思义,就是存放数据的库呗,数据以一条条"记录"的形式,按照统一的格式,存放在数据库中,组成了一个完整的数据库。而数据库中,这些数据并不是干巴巴的直接存放进去的,数据都被有序地存放在一张张数据表中,每一条数据对应数据包中的一行,每一列对应该条数据的各个属性,我们称列为字段。就像这样,行+列的形式,组成了数据表,然后n个数据表,组成了数据库。
当然,这些表并非绝对没有关系,在关系型数据库中,这些表通常是有那么一两个字段是有联系的。首先要说一下,什么是关系型数据库,就是表与表之间的关系对应着实体与实体之间的关系,很好理解,反之则为非关系型数据库。
关系型数据库,举个例子,就比如大学时候的一个学生的信息管理系统,在宿管那边,他的表里可能包含,学号、姓名、寝室号等等,在辅导员那边,也有学号姓名,但他可能还有学分、学时、对应的辅导员班主任等等,然后任课老师那边可能会有一个整体的课程id,可以根据选修课程id 找到下面有哪些学生等等,然后教务办那里会有一张总表,记录着学生的学号、寝室号、主修课等等,根据总表里的记录,找到对应各个分表里的详细数据。这里总表和分表并没有直接的从属关系,只是为了方便解释这么说,关系表大致就是这样,大白话说,就是各个表之间的关系,放到现实生活中,也是有一定联系的。
反之则为非关系表,存储大量数据,并且数据之间没有太大关系的时候,就用到非关系型数据库,比如淘宝,那么多用户发来那么多数据,但用户和用户之间并没有什么联系,那肯定就用到非关系型,量大、无关联,当然我也只是举个例子,具体用的什么我不得而知。
数据库管理系统
数据库管理系统 DBMS,用户通过操作DBMS来管理数据库,常见的比如 MySQL 、Oracle等等,就不详细列举了,至于navicat,它也是数据库管理工具,只不过是远程连接数据库进行管理, 能够提供友好的人机界面。
当用户发出请求时,将用户的数据请求(高级指令)转换为机器代码(底层指令),然后实现对数据库的操作,从数据库的操作中接受查询结果,对查询结果进行处理(格式转换),最后将处理结果返回给用户。
数据库的管理
登入MySQL
mysql -u root -p
输入密码,以root身份进入数据库
如果在之前就已经安装了MySQL了,然后记不得密码了,就去到my.cnf文件
vim /etc/my.cnf
在[mysqld]模块下添加一行
skip-grant-tables #登录mysql不使用授权表
然后保存退出,重启mysql 服务
这时我们再登录,直接输入mysql ,登录进去输入
show databases; (注意分号)
查看数据库
如果没有创建任何数据库的话,查看数据库应该是只有默认的四个
创建数据库
这里创建一个demo 数据库
create database demo;
use demo 切换至该数据库
创建数据表
创建完数据库就该创建数据表(table)了,我创建一个test表,创建表的时候必须定义字段及其属性,就比如需要创建一个学生表,学生表里有一些字段:学号、姓名、性别等等,其他用户在录入数据的时候不能乱填啊,姓名冒出一个数字,性别也是数字,那肯定不行,所以必须加以约束
一个字段的属性可以很多,也可以很少
Field:字段名称
Null :是否允许为空
Key :主键
Null :是否允许为空,如果不允许为空为 not null
Default :默认值
type:数据类型,常用的有:
int:整型 用于定义整数类型的数据
float:单精度浮点4字节32位 准确表示到小数点后六位
double:双精度浮点8字节64位
char:字符串,用于定义字符类型、长度
varchar:可变长度的字符类型
一般情况下没有特殊需求,就直接字段名+数据类型就行了
我续用学生表为例了,表内有学号,学号只能为整数,姓名,为字符串类型,性别也为字符串
create table student(id int not null,name char(20),sex char(10),primary key (id));
创建表必须定义主键,主键用于唯一标识表中的每一行记录,通常用于建立表与表之间的关联,具有一定的特殊性,不可重复
创建完了show tables; 查看已有的数据表
describe student; 展示表的结构
这样的话咱们数据表也创建完成了
有创建就有删除
我们将刚才那个命令复制一遍,将student改成s1,回车,再创一张表
show tables; 看看是否创建成功
然后删除这张表
drop table s1; 得在该表所在的数据库下才能直接删除该表
再次show tables; 不出意外的话表应该是被删除了,注意符号,命令不要拼错
同样的,drop也可以删除数据库,drop database 数据库名;就可以删除数据库了,也可以不进到数据库内,直接 drop table 数据库名.数据表名;对数据表直接进行删除。
数据操作
数据表创完,接下来该对数据进行耳熟能详的增删改查了
插入数据
也就是所说的增
用 insert 命令,格式是
insert into 表名 values(字段1的值,字段2的值,.....)
如果不按字段123的顺序,那么需要
insert into 表名 (字段1,字段2.....) values(字段1的值,字段2的值,.....)这样一一对应
比如我随便插入几条数据
insert into student values(01,'wukong','M');
insert into student values(02,'wuneng','M');
insert into student values(03,'guanyin','F');
插入字符串的时候需要加单引号
查看一下数据库,用到一个待会学的命令select ,查询student表内的所有数据
select * from student;
三条数据,不多不少
有一点,如果遇到需要插入密码时,那自然不能让别人随随便便看见,在插入密码字段时,就用
PASSWORD('123456'),这样,查询的时候,密码那一栏就是密文显示
有的时候,在定义表字段的时候,就定义了字段的属性为 auto_increment (自增),这样新增数据的时候就不用特地输入整个字段的值了,节省时间
还有 unique key表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
删除数据
删除是delete命令
delete from 表名 where 匹配条件
我先多插入几条数据,就还刚才那几条,稍作改动加进去吧
随便插入了几条数据
现在我要删除student表中 id为4的数据
delete from student where id=4;
4 无了
也可以删除多条,比如sex=F的,这里F要加单引号
delete from student where sex='F';
只剩两条数据了
如果要删除全部数据
delete from 表名; 这样表内所有数据都被删除
之前提到删除表删除数据库,drop,和delete有啥区别呢?
drop 不可回滚,也就是不可恢复,不能指定删除哪一条数据,就是不带where,表内容和结构删除 但删除速度快
delete 可回滚,可根据条件删除,删除表内所有内容后,表结构在,删除速度慢,需要逐行删除
还有个就是truncate,一般不用,不可回滚,不可where,表内容删除,删除速度快
删除很简单,就这么多,删的时候需慎重就行了
修改数据
update
update 表名 set 需要更改的字段名=更改后的值 where 根据字段进行筛选
比如我将wukong 的性别改为monkey
update student set sex='monkey' where id=1;
根据不同的需求做出不同的修改,不多举太多例子
查询数据
select 字段名 from 表名 where 条件表达式
我们所使用的 select * 就是查询某表内的所有数据
为了方便展示我再次随便插入了几个数据
我记不得学号为1 的同学的名字叫什么了
select name from student where id=1;
还要显示学号为1的同学的性别,那name 后面再加一个 sex即可
现在我只想显示前2行
select * from student limit 2;
显示二三行
select * from student limit 1,2; 代表第一行往后两行,那也就是二三行
表操作
对表进行操作也是时常会发生的
首先修改表的名字
alter table 旧表名 rename 新表名;
添加一个字段
alter table student add age int default '未提供年龄';
这样的话default 默认值 ,当字段内容为空时,它会显示定义的默认值
修改字段名
alter table 表名 change 旧列名 新列名 数据类型;
也可以只修改字段类型(一般不用)
alter table 表名 modify column 字段名 类型;
数据库用户管理
新建用户
创建一个用户
create user 'abc'@'localhost' identified by '123123';
abc 是用户名
localhost 是用户来源,指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录 可用通配符%,比如172.16.233.%,允许这个网段上的用户访问数据库
'123123'是密码,若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用
select password('密码');
获取密码密文,再在语句中添PASSWORD '刚才得到的密文';
若省略"IDENTIFIED BY"部分,则用户的密码将为空(不建议使用)
创建完成后,
use mysql;
select User,authentication_string,Host from user;
可以查看到abc用户了
用户重命名
rename user 'abc'@'localhost' to 'cba'@'localhost';
删除用户
drop user 'cba'@'localhost';
修改当前密码
set password = password('abc123');
也可以修改其他用户密码
set password for '其他用户名'@'来源地址' = password('密码')
前面提到过root密码忘记了怎么办,我们通过修改配置文件的方式,直接进入数据库,但是,问题依然存在,我还是不知道密码
这时候,可以接着免密进入mysql 继续操作
update mysql.user set authenctication_sring = password('新密码') where user='root'
然后要记得删除my.cnf 文件里的skip-grant-tables ,然后重启mysql服务
之后就可以以新密码登录root用户了
用户授权
之前我们用root用户的时候,对数据使用增删改查,都是畅通无阻的,但是,如果是普通用户,也能如此顺利的进行各种操作,那是相当不安全的,我们需要只给某些用户某些权限
grant 权限 on 数据库名.数据表名 to '用户名'@'来源地址';
如果要加密码还可以在最后添上 identified by '密码';
如果要授予多个权限,用逗号隔开,如果是所有权限,那就是 grant all privilege on ....
权限大致就 insert、select、update、delete、create、drop、reference、index、alter.....
flush privilege; 刷新权限
show grant for '用户名'@'来源地址' 可以查看权限
如果赋权错了没关系,可以赋权同样也可以撤销权限
revoke 权限 on 数据库名.表名 from '用户名'@'来源地址';