zoukankan      html  css  js  c++  java
  • Python day42:数据库增删改查进阶语句:分组/排序/限制/通配符/连表/外键变种(一对一及多对多)

    ## 外键的变种:
    
    ```python
    1:唯一索引:unique()
       create table t5(id int,numint,unique(num))engine=Innodb charset=utf8;
        作用:    
            num列的值不能重复
            加速查找
       create table t6(id int,num int,unique(id,num))engine=Innodb charset=utf8;
    联合唯一索引作用:(可以联合多个值)    
                num列和id列的值的组合不能重复
                加速查找   
    外键:一对一类型:
            通过unique实现,将外键值通过unique约束,这个值将不能重复.
    外键:多对多类型:
            也是通过unique实现,将多个外键联合通过unique约束,联合的值不能重复!
    ```
    
    ## 数据行的增删该查 进阶语句:
    
    ```python
    增:
    insert into 表名 (列名1,列名2) values (值1,值2),(值1,值2),(值1,值2)
    insert into 表名 (列名1,列名2) select 列名1,列名2 from表名
    删除:
        delete from 表名 where id >=10
        delete from 表名 where id=10 and/or name="owen"
    修改:
        update 表名 set name='egon',age=23 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) 可以这样使用的, 但是不建议使用;
    通配符:  配合 like  使用
        alex
        select * from 表 where name like 'ale%'  - ale开头的所有(多个字符串)
        select * from 表 where name like 'ale_'  - ale开头的所有(一个字符
    限制条件:
        select * from 表名 limit 索引偏移量, 取出多少条数据;
        select * from t3 limit 0, 10;  第一页
        elect * from t3 limit 10, 10;  第二页
        page = input('page:')    
        page 索引偏移量  数据量(offset)
                                          1         0              10
                                          2         10             10
                                          3         20             10
                                          4         30             10
        age   (page-1)*offset   offset
        分页核心SQL:
            'select * from t3 limit (page-1)*offset, offset;
    排序:
        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;
    如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.
    分组:
    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
        aving的二次删选:
            select age, count(num) as cnt from t7 group by age  having cnt>1;
        here 和 having的区别:
        1). having与where类似,可筛选数据
        2). where针对表中的列发挥作用,查询数据
        3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用
     
    连表操作:
        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 
        
    ```
  • 相关阅读:
    C# 操作Excel
    分享C#原生ID(流水号)生成功能实现
    Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的解决办法
    c# 软件自动在线更新代码
    Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的另一解决办法
    ActiveX控件的另类免费签名法(补充)
    ActiveX控件的另类免费签名法
    常用函数以及正则校验
    Delphi键盘按键伪码
    格林治时间
  • 原文地址:https://www.cnblogs.com/huhongpeng/p/11042359.html
Copyright © 2011-2022 走看看