• 售前

  • 售后

热门帖子
入门百科

SQL查询入门(中篇)

[复制链接]
123457399 显示全部楼层 发表于 2021-10-26 13:49:45 |阅读模式 打印 上一主题 下一主题
引言
在前篇文章中(SQL查询入门(上篇),我对数据库查询的根本概念以及单表查询做了详细的表明,本篇文章中,主要阐明SQL中的各种毗连以及利用范围,以及更进一步的表明关系代数法和关系演算法对在同一条查询的不同思路。

多表毗连简介
在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而假如大多查询只涉及到一个表的,那么谁人表也往往低于第三范式,存在大量冗余和异常。

因此,毗连(Join)就是一种把多个表毗连成一个表的紧张本领.

好比简单两个表毗连学生表(Student)和班级(Class)表,如图:
   [img=231 border=0,129 alt=1 src=]https://www.caogenba.net/[/img][img=167 border=0,110 alt=2 src=]https://www.caogenba.net/[/img]      举行毗连后如图:
     [img=438 border=0,359 alt=3 src=]https://www.caogenba.net/[/img]
笛卡尔积
      笛卡尔积在SQL中的实现方式既是交叉毗连(Cross Join)。全部毗连方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,体现两个表中的每一行数据恣意组合,上图中两个表毗连即为笛卡尔积(交叉毗连)
      在实际应用中,笛卡尔积本身大多没有什么实际用处,只有在两个表毗连时加上限定条件,才会有实际意义,下面看内毗连
内毗连
      假如分步调明白的话,内毗连可以看做先对两个表举行了交叉毗连后,再通过加上限定条件(SQL中通过关键字on)剔除不符合条件的行的子集,得到的效果就是内毗连了.上面的图中,假如我加上限定条件
      对于开篇中的两个表,假使查询语句如下:
复制代码 代码如下:
SELECT *
  FROM [Class] c
       inner join
       [Student] s
       on c.ClassID=s.StudentClassID

  可以将上面查询语句举行分部明白,首先先将Class表和Student表举行交叉毗连,生成如下表:
[img=438 border=0,359 alt=5 src=]https://www.caogenba.net/[/img]
     然后通过on后面的限定条件,只选择那些StudentClassID和ClassID相等的(上图中划了绿色的部分),最终,得到选择后的表的子集

     [img=438 border=0,359 alt=4 src=]https://www.caogenba.net/[/img]
固然,内毗连on后面的限定条件不但仅是等号,还可以利用比力运算符,包括了>(大于)、>=(大于或即是)、<=(小于或即是)、<(小于)、!>(不大于)、!<(不小于)和<>(不即是)。固然,限定条件所涉及的两个列的数据类型必须匹配.

对于上面的查询语句,假如将on后面限定条件由即是改为大于:
复制代码 代码如下:
SELECT *
FROM [Class] c
inner join
[Student] s
on c.ClassID>s.StudentClassID

则效果从第一步的笛卡尔积中筛选出那些ClassID大于StudentClassID的子集:
[img=438 border=0,359 alt=6 src=]https://www.caogenba.net/[/img]
固然上面毗连后的表并没有什么实际意义,但这里仅仅作为DEMO利用:-)

关系演算
上面笛卡尔积的概念是关系代数中的概念,而我在前一篇文章中提到尚有关系演算的查询方法.上面的关系代数是分布明白的,上面的语句推导过程是如许的:“对表Student和Class举行内毗连,匹配全部ClassID和StudentClassID相等行,选择全部的列”

而关系演算法,更多关注的是我想要什么,好比说上面同样查询,用关系演算法思考的方式是“给我找到全部学生的信息,包括他们的班级信息,班级ID,学生ID,学生姓名”

用关系演算法的SQL查询语句如下:
复制代码 代码如下:
SELECT *
FROM [Class] c
,
[Student] s
where c.ClassID=s.StudentClassID

固然,查询后返回的效果是不会变的:

[img=438 border=0,359 alt=4 src=]https://www.caogenba.net/[/img]
外毗连
假设还是上面两个表,学生和班级.我在学生中添加一个名为Eric的学生,但出于某种缘故原由忘了填写它的班级ID:
[img=239 border=0,152 alt=7 src=]https://www.caogenba.net/[/img] [img=167 border=0,110 alt=2 src=]https://www.caogenba.net/[/img]

当我想执行如许一条查询:给我取得全部学生的姓名和他们所属的班级:

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作