数据库的权限管理
mysql 用户管理
mysql是一个tcp服务器 ,用于操作服务器 上的文件数据,接收用户端发送的指令,接收指令时需要考虑安全问题,是不是谁发给我都要 响应?
mysql中 吧文件称为表,在mysql中自带的mysql数据库中有4个表用于用户管理的,分别是:优先级从高到低
user->db->table_priv->columns_priv
#授权表 user #该表放行的权限,针对:所有数据,所有库下所有表,以及表下的所有字段 db #该表放行的权限,针对:某一数据库,该数据库下的所有表,以及表下的所有字段 tables_priv #该表放行的权限。针对:某一张表,以及该表下的所有字段 columns_priv #该表放行的权限,针对:某一个字段 #按图解释: user:放行db1,db2及其包含的所有 db:放行db1,及其db1包含的所有 tables_priv:放行db1.table1,及其该表包含的所有 columns_prive:放行db1.table1.column1,只放行该字段 复制代码
1.创建用户的语句:
create user 用户名@“主机地址” identified by "密码";
create user scote@"127.0.0.1" identified by "123";
此处的主机地址,不是服务器地址,而是表示这个账户可以在哪台电脑上登陆
2.授权的语句********
语法: grant [权限的名称 select insert......| all] on 数据库.表名 to 用户名 @主机地址;
授予scote 这个用户所有权限,在所有数据库所有表中
grant all on *.* to scote@"localhost"; #可以访问所有库和表
grant all on day41.* to scote@"localhost"; 可以访问day41库的所有表
grant all on day41.stu to scote@"localhost"; 可以访问day41库的stu表
grant select (id,name),insert(id,name) on day41.stu to scote@"localhost";#仅能查看day41库的stu表中的id和name 字段。
3.grant [权限的名称 select insert......|all ] on 数据库.表名 to 用户名@主机地址 with grant option;
with grant option 这个用户可以将它有的权限授予别的账户。
特点:如果授权时,用户不存在,直接自动创建用户
4. 删除权限
revoke 权限的名称 on 数据库.表名 from 用户名@“主机名”;
revoke all on *.* from scote@"localhost";
update mysql.user set grant_priv="n" where user="scote" and host="localhost";
5.刷新权限列表
flush privileges;
6.删除用户
drop user 用户名@“主机地址”
子查询:
当一个查询是另一个查询的条件时,这个查询称之为子查询(内层查询)
当查询需求比较复杂,一次性查询无法获得结果,需要多次查询时,要用到子查询
案例:
准备数据:
create table emp (id int,name char(10),sex char,age int,dept_id int,job char(10),salary double); insert into emp values (1,"刘备","男",26,1,"总监",5800), (2,"张飞","男",24,1,"员工",3000), (3,"关羽","男",30,1,"员工",4000), (4,"孙权","男",25,2,"总监",6000), (10,"刘备2","男",26,2,"总监",5800), (5,"周瑜","男",22,2,"员工",5000), (6,"小乔","女",31,2,"员工",4000), (7,"曹操","男",19,3,"总监",10000), (8,"司马懿","男",24,3,"员工",6000); create table dept(id int primary key,name char(10)); insert into dept values(1,"市场"),(2,"行政"),(3,"财务");
需求: 财务部有哪些人: 方法一: select *from emp inner join dept on dept.id=emp.dept_id ; select *from emp inner join dept on dept.id=emp.dept_id where dept.name=”财务”; 方法二: select *from emp where dept_id=(select id from dept where name="财务"); 查平均年龄大于25 的部门名称: #先求出平均年龄: select avg(age) from emp group by dept_id; select dept_id, avg(age) from emp group by dept_id; #再筛选结果 select dept_id ,avg(age) as a from emp group by dept_id having a >25; select name from dept where id in (select dept_id from emp group by dept_id having avg(age)>25); 查询每个部门的最高工资的员工信息: #先查询每个部门的最高工资 select dept_id,max(salary) from emp group by dept_id; select *from emp inner join (select dept_id,max(salary) maxs from emp group by dept_id) as t2 on emp.dept_id=t2.dept_id where emp.salary=t2.maxs;