复杂sql书写方法
给你一个复杂sql连接不同的表,多个嵌套查询条件等的语句时,你是非常的胆怯由于对语法的不熟悉以及没有经验和自信,现在我们来学习一下如何写复杂的sql,我们把它分解为很多小的步骤进行
一、集中最后的输出结果
开始在头脑中想到要输出的最终结果并且写下期待的结果集从查询中得到的,评估有多少记录你需要取回并且哪些表用于这些结果的输出。
二、理解数据库表关系
主要理解这些表之间的关系是一对一,还是一对多,还是多对多关系,ER图更能理清它们之间的关系,确保你需要哪些字段在这个表中进行连接。
三、将查询拆分为可管理的部分
请记住你不必须一个写下完整的sql语句。首先要确定表所需要的连接,并适当的引入相应的表。记住那个复杂的sql是简单sql的集合。测试那个查询在每个阶段一个接一个确保输出我们需要得到的结果。 一旦查询被创建,就应该在添加新表时一次又一次的进行测试。
四、聚合结果集
这是使用Group By语句聚合不同结果集的时间。您还可以根据需要使用多个聚合函数,如COUNT、MAX、SUM、MIN、SUM或AVG等。此外,如果结果集的顺序很重要,那么将它们按照语句order的正确顺序排列。
五、确保查询容易读
在需要的地方为SQL查询添加注释。不要添加不必要的注释,否则会使查询变得冗长乏味。请记住,SQL语句越长,执行语句就需要越多的带宽。尽量使用大多数开发人员经常使用的标准约定。
六、其它考虑的因素
对于一个复杂的sql查询,为查询使用存储过程是很常见的,但是在编写复杂的SQL查询时还需要考虑许多其他事实。
(1)复杂的sql查询是不可移植的对于其它数据库.
(2)众所周知,当调试很少时,测试是非常困难的.
(3)它们减少了应用服务器上的负载,但增加了web服务器上的负载.
您可以使用简单的SQL语句,然后在需要时使用更多的SQL语句将它们循环起来。经验丰富的数据库开发人员绝不会推荐这种方法,因为它既困难又混乱。最好的方法是实践SQL代码,并使用正确的技术或方法提高编写复杂SQL查询的效率。
七、为什么你应该避免复杂sql查询
一个复杂的SQL查询是许多连接和子查询的组合,很快您就会意识到长查询也是bug的根源,因此,这里的问题是,要么您应该寻找原始创建者来调试查询,要么您应该自己重新设计查询,以深入理解隐藏的复杂性。
复杂SQL查询的最大好处是从多个数据源获取数据,但是当开发人员过度使用时,它可能会产生问题。对于复杂的SQL查询,开发人员必须定义不同数据块之间的关系、连接表、对结果集进行分组、对结果集进行排序等等。
当您对修改数据库模式感兴趣时,它通常涉及重新设计查询,有时候,开发人员不喜欢更改数据模型,因为他们害怕重新创建大量SQL查询并将其按指定的顺序排列。
当复杂的SQL查询设计带来如此多的麻烦时,大多数开发人员都对使用替代方案(如果有的话)感兴趣.
八、复杂的sql查询替代方案。
对于复杂的SQL查询,有两种流行的替代方法,如下所示。
(1)使用大量的小的sql查询。
(2)你可以使用查询生成器。
第一个方案是简单的,而不是用一个包含所有内容的大型查询来访问数据库,将查询分解为更小的可管理单元。编写多个子查询来获取不同的数据段,单独处理它们,而不是一直使用聚合函数。对于新手程序员来说,它是最强大的方法,可以帮助彻底理解复杂的查询,而不必直接跳到最高效的解决方案。
当您希望使用小型查询时,不要忘记考虑效率方面的权衡。小查询通常不太倾向于管理职责,它们可以在不同的情况下自由应用。根据经验丰富的dba的说法,带有一组选定职责的小型查询通常很适合他们的工作,易于调试,而且语法错误也更少。
第二种方案涉及使用查询生成器。将大型查询分解为描述查询不同方面的小的可管理部分,这是最好的方法。它将提供一组具有共享概念的多个查询。您可以单独处理特定的集合,并尝试对其进行全面的逻辑或语法错误测试,以便稍后成功执行。
复杂sql书写方法的更多相关文章
- PL/SQL异常处理方法
PL/SQL异常处理方法 1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: ...
- SQL 跟踪方法相关介绍
oracle sql跟踪方法:1.sql_trace打开跟踪:alter session set sql_trace=true;为跟踪文件做标记:alter session set tracefile ...
- 查找bad sql的方法:
--查找bad sql的方法: select * from (select buffer_gets, sql_text from v$sqlarea ; -- 执行次数多的SQL select sql ...
- SQL书写技巧
SQL书写技巧: 1.针对分区表,如果可以使用分区条件的,一定要加分区条件.分区条件的使用,可以减少不必要的数据访问,加快查询数据,如TB_CSV_ACCEPT_FLOW_OPERATOR表,以acc ...
- C#链接远程SQL 服务器方法
C#链接远程SQL 服务器方法第一步:申请花生壳内网版,要求交1块钱给花生壳服务器做验证.第二步:把你自己主机本地连接那里的内网地址不要自动获取,写成192.168.0.105,子网掩码255.25 ...
- SQL拼接方法
smark Beetle可靠.高性能的.Net Socket Tcp通讯组件 另类SQL拼接方法 在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的 ...
- jdbc调试sql语句方法
在main命令行输入三个参数到oracle 的 dept2表(自己建的 和dept一样(deptno,dname,loc)),插入到数据库中去.通过本例子,学习在java里调试sql的方法. 写完sq ...
- sql注入方法以及防范
sql注入方法: 1.数字注入 ; get请求 www.bobo.com?id=1 可以查出 ID等于1的一条数据. 如果有人在链接后面增加 www.bobo.com?id=1 or 1=1 / w ...
- DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化、SQL优化方法
ylbtech-DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化.SQL优化方法 1.返回顶部 1. 1,单库表别太多,一般保持在200以下为宜 2,尽量避免SQL中出现运算,例如se ...
随机推荐
- 【VS开发】fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本
fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本 <pre id="best-content-12991040 ...
- VUE-CLI项目同一局域网手机通过IP访问电脑本地项目
0.找到config文件夹下的index.js文件,修改host内容为hots:'0.0.0.0',此时重新运行项目,则其他设备可以通过ip进行访问 1.首先确保电脑防火墙或者杀毒软件关闭,因为大多数 ...
- 初始mysql
数据库操作 查看当前登陆用户: select user(); 登录数据库 mysql -u用户名 -p密码 -h 连接地址 修改当前用用户密码 set password = password('123 ...
- Java check是否是日期类型
boolean checkFormate(string parm){ Pattern pattern = Pattern.compile("([0-9]{4})(0[1-9]|1[0-2]) ...
- java - redis学习
在学习redis之前,我们首先需要了解一下NoSQL(非关系数据库).非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定. 为什么需要NoSQL? (1) ...
- Counting Cliques(HDU-5952)【DFS】
题目链接:https://vjudge.net/problem/HDU-5952 题意:有一张无向图,求结点数量为S的团的数量. 思路:如果不加一点处理直接用DFS必然会超时,因为在搜索过程中会出现遍 ...
- MEAN: AngularJS + NodeJS的REST API开发教程
Node.JS https://www.jdon.com/idea/nodejs/web-app-with-angularjs-and-rest-api-with-node.html Mean是一个热 ...
- ajax回调函数,全局变量赋值后,ajax外无法获取的解决
1 ajax回调函数内,function的执行与ajax外是异步的,常导致全局变量赋值后,再次使用此变量人无法获取. 所以,可以把需要的步骤,独立放在functuon中,在ajax回调函数中执行.可较 ...
- Mobile Phone Network CodeForces - 1023F (最小生成树)
大意: 无向图, 其中k条边是你的, 边权待定, m条边是你对手的, 边权已知. 求如何设置边权能使最小生成树中, 你的边全被选到, 且你的边的边权和最大. 若有多棵最小生成树优先取你的边. 先将$k ...
- 12.2备库rman使用delete删除归档日志报错RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process
问题: 客户环境12.2 dg备库环境,定时清理归档脚本并未正常清理归档日志文件. 观察日志可以发现存在如下信息 RMAN-08137: WARNING: archived log not delet ...