SQL查询(中间部分)介绍
介绍在第一篇文章(SQL查询条目(第一部分)中,我对数据库查询和单表查询的基本概念做了详细的解释,本文主要讲解了各种sql连接和使用范围,并进一步说明了代数方法和算法在同一查询中不同思想的关系。
多表连接简介
在关系数据库中,查询通常涉及多个表,因为很少有数据库只有一个表。如果大多数查询只涉及一个表,则表通常低于第三范式。有大量的冗余和异常。
因此,连接是将多个表连接到表中的重要手段。
例如,一个简单的两个表连接学生表(学生)和类(类)表,例如:
连接如下:
笛卡尔积
笛卡尔乘积是在SQL中作为交叉连接(交叉连接)实现的,所有连接都是临时笛卡尔乘积表。笛卡尔积是关系代数中的一个概念。这意味着两行表的每一行都有数据的任何组合。上图中的两个表是笛卡尔积(交叉连接)。
在实际应用中,笛卡尔积本身没有什么实际用途。只有在约束条件下加入两表联接,才具有实际意义。
内部连接
如果理解的步骤,在连接上可以看成是第一个交叉连接的两种形式,然后添加限制(使用SQL关键字)子集排除不符合条件的行,结果是连接的。上面的数字,如果我添加限制
对于打开中的两个表,如果查询如下所示:
复制代码代码如下所示:
*选择
从{ C }
内部联接
{学生}
在c.classid = s.studentclassid
以上的查询语句可以部分理解。首先,类表和学生表相互关联,生成下面的表:
然后,通过限制条件落后,我们只有那些列等于studentclassid和ClassID选择(在上面的图中绿色的部分),最后获得所选表的子集。
当然,限制条件不仅是连接后面的符号,还可以使用比较运算符,包括(=大于、大于或等于)、(小于)、(不等于)。当然,约束中涉及的两列的数据类型必须匹配。
对于上面的查询语句,如果下面的限制被更改为大于:
复制代码代码如下所示:
*选择
从{ C }
内部联接
{学生}
在c.classid > s.studentclassid
结果从第一步的笛卡尔积的子集过滤器的ClassID大于StudentClassID:
虽然所附表格没有任何实际意义,但它仅用作演示:-)
关系演算
关于笛卡尔积的概念是关系代数的概念,我在上一篇文章中提到了关系演算查询方法。关系代数是上述理解的分布,上述声明是这样的:学生与课程的连接表中,ClassID和studentclassid,人人平等,选择所有的列
而关系算法则更关注我所要的,比如上面的查询相同,而用关系算法的思路就是查找所有的学生信息,包括他们的班级信息、班级ID、学号、学号等。
使用关系算法的sql查询语句如下所示:
复制代码代码如下所示:
*选择
从{ C }
,
{学生}
在c.classid = s.studentclassid
当然,查询后返回的结果不会改变。
外部连接
假设上面是两张表,学生和班级。我给学生加了一个名叫埃里克的学生,但由于某种原因忘了填写班级ID:
当我想执行这样一个查询时,告诉我所有学生的名字和他们所属的班级: