当前位置: 首页 > news >正文

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

 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
;

 

近日总结:

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搭建 Web 群集Haproxy
  • 安装pointnet踩坑记录(情绪篇)
  • 学习c语言第24天(练习)
  • 进程状态(二)----- linux 中具体的进程状态(上)
  • 设置临时环境变量
  • utf-8‘ codec can‘t decode byte 0xd3 in position
  • Django ASGI服务
  • 易境通海运系统,让财务对账不再是老大难
  • 使用 1panel面板 部署 springboot 和 vue
  • Python酷库之旅-第三方库Pandas(073)
  • Preferences首选项存储工具类(Harmony OS)
  • 【实现100个unity特效之12】Unity中的冲击波 ——如何使用ShaderGraph制作一个冲击波着色器
  • 实时数据监控,三防平板在工业领域的应用解析
  • Unity补完计划 之 Mask SortingGroup
  • 哈尔滨等保测评——为工业网络安全保驾护航新航标
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Apache Spark Streaming 使用实例
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Javascript 原型链
  • JAVA多线程机制解析-volatilesynchronized
  • Mysql5.6主从复制
  • React Native移动开发实战-3-实现页面间的数据传递
  • text-decoration与color属性
  • ViewService——一种保证客户端与服务端同步的方法
  • vue.js框架原理浅析
  • Vue--数据传输
  • webpack入门学习手记(二)
  • 从PHP迁移至Golang - 基础篇
  • 对JS继承的一点思考
  • 分布式熔断降级平台aegis
  • 服务器从安装到部署全过程(二)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 聊聊hikari连接池的leakDetectionThreshold
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 那些年我们用过的显示性能指标
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用common-codec进行md5加密
  • const的用法,特别是用在函数前面与后面的区别
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​卜东波研究员:高观点下的少儿计算思维
  • (20)docke容器
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (论文阅读40-45)图像描述1
  • (三)elasticsearch 源码之启动流程分析
  • (十三)Flink SQL
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .NET BackgroundWorker
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .project文件
  • .py文件应该怎样打开?
  • @ModelAttribute使用详解