偶然间看到一句话,关系代数明白了,就没有不会写的SQL。让我对曾经学过但早就不知道交给谁的“知识”,又重新燃起了兴趣。下面以一个题切入


关系代数 与数据库有什么关系, 来变个魔术_关系代数


关系代数 与数据库有什么关系, 来变个魔术_sql_02

上面的公式,基于下面的图的结果是什么, R S 的左外,右外,全外连接的图是什么样的。

乍看起来和数据库有什么关系,但这些其实是写出复杂逻辑关系的SQL 的基础。估计现在就已经有人在,Turn your nose up ,打个赌,看完或许会改变看法呢


首先我们先要确定的一个事情是 SQL 是具有关系代数,和关系演算的双重特点的语言。关系代数,元祖关系演算,和域关系演算三种语言在表达能力上是等价的。其中会带出来三个完整性,其中两个完整性是必须的,实体完整性和参照完整性,这两个可以理解为我们平时的 主外键关系中的,带有主键的表和带有外键的表的“文雅的叫法”。


估计说到这里有人不耐烦了,马上上操作符


关系代数 与数据库有什么关系, 来变个魔术_数据库_03


1 根据上面图中 R S ,我们可以分析出 R(X.Y) S(Y,Z) 为什么因为R和S 主键有同类和异类,所以同类用Y 表示 不一样的分别为 X 和 Z

这可以通过对应我们的类似下面的查询语句来表示

select A.X,A.Y,B.Y,B.Z

from A

inner join B on A.Y=B.Y


OK 先来一个魔术

关系代数 与数据库有什么关系, 来变个魔术_关系代数

关系代数 与数据库有什么关系, 来变个魔术_sql_02

上面这张图等于


select  R.A3

from R

inner join S on R.A1A2 = S.A1A2 and  S.A1 < 3


上面这个语句的select 结果是 4


是这样的吗  我们来逐一拆解这个图里面的公式

关系代数 与数据库有什么关系, 来变个魔术_关系代数

1 下图的意思,仅仅是对S 集合的数据的过滤  1< 3 的意思是 S 表的第一列的值要小于3  那我们就先对S 进行了一个WHERE 的条件操作  选中的数据

({1,9,1},{2,1,8})并且投影的S的字段是 A1A2


2 剩下的除法,在关系代数的意思就是找到两个集合中除号前面集合中与除号后面集合中不同的列,这里就是 RA3, 所以上面的 select R.A3 就是我们最后要输出的结果。并且前面的括号里面要求投影的S字段是 A1A2


select  R.A3

from R

inner join S on R.A1A2 = S.A1A2 and  S.A1 < 3

这就是上面那个公式转换下来的SQL 语句,上边的公式所表达的也叫关系代数。


另外在数据库中,不是所有的数据库都支持所有的连接方式


内连接 inner join  外连接  left join  right join  或者叫left outer join  right outer join 基本上都是支持的,而full outer join的方式某些数据库是不支持的。


关系代数 与数据库有什么关系, 来变个魔术_sql_07


那不支持FULL OUTER JOIN 的数据库怎么来处理


SELECT * FROM R
LEFT JOIN S ON R.A1A2 = S.A1A2
UNION
SELECT * FROM R
RIGHT JOIN S ON R.A1A2 = S.A1A2


就可以达到上面图中的效果。


关系代数 与数据库有什么关系, 来变个魔术_关系代数_08


mongodb Compass中文设置 mongodb morphia

morphia是谷歌的一个针对mongodb的数据化持久框架;  关于mongodb的介绍不在这里展示,直接进入主题:采用morphia实现对mongodb的聚合查询  这里获取所有学生的分数总和   spring配置文件<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springfra

Java 类如何实例化 java怎么实例化一个类

介绍在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。抛砖引玉下面先来看一个例子吧先来看父类 Father.javapublic class Father {