网络安全 Day24-select高级用法和多表连接

select高级用法和多表连接

  • [1. select 多子句单表高级实践](#1. select 多子句单表高级实践)
    • [1.1 select 多子句高级语法](#1.1 select 多子句高级语法)
    • [1.2 聚合函数](#1.2 聚合函数)
    • [1.3 group by 实践](#1.3 group by 实践)
    • [1.4 having 筛选](#1.4 having 筛选)
    • [1.5 order by 排序](#1.5 order by 排序)
    • [1.6 limit](#1.6 limit)
  • [2. 多表连接](#2. 多表连接)

1. select 多子句单表高级实践

1.1 select 多子句高级语法

  1. where 和 having 区别是后者是分组后进行排名
  2. select 语法: select <字段1, 字段2, ...> from <表名> [where 条件]
  3. 其他语句
    1. group by 分组条件: 分组对指定列分组
    2. having 条件: 分组后条件判断或过滤
    3. order {col_name | expr | position} [ASC | DESC]: 排序ASC升序, DESC降序
    4. LIMIT {[offset,] row_count | row_count OFFSET offset}: 限制结果集数量

1.2 聚合函数

  1. 什么是聚合函数: 聚合函数是group by 的前提条件

  2. 常用聚合函数

    序号 聚合函数 用处
    1 count() 返回指定组中数据的数量, 括号内加列名
    2 sum() 返回指定组中数据之和, 只能用于数字列
    3 avg() 返回指定组中的平均值
    4 max() 返回指定数据的最大值
    5 min() 返回指定数据的最小值
    6 group_concat() 返回指定的数据, 按逗号分割为一行

1.3 group by 实践

  • 查看表结构

    sql 复制代码
    MariaDB [world]> desc city;
    +-------------+----------+------+-----+---------+----------------+
    | Field       | Type     | Null | Key | Default | Extra          |
    +-------------+----------+------+-----+---------+----------------+
    | ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
    | Name        | char(35) | NO   |     |         |                |
    | CountryCode | char(3)  | NO   | MUL |         |                |
    | District    | char(20) | NO   |     |         |                |
    | Population  | int(11)  | NO   |     | 0       |                |
    +-------------+----------+------+-----+---------+----------------+
  • 统计每个国家的总数

    • 错误

      sql 复制代码
      select countrycode,sum(population) 
      from city;
    • 正确

      sql 复制代码
      select countrycode,sum(population) 
      from city 
      group by countrycode;
  • 统计中国每个省的城市个数

    sql 复制代码
    SELECT District,COUNT(ID)
    	FROM city 
    	WHERE CountryCode='chn'
    	GROUP BY District;
  • 统计中国每个省的人口数

    sql 复制代码
    SELECT District,SUM(Population)
    	FROM city 
    	WHERE CountryCode='chn'
    	GROUP BY District;

1.4 having 筛选

  • 用途: 在group by 之后进行筛选
  • 例子
    • 统计中国每个省的城市个数以及城市列表,并把超过十个城市的输出

      sql 复制代码
      SELECT district,COUNT(*),GROUP_CONCAT(NAME) 
        FROM city 
        WHERE countrycode='CHN' GROUP BY district 
        having count(*)>10;

1.5 order by 排序

  • 查询中国城市人口并按人口数排序输出

    sql 复制代码
    SELECT NAME,Population
    	FROM city 
    	WHERE CountryCode= 'CHN'
    	ORDER BY Population DESC;
  • 统计中国每个省的总人口,过滤输出总人口超过1000w,从大到小排序输出

    sql 复制代码
    SELECT District,SUM(Population)
    	FROM city 
    	WHERE CountryCode= 'CHN'
    	GROUP BY District
    	HAVING SUM(Population)>10000000
    	ORDER BY SUM(Population) DESC;

1.6 limit

  • 作用与语法: 用于显示指定数据行数, 一般用于order by排序后, 例如选择top3 或者倒数前3
  • 例子
    • 显示前两行: limit 2
    • 显示3-6行: LIMIT 2,5

2. 多表连接

  • 什么是多表连接: 将多张表用一个相同字段拼接成一张表
  • 连接的分类
  • 语法: select 字段1,字段2 from 表1 join 表2 on(注意此时的字段表示方法都应该是: 表.字段)
  • 练习请参考: https://www.cnblogs.com/oldboy666/p/15637461.html
  • 例子
    • 查询oldboy老师教的学生名

      sql 复制代码
      SELECT teacher.tname,GROUP_CONCAT(student.sname)
      FROM teacher
      JOIN course
      ON teacher.tno=course.tno
      JOIN sc 
      ON course.cno=sc.cno
      JOIN student
      ON sc.sno=student.sno
      WHERE teacher.tname='oldboy'
      GROUP BY teacher.tno;
    • 查询oldboy所教课程的平均分数

      sql 复制代码
      SELECT teacher.tname,AVG(sc.score) 
      FROM teacher
      JOIN course
      ON teacher.tno=course.tno
      JOIN sc 
      ON course.cno=sc.cno
      WHERE teacher.tname='oldboy'
      GROUP BY teacher.tno;
    • 查询oldboy老师教的学生名

      sql 复制代码
      SELECT teacher.tname,GROUP_CONCAT(student.sname)
      FROM teacher
      JOIN course
      ON teacher.tno=course.tno
      JOIN sc 
      ON course.cno=sc.cno
      JOIN student
      ON sc.sno=student.sno
      WHERE teacher.tname='oldboy'
      GROUP BY teacher.tno;
相关推荐
J-Tony111 小时前
【Redis】 Redis 是单线程还是多线程
服务器·数据库·mysql
这个DBA有点耶1 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
IvorySQL1 小时前
PG 日报|SQL/PGQ 图查询基于联接重写机制实现
数据库·人工智能·sql·postgresql·区块链·ivorysql
数聚天成DeepSData4 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一勺菠萝丶5 小时前
生产环境平滑升级实战-Nginx维护页数据库迁移与安全回滚
数据库·nginx·安全
心静自然凉8005 小时前
MySQL主从同步配置(一主一从)
数据库
haidy ahmed5 小时前
企微复杂审批流反序列化:动态表单解析引擎与EAV存储模型
数据库·人工智能·自动化·企业微信
Lihua奏5 小时前
MVCC:为什么多人同时读写数据,数据库还能不乱
数据库
952365 小时前
Redis - 应用
数据库·redis·分布式·缓存
青山木5 小时前
一把 Redis 分布式锁,踩透四个坑:锁争抢、僵尸锁、锁过期、锁丢失
java·数据库·redis·后端