MySQL

LAMP部署-CSDN博客

之前的一篇博客中稍微写了一些关于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 '用户名'@'来源地址';

相关推荐
o(╥﹏╥)10 分钟前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长25 分钟前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_27 分钟前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui132 分钟前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记1 小时前
MHA binlog server
数据库·mysql
lovelin+v175030409661 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
DT辰白2 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
2401_871213302 小时前
mysql高阶语句
数据库·mysql
zxrhhm2 小时前
PostgreSQL的交互式终端使用一系列命令来获取有关文本搜索配置对象的信息
数据库·postgresql