【教奶奶学SQL】(task6)秋招秘籍B

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 练习一:行转列假设 A B C 三位小朋友期末考试成绩如下所示:

练习一:行转列

假设 A B C 三位小朋友期末考试成绩如下所示:

+-----+-----------+------|
| name|   subject |score |
+-----+-----------+------|
|  A  |  chinese  |  99  |
|  A  |  math     |  98  |
|  A  |  english  |  97  |
|  B  |  chinese  |  92  |
|  B  |  math     |  91  |
|  B  |  english  |  90  |
|  C  |  chinese  |  88  |
|  C  |  math     |  87  |
|  C  |  english  |  86  |
+-----+-----------+------|

请使用 SQL 代码将以上成绩转换为如下格式:

+-----+-----------+------|---------|
| name|   chinese | math | english |
+-----+-----------+------|---------|
|  A  |     99    |  98  |    97   |
|  B  |     92    |  91  |    90   |
|  C  |     88    |  87  |    86   |
+-----+-----------+------|---------|

方法一:

# 核心步骤 
SELECT  
  name,
  SUM(CASE WHEN subject = 'chinese' THEN score
       ELSE NULL
    END) AS 'chinese',
  SUM(CASE WHEN subject = 'math' THEN score
       ELSE NULL 
    END) AS 'math',
  SUM(CASE WHEN subject = 'english' THEN score
       ELSE NULL 
        END) AS 'english'
FROM score1 
GROUP BY name;

可以回顾SQL中的CASE使用方法

PS:在Oracle中可以使用PIVOT函数如下,mysql中也是可以的,参考MySQL实现pivot行转列

SELECT a.name AS name, a.chinese as chinese, a.math as math, a.english as english
FROM score1 
PIVOT(
  SUM(score) FOR subject IN (chinese, math, english)
)AS a
GROUP BY a.name;

练习二:列转行

假设 A B C 三位小朋友期末考试成绩如下所示

+-----+-----------+------|---------|
| name|   chinese | math | english |
+-----+-----------+------|---------|
|  A  |     99    |  98  |    97   |
|  B  |     92    |  91  |    90   |
|  C  |     88    |  87  |    86   |
+-----+-----------+------|---------|

请使用 SQL 代码将以上成绩转换为如下格式:

+-----+-----------+------|
| name|   subject |score |
+-----+-----------+------|
|  A  |  chinese  |  99  |
|  A  |  math     |  98  |
|  A  |  english  |  97  |
|  B  |  chinese  |  92  |
|  B  |  math     |  91  |
|  B  |  english  |  90  |
|  C  |  chinese  |  88  |
|  C  |  math     |  87  |
|  C  |  english  |  86  |
+-----+-----------+------|

这里我们先直接利用练习1select出现的表:

DROP TABLE score2;
CREATE TABLE score2 AS 
SELECT * FROM (
SELECT  
  name,
  SUM(CASE WHEN subject = 'chinese' THEN score
       ELSE NULL
    END) AS 'chinese',
  SUM(CASE WHEN subject = 'math' THEN score
       ELSE NULL 
    END) AS 'math',
  SUM(CASE WHEN subject = 'english' THEN score
       ELSE NULL 
        END) AS 'english'
FROM score1 
GROUP BY name
) AS score2;
SELECT * FROM score2;

这里创建的表就是刚才练习一的了:

image.png

注意在题目表中如语文的成绩字段名是chinese而非score,所以需要chinese AS score

# 核心步骤 
SELECT name, 'chinese' AS subject, chinese AS score 
FROM score2  
UNION ALL 
SELECT name, 'math' AS math, math AS score 
FROM score2 
UNION ALL  
SELECT name, 'english' AS english, english AS score 
FROM score2 
ORDER BY name;

image.png

练习三:带货主播

假设,某平台2021年主播带货销售额日统计数据如下:

表名 anchor_sales

+-------------+------------+---------|
| anchor_name |     date   |  sales  | 
+-------------+------------+---------|
|      A      |  20210101  |  40000  |
|      B      |  20210101  |  80000  |
|      A      |  20210102  |  10000  |
|      C      |  20210102  |  90000  |
|      A      |  20210103  |   7500  |
|      C      |  20210103  |  80000  |
+-------------+------------+---------|

定义:如果某主播的某日销售额占比达到该平台当日销售总额的 90% 及以上,则称该主播为明星主播,当天也称为明星主播日。

首先我们插入数据:

# 练习3 
DROP TABLE if EXISTS anchor_sales;
CREATE TABLE anchor_sales
(anchor_name VARCHAR(4) NOT NULL,
 date INTEGER NOT NULL,
 sales INTEGER NOT NULL,
 PRIMARY KEY(anchor_name, date));
INSERT INTO anchor_sales VALUES('A',20210101,40000);
INSERT INTO anchor_sales VALUES('B',20210101,80000);
INSERT INTO anchor_sales VALUES('A',20210102,10000);
INSERT INTO anchor_sales VALUES('C',20210102,90000);
INSERT INTO anchor_sales VALUES('A',20210103,7500);
INSERT INTO anchor_sales VALUES('C',20210103,80000);
SELECT * FROM anchor_sales;

请使用 SQL 完成如下计算:

a. 2021年有多少个明星主播日?

b. 2021年有多少个明星主播?

方法一:

这其实是一个问题,找到明星主播日及其对应的明星主播,我们可以先计算出不同人在当天的销售比率(占当天所有额),这一步通过聚合函数SUM和窗口函数的结合使用。

# 计算出不同人在当天的销售比率(占当天所有额)
SELECT date, anchor_name, 
     (SUM(sales) / SUM(sales) OVER (PARTITION BY date)) AS sale_rate 
FROM anchor_sales 
GROUP BY date, anchor_name 
ORDER BY date, anchor_name DESC; 

image.png

然后在上面这个表中进行筛选出sale_rate大于等于90%,全部过程:

SELECT * FROM (
SELECT date, anchor_name, 
     (SUM(sales) / SUM(sales) OVER (PARTITION BY date)) AS sale_rate 
FROM anchor_sales 
GROUP BY date, anchor_name 
ORDER BY date, anchor_name DESC
) AS a 
WHERE sale_rate >= 0.9;

练习四:MySQL 中如何查看sql语句的执行计划?可以看到哪些信息?

可以使用profiles来查看sql 语句执行计划,要使用该功能,mysql的版本必须在5.0.37版本以上。否则只能使用explain 的方式来检查。

profiling 功能可以了解到cpu io 等更详细的信息。

show profile 的格式如下:

SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]
type:
    ALL  | BLOCK IO  | CONTEXT SWITCHES  | CPU  | IPC  | MEMORY  | PAGE FAULTS  | SOURCE  | SWAPS

默认方式下该功能是关闭的。

练习五:解释一下 SQL 数据库中 ACID 是指什么

ACID为原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)的总称。

5.1 原子性(Atomicity)

整个事务是一个不可分割整体,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

每一条的T-SQL语句都是一个事务,如insert语句、update语句等。用户也可以定义自己的事务,使用TYR-CATCH方法将多条语句合为一个事务,比如银行转账,在A账户中减钱与在B账户中增钱是一个自定义的事务。

5.2 一致性(Consistency)

一致性,即在事务开始之前和事务结束以后,数据库的完整性约束(唯一约束,外键约束,Check约束等)没有被破坏。业务的一致性可以转化为数据库的一致性。

5.3 隔离性(Isolation)

隔离执行事务,多个事务的执行互相不干扰。一个事务不可能获取到另一个事务执行的中间数据。SQL Server利用加锁造成阻塞来保证事务之间不同等级的隔离性。

事务之间的互相影响的情况分为几种,分别为:脏读(Dirty Read),不可重复读,幻读。

(1)脏读

脏读表示一个事务获取了另一个事务的未提交数据,这个数据有可能被回滚。

不可重复度表示一个事务执行两次相同的查询,出现了不同的结果,这是因为两次查询中间有另一事务对数据进行了修改。

(2)幻读

幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,第一个事务的用户发现表中还有 没有修改的数据行,就好象发生了幻觉一样。

为了避免上述几种事务之间的影响,SQL Server通过设置不同的隔离等级来进行不同程度的避免。因为高的隔离等级意味着更多的锁,从而牺牲性能.所以这个选项开放给了用户根据具体的需求进行设置。不过默认的隔离等级Read Commited符合了99%的实际需求.

5.4 持久性(Durability)

在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 关系型数据库 MySQL
【教奶奶学SQL】(task6)秋招秘籍C
练习一:行转列 假设有如下比赛结果
103 0
【教奶奶学SQL】(task6)秋招秘籍C
|
SQL 数据采集 关系型数据库
【教奶奶学SQL】(task4)集合运算
集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。
234 0
【教奶奶学SQL】(task4)集合运算
|
SQL 关系型数据库 MySQL
【教奶奶学SQL】(task2)基础查询与排序
从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思。通过SELECT语句查询并选取出必要数据的过程称为匹配查询或查询(query)。
127 0
【教奶奶学SQL】(task2)基础查询与排序
|
SQL 存储 关系型数据库
【教奶奶学SQL】(task1)初识数据库
数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。该数据集合称为数据库(Database,DB)。用来管理数据库的计算机系统称为数据库管理系统(Database Management System,DBMS)。
139 0
【教奶奶学SQL】(task1)初识数据库
|
SQL 关系型数据库 MySQL
【教奶奶学SQL】(task6)秋招秘籍C
练习一:行转列 假设有如下比赛结果
133 0
【教奶奶学SQL】(task6)秋招秘籍C
|
SQL
【教奶奶学SQL】(task6)秋招秘籍A(leetcode刷题)
【leetcode】184 部门工资最高的员工 创建Employee 表,包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。 并插入数据:
145 0
【教奶奶学SQL】(task6)秋招秘籍A(leetcode刷题)
|
SQL OLAP Serverless
【教奶奶学SQL】(task5)SQL高级处理(窗口函数 | ROLLUP)
窗口函数也称为OLAP函数。OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。 为了便于理解,称之为 窗口函数。常规的SELECT语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某一部分数据进行汇总、计算和排序。
167 0
【教奶奶学SQL】(task5)SQL高级处理(窗口函数 | ROLLUP)
|
SQL 存储 关系型数据库
【教奶奶学SQL】(task3)复杂查询(视图 | 子查询 | 谓词 | Case)
单从表面上看起来这个语句是和正常的从数据表中查询数据是完全相同的,但其实我们操作的是一个视图。所以从SQL的角度来说操作视图与操作表看起来是完全相同的,那么为什么还会有视图的存在呢?视图到底是什么?视图与表有什么不同呢?
278 0
【教奶奶学SQL】(task3)复杂查询(视图 | 子查询 | 谓词 | Case)
|
SQL 存储 关系型数据库
【教奶奶学SQL】(task1)初识数据库
数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。该数据集合称为数据库(Database,DB)。用来管理数据库的计算机系统称为数据库管理系统(Database Management System,DBMS)。
197 0
【教奶奶学SQL】(task1)初识数据库
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")