MySQL 之外键和查询关键字

常见操作数据库的方法:
  

外键

    添加外键需注意
      1.确保主键和外键字段类型、大小、编码一致
      2.确保表引擎一致(engine=Innodb) 
      3.确保主表中的数据副表中有对应的值 
      4.确保外键名不重复


  create table userinfo(
    uid int auto_increment primary key,
    name varchar(32),
    department_id int,
    constraint fk_user_depar foreign key (department_id) references department(id)
  )engine=innodb default charset=utf8;

  create table department(
    id bigint auto_increment primary key,
    title char(15)
  )engine=innodb default charset=utf8;


唯一索引:
  create table t2(

    id int ,
    nid int,
    sid int,
    ....
    unique uq1(nid)     # 唯一索引
    unique uq2(nid,sid)  # 联合索引    作用:加速查找,不能重复,可以为空
  )engine=innodb default charset=utf8;


  外键的变种: foreign key-->>fk()


    一对一:用户表和百合网(admin)
      create table userinfo1(
        id int auto_increment primary key,
        name varchar(20),
        age int,
        email varchar(20)
      )engine=innodb default charset=utf8;

      create table admin(
        id int not null auto_increment primary key,
        username varchar(20) not null,
        userpwd varchar(20) not null,
        user_id int not null,
        unique uq1 (user_id),
        CONSTRAINT fk_admin_u1 foreign key(use_id) references userinfo1(id)
      )engine=innodb default charset=utf8;


    一对多:用户表和部门表
    多对多(双向的一对多):用户表和主机表 ,用双向的FK()加快查找速度
      用户表
        create table userinfo2(
            id int not null auto_increment primary key,
            name varchar(20),
            email varchar(64)
        )engine=innodb default charset=utf8;

      主机表
        create table host(
          id int auto_increment primary key ,
          name varchar(20)
        )engine=innodb default charset=utf8;

      中间关联表
        create table user2host(
          id int auto_increment primary key,
          userid not null,
          hostid not null,
          unique uq_user2_host(userid,hostid)
          CONSTRAINT fk_u2h_user2 foreign key(userid) references userinfo2(id),
          CONSTRAINT fk_u2h_host foreign key(hostid) references host(id)
        )engine=innodb default charset=utf8;



   通配符 like
      # 表示以a开头的匹配,只要是a开头的都可以 select * from t5 where name like "a%";
      # 表示以a开头的匹配,只要以a开头的只能取一位 select * from t5 where name like "a_"; 分页 limit
      # 表示取10条数据 select * from t5 limit 0,10;
    select * from t5 limit 10;

      # 表示从10处开始向后取10条数据 select * from t5 limit 10,10;
      # 表示从第20行开始向后取10条数据 select * from t5 limit 20,10; select * from t5 limit 10 offect 20; 排序 order by
     # 从小到大 select * from t5 order by id asc;
     # 从大到小 倒序 abcd select * from t5 order by id desc;
     # 表示从大到小取前面的2个数据 select * from t5 order by id desc limit 2;
     # 优先按照age从大到小排,在根据id从小到大排 select * from t5 order by age desc ,id asc; 分组 group by create table department5( id int auto_increment primary key, title varchar(32) )engine=innodb default charset=utf8; insert into department5(title)values("公关"),("IT"),("前台"),("服务"); insert into department5(title)values("飞行"); create table userinfo5( id int auto_increment primary key, name varchar(20), part_id int, CONSTRAINT fk_user_part FOREIGN key (part_id) REFERENCES department5(id) )engine=innodb default charset=utf8; insert into userinfo5(name,part_id)values("旺财",3),("狗蛋",5),("alex",1),("二狗",7),("egon",1);   # 按照 part_id分组 select count(id),max(id), part_id from userinfo5 group by part_id; 常见的聚合函数 max ,min,count,sum,avg # *****如果对于聚合函数进行二次筛选时必须使用 ---having--- **** select count(id) as id ,max(id), part_id from userinfo5 group by part_id having part_id >1 ; 连表操作 左右连表 select * from department5,userinfo5 where department5.id = userinfo5.part_id; # left join左边的全部显示 select * from department5 left join userinfo5 on department5.id = userinfo5.part_id; # inner join 去除表中出现的 NUll值 select * from department5 inner join userinfo5 on department5.id = userinfo5.part_id; # right join右边的全部显示 select * from department5 right join userinfo5 on department5.id = userinfo5.part_id; 上下连表 union(列数必须相同,带有自动去重功能) union all(列数必须相同,不带有自动去重功能)

 

posted @ 2018-12-01 22:52  随性岁分享  阅读(357)  评论(0编辑  收藏  举报