zoukankan      html  css  js  c++  java
  • day42外键的变种【唯一索引/联合唯一索引、一对多、一对一、多对多、数据行的操作:insert、delete、update、select(条件、通配符、限制、排序、分组、连表)】

    昨日回顾:

    一. 数据库的介绍
      管理数据的软件
    二. 数据库的 分类:
      a.关系型数据库
        有约束、硬盘持久ying
      b.非关系型数据库
        没有约束 内存

    三. MySQl 的安装:
      a. exe msi文件 点击下一步下一步

      b. 压缩包
        bin
      mysqld : 启动mysql服务的
      mysql : 连接mysql
      环境变量
    四. 数据库(文件夹)
      数据表 (文件)
      数据行(文件行)

    五. 数据库:
      增:
        create database 数据库名;
      删:
        drop database 数据库名;
      查:
        show databases;

      数据表:
        创建:
          create table 表名(
            id int auto_increment primary key
              列名1 列类型 [not null/ null default '' ],
              列名2 列类型 [not null/ null default '' ],
              列名n 列类型 [not null/ null default '' ]
            )engine=Innodb charset=utf8;

          列类型:
            数值类型:
              tinyint
              samllint
              mediumint
              int
              bigint
              有符号 / 无符号 (unsigned)

            字符串类型:
              char varchar text
            时间日期类型:
              datetime 年月日时分秒
        删除:
          drop table 表名;
        查询:
          show tables;
        修改:
          alter table 表名 change/modify 旧列名 新列声明;
          alter table 表名 add 新列声明;
          alter table 表名 drop 旧列名;

          alter table class_char rename to class;  【仅改表名】
      数据行:
        增:
          insert into 表名 (列1,列2, 列n) values (值1, 值2, ..., 值n);

          insert into class (caption) select caption from class; 【循环新增】
        删除:
          delete from 表名 where id=12;;
          truncate 表名;
        修改:
          update 表名 set name='xxxx';
          update 表名 set name='xxxx' where id=12;
          update 表名 set name='xxxx',age=12 where id=12;
        查询:
          select * from 表名;
          select name, age from 表名;
    六.外键 (一对多)
      作用:
        1. 约束
        2. 节省空间
          create table department (
          id int auto_increment primary key,
          depart_name varchar(32) not null default '',
          num int not null default 0
          )engine=Innodb charset=utf8;


          create table userinfo (
          id int auto_increment primary key,
          name varchar(32) not null default '',
          depart_id int not null default 1
          constraint fk_userinfo_depart foreign key (depart_id) references department(id)
          )engine=Innodb charset=utf8;
    注: constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)),
    ps:
    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. 1唯一索引:
      create table t5(
      id int,
      num int,
      unique(num)
      )engine=Innodb charset=utf8;

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

    1.2联合唯一索引作用:
      num列和id列的值不能重复
      加速查找
      create table t6(
      id int,
      num int,
      unique(id, num......)
      )engine=Innodb charset=utf8;

    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.通配符:
              select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)-- alexsd
              select * from 表 where name like 'ale_' - ale开头的所有(一个字符)  -- alex

          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

  • 相关阅读:
    全宁对医药行业销售代表的介绍
    effective c#读书笔记之二 静态成员的初始化
    自学笔记
    effective c#读书笔记之一
    如何判断表中是否有值
    领域驱动
    VIM 打造自己的VIM界面!
    Jqueryui的用法!
    php中io操作!
    php中Http请求!
  • 原文地址:https://www.cnblogs.com/qingqinxu/p/11018920.html
Copyright © 2011-2022 走看看