当前位置: 首页 > 面试题库 >

SQL中的查询设计实践

章城
2023-03-14
问题内容

我正在建立MS Access
2007中数据库的查询,并且想知道我当前的设计实践是否达到标准。基本上,数据库是在我来之前配置的,但是我被赋予构建高效查询以提取数据的责任。

我当前的查询既小又简单,每个查询一次完成2-3个任务(有时只有1个)。之所以采用这种方法,是因为我对SQL完全陌生,并且发现与许多简单的查询一起使用并使用报告来合并数据比较容易,而与构建极其复杂的查询相对较容易,后者非常难于进行:1)难以构建(无论如何对我而言)和2)难以维护。

我只是想知道是否有人具有查询设计的最佳实践,是否可以为我提供上述方法的特定反馈,以及是否应该开始进行复杂的查询,还是只坚持简单的查询和报告呢?合并相关数据。

谢谢。


问题答案:

从Access的角度来看,回答这个问题的人们并不是来回答这个问题,因此,从1996年以来,我一直在从事全职专业的Access应用程序开发工作,因此我将提供一些意见。

首先,在Access应用程序中有几个地方可以使用SQL:

  1. 存储的查询。

  2. 表单,报表,组合框和列表框的存储属性。

  3. 在您正在动态编写SQL的VBA代码中。

即使不是不可能,以有组织的方式管理所有这些SQL语句也很困难。但是我不确定是否值得!

首先,请考虑仅存储查询。如果您遵循为每个任务保存查询的建议,以使每个SQL语句仅在一个地方使用,那么查询列表很快就会变得一团糟,并且您将被迫采用某种命名约定跟踪什么是什么。因此,除了必须将查询保存在哪里,或者保存的查询附带的优化将对您有所帮助(即大型数据集或复杂的联接/过滤)之外,我通常不保存查询。

例如,当我第一次开始在Access中编程时,我会将组合框的所有行源都保存为已保存的查询。我开发了一个命名约定,因此它们不会与查询列表中的其他查询混在一起,因此管理起来并不难。起初,我以为我会重用已保存的查询,但是很快就很清楚,我需要针对个别情况进行更改,并且更改在其他地方使用的查询可能会在其他情况下更改其结果,因此保存的查询没有“共享代码”的好处(就像我想的那样)。唯一有用的地方是我在多个表单上具有相同的组合框,然后可以将其行源保存为已保存的查询,并且如果需要更改它,则可以在一个地方进行。然而,

简而言之,我很快得出结论,将SQL语句保存在使用它们的位置上会更容易-
因为首先很少进行重用(一旦我获得了足够的经验,就可以体会到尝试重用的陷阱)它们),效果更好,并且使SQL接近使用位置。

对于表单和报表,我做一些相同的事情,但是总的来说,使用保存的查询是为了避免不得不写太多复杂的子选择以用作派生表。在需要这些代码的地方,编写它并保存它,然后在另一个SQL语句中将其与JOIN一起使用总是比尝试将subselect内联用作派生表要容易得多(这使得难于阅读的复杂SQL变得更容易了)
-尤其是当您无法注释或格式化SQL时(如已保存的Access查询的情况)。

通常,除了真正进行重用的地方,我不会保存表单或报表的记录源(报表通常会使用与表单相同的记录源,因此在这种情况下,保存它很有用,这样当您更改表单的SQL时,它所伴随的报表将继承更改。

所有这些都将动态SQL组装在VBA代码中。从动态设置组合/列表框的行源到设置子窗体的记录源以进行过滤,我使用了很多这样的方法。这很难管理,有时我在模块中使用字符串常量使之更容易。例如,在编写动态SQL的情况下,除了WHERE子句外,其他所有东西都保持不变,带有SELECT的常量和带有ORDER
BY的第二个常量使组装完整的SQL语句变得容易得多。

我不知道这是否真的回答了您的问题,但是多年来我了解到,重用SQL语句的好处远远超过了无法轻松跟踪该SQL语句的使用位置所带来的不确定性。我发现最好将SQL语句存储在尽可能靠近它的位置,因为这是一种“自我文档”形式(尽管不是很好!)。

当确实在性能或管理方面有真正的明显好处时,我确实会做很多例外,并保存查询,否则将使SQL变得更加复杂。但是,我还要指出的是,使用大量嵌套的已保存查询,也不应在另一个方向上走得太远,因为这样会遇到其他问题(即“数据库过多”问题,这实际上是由于使用一次最多提供2048个表句柄-
比您想象的要容易得多)。



 类似资料:
  • 我需要对用户选择的所有水果进行求和,并绘制图表。 例如,当用户同时选择“香蕉”和“橘子”时,结果将是 问题是:

  • 问题内容: 我有一张表,上面有像 我想做一张像这样的桌子 等等。 问题答案: WITH basedata(id,keywords) AS ( SELECT 1,’cat, dog, man, mouse’ union all SELECT 2 ,’man, pen, pencil, eraser’ union all SELECT 3,’dog, man, friends’ union all S

  • 我有3张桌子 许可证中的CREATED_AT是一个日期(非空)字段。 表根据同名主键/外键进行关联;客户可以拥有0个或多个许可证,每个许可证都有一个版本。 我想从这些表格中得到: 客户的名字、姓氏和创建的最后一个许可证的release\u id(根据许可证中的created\u AT字段查找最后一个),如果有。 对于这个问题,我使用了以下查询: 这似乎有效,但我问是否有人可以证实我这一点,或者是否

  • 问题内容: 在SQL中按月将一列中的1-12连接到一堆计数的好方法是什么?…在​​SQL中 最终会像 编辑-基本上是一种获取我的月份列表/表格/任何内容的巧妙方法 问题答案: 许多方法…在上一份工作中对许多应用程序来说对我来说效果很好的一种方法是建立时间表。 然后,您可以将其日期字段放在startstamp和endstamp之间的timeframes表中进行联接。 这样可以很容易地拉出某个时间段或

  • 本文向大家介绍SQL中的子查询,包括了SQL中的子查询的使用技巧和注意事项,需要的朋友参考一下 子查询是查询内的查询,即嵌套查询。它放置在查询中,其结果用于进一步评估外部查询。 在SQL中,子查询必须遵循一些规则。其中一些是- 子查询应放在括号内。 子查询可以与不同的运算符(如<,>,<=,> =,IN,BETWEEN等)一起使用。还可以使用SELECT,INSERT,DELETE,UPDATE等

  • 问题内容: 我的SQL查询可能有问题。在此查询中,我合并了4个不同的表。 我有一个用于存储常规信息的表(,)。 我有一个表,用于存储员工的一般信息(和)。 员工有工作。一名员工需要参加课程。这取决于他必须修的课程。此信息存储在表中(带有和)。 如果员工完成了课程,则将其存储在表中(带有和) 现在,我要搜索某个课程-当用户按下搜索按钮时,他应该得到两个不同的结果。 第一个:在这里您可以看到 哪个员工