毫无疑问,编写代码是一门艺术而非科学,没有程序员可以编写出既可读又可维护的漂亮代码,即使有经验也是如此。
一般来说,当您学习编码的艺术时,编码水平会随着经验而提高,例如,你会变得更喜欢组合而不是继承或更喜欢接口而不是实现,但是只有少数开发人员能够掌握这些技术。
SQL查询也是如此。您构建查询的方式,您编写它的方式,如果正确的话,可以很好地将您的意图传达给其他开发人员。
常常,在我看到来自多个开发人员的电子邮件中的SQL查询时,我能看出他们的编写风格的显著差异。一些开发人员编写得非常整洁,并且对查询进行了适当的缩进,这使得很容易发现关键细节,例如,从哪个表中提取哪些列以及哪些是条件。
因为在实际的项目中,SQL查询并不是单行的,所以当您需要以后阅读这些SQL查询或需要将该查询共享给某人进行检查或执行时,这种情况下,学习正确的编写SQL查询的方式会带来很大的不同。
在本文中,我将向您展示一些我过去尝试过的编写风格,介绍它们的优缺点以及我认为最好的SQL查询编写方式。

除非你有很好的理由不使用我推荐的风格,例如:你有更好的风格,或者你想坚持项目中一直使用的风格(一致性压倒一切),没有理由不使用它。

顺便说一句,我希望您熟悉SQL,了解SQL查询中的不同子句及其含义。如果不是,你最好通过参加一个很好的课程来获得SQL经验。

第一种写SQL的方式

SELECT e.emp_id, e.emp_name, d.dept_name, p.project_name from Employee eINNER JOIN Department d ON e.dept_id = d.dept_idINNER JOIN Projects p ON e.project_id = p.project_idWhere d.dept_name="finance" and e.emp_name like '%A%' and e.salary > 5000;
优点:
使用了大小写混合将关键字从列和表名之间分开,如SELECT使用大写,而Employee使用首字母大写,但如果你喜欢一致性的话,可以让from关键字也大写,没有研究只显示那种写法更好。

缺点:

1)大小写混合

2)整个查询写在一行上,一旦表和列的数量增加,这一行就不可读了

3)在添加新条件或删掉条件时没有灵活性

第二种书写SQL查询的方式

SELECT e.emp_id, e.emp_name, d.dept_name, p.project_namefrom Employee eINNER JOIN Department d ON e.dept_id = d.dept_idINNER JOIN Projects p ON e.project_id = p.project_idWhere d.dept_name="finance" and e.emp_name like '%A%' and e.salary > 500;

改进:

1) SQL查询被划分为多行,使其更具可读性

问题

1)大小写混合

2) where子句上的所有条件位于同一行上,也就是说通过注释排除它们不是那么容易。

第三种书写SQL的方式,也是最好的一种

select e.emp_id, e.emp_name, d.dept_namefrom Employee einner join Department d on e.dept_id = d.dept_idwhere d.dept_name = 'finance'and e.emp_name like '%A%'and e.salary > 500;
1)将SQL查询划分为多行可以提高可读性

2)使用适当的缩进可以很容易地找到数据源,例如表和join

3)让条件语句都放在单独的行上,可以容易的注释掉某个条件进行调试。

select e.emp_id, e.emp_name, d.dept_namefrom Employee einner join Department d on e.dept_id = d.dept_idwhere d.dept_name = 'finance'-- and e.emp_name like '%A%';and e.salary > 5000
顺便说一句,如果您喜欢用大写字母表示关键字,您还可以编写如下所示的相同的SQL查询,这些规则是相同的,只是关键字是大写字母。

这就是我要说的如何编写可读和更易于维护的SQL查询。对于SQL查询的缩进或样式化,您有什么看法?

这是一种简单的技术,但非常强大,对于提高涉及多个连接的复杂SQL查询的可读性大有帮助,如我前面的示例所示。

如果您喜欢,也可以在网上使用各种SQL格式器,但我建议您学习一种样式并坚持使用它,而不是依赖于格式器。

如何更优雅的写出你的SQL语句相关推荐

  1. 写出一条Sql语句,取出表A中的第31条到第40条记录。表A以自动增长的ID作为主键。(注意:ID可能不是连续的)

    写出一条Sql语句,取出表A中的第31条到第40条记录.表A以自动增长的ID作为主键.(注意:ID可能不是连续的).笔试的时候经常会出现这道题,网上的答案也是龙鱼混杂,今天自己实践了一下,找出了正确的 ...

  2. 如果学号的前两位表示年级,要查找98级女生的姓名,请写出相应的SQL语句

    下面是学生成绩表(score)的结构说明 字段名称 字段解释 字段类型 字段长度 约束 sc_number 学号 字符 8 PK sc_name 姓名 字符 50 Not null sc_sex 性别 ...

  3. 如何写出高效率的sql语句

    转自 http://jianglin.blog.51cto.com/676726/134264 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处 ...

  4. 如何写出高性能的SQL语句,及如何进行SQL性能分析与调优

    1.尽量使用索引 索引是数据库中重要的存储结构,对于查询耗时影响甚大,应避免导致索引无效的sql语句 索引失效的场景: 1.缺失索引 2.where 条件中的or 3.where条件表字段使用函数 4 ...

  5. 运筹学修炼日记:如何优雅地写出大规模线性规划的对偶

    运筹学修炼日记:如何优雅地写出大规模线性规划的对偶问题 运筹学修炼日记:如何优雅地写出大规模线性规划的对偶 最短路问题 多商品流问题`Multicommodity Network Flow Probl ...

  6. matlab复数向极坐标转换_[matlab 极坐标]利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。谁能写出函数和调用语句?...

    利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换.谁能写出函数和调用语句? 问题补充:利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换.谁能写出 ...

  7. 修改 decimal 默认值为0.00 sql_被经理邀请去“爬山”,只是因为我写错了一条SQL语句?...

    作者:isysc1 链接:https://juejin.im/post/5f06a2156fb9a07e5f5180df 来源:掘金 前戏 SQL 写的妙,涨薪呱呱叫! 新来的实习生小杨写了一条 SQ ...

  8. mysql更新两表所有记录语句怎么写_mysql 一条sql语句update更新两个表

    mysql 一条sql语句update更新两个表 你写过一条sql语句来修改两个表的数据吗? UPDATE test.table1 t1,test.table2 t2 SET t1.aa='a',t1 ...

  9. 优雅的写出 JavaScript 代码

    目录 前言 避免使用 js 糟粕和鸡肋 编写简洁的 JavaScript 代码 使用 ES6/ES7 新特性 Babel ESLint Prettier 采用函数式编程 优雅的敲 JS 代码的几个原则 ...

最新文章

  1. linux查找文件命令find
  2. CF#190DIV.1
  3. windows查看已连接过的wifi密码
  4. idea中maven导入jar包
  5. windows下使用salt安装软件
  6. 获取java 私有属性或 方法
  7. python不相等的两个字符串的 if 条件判断为True
  8. C/C++语言学习的策略
  9. perl -p -i -e s/aaaaa/bbbbb/g ./*.sql
  10. 23种设计模式(十一)对象性能之单件模式
  11. 小程序开发工具命令行启动配置
  12. SoilGrid 250米土壤质地数据集
  13. 如何从零创建一个机器人模型
  14. RAIN - SEKAI NO OWARI - 歌词翻译及罗马音译整理
  15. 如何看计算机几核,如何查看电脑CPU是几核的?,这几步你要了解
  16. java 协方差矩阵_协方差矩阵概念(易理解)
  17. 十月一“闭关修炼”,读完这些Java技术栈,愿金九银十过五斩六
  18. 【图文】如何在学信网申请在线验证报告?包括-教育部学籍在线验证报告-教育部学历证书电子注册备案表 in 中国高等教育学生信息网
  19. Java clk啥意思_clock (CLK)是什么意思
  20. 思科 计算机网络 第六章测试考试答案

热门文章

  1. ‘(‘:illegal token on right side of ‘::‘
  2. DaVinci的Buffer_Handle和BufTab Cmem函数调用
  3. halcon trainf_ocr_class_svm 训练OCR分类器
  4. mysql select array_从数据库select查询出来的数组
  5. android studio 手动安装gradle,Android Studio 如何安装Gradle?
  6. 三维家可以导入别人的方案吗_广州深圳天津形位公差检测三维缺陷检测服务
  7. php负责传递数据,php传递数据的方法有哪些
  8. mysql 卸载批处理_MYSQL 注册启动 及 停用卸载 批处理脚本 (补)
  9. 面试题——20190717
  10. phper必知必会之类库自动加载的七种方式(三)