你能解释一下结构化查询语言(SQL)中索引和外键之间的区别吗?

推荐答案1

最常由索引来支持外键,以便有效地找到包含该键的给定值的因行,实际上从父行导航到任何chikd行.但是,外国钥匙限制的作用要大得多.它最重要的功能是确保在依赖表中没有一行,而父表中没有支撑行.它是通过防止行添加到附件表中没有行的依赖表中的行,该行带有与新行的外键值匹配的主键,并防止在父表中的行中的一行,该行确实具有匹配的依赖,从被删除的行.

推荐答案2

在1990年,我在抱怨SQL的奇怪之处时,发表了一份声明,我已经在1990年或'91左右的公告板和Usenet列表开始了很多次.我将其命名为" Kagel的SQL的第一定律":

Kagel的SQL的第一定律

任何选择语句都可以重写任何选择语句至少三种不同的方法并返回相同的结果!

首先是Kagel的SQL的第一定律:

您有自从SQL '92的出现和"加入…on…" Syntax以来那使四个.添加派生的桌子制作五个和CTE至少六个. ,没有人向我展示任何精选的陈述,我无法重写许多不同的方式.我确实可以提供一个,但是它并不是真正的数据库选择,因为它仅返回常数值,并且仅包含一个投影子句,而没有其他条款.那将是这样的查询:今天选择;或选择13*234535;两者在大多数(但不是全部)RDBMS系统上都是合法的SQL,甚至实际上这些系统都可以被重写为投影子句中的微不足道派生表,从子句中的派生表或CTE表达式中的派生表.

好的,这是一个相当简单的查询的示例:

关联子查询版本:

  1. SELECT a.*, (SELECT b.col_d FROM othertab AS b WHERE b.keycol = a.col3) AS b_value 
  2. FROM sometable AS a 
  3. WHERE a.col4 >12345; 

无子查询版本:

  1. SELECT a.*, b.col_d AS b_value 
  2. FROM sometable AS a 
  3. JOIN othertab AS b 
  4. ON b.keycol = a.col3 
  5. WHERE a.col4 > 12345; 

派生的表版本:

  1. SELECT a.*, b.value 
  2. FROM sometable AS a 
  3. JOIN ( 
  4. SELECT col_d 
  5. FROM othertab 
  6. ) AS b( b_value ) 
  7. ON b.keycol = a.col3 
  8. WHERE a.col4 > 12345; 
  1. SELECT a.*, b.value 
  2. FROM sometable AS a 
  3. JOIN ( 
  4. SELECT col_d 
  5. FROM othertab 
  6. ) AS b( b_value ) 
  7. ON b.keycol = a.col3 
  8. WHERE a.col4 > 12345; 

我可以继续…

推荐答案3

这里有几个:

  • 使用无效导致不可预测性,不一致和缺乏逻辑正确性;
  • 某些查询可以生成重复行;
  • 某些查询可以生成重复列名称;
  • 应用程序编程语言和数据库语言之间的尴尬"阻抗不匹配";
  • 弱支持对树的结构的弱支持(SQL:1999与CTES和CTES相当普遍,但是…这是我们能做的最好的吗?);
  • 有限的支持(例如,多桌)约束,除了外键约束;
  • 有限的支持通过视图更新;
  • 古代和冗长语法,这似乎鼓励冗长,难以调试,难以重构或重复使用查询;
  • join语法很尴尬;微不足道的语法错误可能会导致CPU-thogging&Memory耗费外部连接;
  • 某些查询取决于列顺序,这是高度错误的; < <
  • 表本质上是变量(从常规编程语言角度看时),但需要"特殊"语法;
  • 缺乏对"现代的支持" "范式,例如面向对象的编程或功能编程,以及对程序编程的不一致的支持;
  • 更新和插入语法不一致;
  • 对UPSERT的支持不一致,即组合的更新或插入,例如替换或合并;
  • 语法,并且在供应商之间的特征不一致.与(例如)Java和C#不同,所有实现(至少是语言)几乎相同;
  • 普遍缺乏对用户定义的聚合操作员和类型的支持;
  • 列别名和表达式可以在查询的一个部分中定义,但在另一部分中未识别;
  • 某些实现不要支持某些约束,或者仅在有限的情况下允许它们;
  • 缺乏复杂的现代类型系统;
  • 不是关系模型的忠实实施.

推荐答案4

是的,SQL不代表结构化查询语言. SQL最初是由IBM在1970年代开发的.它起源于结构化语言的概念是作为对"意大利面条法规"的恐怖的辩护.非结构化的语言使您可以从程序中的一个位置跳到另一个位置,通常使用命令. SQL,最初命名的续集包含跳跃能力,至今仍在使用:

e时p> 续集是结构化英语查询语言的首字母缩写.之所以使用这个聪明的名字,是因为续集陈述非常像英语语言句子,但结构更高.它是结构化的英语.续集也是一种查询语言.但是,它不是 结构化 查询语言.这不是任何形式的结构化语言.它是并且它仍然是一种非结构化的查询语言. SQL是结构化查询语言的首字母缩写的想法,该想法是由不知道历史记录并假设结构化查询语言的人重新注册到该语言上的.虽然在续集首字母缩写词代表结构化时,Q代表查询,而L代表语言,而不是这些字母在SQL中所代表的.实际上,它们不属于任何东西,就像C不愿代表C语言中的任何东西一样.

推荐答案5

<>应读取"不等于",并且在其右侧进行单个参数.

不在中获取参数列表在其右侧,所有这些都必须是与左侧参数的兼容类型.

n in(b)在逻辑上与a <<<> b.

n in in(b,c)在逻辑上与(a <> b和a <> c) > a不在(<子查询>)中评估子查询,并将子查询的返回结果展开到列表中,因此,如果一个子查询返回B,C,d,d,

a in in(<子Query>)在逻辑上与AN中的A相同(B,C,D)否定操作通常很难针对许多数据库引擎进行优化,因此()不在某些数据库引擎(即

)中进行优化不良() span> n in in in in in n in n in <

不存在(从中选择1个 = a)

不依赖查询优化器为您替代.通常不会 - 尤其是如果子查询完全是复杂的 - 因此,您应该使用解释来确保使用索引.