zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Math对象
    MDN中的对象原型
    构造函数的静态成员和实例成员
    js对象的九大特点
    对象数据的使用方法
    创建对象的所有方式
    Linux下gcc编译器的使用
    Linux vim环境设置
    Linux下is not in the sudoers file解决方法
    mySQL相关函数的使用
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11019739.html
Copyright © 2011-2022 走看看