zoukankan      html  css  js  c++  java
  • day-42mysql

    外键补充:

    1 不能将创建外键的语句单独拿出来

      alter table userinfo add constraint fk_userinfo_depart foreign key (depart_id) references department(id);    增加
      alter table userinfo drop foreign key 外键名称(fk_userinfo_depart );                 删除

    2. 外键关联的时候, 必须关联的是表的主键ID

    3. 练习的时候, 将语句写在文本中, 然后考过去执行

    4. 主键索引 : 加速查找 + 不能为空 + 不能重复

    一. 外键的变种:

    1唯一索引:

      create table t5(
      id int,
      num int,
      unique(num)
      )engine=Innodb charset=utf8;

      作用:
        num列的值不能重复
        加速查找


    联合唯一索引

      create table t6(
      id int,
      num int,
      unique(id, num......)
      )engine=Innodb charset=utf8;

        作用:
          num列和id列的值不能重复
          加速查找

    2. 一对多:

    部门表:
    id depart_name
    1  公关部
    2  公共部
    3  保安部

    员工表:
    id name age depart_id(外键)
    1 lxxx    12    2
    2 xxxx   13    1
    3 xxxx   13    2

      3. 一对一:

      用户表:
      id name age
      1 zekai     23
      2 eagon 34
      3 lxxx     45
      4 owen     83

      博客表:
      id url user_id (外键 + 唯一约束)
      1 /linhaifeng 2
      2 /zekai   1
      3 /lxxx    3
      4 /lxxx    4

      

    4. 多对多:

    用户表:
    id name phone
    1 root1 1234
    2 root2 1235
    3 root3 1236
    4 root4 1237
    5 root5 1238
    6 root6 1239
    7 root7 1240
    8 root8 1241

    主机表:

    id hostname
    1  c1.com
    2  c2.com
    3  c3.com
    4  c4.com
    5  c5.com

      为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表:
      user2host:
      id userid hostid
      1   1   1
      2   1   2
      3   1   3
      4   2    4
      5   2   5
      6   3   2
      7  3   4
      创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid)

      Django orm 也会设计

    二. 数据行的操作:


      增:
        insert into 表名 (列名1, 列名2) values(值1, 值2);
        insert into 表名 (列名1, 列名2) values(值1, 值2),(值1,值2),(值n,值n);
        insert into 表名 (列名1, 列名2) select 列名1, 列名2 from 表名;
      删除:
        delete from 表名;
        delete from 表名 where id > 10
        delete from 表名 where id < 10
        delete from 表名 where id <= 10
        delete from 表名 where id >= 10
        delete from 表名 where id != 10
        delete from 表名 where id = 10 and name='xxx'; and : 并且 两个条件都必须要成立
        delete from 表名 where id = 10 or name='xxx'; or : 或者 只要满足一个条件成立

      

      修改:
        update 表名 set name='zekai', age=23 where id > 10;
      查询:
        基本:
          select * from 表名;
          select name , age from 表名;
        高级:
          a. where 条件查询:
            select * from 表名 where id=10;
            select * from 表名 where id >10 and id<15;
            select * from 表名 where id > 10;
            != : 不等与
            >= <=
            between and: 闭区间
              select * from t4 where id between 9 and 12;
            in: 在某一个集合中
              select * from t4 where id in (9,10,11....);
              select * from t4 where id in (select id from t3 where id between 2 and 4)
              是可以这样使用的, 但是不建议大家使用;

          b. 通配符:
            alex
              select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)
              select * from 表 where name like 'ale_' - ale开头的所有(一个字符)

          c. 限制取几条:
              select * from 表名 limit 索引偏移量, 取出多少条数据;
              select * from t3 limit 0, 10; 第一页
              select * from t3 limit 10, 10; 第二页
              page = input('page:')
              page 索引偏移量 数据量(offset)
              1     0     10
              2      10   10
              3      20    10
              4    30    10
              page (page-1)*offset offset
              分页核心SQL:
              select * from t3 limit (page-1)*offset, offset;


          d. 排序:
            order by
            降序:
              select * from t4 order by 列名 desc; descending
            升序:
              select * from t4 order by 列名 asc; ascending
            多列:
              create table t7(
              id int auto_increment primary key,
              num int not null default 0,
              age int not null default 0
              )charset=utf8;
              insert into t7 (num, age) values (2, 12),(3,13),(4, 12);
              select * from t4 order by num desc, name asc;
              如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.
          e. 分组
            select age, 聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名;
            select age, avg(num) from t7 group by age;
            select age, count(num) from t7 group by age;
            select age, count(num) as cnt from t7 group by age; 显示别名 as
            having的二次删选:
            select age, count(num) as cnt from t7 group by age having cnt>1;
            where 和 having的区别:
              1). having与where类似,可筛选数据
              2). where针对表中的列发挥作用,查询数据
              3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用

        

          f. 连表操作
            select * from userinfo, department; (笛卡尔积)
            select * from userinfo, department where userinfo.depart_id=department.id;
            左连接:
              select * from userinfo left join department on userinfo.depart_id=department.id;
              左边的表全部显示, 右边没有用到不显示
            右连接:
              select * from userinfo right join department on userinfo.depart_id=department.id;
              右边的表全部显示, 左边没关联的用null表示
            内连接:
              左右两边的数据都会显示
            ps:
              a.只需要记住左连接 left join
              b.可以连接多张表 通过某一个特定的条件

    注意查询的顺序:
          select name,sum(score) from 表 where id > 10 group by score having age> 12 order by age desc limit 2, 10

     

  • 相关阅读:
    UVa 10905
    有道云笔记同步IT笔试面试资源
    送给80、90后的人生经典语录,别再孩子气了
    ch1 位姿表示和旋转矩阵
    jetson nano使用RealSenseD400深度相机
    jetson nano电源(性能)管理
    http://emanual.robotis.com/docs/en/platform/turtlebot3/overview/
    Jetson Nano配置与使用——中文输入法ibus配置
    jetson nano更改源
    ROS多机通信
  • 原文地址:https://www.cnblogs.com/klw1/p/11022034.html
Copyright © 2011-2022 走看看