常用sql语句及其优化

文章目录

  • 介绍
  • 常用sql语句
    • 1. 数据查询
      • 1.1 SELECT 语句
      • 1.2 DISTINCT 关键字
      • 1.3 WHERE 子句
      • 1.4 ORDER BY 子句
      • 1.5 LIMIT 关键字
    • 2. 数据更新
      • 2.1 INSERT INTO 语句
      • 2.2 UPDATE 语句
      • 2.3 DELETE FROM 语句
    • 3. 数据管理
      • 3.1 CREATE TABLE 语句
      • 3.2 ALTER TABLE 语句
      • 3.3 DROP TABLE 语句
  • 常用关联查询表
    • 1. 内连接(INNER JOIN)
    • 2. 左连接(LEFT JOIN)
    • 3. 右连接(RIGHT JOIN)
    • 4. 全连接(FULL JOIN)
  • 多表关联
    • 1. 多表连接(JOIN)
    • 2. 联合查询(UNION)
    • 3. 子查询(Subquery)
  • sql查询性能优化
    • 1. SQL 查询语句优化
    • 1. 使用索引
    • 2. 索引优化
    • 3. 数据库统计信息
    • 4. 查询缓存
    • 5. 查询优化工具
    • 6. 数据库配置优化
    • 7. 数据分区和分片

介绍

SQL 是结构化查询语言(Structured Query Language)的简称,是用于管理关系型数据库的标准化语言。而SQL 查询性能优化是提高数据库查询速度和效率的关键步骤。通过优化 SQL 查询语句、索引设计和数据库配置,可以显著提升系统性能和响应时间。

常用sql语句

1. 数据查询

1.1 SELECT 语句

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • 用于从数据库中检索数据,可以指定需要返回的字段和条件。

1.2 DISTINCT 关键字

SELECT DISTINCT column1, column2, ...
FROM table_name;
  • 用于返回唯一不重复的值。

1.3 WHERE 子句

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • 用于过滤数据,根据指定条件筛选所需的数据。

1.4 ORDER BY 子句

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC];
  • 用于对结果集进行排序,默认按升序排列,也可以指定降序排列。

1.5 LIMIT 关键字

SELECT column1, column2, ...
FROM table_name
LIMIT number_of_records;
  • 用于限制结果集的行数。

2. 数据更新

2.1 INSERT INTO 语句

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
  • 用于向表中插入新的行。

2.2 UPDATE 语句

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • 用于修改表中已有的数据。

2.3 DELETE FROM 语句

DELETE FROM table_name
WHERE condition;
  • 用于删除表中的行。

3. 数据管理

3.1 CREATE TABLE 语句

CREATE TABLE table_name (
  column1 datatype,
  column2 datatype,
  ...
);
  • 用于创建新的表格。

3.2 ALTER TABLE 语句

ALTER TABLE table_name
ADD column_name datatype;
  • 用于向表中添加新的列。

3.3 DROP TABLE 语句

DROP TABLE table_name;
  • 用于删除整个表。

常用关联查询表

1. 内连接(INNER JOIN)

内连接是最常用的连接方式,它会返回两个表中满足连接条件的行。语法如下:

SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
  • 示例:
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

2. 左连接(LEFT JOIN)

左连接会返回左表中所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则返回 NULL 值。语法如下:

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
  • 示例:
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

3. 右连接(RIGHT JOIN)

右连接与左连接相反,会返回右表中所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则返回 NULL 值。语法如下:

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
  • 示例:
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

4. 全连接(FULL JOIN)

全连接会返回两个表中所有的行,无论是否满足连接条件。如果某个表中没有匹配的行,则返回 NULL 值。语法如下:

SELECT columns
FROM table1
FULL JOIN table2 ON table1.column = table2.column;
  • 示例:
SELECT customers.customer_name, orders.order_id
FROM customers
FULL JOIN orders ON customers.customer_id = orders.customer_id;

多表关联

1. 多表连接(JOIN)

多表连接用于将多个表按照指定条件进行连接,以获取符合条件的数据。常见的连接类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。语法如下:

SELECT columns
FROM table1
JOIN table2 ON table1.column = table2.column
JOIN table3 ON table2.column = table3.column
...
  • 示例:
SELECT orders.order_id, customers.customer_name, products.product_name
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
JOIN products ON orders.product_id = products.product_id;

2. 联合查询(UNION)

联合查询用于合并多个 SELECT 语句的结果集,并去除重复行。语法如下:

SELECT columns FROM table1
UNION
SELECT columns FROM table2
UNION
SELECT columns FROM table3
...
  • 示例:
SELECT product_name FROM products
UNION
SELECT product_name FROM archived_products;

3. 子查询(Subquery)

子查询是嵌套在其他查询语句中的查询,可以用来作为条件、筛选规则或者结果集的一部分。语法如下:

SELECT columns
FROM table
WHERE column IN (SELECT column FROM another_table WHERE condition);
  • 示例:
SELECT order_id, order_date
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'USA');

sql查询性能优化

SQL 查询性能优化是提高数据库查询速度和效率的关键步骤。通过优化 SQL 查询语句、索引设计和数据库配置,可以显著提升系统性能和响应时间。

1. SQL 查询语句优化

1. 使用索引

  • 在经常用于检索数据的列上创建索引,可以加快查询速度。
CREATE INDEX index_name ON table_name(column_name);
  1. 避免 SELECT *
  • 尽量避免使用 SELECT *,而是明确列出需要查询的列,避免检索不必要的数据。
  1. 使用 WHERE 子句
  • 在查询中尽量使用 WHERE 子句进行条件过滤,减少返回结果集的大小。
  1. 使用 JOIN 条件
  • 确保 JOIN 操作中有合适的连接条件,避免出现笛卡尔积(Cartesian Product)。
  1. 避免嵌套查询
  • 尽量避免使用嵌套查询,可以考虑使用 JOIN 或子查询来替代。
  1. 使用 EXISTS 替代 IN
  • 在需要检查子查询是否返回结果时,使用 EXISTS 关键字比 IN 关键字效率更高。
  1. 避免使用通配符在 WHERE 子句开头
  • 避免在 WHERE 子句中使用通配符(如 %)开头,这会导致索引失效。
  1. 使用 LIMIT 限制结果集大小
  • 在查询中使用 LIMIT 关键字限制返回结果的数量,避免返回过多数据。
  1. 使用 UNION ALL 替代 UNION
  • 如果不需要去重操作,尽量使用 UNION ALL 而不是 UNION,因为 UNION 会执行去重操作,消耗额外性能。
  1. 定期优化表结构
  • 定期对数据库表进行优化,包括删除不必要的索引、重建索引、压缩表等操作。

通过合理使用以上 SQL 查询语句优化关键字和技巧,可以有效提升数据库查询性能和效率,让查询操作更加快速和高效。希木这些技巧对您有所帮助,如果有任何问题或需要进一步帮助,请随时提问!

2. 索引优化

  1. 选择合适的列进行索引
  • 需要对经常用于检索数据的列进行索引,例如常用于 WHERE 子句、JOIN 条件和 ORDER BY 子句的列。
  1. 考虑多列索引
  • 在需要同时检索多个列的查询中,考虑创建多列索引,以提高联合条件查询的效率。
  1. 避免在频繁更新的列上创建索引
  • 对于频繁进行插入、删除和更新操作的列,不宜过度创建索引,因为索引的维护会增加额外的开销。
  1. 考虑使用覆盖索引
  • 覆盖索引是指索引包含了查询需要的所有列,避免了回表查询,可以提高查询效率。
  1. 定期重新构建索引
  • 对于数据量变化较大的表,定期重新构建索引可以帮助优化索引的性能。
  1. 使用索引提示
  • 在某些情况下,数据库可能无法正确选择最优的索引,可以考虑使用索引提示来指导数据库查询优化器选择合适的索引。
  1. 监视索引的使用情况
  • 通过监视数据库索引的使用情况,可以及时发现哪些索引没有被使用或者需要优化。
  1. 考虑部分索引
  • 对于只有部分数据需要索引的列,可以考虑创建部分索引,以减少索引的大小和维护成本。
  1. 使用索引优化工具
  • 可以使用数据库管理工具或者专门的索引优化工具来分析索引的性能,并提出优化建议。
  1. 注意索引与性能的平衡
  • 创建过多的索引可能会增加数据库的维护开销,需要权衡索引对查询性能的提升和维护成本之间的关系。

3. 数据库统计信息

  1. 表统计信息
  • 表的大小:包括表的行数、占用的存储空间大小等。
  • 表的平均行长度:用于估算表的存储空间需求和查询性能。
  • 表的更新时间:记录表最后一次更新的时间戳,用于查询数据的实时性。
  1. 索引统计信息
  • 索引的大小:包括索引占用的存储空间大小。
  • 索引的选择性:衡量索引的唯一性,选择性越高表示重复值越少,性能越好。
  • 索引的使用频率:记录索引被查询的次数,用于评估索引的实际效益。
  1. 列统计信息
  • 列的基本信息:包括列的数据类型、长度、是否允许空值等。
  • 列的数据分布:统计列中不同取值的频率和分布情况,用于优化查询条件。
  • 列的最大值和最小值:用于确定列的范围和数据分布情况。
  1. 查询执行计划统计信息
  • 查询执行计划:记录数据库查询的执行路径、操作顺序和访问方法,用于优化查询性能。
  • 查询优化器统计信息:包括查询优化器对索引、表和连接方式的估算成本和选择依据。
  1. 数据库性能监控指标
  • 数据库连接数:记录当前数据库的连接数和连接池使用情况。
  • 查询响应时间:统计数据库查询的响应时间,用于评估数据库性能。
  • 缓存命中率:记录数据库缓存的命中率,用于评估缓存效果和优化缓存设置。

4. 查询缓存

  1. 什么是查询缓存?
    查询缓存是数据库管理系统中的一个缓存机制,用于存储已经执行过的查询结果,以便在接收到相同查询请求时能够直接返回缓存结果,而无需重新执行查询操作。
  2. 查询缓存如何工作?
    当一个查询语句被执行后,数据库会将查询结果存储在内存中的缓存中,同时记录查询语句和对应的结果。当下次有相同的查询请求到达时,数据库会首先检查缓存中是否存在相同的查询语句,如果有,则直接返回缓存结果,避免了重复执行查询操作。
  3. 查询缓存的优势是什么?
  • 提高查询性能:避免了重复执行相同查询语句,减少了查询响应时间。
  • 减轻系统负载:减少了数据库服务器的计算和IO开销,提高了系统的并发处理能力。
  1. 查询缓存存在哪些问题?
  • 缓存命中率:如果缓存中没有需要的查询结果,就无法利用查询缓存,影响性能提升效果。
  • 缓存失效:当数据库数据发生变化时,缓存中的查询结果可能会失效,需要及时更新缓存。
  1. 如何管理查询缓存?
  • 合理设置缓存大小:根据系统需求和内存资源设置合适的缓存大小。
  • 定期清理缓存:避免缓存过期或者存储无效数据,定期清理缓存可以提高效率。
  • 监控缓存命中率:监控缓存命中率可以评估缓存效果,及时调整缓存策略。

5. 查询优化工具

  • 使用数据库性能分析工具来监控查询执行计划和性能瓶颈,及时发现并解决问题。
  • 使用 Explain Plan 来查看查询执行计划,分析索引是否被正确使用。

6. 数据库配置优化

  • 调整数据库参数设置,如内存分配、并发连接数等,以提高查询性能和系统稳定性。

7. 数据分区和分片

  • 对大型表进行数据分区或分片,可以减少查询范围,提高查询性能。
  • 合理设计数据分区策略,确保数据均匀分布,避免单一分区数据过大导致性能问题。

点赞.jpg

各位看官》创作不易,点个赞!!!
诸君共勉:万事开头难,只愿肯放弃。

免责声明:本文章仅用于学习参考

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十八:Java8新特性

文章目录 01、Java8概述02、Java8新特性的好处03、并行流与串行流04、Lambda表达式4.1、Lambda表达式使用举例4.2、Lambda表达式语法的使用14.3、Lambda表达式语法的使用2 05、函数式(Functional)接口5.1、函数式接口的介绍5.2、Java内置的函数式接口介绍及使用举例 06、方法引…

shopify如何使用代码片段进行代码优化

在Shopify中,您可以使用代码片段来进行代码优化。代码片段是一种在主题中重复使用的可重用代码块。通过使用代码片段,您可以将常用的代码逻辑封装起来,提高代码的可维护性和重用性。以下是在Shopify中使用代码片段进行代码优化的步骤&#xf…

笔记73:ROS中的各种消息包

参考视频: 33.ROS 的标准消息包 std_msgs_哔哩哔哩_bilibili 34. ROS 中的几何包 geometry_msgs 和 传感器包 sensor_msgs_哔哩哔哩_bilibili 标准消息包:std_msgs常用消息包:common_msgs导航消息包:nav_msgs几何消息包&#xf…

遥感影像处理(ENVI+ChatGPT+python+ GEE)处理高光谱及多光谱遥感数据

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能…

SpringBoot项目连接Redis报错:Connection refused: no further information

今天在使用SpringBoot连接Redis时发生了报错 明明Jedis能够连接成功为什么StringRedisTemplate就不行? 然后在网上找了一下说是关闭防火墙或者修改配置文件但是都不管用 最后发现是Redis在SpringBoot3之后yml的配置方式发生了改变 相较于之前多了一个前缀, 由于我刚开始没有…

600万订单每秒Disruptor +SpringBoot,如何解决消息不丢失?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,遇到很多很重要的面试题: Disruptor 官方说能达到每秒600w OPS订单处理能力&…

databinding双向绑定原理,Android程序员最新职业规划

1. Android架构设计模式 MVC架构设计模式:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVP架构设计模式:MVC全名是Model View Persenter,MVP由MVC演变而来,是现在主流的开发…

IDEA切换 Springboot初始化 URL

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

Mysql常见用法(2)

目录​​​​​​​ mysql 约束 primary key 主键的基本使用 notnull(非空) unique(唯一) foreign key(外键) check 自增长 mysql索引 索引的原理 索引的类型 索引的使用 --添加索引 删除索引: -- 修改索引 , 先删除,在添加新…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

vscode设置打开浏览器

安装这个插件 Open Browser Preview

MYSQL--锁机制*

一.对锁机制的大概介绍: 1.大概的来说,MYSQL当中的锁实际上就是合理的管理多个服务器对于同一个共享资源的使用,是计算机协调多个进程或者是线程并发访问某一资源的机制(避免争抢资源的现象发生) 2.在数据库当中,数据是一种可以供许多的用户进行共享使用的资源,如何保证数据并发…

Vue2:用node+express部署Vue项目

一、编译项目 命令 npm run build执行命令后,我们会在项目文件夹中看到如下生成的文件 二、部署Vue项目 接上一篇,nodeexpress编写轻量级服务 1、在demo中创建static文件夹 2、将dist目录中的文件放入static中 3、修改server.js文件 关键配置&…

Function calling流程总结 和 用于构建Agent的Function calling流程

Function calling流程总结的步骤如下: 自定义函数:根据用户需求,自定义函数chen_ming_algorithm,用于处理特定的任务。创建字典:根据自定义函数,创建一个字典chen_ming_function,其中包含自定义…

华为 OD 一面算法原题

2.2 亿彩票公布调查结果 昨天,闹得沸沸扬扬的《10 万中 2.2 亿》的彩票事件,迎来了官方公告。 简单来说,调查结果就是:一切正常,合规合法。 关于福利彩票事件,之前的推文我们已经分析过。 甚至在后面出现《…

云上攻防-云服务篇弹性计算服务器云数据库实例元数据控制角色AK控制台接管

知识点: 1、云服务-弹性计算服务器-元数据&SSRF&AK 2、云服务-云数据库-外部连接&权限提升 章节点: 云场景攻防:公有云,私有云,混合云,虚拟化集群,云桌面等 云厂商攻防:阿里云&am…

Kepler 参数化查询优化方法

写在前面 本文主要介绍了发布于 2023 年 SIGMOD 的论文《Kepler: Robust Learning for Faster Parametric Query Optimization》,该文章针对参数化查询,将参数化查询优化与查询优化结合,旨在减少查询规划时间的同时提高查询性能。 为此&…

【Java项目介绍和界面搭建】拼图小游戏——添加图片

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

C++ 补充之常用排序算法

C 补充之常用排序算法 常用的排序算法主要包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,下面简单介绍一下它们的概念和原理: 冒泡排序(Bubble Sort): 冒泡排序是一种基础的排序算法,它重…

作业1-224——P1015 [NOIP1999 普及组] 回文数

题目描述 思路 首先此题为一道高精度题,然后本题按照题目意思模拟即可。我们可以开两个数组来记录高精度数字,这样方便我们处理。判断“该数组是否回文”、“c翻转存入d再做cd”可以写成两个单独的函数。然后主程序组织一下他们即可。注意好退出循环的…