网络安全 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;
相关推荐
IT古董3 小时前
《FDE前沿部署工程师实战教程》33 - Enterprise AI Observability:从Agent Trace到全链路智能运维
数据库·人工智能
for_ever_love__3 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
Nturmoils7 小时前
GROUP BY 先别想当然,查汇总前把规则跑清楚
数据库
最笨的羊羊8 小时前
Oceanbase数据库系列之:向量数据库核心知识
数据库·oceanbase
fish_xk8 小时前
mysql中的表的约束
数据库·mysql
谢亮_vipxieliang8 小时前
Go Channel 高级模式——从底层原理到扇出扇入实战
java·数据库·golang
ggaofeng9 小时前
自己编写邮件服务器和客户端
数据库
java1234_小锋9 小时前
【技术专题】Mysql8 数据库 - Mysql8 添加,更新,删除数据
数据库·mysql
PaperData9 小时前
2015-2024年各省绿色贸易数据
数据库
小羊没烦恼!9 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#