日常学习 7.20 sqlite数据库的复杂查询

【数据库的复杂查询】
一、联表查询
#场景:查询学生数据,列出完整的数据(包含 班级名称)
#前提:两张表中必须有对应(关联)的字段          如:学生表  班级表  对应字段:班级id
#联表的方式
    1.普通联表(直接联表)
    select * from 表1,表2 where 表1.字段名=表2.字段名;
    select 表1.*,表2.字段名 where 表1.字段名=表2.字段名;    (展示表1的全部字段和表2的字段名字段)
    2.公式联表
        -内连接 inner join .............. on
        select * from 表1 inner join 表2 on 表1.字段名=表2.字段名;
        连接过程:取交集(笛卡尔积)
        
        -外连接(左外连接(绝大多数)、右外连接、全外连接) left join .......... on
        select * from 表1 left join 表2 on 表1.字段名=表2.字段名;
        连接过程:left on前为主表  后为从表
        1.取交集
        2.将主表中没有匹配上的也列出来        

        #新增两张表验证内外连接的区别
        -学科表:学科id  学科名称
        
        -成绩表:学生id  学科id  分数
            1001    1           90
            1001    2           80
            1002    1         90
        设置主键解决方案:单独设置一个字段作为主键   (sqlite中主键类型为integer时(int不行)可自增长,填null即可)
        支线:解决方案是联合主键
        
        

重命名
select * 表1.字段名,表2.字段名 from 表1 inner 表2 on 表1.字段名=表2.字段名;
重命名为:select * A.字段名,B.字段名 from 表1 A inner 表2 B on A.字段名=B.字段名;
二、子查询
#嵌套子查询
    #场景:查询价格和蒙多一样的英雄信息
    1.查询蒙多的价格
    select hero_price from z_hero where hero_name='蒙多';
    2.查询英雄时,把价格=上面查询的结果
    select * from z_hero where hero_price=(select hero_price from z_hero where hero_name='蒙多';);
#in子查询
    #场景:前端传递来“一堆数据”(数组)  17,18,19,20,21
    查询指定年龄的学生信息
    -方式1:范围 大于 小于(缺点:数据必须连贯 有规则)
    select * from z_student where stu_age >=17 and stu_age<=21;
    -方法2:between and(缺点:数据必须连贯 有规则)
    select * from z_student where stu_age between 17 and 21;
    -方式3:取反大法(not)(缺点:数据必须连贯 有规则)
    select * from z_student where not (stu_age <17 and stu_age>21);
    -方法4:穷举法(缺点:麻烦)
    select * from z_student where stu_age=17 or stu_age=18 or stu_age=19 or stu_age=20 or stu_age=21;
    -in子查询:
    select * from z_student where stu_age in (17,18,19,20,21);

三、聚合函数查询
    -求和函数
    sum(字段)  如:select sum(字段名) from 表名;
    -求平均数函数
    avg(字段)  如:select avg(字段名) from 表名;
    -统计个数函数
    count(*)  如:select count(*) from 表名;
    -最值
    max(字段)  min(字段)  如:select max(字段) from 表名;   select min(字段) from 表名;
    -分组聚合查询 group by 字段名
    需求:展示每个学生的总分  
    select sum(score) from t_student group by stu_id;
    展示每个学生的总分和学生id  总分降序
    select sum(score),stu_id from t_student group by stu_id order by sum(score) desc;
    如果在分组查询中有条件筛选且条件是聚合函数字段,需在group by 字段名后且加having
    例如:展示总分在240及以上的学生总分 降序
    select sum(score) from t_student group by stu_id having sum(score)>=240 order by sum(score) desc;


    select sum(字段名) from 表名 group 字段名;
    

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值