Questions tagged «sql»

结构化查询语言(SQL)是一种用于在关系数据库管理系统中管理数据的语言。该标签用于一般的SQL编程问题。它不适用于Microsoft SQL Server(为此,请使用sql-server标记),也不能单独引用SQL的特定方言。


12
为什么关系数据库不支持以嵌套格式返回信息?
假设我正在建立一个博客,希望发布和发表评论。因此,我创建了两个表,一个具有自动递增整数“ id”列的“ posts”表,以及一个具有外键“ post_id”的“ comments”表。 然后,我想运行可能是我最常见的查询,即检索帖子及其所有评论。对于关系数据库而言,它是相当新的东西,对我而言,最明显的方法是编写看起来像这样的查询: SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments FROM posts WHERE id = 7 这会给我我想要的帖子的ID和内容,以及所有相关的注释行,它们整齐地打包在一个数组中(嵌套表示形式,就像您在JSON中使用的一样)。当然,SQL和关系数据库不是这样工作的,它们可以得到的最接近的结果是在“帖子”和“注释”之间进行联接,这将返回很多不必要的数据重复(重复相同的帖子信息)在每一行中),这意味着要花费大量的时间在数据库上以将它们放在一起,也需要花费我的ORM来解析和撤消所有内容。 即使我指示我的ORM急切地加载帖子的评论,最好的办法是调度一个对该帖子的查询,然后进行第二个查询以检索所有评论,然后将它们放到客户端,效率也不高。 我知道关系数据库是经过验证的技术(地狱,它们比我还旧),并且在过去的几十年中,对它们进行了大量研究,我敢肯定,它们(以及SQL标准)旨在按其功能运行,但我不确定为什么上面概述的方法不可行。在我看来,这是实现记录之间最基本关系之一的最简单,最明显的方法。为什么关系数据库不提供这样的功能? (免责声明:我主要使用Rails和NoSQL数据存储来编写Web应用程序,但是最近我一直在尝试Postgres,我实际上非常喜欢它。我并不是要攻击关系数据库,只是感到困惑。) 我不是在问如何优化Rails应用程序,或如何在特定数据库中解决此问题。我在问为什么SQL标准在我看来违反直觉和浪费时会以这种方式工作。SQL的原始设计者希望他们的结果看起来像这样有一定的历史原因。
46 database  sql  rdbms  query 

4
为什么SQL的BETWEEN具有包容性而不是半开放?
半开放(或半开放,半封闭,半有界)间隔([a,b),其中x属于间隔iff a <= x < b)在编程中非常常见,因为它们具有许多方便的属性。 谁能提供解释SQL为什么BETWEEN使用封闭间隔([a,b])的理由?这是特别的。日期不便。你怎么会BETWEEN这样
45 sql 

9
是否使用JOIN关键字
以下SQL查询是相同的: SELECT column1, column2 FROM table1, table2 WHERE table1.id = table2.id; SELECT column1, column2 FROM table1 JOIN table2 ON table1.id = table2.id; 肯定会在我尝试过的每个DBMS上产生相同的查询计划。 但是我经常听到或听到这样的观点:一个绝对比另一个更好。当然,这些主张从不带有任何解释。 在我工作的地方,第二版似乎受到了大多数其他开发人员的青睐,因此我也倾向于这种风格,以最大程度地减少意外。但是在我的心中,我真的在想第一个(因为这是我最初学习它的方式)。 这些形式中的一种在客观上是否优于另一种?如果没有,那么为什么一个使用另一个?
45 sql  coding-style 

9
通过为每列设置预定义的数据类型,关系数据库能获得什么?
我现在正在使用SQL数据库,这一直使我感到好奇,但是Google搜索的机会并不多:为什么使用严格的数据类型? 我了解为什么会有几种不同的数据类型,例如区分二进制数据和纯文本数据很重要。现在,我知道将二进制数据存储为自己的格式比将二进制数据的1和0格式存储为纯文本要好得多。 但是我不明白的是拥有这么多种不同的数据类型的好处是什么: 为什么mediumtext,longtext和text? 为什么decimal,float和int? 等等 告诉数据库“此列的条目中只有256个字节的纯文本数据”有什么好处。或“此列最多可以包含16,777,215字节的文本条目”? 这是性能优势吗?如果是这样,为什么在事前知道条目的大小对性能有何帮助?或更确切地说是其他东西吗?

9
为什么首选文件系统而不是RDBMS日志?
从标题可以清楚地看出问题。例如,无论使用何种规模,Apache都将其访问和错误日​​志保存在文件中而不是RDBMS中。 对于RDMS,我们只需要编写SQL查询,它将完成工作,而对于文件,我们必须确定特定的格式,然后编写正则表达式,或者可能是解析器来操纵它们。如果没有给予足够的照顾,在某些情况下甚至可能失败。 但是,每个人似乎都更喜欢使用文件系统来维护日志。我对这些方法都不抱有偏见,但我想知道为什么要这样进行。是速度还是可维护性或其他?

8
域驱动设计是一种反SQL模式吗?
我正在研究域驱动设计(DDD),尽管我对此进行了更深入的了解,但有些事情我还是没有。据我了解,主要要点是将域逻辑(业务逻辑)与基础结构(数据库,文件系统等)分开。 我想知道的是,当我遇到非常复杂的查询(例如材料资源计算查询)时会发生什么?在这种查询中,您需要使用繁重的集合操作,这是SQL设计的目的。在域层内部进行这些计算并使用其中的许多集合就像丢弃SQL技术一样。 在基础架构中也无法进行这些计算,因为DDD模式允许在基础架构中进行更改而无需更改域层,并且知道MongoDB不具有SQL Server等相同的功能,这是不可能发生的。 这是DDD模式的陷阱吗?

7
SQL触发器以及何时或何时不使用它们。
当我最初学习SQL时,总是被告知,只有在确实需要时才使用触发器,并尽可能使用存储过程。 不幸的是,现在(几年前)我并不像现在这样好奇和关心基本面,因此从未问过为什么。 社区对此有何看法?仅仅是某人的个人喜好,还是应该避免触发(就像游标一样),除非有充分的理由。
43 sql 

6
如何使复杂的SQL查询更易于编写?[关闭]
我发现编写涉及多个(至少3-4个)表之间的联接并涉及多个嵌套条件的复杂SQL查询非常困难。我被要求编写的查询很容易用几句话来描述,但是可能需要大量的欺骗性代码才能完成。我发现自己经常使用临时视图来编写这些查询,这似乎有些曲折。您可以提供哪些提示以使这些复杂查询更容易?更具体地说,如何将这些查询分解为实际编写SQL代码所需的步骤? 请注意,我是被要求编写的SQL,是数据库课程家庭作业的一部分,因此,我不希望有能够为我完成工作的软件。我想真正理解我正在编写的代码。 更多技术细节: 该数据库托管在本地计算机上运行的PostgreSQL服务器上。 数据库非常小:最多有七个表,最大的表少于50行。 SQL查询将通过LibreOffice Base不变地传递到服务器。
42 sql  tips  query 

6
为什么不从数据库以字符串形式返回日期?
在典型的Web应用程序中,从强类型的数据库层中检索日期(例如,在c#中为System.DateTime,与System.String相反)。 当日期需要表示为字符串时(例如,显示在页面上),则在表示层中完成从DateTime到字符串的转换。 为什么是这样?为什么将DateTime转换为数据库层上的字符串是一件坏事? 另请参阅聊天中激烈的辩论,以及引发所有这些问题的原始问题。

6
为什么SQL不可重构?[关闭]
每个人都知道新开发人员会编写长函数。随着您的进步,您会更好地将代码分解成较小的部分,而经验告诉您这样做的价值。 输入SQL。是的,SQL的代码思考方式与过程的代码思考方式不同,但是该原理似乎同样适用。 假设我有一个采用以下形式的查询: select * from subQuery1 inner join subQuerry2 left join subquerry3 left join join subQuery4 使用一些ID或日期等 这些子查询本身很复杂,可能包含自己的子查询。在任何其他编程上下文中,我都认为复杂子查询1-4的逻辑与将它们全部连接在一起的父查询一致。看起来很简单,应该将那些子查询定义为视图,就像如果我在编写过程代码时将它们作为函数一样。 那么,为什么不这样做呢?人们为什么如此频繁地编写这些冗长的整体SQL查询?SQL为什么不鼓励广泛使用视图,就像过程编程鼓励广泛使用函数一样。(在许多企业环境中,创建视图甚至都不是一件容易的事。需要请求和批准。想象一下,其他类型的程序员每次创建函数时是否都必须提交请求!) 我想到了三个可能的答案: 这已经很普遍了,我正在与经验不足的人一起工作 经验丰富的程序员不会编写复杂的SQL,因为他们喜欢用过程代码解决硬数据处理问题 还有别的

3
自引用表,好还是坏?[关闭]
代表应用程序中的地理位置,基础数据模型的设计提出了两个明确的选择(或可能还有更多选择)。 一个表,带有一个自引用的parent_id列UK-伦敦(伦敦父母ID =英国ID) 或两个表,使用外键一对多关系。 我更喜欢一个自引用表,因为它可以轻松扩展到所需的子区域。 通常,人们会偏离自引用表,还是可以?

3
为什么在Microsoft SQL Server中我们需要在字符串前放置N?
我正在学习T-SQL。从我看到的示例中,要在varchar()单元格中插入文本,我只能编写要插入的字符串,但是对于nvarchar()单元格,每个示例都在字符串前加上字母N。 我在具有nvarchar()行的表上尝试了以下查询,并且工作正常,因此不需要前缀N: insert into [TableName] values ('Hello', 'World') 为什么在我看到的每个示例中,字符串都以N为前缀? 使用此前缀的利弊是什么?

11
通过WHERE子句连接的查询与使用实际JOIN的查询之间有什么实质性的区别吗?
在“ 学习SQL的艰辛方法”(练习6)中,作者提出了以下查询: SELECT pet.id, pet.name, pet.age, pet.dead FROM pet, person_pet, person WHERE pet.id = person_pet.pet_id AND person_pet.person_id = person.id AND person.first_name = "Zed"; 然后继续说: 实际上,还有其他一些使这类查询起作用的方法,称为“联接”。我现在避免使用这些概念,因为它们令人困惑。只需现在就采用这种连接表的方式,而忽略尝试告诉[您]这在某种程度上较慢或“低级”的人们。 真的吗?为什么或者为什么不?
32 sql 

2
SQL的非官方发音的历史是什么?
SQL的正式发音为/ ˌɛskjuːˈɛl /,就像“ SQL”一样,如 艾伦·博留(2009年4月)。玛丽E. ed。学习SQL(第二版)。美国加利福尼亚州塞巴斯塔波尔:O'Reilly。ISBN 978-0-596-52083-0。 但是通常发音为/ ˈsiˈkwəl /就像“续集”一样,第二个发音背后的历史是什么?
32 sql  history 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.