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

 

猜你喜欢

转载自www.cnblogs.com/klw1/p/11022034.html