用户和权限管理
用户管理
命令 | 描述 | 备注 |
---|---|---|
create user zhang3 identified by ‘123123’; | 创建名称为zhang3 的用户,密码设为123123; | |
select host,user,password,select_priv,insert_priv,drop_priv from mysql.user; | 查看用户和权限的相关信息 | |
set password =password(‘123456’) | 修改当前用户的密码 | |
update mysql.user set password=password(‘123456’) where user=‘li4’; | 修改其他用户的密码 | 所有通过user 表的修改,必须用flush privileges; 命令才能生效 |
update mysql.user set user=‘li4’ where user=‘wang5’; | 修改用户名 | 所有通过user 表的修改,必须用flush privileges; 命令才能生效 |
drop user li4 | 删除用户 | 不要通过delete from user uwhere user=‘li4’ 进行删除,系统会有残留信息保留。 |
host :表示连接类型
- % 表示所有远程通过TCP 方式的连接
- IP 地址如(192.168.1.2,127.0.0.1) 通过制定ip 地址进行的TCP 方式的连接
- 机器名通过制定i 网络中的机器名进行的TCP 方式的连接
- ::1 IPv6 的本地ip 地址等同于IPv4 的127.0.0.1
- localhost 本地方式通过命令行方式的连接,比如 mysql -u xxx -p 123xxx 方式的连接。
user:表示用户名
- 同一用户通过不同方式链接的权限是不一样的。
password:密码
- 所有密码串通过password(明文字符串) 生成的密文字符串。加密算法为MYSQLSHA1 ,不可逆。
- mysql 5.7 的密码保存到authentication_string 字段中不再使用password 字段。
select_priv , insert_priv 等
- 为该用户所拥有的权限。
权限管理
授予权限
收回权限
查看权限
MySQL 的逻辑架构
连接层
最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的
通信。 主要完成一些类似于连接处理、授权认证、及相关的安全方案。
- 在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。
- 同样在该层上可以实现基于SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
服务层
引擎层
存储引擎层,存储引擎真正的负责了MySQL 中数据的存储和提取,服务器通过API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
扫描二维码关注公众号,回复:
13241435 查看本文章
存储层
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
Profile
开启profile
-
查看profile 是否开启:
show variables like '%profiling%'
如果没有开启,可以执行set profiling=1 开启! -
使用 profile
执行 show prifiles 命令,可以查看最近的几次查询:
根据 Query_ID ,可以进一步执行show profile cpu,block io for query Query_id
来查看sql 的具体执行步骤。
MySQL 的查询流程
- 1、首先 mysql 客户端通过协议与mysql 服务器建连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析, 也就是说,在解析查询之前,服务器会先访问查询缓存(query cache)——它存储SELECT 语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。
- 2、 语法解析器和预处理:生成解析数,检查语法规则
- 首先 mysql 通过关键字将SQL 语句进行解析,并生成一颗对应的“解析树”。
- mysql 解析器将使用mysql 语法规则验证和解析查询;
- 预处理器则根据一些mysql 规则进一步检查解析数是否合法。
- 3、查询优化器:优化执行计划
- 当解析树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。。
- 4、 然后,mysql 默认使用的BTREE 索引,并且一个大致方向是:无论怎么折腾sql,至少在目前来说,mysql 最多只用到表中的一个索引。索引优化查找路径
MySQL 常用语句
实例
建表操作如下
CREATE TABLE `t_dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`address` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `t_emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
empno int not null,
PRIMARY KEY (`id`),
KEY `idx_dept_id` (`deptId`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);
1、所有有门派人员的信息(要求显示门派名称)
SELECT e.`name`,d.`deptName` FROM t_emp e INNER JOIN t_dept d ON e.`deptId`=d.`id`;
2、列出所有人员及其门派信息
SELECT e.`name`,d.`deptName` FROM t_emp e LEFT JOIN t_dept d ON e.`deptId`=d.`id`;
3. 列出所有门派
SELECT * FROM t_dept;
4. 所有无门派人士
SELECT * FROM t_emp WHERE deptId IS NULL;
5. 所有无人门派
SELECT d.* FROM t_dept d LEFT JOIN t_emp e ON d.`id`=e.`deptId` WHERE e.`deptId` IS NULL;
6. 所有人员和门派的对应关系
#显示人与门派的对应关系,以人的id为准
SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.`deptId`=d.`id`
UNION
# 显示门派与人的对应关系,即以门派id为准
SELECT * FROM t_emp e RIGHT JOIN t_dept d ON e.`deptId`=d.`id`;
7. 所有没有入门派的人员和没人入的门派
# 没有入门派的人可以这样理解
# 先找出了所有 e.`deptId`=d.`id` 的人员,且这些人员展示了所有人员的id
# 然后利用 where 找到了其中 e.deptId为空的人员进行输出
SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.`deptId`=d.`id` WHERE e.deptId IS NULL
UNION
# 同理,以 t_dept的id为基础,找到所有 e.`deptId`=d.`id` 的门派,
# 由于此时以 t_dept 为基准,因此找到的是所有门派集合,并且将每个人员挂在了相应的门派之后
# 筛选出后面没有挂人员的门派
SELECT * FROM t_dept d LEFT JOIN t_emp e ON d.`id`=e.`deptId` WHERE e.`deptId` IS NULL;
8. 添加CEO 字段
ALTER TABLE `t_dept`
add CEO INT(11) ;
update t_dept set CEO=2 where id=1;
update t_dept set CEO=4 where id=2;
update t_dept set CEO=6 where id=3;
update t_dept set CEO=8 where id=4;
update t_dept set CEO=9 where id=5;
-
8.1 求各个门派对应的掌门人名称
SELECT d.deptName,e.name FROM t_dept d LEFT JOIN t_emp e ON d.ceo=e.id
-
8.2 求所有当上掌门人的平均年龄
SELECT AVG(e.age) FROM t_dept d LEFT JOIN t_emp e ON d.ceo=e.id
-
8.3 求所有人物对应的掌门名称
方案1:SELECT ed.name '人物',c.name '掌门' FROM (SELECT e.name,d.ceo from t_emp e LEFT JOIN t_dept d on e.deptid=d.id) ed LEFT JOIN t_emp c on ed.ceo= c.id;
方案2:
SELECT e.name '人物',tmp.name '掌门' FROM t_emp e LEFT JOIN (SELECT d.id did,e.name FROM t_dept d LEFT JOIN t_emp e ON d.ceo=e.id)tmp ON e.deptId=tmp.did;
方案三:
SELECT e1.name '人物',e2.name '掌门' FROM t_emp e1 LEFT JOIN t_dept d on e1.deptid = d.id LEFT JOIN t_emp e2 on d.ceo = e2.id ; SELECT e2.name '人物', (SELECT e1.name FROM t_emp e1 where e1.id= d.ceo) '掌门' from t_emp e2 LEFT JOIN t_dept d on e2.deptid=d.id;