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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
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));

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
9月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
9月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
|
10月前
|
SQL Oracle 关系型数据库
【YashanDB 知识库】如何将 mysql 含有 group by 的 SQL 转换成崖山支持的 SQL
在崖山数据库中执行某些 SQL 语句时出现报错(YAS-04316 not a single-group group function),而这些语句在 MySQL 中能成功执行。原因是崖山遵循 SQL-92 标准,不允许选择列表中包含未在 GROUP BY 子句中指定的非聚合列,而 MySQL 默认允许这种操作。解决办法包括:使用聚合函数处理非聚合列或拆分查询为两层,先进行 GROUP BY 再排序。总结来说,SQL-92 更严格,确保数据一致性,MySQL 在 5.7 及以上版本也默认遵循此标准。
|
SQL 存储 缓存
高基数 GroupBy 在 SLS SQL 中的查询加速
本文详细介绍了SLS中的高基数GroupBy查询加速技术。
334 105
|
9月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
SQL 监控 测试技术
SQL现在到哪个版本及版本更新技巧与方法
SQL(Structured Query Language)作为数据库管理和操作的标准语言,随着技术的不断进步和数据库管理系统(DBMS)的持续发展,其版本也在不断更新和完善
1107 5
|
SQL Oracle 关系型数据库
SQL数据库当前版本概览与更新趋势
在探讨SQL(Structured Query Language)数据库的当前版本时,我们首先要明确的是,SQL本身是一种查询语言标准,而并非特指某一个具体的数据库产品
|
SQL 数据管理 BI
SQL 有哪些版本?
SQL 有哪些版本?
1142 4
|
SQL 数据管理 BI
SQL Server 有哪些版本?
SQL Server 有哪些版本?
1017 3