目录
0x00数据库分类:
1.关系型数据库:MySQL,Oracle,Sqlserver 存到磁盘
2.非关系型数据库(内存数据库nosql):memcache redis 存到内存中
3.文档型数据库:mongodb
0x01 MySQL的安装以及连接
windows 安装:
MySQL官网下载免安装版,然后直接解压
首先,打开mysql文件夹,在其中创建一个名为data的目录,这个文件夹将来用来存数据库文件
然后,创建一个名为my.ini的配置文件,打开,输入:
[mysqld]
basedir = mysql文件夹的绝对路径 (例如:D:/phpstudy_pro/Extesnsions/MySQL8.0.12/)
datadir = data文件夹的绝对路径 (例如:D:/phpstudy_pro/Extesnsions/MySQL8.0.12/data/)
然后,初始化数据库
打开cmd窗口,在bin文件夹下找到mysql.exe,将其拖入cmd窗口,输入参数 --initialize-insecure 回车
原来创建data空文件夹,就会自动添加许多文件。
最后,添加环境变量
我的电脑>>属性>>高级设置>>高级>>环境变量>>Path>>添加bin的绝对路径
cmd中输入
mysqld 启动mysql,可以通过 netstat -ano 查看如果有3306端口,说明mysql启动成功
MySQL 默认端口为:3306
1.启动MySQL
2.连接MySQL:
/Applications/MAMP/Library/bin/mysql -u root -p
回车,输入密码,默认为root
show databases;展示所有数据库
exit 中断连接,但是mysql仍然在运行,仍然占用3306端口
如何修改数据库的密码?
同源文件夹中打开mysqladmin - u root -p 原密码 password 新密码
mysqladmin -u root -p shutdown 停止mysql,解除端口占用。
0x01各个目录功能介绍
- bin:可执行文件
- data:主要包含数据库文件,一个数据库对应其中的一个文件夹(对应show database),一个数据库(文件夹)中存了许多表
- DESKTOP-O1B1JQ7.err中记录各种报错日志
- DESKTOP-O1B1JQ7.pid 中记录了mysql的进程id
- include文件夹:因为MySQL是用C写的,所以include中包含的是所有的头文件。
- lib:存储库文件
- my.ini 配置文件
0x02 MySQL的几个概念
数据库(database):数据库是一些关联表的集合
数据表(table):表示数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格
列(字段column):一列包含了相同类型的数据
字段类型:规定字段可以存储什么样的数据类型(数值,浮点,字符串,时间)
行(记录row):
0x03 SQL语句书写规则:
- 以分号结尾,可以用delimiter修改结束符。例如:输入delimeter // 那么就将结束符修改为了//,以后;结尾就不好使了。
- 关键词不区分大小写(php代码中写sql语句时推荐大写,命令行中无所谓)
- 注释:
- #注释
- -- 注释 注意--之后要加个空格
- /*注释*/
0x04 数据类型(列类型 /字段类型):
整数型:
为什么设置这么多类型?为了省空间。把合适的数据放到合适的类型。不要用一个很大的类型来存一个很小的数据。
例如:年龄一般用tinyint ,博客文章数一般用smallint
小数型:
前面两种不常用,最常用的是decimal。例如存储金额
字符串类型:
例如,md5加密后的32位的密码就可以用char(32)来存。因为不同的用户名,长度不同,所以一般用varchar(最大长度)来存
日期时间类型:
0x05 字段的属性(列名)
1.unsigned 无符号
2.auto_increment:自增
3.default 默认值,即本列单元格中如果用户上传了值,就用用户上传的值,如果没有指定,那么就用默认值。
4.comment 字段解释说明:如果字段命名不是那么好理解,就需要用comment解释这个字段存什么数据
5.not null:非空限制
6.null:空限制
7.unique:唯一索引,用于提升查询效率,给单元格加上索引,查找的时候就更快了
8.index:普通索引
9.primary key 主键,想要字段属性为auto_increment 自增,必须先指定primary key,然后才会以primary_key为标准排序。
0x06 SQL语句的运算符
= :赋值和判断那都是
!=(<>):都是不等于
< > <= >=
OR(||):或者
AND(&&):且
BETWEEN...AND...:在...和...之间
IN:
NOT IN
0x07SQL语句的分类
- DDL(data defination language)数据定义语言,作用:创建,删除,修改,库表结构(重点)
- DML (data manipulation language) 数据操作语言,作用: 增,删,该表的记录(重点)
- DCL(data control language) 数据控制语言,作用:用户的创建以及授权。运维常用
- DQL(data query language) 数据查询语言,作用:查询数据(重点)。小白写出来的查询语句可能需要10秒钟,但是资深开发写出来的查询语句可能需要1秒钟
0x08 DDL 数据定义语言
1.数据库相关操作:
- show databases; 查看所有数据库
- use 数据库名; 切换数据库,只有当需要对数据库中的表进行操作的时候,才需要切换数据库。
- create database 数据库名; 创建数据库
- drop database 数据库名;删除数据库,不需要切换数据库
2.数据表相关操作(先use 数据库名)
- create table 表名(列名 列类型 一个或多个列属性,列名 列类型 列属性,列名 列类型 列属性);
- 表名/字段名规则:小写字母,用下划线隔开,有意义,不要用系统关键字
- 例如:create table user(id int unsigned auto_increment not null primary key comment ’用户id‘,user_name varchar(20) not null default 'xidian' comment '用户名',pwd char(32) not null comment '用户密码');
这样写更清晰。
- 密码一般是md5加密的32位字符串,因此采用定长字符类型32.
- 建议给每个列都添加not_null属性
- show tables; 查看当前数据库中的所有表
- desc 表名;查看表结构
- show create table 表名; 显示创建表的sql语句
- alter table 原表名 rename 新表名;
- alter table 表名 add 列名 列类型 列属性;向表中添加列
- alter table 表名 add 列名 列类型 列属性 after 已有列名; 在指定位置添加列
- alter table 表名 modify 列名 新的列类型 新的列属性;修改列名的属性和类型。
- alter table 表名 change 原列名 新列名 新类型 新属性; 修改列名,属性,类型
- alter table 表名 drop 列名;删除表中的列;
- drop table 表名;删除表
0x09 DML数据操作语言:
1.insert:
- select * from 表名;显示表中的所有数据
- insert into 表名(列1,列2,列3...) values(列值1,列值2,列值3...);
- 向表中添加数据
- 注意:
- 后面的列值和前面的列一一对应;
- 设置为auto_increment 的列可以不手动添加值,因为会自动添加
- 字符串必须加引号,列名不必加引号
- 不一定要枚举出每个列名,可以选择性的设置,例如:insert into user (username) values ('zhangxueyou');如果报错了,一般是因为在定义表的时候,将其他字段定义为了not null 且 没有设置 默认值。解决方法有两种:要么不要指定这些字段为非空(不可取!),要么为这些字段指定默认值。
- insert into 表名 values(列值1,列值2,列值3,..)
- 可以省略(列1,列2,列3...),但是这样的话,表有多少个字段就要指定多少个值。并且值的顺序必须和字段的顺序相对应。
2.delete
1.delete from 表名 where 条件
注意!
不加where条件会删除所有的数据。
delete删除后,再插入数据,新的数据的id号会从原来的id号开始递增
如:delete from user where id = 1;
2.truncate 表名 where 条件
truncate删除后,再插入数据,新的数据id从1开始
3.update
update 表名 set 列1 = 列值,列2 = 列值 where 条件; 修改表中的内容;
例如:
update user set pwd = 213231;将所有行的密码都改成213231
update user set pwd = 212332 where user_name = 'liudehua';
0x0A DCL数据控制语言
线上的时候:
1.要修改root密码
2.不要用root用户连接数据库
正常线上项目一个mysql可能会跑好几个项目,每个项目对应一个数据库,不同的数据库要对应不同的用户,并且权限也不一样。
例如:你有两个项目,一个博客项目,一个商城项目。
博客项目需要一个用户,商城项目也需要创建一个用户。这样就算博客项目的用户丢了,也不回影响的商城项目。并且博客项目用户的权限仅仅是连接博客的数据库。没有权限连接商城的数据库
0.查看当前有多少用户:
数据库用户信息存在mysql数据库的user表中。
show database;
use mysql;
show tables;
desc user;
select Host,User,authentication_string from user;
1.创建用户:
create user 用户名 @'IP地址' identified by '密码'
例如:create user 'blog' @'%' identified by '123456';
%是通配符,表示可以通过任意ip地址以该用户来连接数据库。
mysql -u 用户名 -h 数据库所在服务器ip -p 连接远程的数据库
当不加-h 时,默认为 -h 127.0.0.1
想要修改配置,只要修改user表中的配置信息即可,然后flush privilege例如:
update user set host ='192.168.1.12' where user = 'blog';
flush privileges;刷新权限
2.给用户授权
grant 权限1,权限2... on 数据库名.* to 用户名 @IP地址或者%;
如果想给所有的数据库授权,就用*.*
数据库名.*表示授权范围:数据库下所有的表
然后flush privileges;
例如:
在root用户下执行:
GRANT insert,update,delete,select ON blog.* TO 'blog' @'192.168.1.206';
flush privileges;
然后退出,用blog用户登录,show databases; 就可以看到blog数据库了。
如果授权没问题,但是还是没权限,可以尝试重启cmd。
如果想授权所有权限,可以写ALL 或者 ALL_PRIVILEGES
3.show grants for 用户名@'IP地址';
显示该用户的所有权限。
4.回收权限
revoke 权限1,权限2..on 数据库名.* from 用户名 @'ip';
flush privileges;
5.创建用户加授权一步搞定:
grant 权限1,权限2 on 数据库名.* to 用户名@IP identified by 密码;
flush privileges;
6.删除用户
drop user 用户名@'IP地址'
7.修改用户密码:
mysqladmin -u用户名 -p原密码 password新密码
方法二:直接修改user表中的authentication_string字段
update user set authentication_string = password('123456') where user =用户名
password()是一个内置函数,用户将明文密码加密为密文
flush privileges;
5.7之前的版本authentication_string字段为password
8.忘记密码
首先关闭数据库
mysqladmin -uroot -p shutdown 这样仍然需要密码,所以直接在任务管理器中直接关闭mysql
然后,
mysqld --skip-grant-table回车,表示跳过权限表,不再验证密码
再打开一个窗口,输入mysql回车不需要输入用户名密码就进来了
然后进入user表中修改密码即可。