如何在SQL中思考?

时间:2009-07-13 13:39:53

标签: sql database rdbms

如何根据游标,过程和函数停止思考每个查询并开始使用SQL应该是什么?我们是否只是通过实践过渡到思考SQL,或者学习基于集合的查询语言有什么魔力吗?你做了什么过渡?

10 个答案:

答案 0 :(得分:22)

如果你是真正的SQL极客,那么首先要考虑的一些例子:

  • Bible concordanceFULLTEXT

  • Bible索引
  • Luca Pacioli Summa de arithmetica 描述了复式簿记实际上是一个规范化的数据库架构

  • Xerxes I计算他的军队时,将10,000他的人占据的区域围住,然后通过这个围场将其他人行进,他使用HASH AGGREGATE方法。

  • The House That Jack Built应使用自联接重写。

  • The Twelve Days of Christmas应使用自我加入和ROWNUM

  • 进行重写 应使用There Was An Old Woman Who Swallowed a Fly

    重写
  • CTE

  • 如果European Union被调用European Union All,我们会在Euro banknote上看到27字词的euro拼写,而不是{{ 1}}。

最后,你可以在我的博客中阅读一篇关于如何停止担忧并学会了爱2的一篇蹩脚文章(我差点忘了写了它):

还有一篇关于这个主题的文章:

答案 1 :(得分:4)

关键是你在操纵SETS&集合的元素;并将不同的集合(和相应的元素)放在一起。这真的是它的核心,imho。这就是为什么每个表都应该有一个主键;为什么你会看到语言中的集合运算符;以及为什么像UNION这样的运算符不会(通过defualt)返回重复的行。

当然在实践中,集合的规则是弯曲的或破坏的,但在必要时并不难看出(否则,SQL将受到限制)。 Imho,只是打开你的离散数学书,重新熟悉一些练习。

答案 2 :(得分:4)

我能给你的最佳建议是,每当你想到逐行处理某些事情时,你就会停下来问问自己是否有基于集合的方法来做到这一点。

答案 3 :(得分:2)

我学到的方法是做大量的查询,并在一份需要你根据结果集思考的工作。

从您的问题来看,您似乎已经编写了大量使用顺序/过程/迭代数据操作的前端代码。如果您没有参加任何需要您使用结果集技能的项目,我个人不会担心。

您可能想要尝试的一件事是尝试编写分析查询,例如,生成简单的数据报告。在这些情况下,您试图通过将它们分成几组来汇总大量数据。

另一个好方法是阅读一本关于RDBMSes的理论/数学基础的书。这些严格遵循集合论以及SQL查询语法的部分内容与其背后的数学直接相关。当然,这需要你喜欢数学。 :)

答案 4 :(得分:2)

我发现SQL的艺术在进入正确的思维模式方面起了很大的作用。

然而,部分原因归结为风格。 显然,您需要开始考虑结果集而不仅仅是程序性的。 但是,一旦你开始这样做,你就会经常找到决定。

您是否编写过令人难以置信的复杂更新语句,除了您自己以外,任何人都难以理解,并且难以维护,或者您是否编写效率较低但更易于管理的程序?

我强烈建议您记住,SQL语句可以在其中包含注释,以澄清它们正在做什么,而不仅仅是存储过程。

link:The Art Of SQL

答案 5 :(得分:2)

当人们问我关于加入时,我发送了here,它有很好的视觉表现形式!

答案 6 :(得分:2)

您可能想要尝试的一项练习是:

从您的应用层获取一些现有的报告代码,最好是生成单个表格数据集的代码。从最基本的元素开始,将其移植到SQL视图。

从单个表中提取所有列并编写SQL语句以选择该数据。然后一次加入一个表并开始计算输出的适当条件和逻辑。

您可能会遇到一些在SQL中最初看起来不可能的特定任务,但根据您编写的实现,几乎总有一种方法可以获得您正在寻找的结果。查看SQL实现的文档,或者尝试使用Google。

此练习的好处是可以为您提供原始报告以进行测试,因此您知道是否获得了预期的输出。

需要注意的一些事项:

  • 递归和图形是相当先进的技术;你可能想从更轻松的事情开始。 (Joe Celko有一本关于这个主题的好书,如果你有兴趣的话。)
  • BIT和C风格bool之间通常存在很大差异。至少,您可能必须明确地将输出从INT投射到BIT
  • OUTER JOIN在部分数据可能为空时非常有用,但请尽量不要滥用它们。

答案 7 :(得分:2)

我认为需要一段时间才能调整(很久以前对我来说,所以我不记得太好了)。但也许关键是SQL是declarative - 即你指定你想要做什么,而不是精确地如何它应该在程序上完成。所以举一个简单的例子:

“获取伦敦各部门员工的姓名和工资”

相关的SQL 几乎自然:

select name, salary
from employees
join departments on departments.deptno = employees.deptno
where departments.location = 'London';

我们“告诉”SQL如何将部门加入员工,但只是声明性地(NATURAL JOIN不需要这样做,但是很危险,所以在实践中没有使用)。我们还没有定义程序性应该如何完成(例如“对于每个部门,找到所有员工......”)SQL可以自由选择执行查询的最佳方法。

答案 8 :(得分:2)

Joe Celko's Thinking in Sets (book)

  

完全聪明的程序员   经常在被迫工作时挣扎   用SQL。为什么? Joe Celko相信   问题在于程序性   编程思维,保持他们   从充分利用   声明性语言的力量。该   结果太复杂了   效率低下的代码,更不用说丢失了   生产率。

     

这本书会改变你的方式   想想你解决的问题   用SQL程序。专注于三个   基于关键表的技术,Celko   通过详细介绍他们的力量   例子和清楚的解释。如   你掌握了这些技巧   发现你能够概念化   根植于集合中的问题   通过声明来解决   节目。不久,你会   编写更快,编写更多   高效的代码,并应用完整的   SQL的力量。

答案 9 :(得分:0)

当您使用SQL将表转储到文件系统中,然后以自己喜欢的编程语言执行任何必须做的事情时,行思考才有意义。 没有太多的SQL杠杆作用;浪费磁盘,内存,CPU和人力资源。

将SQL视为英语(或您喜欢的任何人类语言)。

告诉我所有每天骑牛并喝醉但从未与婆婆一起访问印度尼西亚的客户,这些婆婆的电话号码与我的朋友道格的电话号码相同,但区号除外。

您可以在一条SQL语句中(甚至更多)进行操作,只需学习如何做即可。非常有利可图。