从今天开始深入学习 SQL 优化

news2024/9/21 8:03:24

 SQL优化

.SQL优化

12.1 selet具体字段
12.2 多用limit
12.3 用union all替换 union
12.4 优化group by
12.5 优化order by
12.6 小表驱动大表
12.7 字段类型使用合理
12.8 优化linit分页
12.9 exist& in的合理利用
12.10 join关联的表不宜过多
12.11 delete+in自查询不走索引
12.12 in元素不要过多

 参考链接:接口性能优化-CSDN博客 

 SQL 代码规范

评论区看到的佬总结的 sql 规范

关键字大写,保持统一。
保持良好的换行,便于理清楚逻辑。
and,or,逗号等放在行首,这样的好处是增加删除条件时比较方便,否则删除最后一个条件时还要去上一行末删除关联词。
不用保证符号对齐, where条件field对齐即可。
尽量查询的field前加上表的简称,提高代码可读性,一目了然。

例题

查询

1757. 可回收且低脂的产品

表:Products

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_id  | int     |
| low_fats    | enum    |
| recyclable  | enum    |
+-------------+---------+
product_id 是该表的主键(具有唯一值的列)。
low_fats 是枚举类型,取值为以下两种 ('Y', 'N'),其中 'Y' 表示该产品是低脂产品,'N' 表示不是低脂产品。
recyclable 是枚举类型,取值为以下两种 ('Y', 'N'),其中 'Y' 表示该产品可回收,而 'N' 表示不可回收。
 

编写解决方案找出既是低脂又是可回收的产品编号。

返回结果 无顺序要求 。

返回结果格式如下例所示:

 

示例 1:

输入:
Products 表:
+-------------+----------+------------+
| product_id  | low_fats | recyclable |
+-------------+----------+------------+
| 0           | Y        | N          |
| 1           | Y        | Y          |
| 2           | N        | Y          |
| 3           | Y        | Y          |
| 4           | N        | N          |
+-------------+----------+------------+
输出:
+-------------+
| product_id  |
+-------------+
| 1           |
| 3           |
+-------------+
解释:
只有产品 id 为 1 和 3 的产品,既是低脂又是可回收的产品。

题解:

# Write your MySQL query statement below
SELECT product_id 
FROM Products 
WHERE low_fats = "Y" 
  AND recyclable = "Y"
;

提交之后查看用时分布,发现

 这个是用时最少的:

# Write your MySQL query statement below
SELECT product_id FROM Products WHERE low_fats = 'Y' AND recyclable = 'Y'

没什么两样,但就是时间分布不一样,我又查看了一下其他的题解,都大差不差,我不理解了。

584. 寻找用户推荐人

表: Customer

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| referee_id  | int     |
+-------------+---------+
在 SQL 中,id 是该表的主键列。
该表的每一行表示一个客户的 id、姓名以及推荐他们的客户的 id。
找出那些 没有被 id = 2 的客户 推荐 的客户的姓名。

以 任意顺序 返回结果表。

结果格式如下所示。

 

示例 1:

输入: 
Customer 表:
+----+------+------------+
| id | name | referee_id |
+----+------+------------+
| 1  | Will | null       |
| 2  | Jane | null       |
| 3  | Alex | 2          |
| 4  | Bill | null       |
| 5  | Zack | 1          |
| 6  | Mark | 2          |
+----+------+------------+
输出:
+------+
| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |
+------+

题解:

SELECT name
FROM customer
WHERE referee_id != 2 
   OR referee_id IS NULL
;

595. 大的国家

World 表:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| name        | varchar |
| continent   | varchar |
| area        | int     |
| population  | int     |
| gdp         | bigint  |
+-------------+---------+
name 是该表的主键(具有唯一值的列)。
这张表的每一行提供:国家名称、所属大陆、面积、人口和 GDP 值。
 

如果一个国家满足下述两个条件之一,则认为该国是 大国 :

面积至少为 300 万平方公里(即,3000000 km2),或者
人口至少为 2500 万(即 25000000)
编写解决方案找出 大国 的国家名称、人口和面积。

按 任意顺序 返回结果表。

返回结果格式如下例所示。

 

示例:

输入:
World 表:
+-------------+-----------+---------+------------+--------------+
| name        | continent | area    | population | gdp          |
+-------------+-----------+---------+------------+--------------+
| Afghanistan | Asia      | 652230  | 25500100   | 20343000000  |
| Albania     | Europe    | 28748   | 2831741    | 12960000000  |
| Algeria     | Africa    | 2381741 | 37100000   | 188681000000 |
| Andorra     | Europe    | 468     | 78115      | 3712000000   |
| Angola      | Africa    | 1246700 | 20609294   | 100990000000 |
+-------------+-----------+---------+------------+--------------+
输出:
+-------------+------------+---------+
| name        | population | area    |
+-------------+------------+---------+
| Afghanistan | 25500100   | 652230  |
| Algeria     | 37100000   | 2381741 |
+-------------+------------+---------+

题解:

# Write your MySQL query statement below
SELECT name, population, area
FROM World
WHERE area >= 3000000 
OR    population >= 25000000
;

1148. 文章浏览 I

Views 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| article_id    | int     |
| author_id     | int     |
| viewer_id     | int     |
| view_date     | date    |
+---------------+---------+
此表可能会存在重复行。(换句话说,在 SQL 中这个表没有主键)
此表的每一行都表示某人在某天浏览了某位作者的某篇文章。
请注意,同一人的 author_id 和 viewer_id 是相同的。

请查询出所有浏览过自己文章的作者

结果按照 id 升序排列。

查询结果的格式如下所示:

示例 1:

输入:
Views 表:
+------------+-----------+-----------+------------+
| article_id | author_id | viewer_id | view_date  |
+------------+-----------+-----------+------------+
| 1          | 3         | 5         | 2019-08-01 |
| 1          | 3         | 6         | 2019-08-02 |
| 2          | 7         | 7         | 2019-08-01 |
| 2          | 7         | 6         | 2019-08-02 |
| 4          | 7         | 1         | 2019-07-22 |
| 3          | 4         | 4         | 2019-07-21 |
| 3          | 4         | 4         | 2019-07-21 |
+------------+-----------+-----------+------------+

输出:
+------+
| id   |
+------+
| 4    |
| 7    |
+------+
# Write your MySQL query statement below
SELECT DISTINCT author_id AS id
FROM Views
WHERE author_id = viewer_id
ORDER BY id
;

当然这个还有其他写法,比如 ORDER BY 后 id 换成1,即是按照 SELECT 列表中第一个列(或表达式)的结果进行排序。因为在这个查询中,SELECT 列表的第一个元素是 DISTINCT author_id AS id,实际上 ORDER BY 1 就是按照 id(即 author_id 的别名)进行排序。

1683. 无效的推文

表:Tweets

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| tweet_id       | int     |
| content        | varchar |
+----------------+---------+
在 SQL 中,tweet_id 是这个表的主键。
这个表包含某社交媒体 App 中所有的推文。

查询所有无效推文的编号(ID)。当推文内容中的字符数严格大于 15 时,该推文是无效的。

任意顺序返回结果表。

查询结果格式如下所示:

示例 1:

输入:
Tweets 表:
+----------+----------------------------------+
| tweet_id | content                          |
+----------+----------------------------------+
| 1        | Vote for Biden                   |
| 2        | Let us make America great again! |
+----------+----------------------------------+

输出:
+----------+
| tweet_id |
+----------+
| 2        |
+----------+
解释:
推文 1 的长度 length = 14。该推文是有效的。
推文 2 的长度 length = 32。该推文是无效的。

题解:

# Write your MySQL query statement below
SELECT tweet_id
FROM Tweets
WHERE LENGTH(content) > 15
;

连接

1378. 使用唯一标识码替换员工ID

Employees 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
在 SQL 中,id 是这张表的主键。
这张表的每一行分别代表了某公司其中一位员工的名字和 ID 。
 

EmployeeUNI 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| unique_id     | int     |
+---------------+---------+
在 SQL 中,(id, unique_id) 是这张表的主键。
这张表的每一行包含了该公司某位员工的 ID 和他的唯一标识码(unique ID)。
 

展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。

你可以以 任意 顺序返回结果表。

返回结果的格式如下例所示。

 

示例 1:

输入:
Employees 表:
+----+----------+
| id | name     |
+----+----------+
| 1  | Alice    |
| 7  | Bob      |
| 11 | Meir     |
| 90 | Winston  |
| 3  | Jonathan |
+----+----------+
EmployeeUNI 表:
+----+-----------+
| id | unique_id |
+----+-----------+
| 3  | 1         |
| 11 | 2         |
| 90 | 3         |
+----+-----------+
输出:
+-----------+----------+
| unique_id | name     |
+-----------+----------+
| null      | Alice    |
| null      | Bob      |
| 2         | Meir     |
| 3         | Winston  |
| 1         | Jonathan |
+-----------+----------+
解释:
Alice and Bob 没有唯一标识码, 因此我们使用 null 替代。
Meir 的唯一标识码是 2 。
Winston 的唯一标识码是 3 。
Jonathan 唯一标识码是 1 。

题解:

# Write your MySQL query statement below
SELECT unique_id, name
FROM Employees Es 
LEFT JOIN EmployeeUNI Ee
ON Es.id = Ee.id
;

使用左连接,保留左表所有记录,右表中没有匹配的行则为 NULL。

1068. 产品销售分析 I

销售表 Sales:

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| sale_id     | int   |
| product_id  | int   |
| year        | int   |
| quantity    | int   |
| price       | int   |
+-------------+-------+
(sale_id, year) 是销售表 Sales 的主键(具有唯一值的列的组合)。
product_id 是关联到产品表 Product 的外键(reference 列)。
该表的每一行显示 product_id 在某一年的销售情况。
注意: price 表示每单位价格。
产品表 Product:

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
+--------------+---------+
product_id 是表的主键(具有唯一值的列)。
该表的每一行表示每种产品的产品名称。
 

编写解决方案,以获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。

返回结果表 无顺序要求 。

结果格式示例如下。

 

示例 1:

输入:
Sales 表:
+---------+------------+------+----------+-------+
| sale_id | product_id | year | quantity | price |
+---------+------------+------+----------+-------+ 
| 1       | 100        | 2008 | 10       | 5000  |
| 2       | 100        | 2009 | 12       | 5000  |
| 7       | 200        | 2011 | 15       | 9000  |
+---------+------------+------+----------+-------+
Product 表:
+------------+--------------+
| product_id | product_name |
+------------+--------------+
| 100        | Nokia        |
| 200        | Apple        |
| 300        | Samsung      |
+------------+--------------+
输出:
+--------------+-------+-------+
| product_name | year  | price |
+--------------+-------+-------+
| Nokia        | 2008  | 5000  |
| Nokia        | 2009  | 5000  |
| Apple        | 2011  | 9000  |
+--------------+-------+-------+

题解:

# Write your MySQL query statement below
SELECT product_name, year, price
FROM sales s
JOIN product p
ON s.product_id = p.product_id
;

 1581. 进店却未进行过交易的顾客

表:Visits

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| visit_id    | int     |
| customer_id | int     |
+-------------+---------+
visit_id 是该表中具有唯一值的列。
该表包含有关光临过购物中心的顾客的信息。
 

表:Transactions

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| transaction_id | int     |
| visit_id       | int     |
| amount         | int     |
+----------------+---------+
transaction_id 是该表中具有唯一值的列。
此表包含 visit_id 期间进行的交易的信息。
 

有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个解决方案,来查找这些顾客的 ID ,以及他们只光顾不交易的次数。

返回以 任何顺序 排序的结果表。

返回结果格式如下例所示。

 

示例 1:

输入:
Visits
+----------+-------------+
| visit_id | customer_id |
+----------+-------------+
| 1        | 23          |
| 2        | 9           |
| 4        | 30          |
| 5        | 54          |
| 6        | 96          |
| 7        | 54          |
| 8        | 54          |
+----------+-------------+
Transactions
+----------------+----------+--------+
| transaction_id | visit_id | amount |
+----------------+----------+--------+
| 2              | 5        | 310    |
| 3              | 5        | 300    |
| 9              | 5        | 200    |
| 12             | 1        | 910    |
| 13             | 2        | 970    |
+----------------+----------+--------+
输出:
+-------------+----------------+
| customer_id | count_no_trans |
+-------------+----------------+
| 54          | 2              |
| 30          | 1              |
| 96          | 1              |
+-------------+----------------+
解释:
ID = 23 的顾客曾经逛过一次购物中心,并在 ID = 12 的访问期间进行了一笔交易。
ID = 9 的顾客曾经逛过一次购物中心,并在 ID = 13 的访问期间进行了一笔交易。
ID = 30 的顾客曾经去过购物中心,并且没有进行任何交易。
ID = 54 的顾客三度造访了购物中心。在 2 次访问中,他们没有进行任何交易,在 1 次访问中,他们进行了 3 次交易。
ID = 96 的顾客曾经去过购物中心,并且没有进行任何交易。
如我们所见,ID 为 30 和 96 的顾客一次没有进行任何交易就去了购物中心。顾客 54 也两次访问了购物中心并且没有进行任何交易。

题解:

# Write your MySQL query statement below
SELECT customer_id, COUNT(*) AS count_no_trans
FROM Visits
WHERE visit_id
NOT IN
(SELECT visit_id
FROM transactions)
GROUP BY customer_id
;

 

近日总结:

好好好,咱也是有了秋天的地一杯奶茶了好吧,但是不幸的确实,是伯牙绝弦,好好好,咱现在也是开始反胃了好吧,才喝了一点就开始想吐了好吧,呦呦呦,伯牙绝弦一段时间没见,你还是这么不输当年的威力,好想吐,我的天。

 就跟当初学长请大家喝奶茶一样,好好好,我也是不能喝奶茶的好吧,扔了浪费人家的一番心意,只能转赠他人了呜呜呜。

好好好,还剩下这么多咋整,也是人家的一番心意,呜呜呜,难受,我的胃,你的我的胃不一样,不一样,不一样,呜呜呜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习记录——day29 网络编程

目录 一、网络编程引入 1.1、IPC通信方式 1)内核提供: 无名管道 有名管道 信号 2)system V: 消息队列 共享内存 信号量集 1.2、网络通信使用缘由 二、网络发展阶段 2.1 APRAnet阶段 2.2 TCP/IP两个协议阶段…

Java收发邮件笔记

1 关于邮箱的前置知识 1.1 概念部分 邮箱服务器和协议是电子邮件系统中不可或缺的两个组成部分,它们共同确保了电子邮件的顺利发送、接收和管理。 1.1.1 服务器和协议 邮箱服务器 比如常见的QQ邮箱,网易邮箱。 邮箱服务器是一种负责电子邮件收发管理的计算机系…

Rust学习---Hello World

编写 Rust 程序 1.程序文件后缀名: rs 2.文件命名规范:hello_world.rs 3.(例子) 使用命令创建项目,命名为"hello world" 打开 cmd 输入: mkdir hello_world cd hello_world 新建文件 main.rs编译与运行 Rust 程序 1.编译:rustc main.rs,…

【无标题】Unity Asset Hunter 插件

Asset Hunter PRO是Unity的一款插件,用于分析工程内的资源使用情况,资源大小,分析资源依赖关系,可以用来清理项目中未使用的资源。尤其是项目较大时,删除没有使用的资源很有帮助。 对于项目UI图片修改次数过多时&…

Linux 进程概念

Linux 进程概念 硬件理解冯 诺依曼体系结构五大组成部件强调存储 引子操作系统(Operator System)概念作用认识为什么要有操作系统? 结构 示意图理解操作系统system call库函数概念 进程什么是进程概念误区认识 描述进程 - PCBtask_struct - P…

colResizable插件实现网页中表格列宽自定义

需求:页面上每个字段的列宽,可以通过页面拖动的形式进行调整。 解决方法:使用jQuery的一个插件,名称叫 colResizable,可以实现。 插件官网 colResizable – 可调整大小的列和表 (bacubacu.com) 说明: 该…

汽车线路保护设计

汽车线路保护设计 线路保护就是要对导线加以保护,兼顾对回路电器件的保护。保护装置主要有熔断器、断路器和易熔线等。 保险、继电器、导线、电瓶的选择和计算 熔断器的选取原则 发动机ECU、ABS等对整车性能及安全影响大,另外,易受其他用…

从零安装pytorch并在pycharm中使用

背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种,二者在实现理念上有一定区别,pytorch和人的思维模式与变成习惯更像,而tensorflow则是先构建整体结构,然后整体运行,开发调试过程较为繁…

算法工程师必知必会的数学基础之微积分上

系列文章: 第一篇:算法工程师必知必会的数学基础之线性代数第二篇:算法工程师必知必会的数学基础之微积分上(本文)。 文章目录 2. 微积分2.1 极限(Limits)和 连续性(Continuity&…

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件,它是一个文本标签,如果您想修改它的标签内容,请设置Content属性。我们曾提过ContentControl的Content属性是object类型,意味着Label的Content也是可以设置为任意的引用类型的。 案…

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)

P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况,可以通过这种想法得到: P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…

xxljob--入门使用

1.简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 2.下载 网址:xxljob 3. 导入数据库 3.1请下载项目源码并解压,获取 “调…

ElasticSearch(九)— 聚集查询2

一、 范围分桶聚集 如果使用 SQL 语言类比,桶型聚集与 SQL 语句中的 group by 子句极为相似。桶型聚集(Bucket Aggregation)是 Elasticsearch 官方对这种聚集的叫法,它起的作用是根据条件对文档进行分组。 可以将这里的桶理解为分组的容器,…

git commit 提交报错

当使用git cimmit -m "XXX" 将暂存区文件提交到仓库区时出现以下错误信息: 原因:开启了 eslint 校验 只要跳过 eslint 校验就可以了,即加 --no-verify 即可解决 git commit --no-verify -m "XXX"

太极图形学——弹性物体仿真 1

1.仿真基础,时间和空间的离散化 渲染对于物体的展现来说是一件很重要的事 但除了渲染之外,还需要物理来控制,形成动画 弹性物体的仿真实际上非常重要,特别是对于头发,衣物的仿真,虚拟手术中软组织的仿真 仿…

JupyterNotebook添加Anaconda中已有的虚拟环境

比如,在Acaconde中存在一个我已经配置好的虚拟环境pose,现在我想在Jupyter中使用它 那么可以使用ipython kernel install --user --name 你要添加的环境 添加到Jupyter中。 对于Jupyter中已有的代码,就可以在Kernel - chanage kernel中改变内核。

大模型+XDR!打开网络安全攻防演练新范式!

网络安全领域面临着日益复杂的挑战,外部攻击与内部安全威胁交织的双重压力。技术革新成为筑牢安全防线的关键,随着新一代技术的崛起,特别是大数据与人工智能的深度融合,引领着网络安全进入全新阶段。 通过构建网络安全大模型&…

批量重命名图片文件名,这几种方法告别手打!

在这个数字化时代,图片已成为我们日常生活和工作中不可或缺的一部分。无论是整理旅行照片、管理项目素材,还是编辑文章配图,图片的管理都显得尤为重要。然而,面对成百上千的图片文件,如果还在逐一手动修改文件名&#…

OpenSNN推文:研究发现,人工智能以牺牲集体多样性为代价提升个人创造力

 ChatGPT 等生成式 AI 工具的兴起引发了关于它们对创造力和新颖想法产生的影响的争论。 伦敦大学管理学院和埃克塞特大学研究人员开展的一项新研究探索了生成模型对创意写作的影响。该研究考察了获取大型语言模型 (LLM) 生成的故事创意如何影响人类创…

使用 Python 执行 JavaScript

案例引入 网站: https://spa7.scrape.center 这里是一个简单的 NBA 球星的网站, 用卡片形式展示了一些球星的基本信息。另外,每张卡片其实都有一个加密字符串,这个加密字符串其实和球星的信息是由关联的, 并且每个球星…