SQL练习题--5.6和5.7版本的Group by 用法以及中间表使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: M-统计每个老师教授课程的学生总数-if(expr1,expr2)

M-统计每个老师教授课程的学生总数-if(expr1,expr2)


网络异常,图片无法展示
|

网络异常,图片无法展示
|


预期结果


网络异常,图片无法展示
|


分析过程

先了解一个判断函数IFNULL(expr1,expr2)

假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

特别注意 sql 5.6和5.7之后Group by用法

这里的group by后面如果直接接t.name的话,可能会因为同名教师出现错误,正确的做法还是使用teacher_id进行分组,

但是在SQL5.7之后是不允许group by id, select name字段,输出却包含name字段

所以为了保险起见,还是应该写group by t.id,t.name

因此sql应该这样写

SELECT t.name AS teacher_name,

sum(if(teacher_id is null,0 ,student_count)) as student_count

FROM teachers t LEFTJOIN courses c

ON t.id=c.teacher_id GROUPBY t.id,t.name

否则容易出现查询sql语句报错信息:

Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause ..............

问题原因:

MySQL 5.7.5和up实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们。

(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的。关于前5.7.5行为的描述,请参阅MySQL 5.6参考手册。)


删除重复的(ID小的数字)


编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+------------------+

| Id | Email |

+----+------------------+

| 1 | john@example.com |

| 2 | bob@example.com |

| 3 | john@example.com |

+----+------------------+

Id 是这个表的主键


预期结果


例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+

| Id | Email |

+----+------------------+

| 1 | john@example.com |

| 2 | bob@example.com |

+----+------------------+


分析过程:


方法一:

使用 DELETE 和 WHERE 子句

我们可以使用以下代码,将此表与它自身在电子邮箱列中连接起来。

SELECT p1.* FROM Person p1, Person p2 WHERE p1.Email = p2.Email;

然后我们需要找到其他记录中具有相同电子邮件地址的更大 ID。所以我们可以像这样给 WHERE 子句添加一个新的条件。

DELETE p1 FROM Person p1, Person p2 WHERE p1.Email = p2.Email AND p1.Id > p2.Id

此方法虽然理解上比较容易,但是做了自链接导致用时较长,提交的大概都在900ms左右

所以有了方法二

方法二(通过中间表):

  1. 先通过查询下最小的id 值
  2. 通过中间查询
  3. 再删除id 不在这范围的值

因此上述的题目还可以改写成

delete from Person where id not in(SELECT * from (SELECT min(id ) from Person group by Email)t)

题目简述

查询 teachers 表中,筛选出该国家教师的平均年龄大于所有国家教师的平均年龄的国家,查询出这些国家的教师信息。

网络异常,图片无法展示
|


预期结果


网络异常,图片无法展示
|

分析过程


  1. 筛选出该国家教师的平均年龄

这里需要先进行根据国家分组,求出平均成绩

SELECT country FROM teachers group by country

大于

  1. 所有国家教师的平均年龄的国家

SELECT avg(age) FROM teachers

  1. 查询出这些国家的教师信息。

WHERE country in

SQL

-- 查询并返回所有符合要求的老师信息 --

SELECT* FROM teachers

WHERE country in

(SELECT country FROM teachers group by country

having avg(age) >(SELECTavg(age) FROM teachers));

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
68 11
|
4天前
|
SQL 关系型数据库 MySQL
查询mysql版本sql - 蓝易云
执行这个命令后,MySQL将返回当前正在运行的版本信息。
42 0
|
5天前
|
SQL 流计算 API
实时计算 Flink版产品使用合集之ClickHouse-JDBC 写入数据时,发现写入的目标表名称与 PreparedStatement 中 SQL 的表名不一致如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
12 0
|
8天前
|
SQL XML Linux
SQL Server的版本
【5月更文挑战第14天】SQL Server的版本
22 3
|
8天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
8天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
|
8天前
|
SQL 数据库
sql server 增删改查(基本用法)
sql server 增删改查(基本用法)
|
8天前
|
SQL 数据库
Sql server 表管理(创建 修改 删除)
Sql server 表管理(创建 修改 删除)
|
8天前
|
SQL 存储 Oracle
SQL,Group By 真扎心,原来是这样
SQL,Group By 真扎心,原来是这样
40 0
|
8天前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
21 0