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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
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));

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL Java 数据库连接
SQL SELECT语句的基本用法
SQL SELECT语句的基本用法
|
8天前
|
SQL 数据管理 BI
SQL 有哪些版本?
SQL 有哪些版本?
46 4
|
8天前
|
SQL 数据管理 BI
SQL Server 有哪些版本?
SQL Server 有哪些版本?
23 3
|
8天前
|
SQL 存储 安全
SQL Server用法
SQL Server用法
8 1
|
19天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
26 1
|
29天前
|
SQL 安全 流计算
Flink SQL 在快手实践问题之Group Window Aggregate 中的数据倾斜问题如何解决
Flink SQL 在快手实践问题之Group Window Aggregate 中的数据倾斜问题如何解决
48 1
|
27天前
|
SQL 关系型数据库 MySQL
8、SQL高级用法
8、SQL高级用法
13 0
|
2月前
|
SQL 监控 关系型数据库
PolarDB产品使用问题之SQL防火墙怎么拦截没有指定WHERE条件的特定表的SQL语
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2月前
|
SQL 分布式计算 DataWorks
MaxCompute操作报错合集之使用sql查询一个表的分区数据时遇到报错,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
2月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表