python42 1.外键的变种 2.数据表操作

Posted llx--20190411

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python42 1.外键的变种 2.数据表操作相关的知识,希望对你有一定的参考价值。

 

 

昨日回顾:
 一. 数据库的介绍
   管理数据的软件
 二. 数据库的 分类:
   a.关系型数据库
    有约束
   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 旧列名;
   
   
  数据行:
   
   增:
    insert  into 表名 (列1,列2, 列n) values (值1, 值2, ..., 值n);
   
   删除:
    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)),
   # constraint fk_userinfo_depart foreign key (depart_id) references department(id)
  )engine=Innodb charset=utf8;
  
  
  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.外键的变种

2.数据表操作


  
  一. 外键的变种: (*********************************************************)
    
    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列的值不能重复
      加速查找
     
     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. 通配符:
       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

以上是关于python42 1.外键的变种 2.数据表操作的主要内容,如果未能解决你的问题,请参考以下文章

09-Mysql数据库----外键的变种

10-外键的变种 三种关系

外键的变种 三种关系

外键的变种 三种关系

MySQL外键的变种

外键的变种 三种关系