数据库教程:MySQL修炼之路四

1. 外键(foreign key) 1. 定义:让当前表字段的值在另一个表的范围内选择 2. 语法 foreign key(参考字段名) references 主表(被参考字段名) on delete 级联动作 on update 级联动作 3. 使用规则 1. 主表、从表字段数据类型要一致 2. …


1. 外键(foreign key)

  1. 定义:让当前表字段的值在另一个表的范围内选择
  2. 语法
    foreign key(参考字段名)
    references 主表(被参考字段名)
    on delete 级联动作
    on update 级联动作
  3. 使用规则
    1. 主表、从表字段数据类型要一致
    2. 主表被参考字段: 主键
  4. 示例
    表1、缴费信息表(财务)
      id 姓名 班级 缴费金额
      1 唐伯虎 aid06 300
      2 点秋香 aid06 260
      3 祝枝山 aid06 250
    表2、学生信息表(班主任)
      id 姓名 缴费金额
      1 唐伯虎 300
      2 点秋香 260
      3 xxxxxxxxxxx

    1. 创建表
      表1(主表):
        create table jftab(
        id int primary key,
        name varchar(15),
        class char(5),
        money int
        );

        insert into jftab values
        (1,’唐伯虎’, “aid06”,300),
        (2,”点秋香”, “aid06”,260),
        (3,”祝枝山”, “aid06”,250);
      表2(从表):
        create table bjtab(
        stu_id int,
        name varchar(15)
        money int,
        foreign key(stu_id) references jftab(id)
        on delete cascade
        on update cascade
        );

        insert into bjtab values
        (1,’唐伯虎’, “aid06”,300),
        (2,”点秋香”, “aid06”,260);

  5. 删除外键
    alter table 表名 drop foreign key 外键名;
    外键名:show create table 表名;

  6. 级联动作
    1. cascade
      数据级联删除、更新(参考字段)
    2. restrict(默认)
      从表有相关联记录,不允许主表操作
    3. set null
      主表删除、更新,从表相关联记录字段值为null

  7. 已有表添加外键
    alter table 表名 add
    foreign key(参考字段) referencees 主表(被参考字段)
    on delete …
    on update …

2. 表的复制

  1. 语法
    create table 表名 select … from 表名 where 条件;
  2. 示例
    1. 复制moshou.sanguo表的全部记录和字段,sanguo2
      create table sanguo2
      select * from moshou.sanguo;
    2. 复制moshou.sanguo表的前3条记录,sanguo3
      create table sanguo3
      select * from moshou.sanguo limit 3;
    3. 复制moshou.sanguo表的id,name,country三个字段的前5条记录,sanguo4
      create table sanguo4
      select id,name,country from moshou.sanguo limit 5;

  3. 复制表结构
    create table 表名 select * from 表名 where false;

    1. 复制 jftab 的表结构,jftab2
      create table jftab2 select * from jftab where false;

  4. 注意
    复制表的时候不会把原表的键(key)属性复制过来

3. 嵌套查询(子查询)

  1. 定义: 把内层的查询结果作为外层的查询条件
  2. 语法格式
    select … from 表名 where 条件(select ….);
  3. 示例
    1. 把攻击值小于平均值的英雄免费精选名字大全和攻击值显示出来
      1. 先计算平均值
        select avg(gongji) from moshou.sanguo;
      2. 找到 < 平均值
        select name,gongji from moshou.sanguo
        where gongji< 平均值;

      上面两条语句的结合为: select name,gongji from moshou.sanguo
        where gongji< (select avg(gongji) from moshou.sanguo);

    2. 找出每个国家攻击力最高的英雄的免费精选名字大全和攻击值
      bug: select name,gongji from moshou.sanguo
      where
      gongji in(select max(gongji) from sanguo group by country);
      ## 无bug
      select name,gongji from moshou.sanguo
      where
      (country,gongji) in(select country,max(gongji) from sanguo group by country);

4. 多表查询

  1. 两种方式
    1. select 字段名列表 from 表名列表;(笛卡尔积)
      t1: name -> “a1” “a2” “a3”
      t2: name -> “b1” “b2”
      select * from t1,t2;
    2. … where 条件;

  2. 练习
    1. 显示省和市的详细信息
      河北省 石家庄市
      河北省 廊坊市
      湖北省 武汉市

      select sheng.s_name,city.c_name from sheng,city
      where
      sheng.s_id = city.cfather_id;
    2. 显示省、市和县的详细信息
      select sheng.s_name,city.c_name,xian.x_name from sheng,city,xian
      where
      sheng.s_id = city.cfather_id and city.c_id = xian.xfather_id;

5. 连接查询

  1. 内连接
    1. 语法格式
      select 字段名 from 表1 inner join 表2 on 条件
      inner join 表3 on 条件;
    2. 显示省市详细信息
      select sheng.s_name,city.c_name from sheng
      inner join city on sheng.s_id=city.cfather_id;
    3. 显示省市县详细信息
      select sheng.s_name,city.c_name,xian.x_name from sheng
      inner join city on sheng.s_id=city.cfather_id
      inner join xian on city.c_id = xian.xfather_id;

  2. 外连接
    1. 左连接
      1. 以左表为主显示查询结果
      2. select 字段名 from
        表1 left join 表2 on 条件
        left join 表3 on 条件;
      3. 显示省市详细信息
        select sheng.s_name as sheng,city.c_name as city
        from sheng left join city
        on sheng.s_id=city.cfather_id;
      4. 显示省市县的详细信息
        select sheng.s_name as sheng,city.c_name as city,xian.x_name as xian
        from sheng left join city
        on sheng.s_id=city.cfather_id
        left join xian
        on city.c_id = xian.xfather_id;

    2. 右连接
      1. 以右表为主显示查询结果
      2. select 字段名 from
        表1 right join 表2 on 条件
        right join 表3 on 条件;

6. 数据备份(mysqldump,在linux终端中操作)

  1. 命令格式
    完全备份:
    mysqldump -u用户名 -p 源库名 > ~/***.sql
  2. 源库名的表示方式
    –all-databases 备份所有库
    库名 备份单个库
    -b 库1 库2 库3 备份多个库
    库名 表1 表2 表3 备份指定库的多张表

  3. 示例
    1. 备份所有库,放到 mydata 目录下:all.sql
      mysqldump -uroot -p –all-databases > all.sql
    2. 备份 db4 库中的 sheng city xian 三张表,scx.sql
      mysqldump -uroot -p db4 sheng city xian > scx.sql
    3. 备份 moshou 和 db4 库,md.sql
      mysqldump -uroot -p -b moshou db4 > md.sql

7. 数据恢复

  1. 命令格式(linux终端)
    mysql -uroot -p 目标库名 < ***.sql

  2. 从所有库备份中恢复某个库(–one-database)
    mysql -uroot -p –one-database 目标库名 < all.sql

  3. 示例
    1. 在db4.sheng 新增一条记录

    2. 在db4中新建一张表 t888
    3. 在db4.sql中恢复db4库

    4.注意
      1. 恢复库时如果恢复到源库会将表中数据覆盖,新增表不会删除
      2. 数据恢复时如果恢复的库不存在,则必须先创建空库

8. mysql的用户账户管理

  1. 开启mysql远程连接
    1. sudo -i
    2. cd /etc/mysql/mysql.conf.d/
    3. subl mysqld.cnf
      #bind-address = 127.0.0.1 ctrl + s保存

    4. /etc/init.d/mysql restart
  2. 添加授权用户
    1. 用root用户登录mysql
      mysql -uroot -p123456
    2. 授权
      grant 权限列表 on 库.表 to “用户名”@”%”
      identified by “密码” with grant option;
      with grant option # 这句表示新添加的用户名有往下授权的权限

      权限列表:all privileges、select、insert
      库.表 :*.* 所有库的所有表

  3. 示例
    1. 添加授权用户tiger,密码123,对所有库的所有表有所有权限
      grant all privileges on *.* to “zcc”@”%”
      identified by “123” with grant option;

    2. 添加用户rabbit,对db4库有所有权限
      grant all privileges on db4.* to “rabbit”@”%”
      idetified by “123” with grant option;

需要了解更多数据库技术:MySQL修炼之路四,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/823318.html

(0)
上一篇 2021年9月17日
下一篇 2021年9月17日

精彩推荐