• 外键,高级操作


    一,外键 (一对多)

    作用:
          1. 约束
          2. 节省空间
    --------------------------------------------------------------------------------

        建表时外键设置为0 , 可以忽略外键 , 可删除表

           
      
    添加列:alter table 表名 add 列名 类型
    删除列:alter table 表名 drop column 列名
     
    修改列:
    alter table 表名 modify column 列名 类型; -- 类型
    alter table 表名 change 原列名 新列名 类型; -- 列名,类型
     
    添加主键:
    alter table 表名 add primary key(列名);
    删除主键:
    alter table 表名 drop primary key;
    alter table 表名 modify 列名 int, drop primary key;
     
    添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
    删除外键:alter table 表名 drop foreign key 外键名称
    
            
            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, 唯一索引:

    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)

    二 , 数据行的操作:

    增:
        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 表名;

     

     1, 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)
            

     

    2. 通配符:

    alex
      
        select * from 表 where name like 'ale%'  - ale开头的所有(多个字符串)
        select * from 表 where name like 'ale_'  - ale开头的所有(一个字符)

     

    3,限制取几条:

    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;

     

    4,排序:

    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;
        
        如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.

     

    5,分组

    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配合使用

     

    6, 连表操作

    select * from userinfo, department; (笛卡尔积)
    
    select * from userinfo, department where userinfo.depart_id=department.id;
    
    左连接: left join
    
        select * from userinfo left join department on userinfo.depart_id=department.id;
        左边的表全部显示, 右边没有用到不显示
    
    右连接: right join
        
        select * from userinfo right join department on userinfo.depart_id=department.id;
        右边的表全部显示, 左边没关联的用null表示
    
    内连接: inner join
    左右两边的数据都会显示 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
  • 相关阅读:
    情感日记:离校,漂流他乡
    汉化破解:{smartassembly}使用指南
    金融市场:Open.Yale.course:Financial.Markets.07.Chi_Eng
    【转载】[解决系统服务运行应用程序的权限问题]使用WTSGetActiveConsoleSessionId()的VISTA服务与桌面交互
    【转载】关于sqlserver自增长列的问题
    【转载】如何给IIS添加能访问的文件类型
    【原创】使用反射之后,强制类型转化不成功的问题在哪?
    【转载】网站开发人员应该知道的61件事
    【索引】转载关于DSL、代码生成器使用、依赖注入方式
    【原】使用SoundPlayer播放wav文件时产生杂音如何处理
  • 原文地址:https://www.cnblogs.com/HZLS/p/11040945.html
Copyright © 2020-2023  润新知