关系代数——连接

关系代数——连接

文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://leander.blog.51cto.com/2911819/1094812

本节主要举例说明连接运算,包括内连接和外连接。

连接(或内连接)的结果是由组合两个操作数的匹配元组而形成的元组组成,外连接由这些元组加上通过向一个操作数的未匹配元组扩展上另一个操作数的每个属性的“填充”值而形成的元组组成。

外连接有三种: 左外连接、右外连接和全外连接。(有时省略“外”字)

如果加上又无NULL值,连接和外连接的形式如下图所示:

下面举例说明各种连接的情况:

  1. mysql> create table Name(id varchar(10), name varchar(10));
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table Address(id varchar(10), address varchar(10));
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> insert into Name values
  6. -> (‘10001‘,‘zhangsan‘),(‘10002‘,‘lisi‘), (‘10003‘,‘wangwu‘);
  7. Query OK, 3 rows affected (0.00 sec)
  8. Records: 3  Duplicates: 0  Warnings: 0
  9. mysql> insert into Address values
  10. -> (‘10001‘,‘Beijing‘),(‘10003‘,‘Shanghai‘), (‘10009‘,‘Guangzhou‘);
  11. Query OK, 3 rows affected (0.00 sec)
  12. Records: 3  Duplicates: 0  Warnings: 0
  13. mysql> select * from Name;
  14. +-------+----------+
  15. | id    | name     |
  16. +-------+----------+
  17. | 10001 | zhangsan |
  18. | 10002 | lisi     |
  19. | 10003 | wangwu   |
  20. +-------+----------+
  21. 3 rows in set (0.00 sec)
  22. mysql> select * from Address;
  23. +-------+-----------+
  24. | id    | address   |
  25. +-------+-----------+
  26. | 10001 | Beijing   |
  27. | 10003 | Shanghai  |
  28. | 10009 | Guangzhou |
  29. +-------+-----------+
  30. 3 rows in set (0.00 sec)

连接或者内连接(inner join)

  1. mysql> select * from Name inner join Address using(id);
  2. +-------+----------+----------+
  3. | id    | name     | address  |
  4. +-------+----------+----------+
  5. | 10001 | zhangsan | Beijing  |
  6. | 10003 | wangwu   | Shanghai |
  7. +-------+----------+----------+
  8. 2 rows in set (0.00 sec)

Left out-join,左外连接

自然连接∪左侧失配元组(右侧属性补空值)

  1. mysql> select * from Name left join Address using(id);
  2. +-------+----------+----------+
  3. | id    | name     | address  |
  4. +-------+----------+----------+
  5. | 10001 | zhangsan | Beijing  |
  6. | 10002 | lisi     | NULL     |
  7. | 10003 | wangwu   | Shanghai |
  8. +-------+----------+----------+
  9. 3 rows in set (0.00 sec)

left out-join, B.key is NULL

  1. mysql> select * from Name left join Address using(id)
  2. -> where Address.address is NULL;
  3. +-------+---------+---------+
  4. | id    | name    | address |
  5. +-------+---------+---------+
  6. | 10002 | lisi    | NULL    |
  7. | NULL  | zhaoliu | NULL    |
  8. +-------+---------+---------+
  9. 2 rows in set (0.00 sec)

Right out-join ,右外连接

同左外连接反向

  1. mysql> select * from Name right join Address using(id);
  2. +-------+-----------+----------+
  3. | id    | address   | name     |
  4. +-------+-----------+----------+
  5. | 10001 | Beijing   | zhangsan |
  6. | 10003 | Shanghai  | wangwu   |
  7. | 10009 | Guangzhou | NULL     |
  8. +-------+-----------+----------+
  9. 3 rows in set (0.00 sec)

Right out-join, A.key is NULL

  1. mysql> select * from Name right join Address using(id)
  2. -> where Name.name is NULL;
  3. +-------+-----------+------+
  4. | id    | address   | name |
  5. +-------+-----------+------+
  6. | 10009 | Guangzhou | NULL |
  7. | NULL  | Wuhan     | NULL |
  8. +-------+-----------+------+
  9. 2 rows in set (0.00 sec)

Full out-join,全外连接

自然连接

∪左侧失配元组(右侧属性补空值)

∪右侧失配元组(左侧属性补空值)

  1. mysql> select id, name, address from Name left join Address using(id)
  2. -> union
  3. -> select id, name, address from Name right join Address using(id);
  4. +-------+----------+-----------+
  5. | id    | name     | address   |
  6. +-------+----------+-----------+
  7. | 10001 | zhangsan | Beijing   |
  8. | 10002 | lisi     | NULL      |
  9. | 10003 | wangwu   | Shanghai  |
  10. | 10009 | NULL     | Guangzhou |
  11. +-------+----------+-----------+
  12. 4 rows in set (0.00 sec)

Full join, A.key is NULL or B.key is NULL.

  1. mysql> (select id, name, address from Name left join Address using(id)
  2. ->    where Address.address is NULL)
  3. -> union
  4. -> (select id, name, address from Name right join Address using(id)
  5. ->    where Name.name is NULL);
  6. +-------+---------+-----------+
  7. | id    | name    | address   |
  8. +-------+---------+-----------+
  9. | 10002 | lisi    | NULL      |
  10. | NULL  | zhaoliu | NULL      |
  11. | 10009 | NULL    | Guangzhou |
  12. | NULL  | NULL    | Wuhan     |
  13. +-------+---------+-----------+
  14. 4 rows in set (0.00 sec)

本文出自 “猫眼看世界” 博客,请务必保留此出处http://leander.blog.51cto.com/2911819/1094812

时间: 2024-11-05 16:23:51

关系代数——连接的相关文章

Hive知识

HIVEQL CREATE DATABASE financials(创建数据库) SHOW DATABASES(显示数据库) SHOW TABLES IN 数据库(列出数据库的所有表) SHOW DATABASES LIKE 'h.*';(显示类似h以后任意多个字符) LOCATION '/MY/preferred/directory';(指定数据库存放的路径) COMMENT '**';(添加一个说明表) DESCRIBE DATABASE financials(显示finacials数据库的

肤浅的聊聊关联子查询,数据集连接,TiDB代码,关系代数,等等

本章涉及的内容是TiDB的计算层代码,就是我们编译完 TiDB 后在bin目录下生成的 tidb-server 的可执行文件,它是用 go 实现的,里面对 TiPD 和 TiKV实现了Mock,可以单独运行: 用explain语句可以看到一条sql在TiDB中生成的最终执行计划,例如:我们有一条关联子查询: select * from t1 where t1.a in (select t2.a from t2 where t2.b = t1.b); tidb> explain select *

010.简单查询、分组统计查询、多表连接查询(sql实例)

-------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SELECT UNION --SELECT 'HAHA',1,32--UNION ALL --全部显示/显示重复数据 即使集合相同--UNION---------将查询的两个结果集合并.结构必须一致 -->常见面试题 --SELECT 'HEHE',2,33------将查询结果添加到列表中(子查询)IN

关系代数(Relation Algebra)与SQL语句的对应关系

SQL语句的执行一般是先翻译为关系代数再被执行的(能有效提高执行速度),所以我们有必要 了解关系代数与SQL语句间的对应关系. 就像高中代数由+-*/和数字组成,关系代数是由union.intersection.join等运算符和关系实例 组成的. 关系代数有五个基础运算符,这五个基础运算符能派生出其他组合运算符.它们分别是: 选择(σ, selection).投影(π, projection).叉乘(x, cross-product). 差(-, set-difference)和并(υ, un

关系代数

关系代数的由来 首先从宏观上来认识一下关系演算这个概念,换句话讲也就是什么是关系代数,这也是我在接触一些东西的首要工作.大家都知道对于关系型数据库的数据库操作语言分为查询和更新两类.而查询语言这块,又分为关系代数语言与关系演算语言.这里讲的就是关系代数.所以可以这样定义,关系代数就是为数据库操作语言进行查询的集合操作. 关系代数中的操作可分为两类 (1)传统的集合操作:并.差.交.笛卡儿积.除法. (2)扩充的关系操作:投影.选择.连接.. 常见符号 五种基本的关系代数 1.并 设关系R和S具有

关系代数演算So Easy

关系代数运算So Easy 关系代数是以关系为运算的一组高级运算的集合.由于定义为属性个数 相同的元组的集合,因此集合代数的操作就可以引入到关系代数中.关系代数也可以看做是一种抽象的查询语言,是对关系的运算来表达查询的.任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果.所以运算对象.运算符.运算结果是运算的三大要素. 关系代数的运算对象是关系,运算结果亦为关系.关系代数用到的运算符包括四类:集合运算符.专门的关系运算符.算术比较符和逻辑运算符.如下表: 关系代数可分为两类

【软考】(六)关系代数

关系代数的由来 首先从宏观上来认识一下关系演算这个概念,换句话讲也就是什么是关系代数,这也是我在接触一些东西的首要工作.大家都知道对于关系型数据库的数据库操作语言分为查询和更新两类.而查询语言这块,又分为关系代数语言与关系演算语言.这里讲的就是关系代数.所以能够这样定义,关系代数就是为数据库操作语言进行查询的集合操作. 关系代数中的操作可分为两类 (1)传统的集合操作:并.差.交.笛卡儿积.除法. (2)扩充的关系操作:投影.选择.连接.. 常见符号 五种主要的关系代数 1.并 设关系R和S具有

关系代数 (数据库)

关系代数 (数据库) http://zh.wikipedia.org/wiki/%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0_(%E6%95%B0%E6%8D%AE%E5%BA%93) 关系代数是一阶逻辑的分支,是闭合于运算下的关系的集合.运算作用于一个或多个关系上来生成一个关系.关系代数是计算机科学的一部分. 在纯数学中的关系代数是有关于数理逻辑和集合论的代数结构. 目录 [隐藏] 1 介绍 2 原始运算 2.1 集合运算 2.2 投影 (π) 2.3 选择 (σ)

DBMS-形式化关系查询语言:关系代数、元组关系演算、域关系演算

关系代数 关系代数(relational algebra):一种过程化查询语言.包括一个运算的集合,集合中运算以一个或两个关系为输入,产生一个新的关系作为结果. 关系代数的基本运算包括:选择.投影.并.集合差.笛卡尔积.更名. 其他运算:集合交.自然连接.赋值,可用基本运算来定义. 关系运算的结果自身也是一个关系,可用一个关系运算表达式作为另一个关系运算的参数,因此可以把多个关系代数运算组合成一个关系代数表达式(relational-algebra expression). 关系代数定义了一套在