SQL查询入门(中篇)
来源:asp之家 发布时间:2011-09-30 11:15:09
引言
在前篇文章中(SQL查询入门(上篇),我对数据库查询的基本概念以及单表查询做了详细的解释,本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路。
多表连接简介
在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常。
因此,连接(Join)就是一种把多个表连接成一个表的重要手段.
比如简单两个表连接学生表(Student)和班级(Class)表,如图:
进行连接后如图:
笛卡尔积
笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表连接即为笛卡尔积(交叉连接)
在实际应用中,笛卡尔积本身大多没有什么实际用处,只有在两个表连接时加上限制条件,才会有实际意义,下面看内连接
内连接
如果分步骤理解的话,内连接可以看做先对两个表进行了交叉连接后,再通过加上限制条件(SQL中通过关键字on)剔除不符合条件的行的子集,得到的结果就是内连接了.上面的图中,如果我加上限制条件
对于开篇中的两个表,假使查询语句如下:
代码如下:
SELECT *
FROM [Class] c
inner join
[Student] s
on c.ClassID=s.StudentClassID
可以将上面查询语句进行分部理解,首先先将Class表和Student表进行交叉连接,生成如下表:
然后通过on后面的限制条件,只选择那些StudentClassID和ClassID相等的列(上图中划了绿色的部分),最终,得到选择后的表的子集
当然,内连接on后面的限制条件不仅仅是等号,还可以使用比较运算符,包括了>(大于)、>=(大于或等于)、<=(小于或等于)、<(小于)、!>(不大于)、!<(不小于)和<>(不等于)。当然,限制条件所涉及的两个列的数据类型必须匹配.
对于上面的查询语句,如果将on后面限制条件由等于改为大于:
代码如下:
SELECT *
FROM [Class] c
inner join
[Student] s
on c.ClassID>s.StudentClassID
则结果从第一步的笛卡尔积中筛选出那些ClassID大于StudentClassID的子集:
虽然上面连接后的表并没有什么实际意义,但这里仅仅作为DEMO使用:-)
关系演算
上面笛卡尔积的概念是关系代数中的概念,而我在前一篇文章中提到还有关系演算的查询方法.上面的关系代数是分布理解的,上面的语句推导过程是这样的:“对表Student和Class进行内连接,匹配所有ClassID和StudentClassID相等行,选择所有的列”
而关系演算法,更多关注的是我想要什么,比如说上面同样查询,用关系演算法思考的方式是“给我找到所有学生的信息,包括他们的班级信息,班级ID,学生ID,学生姓名”
用关系演算法的SQL查询语句如下:
代码如下:
SELECT *
FROM [Class] c
,
[Student] s
where c.ClassID=s.StudentClassID
当然,查询后返回的结果是不会变的:
外连接
假设还是上面两个表,学生和班级.我在学生中添加一个名为Eric的学生,但出于某种原因忘了填写它的班级ID:
当我想执行这样一条查询:给我取得所有学生的姓名和他们所属的班级:


猜你喜欢
- 本文主要总结了ES6正则表达式的一些新功能,分享出来供大家参考学习,下面来看看详细的介绍:一、构造函数实例化参数的变化 大家都知道,在ES5
- Pytorch的数据类型为各式各样的Tensor,Tensor可以理解为高维矩阵。与Numpy中的Array类似。Pytorch中的tens
- 有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的。如下:declare @t ta
- 在《javascript设计模式》中对这种方法作了比较详细的描述,实现方法的链式调用,只须让在原型中定义的方法都返回调用这些方法的实例对象的
- 前言mysql中有4类运算符,它们是:算术运算符比较运算符逻辑运算符位操作运算符这个大家应该都比较熟悉,但本文给大家总结介绍的关于MySql
- 记录了mysql 8.0.21 的安装配置方法,分享给大家。一、下载1、下载安装包mysql下载路径直接点击链接也可以下载:mysql 8.
- 不知道算不算DW4的大BUG. DW4实际的运行如下: 读注册表中HKEY_CURRENT_USER/
- 1 JSON 文件存储JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,它通
- 提到 super,最直接的想法就是它代表了父类,替父类执行某些方法。但是理解也仅止步于此,下面对 super 做进一步理解super 的完整
- SQL> show all --查看所有68个系统变量值 SQL> show user --显示当前连接用户 SQL> s
- Python编程时,经常需要跳过第一行读取文件内容。简单的做法是为每行设置一个line_num,然后判断line_num是否为1,如果不等于
- 为什么会讲 MRO?在讲多继承的时候,有讲到, 当继承的多个父类拥有同名属性、方法,子类对象调用该属性、方法时会调用哪个父类的属性、方法呢?
- Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多进程和进程池是其强大的功能之一,可以让我们更加
- 使用摄像头追踪人脸由于血液流动引起的面部色素的微小变化实现实时脉搏评估。效果如下(演示视频): 由于这是通过比较面部色素的变化评估
- 【源码GitHub地址】:点击进入1. 问题描述之前写了一篇关于《pytorch Dataset, DataLoader产生自定义的训练数据
- 命名空间: 每一个作用域变量存储的位置,或者解释为 存储作用域中变量的字典。作用: 获取想查看某个作用域中的变量名、变量值。使用方法: lo
- 听名字就知道这个函数是用来求tensor中某个dim的前k大或者前k小的值以及对应的index。用法torch.topk(input, k,
- 自带验证器1、UniqueValidator用于验证(唯一)unique=True的字段,常用参数:queryset: required,用
- 1.使用Management Studio Express,用“Windows身份验证”登录,选中SQL服务器名,右击鼠标选择属性,在服务器
- 一.问题描述python 中使用open打开某个文件写入时,往往会发现需要写入的文件不在同级目录下。这样就需要根据文件的路径来找到并打开。但