mysql安装及基本操作
1 清除冲突软件mariadb (如果安装了的话)
rpm -q mariadb-server mariadb
systemctl stop mariadb
rpm -e --nodeps mariadb mariadb-server
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql/*
2 安装软件mysql 社区开源版软件
tar -xf mysql-5.7.17.tar
yum -y install mysql-community-*.rpm
3 启动服务并设置开机运行 查看进程和端口
systemctl start mysqld
systemctl enable mysqld
netstat -utnlp | grep 3306 等效与 ss -utnlp | grep 3306
ps -C mysqld 等效于 ps aux | grep mysqld
4 查看连接MySQL服务初始密码
[root@host50 ~]# grep password /var/log/mysqld.log | tail -1
2021-12-06T01:47:49.262056Z 1 [Note] A temporary password is generated for root@localhost: p.7jr.uy.aiZ
5 使用初始密码连接服务
[root@host50 ~]# mysql -hlocalhost -uroot -p'p.7jr.uy.aiZ'
6 修改登录密码(服务强制修改且修改的密码要符合服务要求的复杂度)
mysql> alter user root@"localhost" identified by "123qqq...A";
7 断开连接
mysql> exit;
临时修改密码的复杂度
show variables like "%password%"; 查看与密码相关的配置项
mysql> set global validate_password_policy=0; 修改密码等级为0
mysql> set global validate_password_length=6; 修改最小密码长度
永久修改密码策略
vim /etc/my.cnf (永久配置)把修改 添加到配置文件里 数据库服务重启了 依然有效
[mysqld]
validate_password_policy=0
validate_password_length=6
#破解数据库root密码
1.vim /etc/my.cnf
[mysqld]
#validate_password_policy=0
#validate_password_length=6
skip-grant-tables #跳过授权库MySQL库启动服务 作用连接服务不需要输入密码
mysql> flush privileges; 使修改配置生效
2. 线上破解密码
步骤如下:
1 拷贝其他数据库服务器 管理员root用户能正常连接数据库服务的mysql库 覆盖本机的mysql库
!!!!mysql库存放的是 数据库服务器的用户和密码!!!
2 查看mysql服务 父进程的pid
3 给mysql服务的父进程发送 SIGHUP信息 (作用重新加载数据库目录下的文件 ,可以重新识别 mysql库里的用户和密码)
4 使用破解后的密码登录(密码和root用户能正常登录服务主机的的root密码一样)
scp -r 192.168.4.51:/var/lib/mysql/mysql /var/lib/mysql/
[root@host50 ~]# which pstree || yum -y install psmisc
[root@host50 ~]# pstree -p | grep mysqld | head -1
[root@host50 ~]# kill -SIGHUP 1603
[root@host50 ~]# mysql -hlocalhost -uroot -pNSD2021...a
mysqladmin -uroot -p旧密码 password 新密码
安装图形软件
在数据库服务器安装图形软件 ,通过连接图形软件,对数据库做管理)
要求:在IP地址192.168.4.50主机安装phpmyadmin软件
步骤一:安装phpmyadmin软件。
1) 部署phpmyadmin运行环境 LAP (L 指的是 linux 系统 A 指的是apache P 指的是PHP)
2) 安装phpmyadmin软件
3) 修改配置文件 : 修改phpmyadmin软件的配置文件
365 yum -y install httpd php php-mysql
367 systemctl start httpd ; systemctl enable httpd
371 tar -xf phpMyAdmin-2.11.11-all-languages.tar.gz
373 mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpmyadmin
374 cd /var/www/html/phpmyadmin
378 cp config.sample.inc.php config.inc.php 创建主配置文件
380 vim +17 config.inc.php #在''号里添加plj123
步骤二:客户端通过访问phpmyadmin软件管理数据库。
打开真机的浏览器 输入
访问的网址 http://192.168.4.50/phpmyadmin
相关参数(必须熟知 )
主配置文件 /etc/my.cnf
数据库目录 /var/lib/mysql
服务的进程名/端口 mysqld/3306
进程所有者和所属组 mysql/mysql
数据传输协议 tcp
错误日志文件名 /var/log/mysqld.log
基本命令:
mysql> show databases; 显示服务器上已有的库(文件夹)
mysql> select user(); 显示当前登录的用户名和客户端地址
mysql> select version(); 显示数据库服务软件的版本号
mysql> select database(); 显示当前所在的库
mysql> use mysql; 进入到mysql库里
mysql> show tables; 显示所在库下已有的表 (表就是用来存数据的文件 )
mysql> select @@version; 查看环境变量
mysql> desc tarena.user; 查看表结构
mysql>select name as 用户名 , homedir 家目录 from tarena.user; 取别名
mysql> select concat(name,"-",uid) as 用户信息 from tarena.user; 拼接
mysql> select distinct shell from tarena.user; 不显示重复项
数值比较 符号 = != > >= < <=
相等 不相等 大于 大于等于 小于 小于等于
字符比较 符号 = !=
空 is null 表头下没有数据
非空 is not null 表头下有数据
范围匹配条件 in 、 not in 、 between 数字1 and 数字2
模糊匹配条件 where 字段名 like ‘表达式’
统配符号
_ 表示 1个字符
%表示零个或多个字符
正则匹配 使用正则表达式做判断条件 格式: 字段名 regexp '正则表达式'
^ 匹配行首
$ 匹配行尾
[] 匹配范围内任意一个
* 前边的表达式出现零次或多次
| 或者
逻辑匹配 就是有多个判断条件
逻辑与 and && 多个判断条件必须同时成立
逻辑或 or || 多个判断条件其中某个条件成立即可
逻辑非 not ! 取反
() 提高优先级 作用:改变执行顺序
表管理
建库的基本命令 create database 库名;
create table 库名.表名(
表头名1 数据类型,
表头名2 数据类型,
表头名3 数据类型,
表头名4 数据类型
);
Create Table: CREATE TABLE `t1` (
`level` tinyint(3) unsigned DEFAULT NULL,
`money` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 西欧字符编码
命令格式: alter table 库名.表名 操作命令;
可以做哪些修改呢?(操作命令)
添加新表头 add
删除表头 drop
修改表头存储数据的 数据类型 modify
修改表头名 change
修改表名 rename
mysql> alter table studb.stu rename studb.stuinfo; 修改表名
mysql> alter table studb.stuinfo drop age ; 删除字段
mysql> alter table studb.stuinfo add mail char(30) ; 添加在末尾
添加在指定位置
mysql> alter table studb.stuinfo add number char(9) first , add school char(10) after name;
mysql> alter table studb.stuinfo 修改字段类型
-> modify
-> mail varchar(50) not null default "plj@tedu.cn";
mysql> alter table studb.stuinfo change class class_name char(9) ; 修改表头名
使用modify 修改表头的位置
mysql> alter table studb.stuinfo modify age int after name ;
表头和数据复制都复制的
命令格式 create table 库名.表名 select * from 库名.表名 ;
仅仅复制表头命令格式:(只复制表结构)
命令格式 CREATE TABLE 库.表 LIKE 库.表
管理表记录 :
对表中存储的行做管理 ,
操作包括 查看select 插入 insert into 更新 update 删除 delete
添加行 insert into
修改 update
删除行 delete
mysql> select * from studb.stuinfo;
mysql> insert into studb.stuinfo
-> values
-> ("nsd211102" , "jim",21,"boy"),("nsd211103","lucy",18,"girl");
命令格式: update 库名.表名 set 字段名 = 值 , 字段名 = 值 ;
仅删除符合条件的行 (删除命令有筛选条件)
delete from 库.表 where 筛选条件;
注意 也可以使用 truncate table 库.表; 删除表里的记录
truncate 与 delete 删除记录的区别!!! (要知道 )
- TRUNCATE不支持WHERE条件
- 自增长列,TRUNCATE后从1开始;DELETE继续编号
- TRUNCATE不能回滚,DELETE可以
- 效率略高于DELETE
字符类型 (表头下存储的是汉字或者是英文字母)
char(字符个数) 定长字符类型(固定长度) 存储范围 1-255字符 补空格
varchar(字符个数) 变长 (长度不固定) 存储范围 1-65535字符 (有效存储范围到65532) 不会补空格
一个英文字母 是一个字符
一个汉字也是一个字符
char 和 varchar 共同点 都不能超出指定的字符个数
char 和 varchar 不同点 存储的字符个数小于指定的字符个数时处理的方式不一样,
枚举类型 给表头赋值时 ,值必须在类型规定的范围内选择
单选 enum(值1,值2,值3 ....)
多选 set(值1,值2,值3 ....)
日期时间类型 表头存储与日期时间格式的数据
年 year YYYY 2021
日期 date YYYYMMDD 20211104
时间 time HHMMSS 143358
日期时间(既有日期又有时间) datetime 或 timestamp
timestamp类型 不赋值 使用系统时间自动赋值
datetime类型 不赋值 使用null 赋值
datetime 与 timestamp 的区别?
第一个区别是存储范围不一样 (datetime存储范围大 timestamp范围小)
存储数据的方式不一样
使用2位数给year的表头赋值也是可以的 但会自动补全4位数
01-69 之间的数字使用20补全4位数的年 2001~2069
70-99 之间的数字使用19补全4位数的年 1970~1999
#查看默认的检索目录
mysql> show variables like "secure_file_priv";
第二 修改数据库服务默认的检索目录
[root@host50 ~]# vim /etc/my.cnf
[mysqld]
secure_file_priv=/myload #手动添加
数据导入格式:
mysql> load data infile "/检索目录/文件名" into table 库名.表名
fields terminated by "文件中列的间隔符号"
lines terminated by "\n" ;
数据导出命令格式1)
select 字段名列表 from 库.表 where 条件 into outfile "/检索命令名/文件名" ;
数据导出命令格式2)
select 字段名列表 from 库.表 where 条件
into outfile "/检索命令名/文件名" fields terminated by "符号" ;
一、字段约束
字段约束的作用是什么?
设置在表头上 ,用来限制字段赋值
字段都有哪些约束?(每一种约束都有各自的功能)
字段约束分类:
1、 PRIMARY KEY:主键,用于保证该字段的值具有唯一性并且非空。
2、NOT NULL :非空,用于保证该字段的值不能为空。
3、DEFAULT:默认值,用于保证该字段有默认值。
4、UNIQUE:唯一索引,用于保证该字段的值具有唯一性,可以为空。
5、 FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值。
建表时,创建主键 (2种语法格式 要记住)
语法格式1
create table 库.表( 字段名 类型 primary key , 字段名 类型 , ..... );
语法格式2
create table 库.表( 字段名 类型 , 字段名 类型 , primary key(字段名) );
删除主键命令格式(要记住)向表头下存储数据不受主键的限制
mysql> alter table 库.表 drop primary key ;
添加主键命令格式(要记住)
mysql> alter table 库.表 add primary key(表头名);
主键与auto_increment连用:
当给字段设置了auto_increment属性后,插入记录时,如果不给字段赋值
字段会通过自加1的计算结果赋值
要想让字段有自增长 那么字段必须有主键的设置才可以
复合主键
表中的多个表头一起做主键
复合主键的约束方式: 多条记录 主键字段的值不允许同时相同
创建有复合主键的表
create table db1.t39(cip varchar(15) , port smallint ,
status enum("deny","allow") , primary key(cip,port)
删除复合主键
mysql> alter table db1.t39 drop primary key;
添加复合主键时 字段下的数据与主键约束冲突 不允许添加
mysql> alter table db1.t39 add primary key(cip,port);
外键
核心思想:保证数据的一致性
插入记录时,字段值在另一个表字段值范围内选择。
外键的使用规则:
表存储引擎必须是innodb (在进阶课程里讲 现在仅需要知道如何指定表使用innodb存储引擎)
字段类型要一致
被参照字段必须要是索引类型的一种(通常是 primary key)
格式
create table 库.表(表头列表 ,
foreign key(表头名) #指定外键
references 库.表(表头名) #指定参考的表头名
on update cascade #同步更新
on delete cascade #同步删除
)engine=innodb;
外键验证:
1 外键字段的值必须在参考表字段值范围内
2 验证同步更新( on update cascade)
3 验证同步删除( on delete cascade) 练习到 17:18
mysql索引
ysql索引主要有三种结构:Btree、B+Tree 、Hash 。
索引优点具体如下:
可以大大提高MySQL的检索速度
索引大大减小了服务器需要扫描的数据量
索引可以帮助服务器避免排序和临时表
索引可以将随机IO变成顺序IO
索引的缺点:
虽然索引大大提高了查询速度,同时却会降低更新表的速度,
如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存索引文件。
建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
对于非常小的表,大部分情况下简单的全表扫描更高效。
索引的分类:
普通索引 (index)
不应用任何限制条件的索引,该索引可以在任何数据类型中创建。
字段本身的约束条件可以判断其值是否为空或唯一。
创建该类型索引后,用户在查询时,便可以通过索引进行查询。
唯一索引 (unique)
使用UNIQUE参数可以设置唯一索引。
创建该索引时,索引的值必须唯一。
通过唯一索引,用户可以快速定位某条记录。
主键是一种特殊唯一索引。
全文索引 (FULLTEXT)
使用FULLTEXT参数可以设置索引为全文索引。
全文索引只能创建在CHAR、VARCHAR或者TEXT类型的字段上。
查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。
在默认情况下,应用全文搜索大小写不敏感。如果索引的列使用二进制排序后,
可以执行大小写敏感的全文索引。
单列索引
顾名思义,单列索引即只对应一个字段的索引。
应用该索引的条件只需要保证该索引值对应一个字段即可。
可以包括普通、唯一、全文索引。
多列索引
多列索引是在表的多个字段上创建一个索引。
该索引指向创建时对应的多个字段,用户可以通过这几个字段进行查询。
要想应用该索引,用户必须使用这些字段中的第一个字段。
2.4 普通索引(index)的管理
普通索引(index)的使用规则(需要牢记)具体如下:
一个表中可以有多个index
字段的值可以重复,且可以赋值为null
通常在where条件中的字段上配置Index
index索引字段的标志为mul
创建普通索引(index)
1)建表时创建索引命令格式
CREATE TABLE 库.表(
字段列表 ,
INDEX(字段名) ,
INDEX(字段名) ,
);
查看索引详细信息 show index from 库.表;
删除索引
命令格式 DROP INDEX 索引名 ON 库.表;
在已有表添加索引命令格式
CREATE INDEX 索引名 ON 库.表(字段名);
explain命令 : 可以查看执行的查询select语句, 是否使用到索引做查询了
mysql用户管理:
1 用户授权
1.3 用户授权命令格式
GRANT 权限列表 ON 库名 TO 用户名@"客户端地址" IDENTIFIED BY “密码” WITH GRANT OPTION;
权限列表 : 就是添加的用户对指定的库名具有的访问权限表示方式(就是学过的sql命令)
ALL 表示所有权限 (表示所有命令)
USAGE 表示无权限 (除了查看之外啥权限都没有 , 看的命令show desc )
SELECT,UPDATE,INSERT 表示只有个别权限
SELECT, UPDATE (字段1,字段N) 表示权限仅对指定字段有访问权限
库名 :添加的使用户对服务器上的那些库有访问权限 可以表示的方式有:
*.* 表示 所有库所有表 第1个表示所有库名 第2个 表示所有表名
库名.* 表示一个库下的所有表 例如 tarena.*
库名.表名 表是一张表 例如 tarena.user
客户端地址: 表示网络中的那些主机可以使用添加的用户连接数据库服务表示的方式有:
% 表示网络中的所有主机
192.168.4.% 表示 192.168.4网段内的所有主机
192.168.4.1 表示仅仅是192.168.4.1 一台主机
localhost 表示数据库服务器本机
WITH GRANT OPTION :
让添加的用户也可以使用grant命令再添加用户,但用户本身要对mysql库有insert的权限
权限撤销 : 删除已有授权用户的权限
命令格式如下
REVOKE 权限列表 ON 库名 FROM 用户名@"客户端地址";
注意 : 库名的表示方式 要和 用户授权时的表示方式一样
3 删除添加的用户
drop user 用户名@"客户端地址";
查看用户访问权限
mysql> show grants for root@"%";
mysql> set password for 用户名@"客户端地址"=password("新密码"); #修改已有授权用户的连接密码