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修炼之路四的更多相关文章

  1. MySQL修炼之路二

    1. 表字段的操作 1. 语法: alter table 表名 执行动作: 2. 添加字段(add) alter table 表名 add 字段名 数据类型: alter table 表名 add 字 ...

  2. MySQL修炼之路一

    1. MySQL概述 1. 什么是数据库 存储数据的仓库 2. 都有哪些公司在用数据库 金融机构.游戏网站.购物网站.论坛网站 ... ... 3. 提供数据库服务的软件 1. 软件分类 MySQL. ...

  3. MySQL修炼之路五

    1. 存储引擎和锁 1. 存储引擎(处理表的处理器) 1. 基本操作 1. 查看所有存储引擎 mysql>show engines; 2. 查看已有表的存储引擎 mysql>show cr ...

  4. MySQL修炼之路三

    1. SQL查询 1. 执行顺序 3. select ... 聚合函数 from 表名 1. where ... 2. group by ... 4. having ... 5. order by . ...

  5. Java工程师修炼之路(校招总结)

    Java工程师修炼之路(校招总结) 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易, ...

  6. python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点

    python 闯关之路四(下)(并发编程与数据库编程)   并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型   操作系统工作原理介绍.线程.进程演化史.特点.区别 ...

  7. iOS攻城狮修炼之路

    自己总结的学习iOS的笔记,打造一个全面的知识体系,iOS攻城狮修炼之路[持续更新中] iOS学习笔记01-APP相关 iOS学习笔记02-UIScrollView iOS学习笔记03-UITable ...

  8. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  9. 微博MySQL优化之路--dockone微信群分享

    微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...

随机推荐

  1. python爬虫之获取页面script里面的内容

    这是网页上的script 我要获取的是00914这个数字  直接使用正则表达式即可 运行结果: 源码: import re from bs4 import BeautifulSoup from url ...

  2. Excel-统计函数

    1.Count系列函数 COUNT 数字个数----下面结果为 4 counta 非空的字数 ----下面为6 COUNTBLANK ------非空个数  ---- 下面为9 如何将字符串形式的数字 ...

  3. TCP/UDP通信中server和client是如何知道对方IP地址的

    在TCP通信中 client是主动连接的一方,client对server的IP的地址提前已知的.如果是未知则是没办法通信的. server是在accpet返回的时候知道的,因为数据包中包含客户端的IP ...

  4. 数据呈现到 ASP.NET Core MVC 中展示

    终于要将数据呈现到 ASP.NET Core MVC 中的 视图 上了 将数据从控制器传递到视图的三种方法 在 ASP.NET Core MVC 中,有 3 种方法可以将数据从控制器传递到视图: 使用 ...

  5. [POI2014]RAJ(最短路,拓扑排序)

    对于一个点 \(x\) 如何求答案? 由于这个图是个有向无环图,可以先拓扑排序一遍,求出每个点的拓扑序,从起点到它的最长路 \(d2\),从它到终点的最长路 \(d1\).(我写代码是这么写的,注意顺 ...

  6. 关于一些规范:main()函数的返回值 mingw和mingw-w64编译器的区别

    深度剖析c语言main函数---main函数的返回值 - 编程随笔与杂谈 - CSDN博客 https://blog.csdn.net/z_ryan/article/details/80979008 ...

  7. Java高级工程师常见问题

    MySQL数据库调优   定位慢查询得到生产环境那些sql语句响应慢,根据执行计划进行分析调优事物管理索引结构(B+树)平衡二叉树.B树.B+树分库分表后,如何解决查询    使用第三方数据库中间件( ...

  8. IntelliJ IDEA最新版2019年注册码,可激活至2099年 激活 破解

    IntelliJ IDEA最新版2019年注册码,可激活至2099年 激活 破解 特别说明:图中的IDEA是2017版本,不过方法对2019版本的IDEA同样适用! 最近笔者测试了好多破解Idea的方 ...

  9. Spring事物隔离级别及事物传播行为@Transactional实现

    阅读本篇文章前,请先阅读如下文章: 四种事物隔离级别详解 先看下@Transactional可以配制那些参数及以其所代表的意义. isolation 枚举org.springframework.tra ...

  10. python 进程数据通信

    进程通信的第一种方式from multiprocessing import Process,Queue def f(q): q.put([42,2,'hello']) print('zi q id:' ...