SQL(高级查询)

5.高级查询

1.统计查询

  • 通过聚合函数实现

  • 聚合函数的作用:将一列数据作为一个整体,进行纵向计算。

  • 常见聚合函数

    • sum():求和

    • avg():求平均数

    • max():最大值

    • min():最小值

    • count():统计符合条件的数据的总记录数

    语法

    select 聚合函数(字段)from 表名
    • 注意:NULL值是不参与所有聚合函数运算的

    • 案例:

      • 求表里面有多少条记录

        select count(*) from t_student
      • 求最大的年龄

        select max(age) from t_student
      • 求最小的年龄

        select min(age) from t_student
      • 求所有学生的年龄相加的和

        select sum(age) from t_student
      • 求所有学生的平均年龄

        select avg(age) from t_student


2.分组查询

  • group by 条件:

    • 通过指定的条件进行分组

  • having:

    • 对分组后的数据进行筛选

  • 案例

    ​
        1. 求班上男女生各多少个;
        select sex,count(*) from t_student group by sex
        2. 求班上男女生学号平均值;
        select sex,avg(id) from t_student group by sex
        3. 求班上男女生各学号总和;
        select sum(id) from t_student group by sex
        4. 求班上男女生各个姓氏分别有多少人;
        select substring(sname,1,1),ssex,count(*) from t_student group by substring(sname,1,1),ssex
        5. 求各个地方各个性别多少个人;
        select addr,ssex,count(*) from t_student group by addr,ssex
        6. 求各个地方多少个人;
        select addr,count(*) from t_student group by addr
        7. 求衡阳的男女生各多少个;
        select sex,count(*) from t_student where addr='衡阳'
        8. 求姓刘的男女生各多少;
        select sex,count(*) from t_student where substring(name,1,1)='刘' group by sex
        9. 求人数在2个人以上的地方;
        select addr from t_student group by addr having count(*)>2
        10. 求男生人数在2个人以上的地方。
        select addr from t_student where sex='男' group by addr having count(*)>2
    ​
    ​
    ​

  • where和having的区别

    • 执行时机不同:

      where是分组之前进行过滤,不满足where条件不参与分组;而having是分组之后对结果进行过滤

    • 判断条件不同:

      where不能对聚合函数进行判断,而having可以

    • 注意事项 :

      • 分组之后查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

      • 执行顺序:where >聚合函数 >having

      • 支持多字段分组,具体语句为:group by columnA,columnB

3.联表查询

  • 关联查询又称为联表查询或多表联查,关联查询分为:内连接、外连接和交叉连接

  • 关联查询需要把多张表共有的字段作为关联查询的条件

1.内连接

  • inner join /join

  • 内连接也叫自连接,我们经常用的查询方法,内连接查询只能查询出多张表匹配的记录,匹配不上的记录时无法查询出来的。

  • 内连接的三种写法

    select * from student s, color c where s.stuname = c.stuname;【简写方式】
    select * from student s inner join color c on s.stuname = c.stuname;
    
    select * from student s join color c on s.stuname = c.stuname;
    
    select * from student s join color c where s.stuname = c.stuname;
    

    注意:内连接的时候可以用where替代on,但是where没有on的效率高

2.外连接 -outer join

  • outer join

  • 外连接可进一步分为左外连接(left outer join)和右外连接(right outer join),简称左连接(left join)和右连接(right join)

2.1 左外连接 -left join
  • 连接就是以左边的表(left join 左边的表)为主表,即使有些记录关联不上,主表的信息也能全部查询出来,也就是左边的表数据全部展示,右边表的数据符合条件的展示,不符合条件的以空值代替。语法如下:

    select * from student s left join color c on s.stuname = c.stuname;
    
    select * from student s left outer join color c on s.stuname = c.stuname;
    

2.2 右外连接
  • 右连接就是以右边的表(right join 右边的表)为主表,即使有些记录关联不上,主表的信息也能全部查询出来,也就是右边的表数据全部展示,左边表的数据复合条件的展示,不符合条件的以空值代替。语法如下:

    select * from student s right join color c on s.stuname = c.stuname;
    
    select * from student s right outer join color c on s.stuname = c.stuname;
    

2.3全连接
  • 全连接的查询结果是左外连接和右外连接查询结果的并集,即使一些记录关联不上,也能够把部分信息查询出来。mysql里面已经删除了全连接 full join,不过我们可以通过 UNION 拼接实现如下:

    (select * from tb_user left join tb_shop on tb_user.shop_id = tb_shop.shop_id) #左连接两张表,没有取别名union
    (select * from tb_shop right join tb_user on tb_user.shop_id = tb_shop.shop_id) #右连接两张表,没有取别名
    
    


4.高级子查询

4.1 何为子查询
  • 把一个查询块作为另外一个查询块的条件。那么这个作为条件的查询块就是“子查询”或“内层查询”,上层的查询块称为“父查询”或“外层(部)查询”。

  • 如:select * from 表 where 字段 运算符 (select 字段 from 表 where 条件);

  • 注:将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个(单行单列)。

4.2 使用子查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值