MySQL用户权限控制与表的关联关系【超详细】

五、DCL-用户权限控制

注意:主机名为%,表示任意主机都可以访问

5.1、查询用户

# 使用存放用户的数据库
use mysql;
# user表中存放用户信息
select * from user;

5.2、创建用户

创建的用户默认都存放在数据库名为mysql下的user表中

## 格式:
create user '用户名'@'主机名' identified by '密码';
​
## 创建用户mysql_user只能在当前主机访问
create user 'mysql_user'@'localhost' identified by '12345';
​
## 创建用户mysql_user可以在任意主机访问该数据库
create user 'mysql_user'@'%' identified by '123456'

5.3、修改用户密码

## 格式:
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
​
## 修改mysql_user的密码
alter user 'mysql_user'@'%' identified with mysql_native_password by '123'

5.4、删除用户

# 格式
drop user '用户名'@'主机名';

5.5、权限控制

注意:多个权限之间用逗号隔开,可以使用*进行通配,代表所有

权限 说明
all 所有权限
insert|update|delete|create|alter|drop|select 对应局部个个权限

1)查看权限:

## 格式:
show grants for '用户名'@'主机名';

2)授予权限:

## 格式:
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';

3)撤销权限:

## 格式:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';

六、数据表的关联关系

MySQL是一种关系型数据库,不仅可以存储数据,还可以维护数据与数据之间的关系---在数据表中添加字段建立外键约束

6.1、关联方式

1、一对一关系

  • 1)主键关联:两张数据表中主键相同的数据为相互对应的数据

  • 2)唯一外键:在任意一张数据表中添加一个字段添加外键约束与另一张表建立主键关联,并将添加了外键约束的字 段设置为唯一约束

2、一对多或多对一

  • 在多的一端添加外键,在和一端进行关联

3、多对多

  • 额外创建一张关系表来维护多对多关联--在关系表中定义两个外键,分别与两个数据表的主键进行关联

6.2、添加外键约束

将一个列添加外键约束与另一张表的主键进行关联之后,这个外键约束的字段添加的数据必须要在关联的主键字段中存在

# 设置为外键约束
constraint 自定义的约束名称 foreign key(设置为外键的具体字段cid) references 表名(具体需要关联的主键字段) 

案例:学生表和班级表(在学生表中添加外键与班级表中的主键进行关联)

创建原则:先创建不包含外键的表,也就是班级表

1、创建班级表

create table 班级表名(
  字段名 字段类型 primary key auto_increment,  # 创建班级表中的主键,并进行自增
    字段名 字段类型 not null unique, # 设置字段不能为空并且唯一
    字段名 字段类型 
);

2、创建学生表(在学生表中添加外键与班级表中的主键进行关联)

# 方式1--在创建表的时候定义cid字段,并添加外键约束
create table 学生表名(
  字段名 字段类型 primary key,
    字段名 字段类型 not null,
    cid 字段类型 unique,  # 定义cid字段使cid字段类型与班级表中主键的字段类型保持一致,设置为一对一关系
    constraint 约束名称 foreign key(具体字段cid) references 关联的表名(具体主键字段) # 设置为外键约束
);
​
# 方式2--先创建表在添加外键约束
create table 表名(
  字段名 字段类型 primary key,
    字段名 字段类型 not null,
    cid 字段类型  # 定义cid字段使cid字段类型与班级表中主键的字段类型保持一致
);
# 创建表之后为cid字段添加外键约束
alter table 添加约束的表名 add constraint 约束名称 foreign key(具体字段cid) references 关联的表名(具体主键字段);
​
# 删除外键约束
alter table 表名 drop foreign key 约束名称;

6.3、外键约束-级联

当学生表中存在学生信息关联班级的某条记录时,就不能对班级表中的这条数据进行修改和删除操作,没有关联的信息可以进行修改和删除

1、如果一定需要修改删除操作,则:

  • 将学生表中设置为外键约束的cid修改为null

  • 再进行修改班级信息表中需要修改的字段的信息

  • 再将cid修改成对应的值

# 将cid 为3的外键约束修改为nill
update 表名 set cid = NULL where cid = 3; # 相当于取消关联这条信息

2、取消外键约束,重新给对应的表的字段添加外键约束,并同时设置级联的修改和删除

## 先删除外键约束
alter table 表名 drop foreign key 约束名称;
​
## 重新添加外键约束,同时设置级联的修改和删除
alter table 添加约束的表名 add constraint 约束名称 foreign key(约束字段) references 关联的表名(具体字段) on update cascade on delete cascade; 

6.4、连接查询

  • 内连接 inner join--只会显示有关联的数据

select 查询字段 from 表1 inner join 表2 on 匹配条件 where 条件;

如果直接使用select 查询字段 from 表1 inner join 表2;会产生数据集合的笛卡尔积(依次使用表1中的每一条记录去匹配表2中的每一条数据)

-- 使用where设置过滤条件先产生笛卡尔积在从中过滤
select * from students INNER JOIN classes where students.cid = classes.clsss.id;
​
-- 使用on设置查询条件,先判断连接条件是否成立在合成一条记录
select * from students INNER JOIN classes on students.cid = classes.class.id;
  • 左连接 left join --左表中的数据会全部显示

显示左表中的所有数据,如果右表中存在与左表中满足匹配条件的数据,则进行匹配,如果不存在,则显示为null

## 语法
select 查询字段 from 表1 left join 表2 on 匹配条件 where 条件;
​
-- 左连接:显示左表中的所有数据
select *from students left join classes on students.cid = classes.class.id;
  • 右连接 right join

## 右连接:显示右表中所有数据
select *from students right join classes on students.cid = classes.class.id;

6.5、数据表别名

1、当两表中的字段名相同时可以使用【表名.字段名】的方法区分相同的字段名

## 查询这两个表的name字段----内连接查询
select student.name,class.name from student inner join class on student.cid = class.id;

2、取别名

select s.name,c.name from student s(别名) inner join class c(别名) on student.cid = class.id;

6.6、子查询/嵌套查询

先进行第一次查询,第一次查询的结果作为第二次查询的条件进行查询

1)子查询返回单个值---单行单列

案例:查询班级名称为java2004班级中的学生信息(只知道班级名称不知道班级id)

  • 一般方法:

    ## 先查询班级为java2004的班级id
    select class_id from 班级表名 where class_name = 'java2004';
    ​
    ## 同过查询到的id查询信息
    select * from 学生表名 where cid(设置为外键的字段) = '对应的值'
  • 子查询方法:

    ## 如果子查询返回的是一个值,条件可以直接使用关系用算符:= != 
    select * from 学生表名 where 设置为外键的字段cid = (select 要查询的字段id from 班级表名 where class_name = 'java2004');

2)子查询返回多个值---多行单列

案例:查询所有java班级中的所有学生信息

  • 一般方法:

    ## 查询所有java班的班级编号
    select class_id from 班级表名 where class_name like 'java%';
    ​
    # 查询这些班级的学生信息通过union将多个结果整合在一起
    select * from 学生表名 where cid = '查到的值1' union select * from 学生表名 where cid = '值2';
  • 子查询方法:

    操作符 说明
    in 在指定的集合范围内的所有可以查询到的
    any 查询返回的多个值中满足一个即可
    some 与any相同
    all 查询返回的值都必须全部满足
    ## 如果查询的结果返回的是多个值条件使用:in/not in
    select * from 学生表名 where 外键字段cid in (select class_id from 班级表名 where class_name like 'java%');

3)子查询返回多个值---多行多列

案例:查询cid=1的班级中性别为男的学生信息

  • 一般方法:

    ## 查询cid=1的班级中性别为男的学生信息
    select * from 学生表 where cid = 1 and stu_gender = '男';
  • 子查询方法:

    # 将查询出来cid=1的所有学生信息作为一个虚拟表,之后在这个虚拟表中在查第二个条件
    select * from (select * from 学生表 where cid = 1) as t where t.stu_gender = '男';

你可能感兴趣的:(mysql,数据库)