MySQL 高级(1):权限管理,左联合,右联合

用户和权限管理

用户管理

命令 描述 备注
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;
    

猜你喜欢

转载自blog.csdn.net/Mr_tianyanxiaobai/article/details/119870129