联接:


8.1理解简单的单联接: 


  基本上联接的结果是每个集合的笛卡尔积。例如:两个集合{a,b,c}和{a,b}的笛卡尔积是如下的成对集合:{(a,a),(a,b),(b,a),(b,b),(c,a),(c,b)}。

  select 表1.列1,表1.列2,表2.列3 from 表1 cross join 表2;

  这种类型的联接称为交叉联接,或者笛卡尔积。在mysql中查询语句就是这样写的。

8.1.1使用两表相等联接:

  两个表的行相连接的最常用的方法是通过一个相等联接。相等联接基于每行中的一个列的值。如Sql语句:select 表1.列1,表1.列2,表2.列3 from 表1,表2 where 表1.列1 = 表2.列2;  与交叉联接一样,我们可以使用一个更清楚的关键字形式表达前面的语句。  如:select 表1.列1,表1.列2,表2.列3 from 表1 join 表2 on 表1.列1 = 表2.列2; 这里不同的是我们通过join来代替逗号,使用on来代替where,但是需要注意的是,虽然where用on来进行替代了,但是where关键字还是可以在这样的语句中使用的,并不是说where就不能用了,这点需要注意。比如:

  select StudentExam.ExamId,StudentExam.Makr,Student.Name as StudentName from StudentExam join Student on StudentExam.StudnetId =  Student.StudnetId  where StudentExam.mark >= 80;(附加条件分数大于等于80的学生信息。)

  这是标准形式。为使这个示例的语法工作于所有的数据库平台并且得到相同的结果,我们须使用:inner join 替代 join。 

  根据上述语句我们可以解决一下类似这样的事情了,如:假设有一个表Customers带有一个CustomerId列,有一个表CreditCards也带有CustomerId列,我么就可以编写如下语句:

  select Customers.CustomerId,Customers.CustomersName,CreditCards.CardsNumber from Customers join CreditCards on Customers.CustomerId = CreditCards.CustomerId;

  假设这两张表是一对多的关系,一个用户可以有多张信用卡。查询结果将对CreditCards表中的每个信用卡返回一行。注意有些行有相同的客户信息,因为我们请求数据的方式就是如此。

8.1.2使用多表相等联接:

  相等联接并不仅局限于两个表,我么可以在联接中包含更多表。在一个join 和 on子句后面添加join 和 on子句就可以联接更多的表。例如:select * from table1 join table2 on table1.column1 = table2.column2 join table3 on table1.column3 = table3.column4;

  针对上述的语句,我们对于前面的客户和信用卡来进行表的增加,假设还有另外一个表Address的地址表,存储每个客户的一到多个地址。我么可以执行下列语句:

  select Customer.CustomerId,Customer.CustomerName,CrediCards.CardNumber,Address.Country from Customer join CrediCards on Customer.CustomerId = CrediCards.CustomerId join Address on Customer.CustomerId = Address.CustomerId;

8.1.3使用非相等联接:

  所有相等联接都是在on后面使用想等运算符(=),当然,我们也可以在联接中使用其他比较运算符。例如:select * from table1 join table2 on table1.column1 < table2.column2 ;

8.1.4在相等联接中使用别名:

  我们从上述的例子中可以看出每一天记录的名字都是很长的,当然我们也可以通过使用 (AS) 关键字别名来使得看起来更简洁明了。比如:

  select SE.ExamId,SE.Mark,S.Name AS StudentName from StudentExam AS SE join Student AS S on SE.StudentId = S.StudentId order by ExamID;

  这样跟节省空间,并且使得查询更容易读懂。


8.2使用联接:


  当表联接在一起时,我们将一个表中的行与其他表中的行联合,并从组合中抽取数据。联接可分为以下几类:

  1. 内联接:是一种典型的联接运算,使用像=或者<>之类的比较运算符。包括相等联接、非相等联接和自然联接。内联接使用比价运算符根据每个表共有的列的值匹配两个表中的行。例如:检索Room和Class表中的RoomId相同的所有行。
  2. 外联接:外联接又可以分为左外联接、右外联接或全外联接。在from子句中指定外联接时,可以有以下几个关键字的一组指定:
  • 左外联接:left join或left outer join。左向外联接的结果集包括left outer 子句中指定的左表的所有行,而不仅仅是联接到所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表均为空值。
  • 右外联接:right join或right outer join。右向外联接跟左向外联接方向相反而已,其用法是一样的。
  • 全外联接:full join或full outer join。全外联接返回左表和右表的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

  3.交叉联接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接又称为笛卡尔积。

  1. 内联接:是指使用比较运算符根据每个表共有的列的值匹配两个表中的行。比如:首先我们在两个表中执行内联接。  select 表1.列1,表2.列2 from 表1 inner join 表2 on 表1.列1 = 表2.列2;
  2. 外联接:外联接考虑到源表中有些行不匹配的情况。有三种形式的外联接方式:左外、右外、全外。分别是结果集包含所有从左边的表、右边的表、左右两边的表。执行外联接时的语法与内联接相似,但是使用的left outer join、right outer join、full outer join。所有的这些联接时都需要用到一个on字。
  • 左外联接语句:select * from table1 left outer join table2 on table1.column1 = table2.column2;
  • 右外联接语句:select * from table1 right outer join table2 on table1.column1 = table2.column2;
  • 全外联接语句:select * from table1 full outer join table2 on table1.column1 = table2.column2;

总结:数据库表的联接无疑是非常重要的知识点,在平时的学习和使用过程中未能感觉到它的美妙的地方。这个知识点也是被无数面试官所青睐的问题。比如:你知道联接的几种形式?外联接分几种?什么是笛卡尔积?等等···所以熟悉掌握它异常重要。总结到这里,基本的数据库知识就总结完了。经过这几天的总结和回顾,自然是对数据库的使用又多了一些感悟,感觉基本的数据库知识比较熟悉了。以便于在日后的工作中能将所感悟到的东西运用到实际解决问题中去,这才是正真的意义。

  

数据库知识整理<八>的更多相关文章

  1. 数据库知识整理<六>

    聚合函数与分组 6.1使用聚合函数进行数据统计: 聚合函数常见的有以下几种: count:返回该结果集中行的数目. sum:返回结果集中所有值的总和. avg:返回结果集中所有值的平均值. max:返 ...

  2. 数据库知识整理<一>

    关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...

  3. 数据库知识整理<五>

    简单的数据查询: 5.1查询的基本结构: Sql语句:select [distinct] (* | column [alias],...) from table [where condition] [ ...

  4. 数据库知识整理<二>

    又继续写的博客,希望自己能坚持每天写博客.分享自己的点滴,对自己成长有帮助.今天下午高强度打了三个小时篮球,小腿都抽筋了.很爽,失落的心情似乎变得开明了一些.想到了一句话:“像SB式的坚持总会有好的收 ...

  5. 数据库知识整理<三>

    保证数据的完整性: 3.1数据完整性概述: 数据完整性的意义:我们知道数据库能防止储存垃圾数据,RDBMS实现该功能主要是通过维护数据完整性来实现的.根据数据完整性实施方法我们将其分为四类:实体完整性 ...

  6. 数据库知识整理<四>

    使用DML语句更改数据: 所谓DML语句是指数据库操作语句,其中包括的是对数据库数据的修改.删除.插入. 4.1添加新数据: 插入单行的记录:基本的SQL语句为-insert into <表明& ...

  7. 数据库知识整理<七>

    组合查询: 7.1使用子查询: 嵌套在其他查询中的查询,我们称之为子查询.子查询本身也可能包含一个子查询.子查询也称为内部查询,而包含子查询的语句也称为外部查询. 所有的子查询可以被分为两个类别:子查 ...

  8. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  9. MySQL 索引知识整理(创建高性能的索引)

    前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...

随机推荐

  1. MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题

    ///MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题,在webconfig中配置<system.web><authentication mode ...

  2. express html模板项目搭建

    初学express的亲们,估计要弄ejs和jade会比较烦躁,那就先html开始,简单笔记如下:   1.新建项目文件夹demotest 2.进入demotest    >express -e ...

  3. 用Python给你的博客加上水印

    之前写的博客里面用到的图片都没有加水印,今天才在别的网站上发现自己的博客居然一个字不动的出现在了别人的文章里,而且还不标注出处,简直醉了. 其实博客这种东西讲真我是很愿意让别人看得,因为自己写的也比较 ...

  4. 远程操控软件 TeamViewer for MAC 官方中文版11.0.55321

    百度云:https://pan.baidu.com/s/1o77ol2y 提取密码:3tsx windows: http://download.pchome.net/internet/server/r ...

  5. 第 一 百 天上课 PHP TP框架 数据库修改和删除

    修改的三种方式 //造数组的方式修改 public function xiugai1() { $db=D('yonghu'); $attr=array ( 'zhanghao'=>001, // ...

  6. Centos7 禁止firewalld并使用iptables 作默认防火墙以及忘记root密码的处理方法

    一.停止并禁用firewalld [root@test ~]# systemctl stop firewalld [root@test ~]# systemctl disable firewalld ...

  7. CRC

    #define POLY 0x1021 /** * Calculating CRC-16 in 'C' * @para addr, start of data * @para num, length ...

  8. Howto: 如何将ArcGIS Server缓存移动到新服务器

     Howto: 如何将ArcGIS Server缓存移动到新服务器 文章编号: 33686 软件: ArcGIS Server 9.2, 9.3, 9.3.1 操作系统: Windows 2000, ...

  9. [翻译]Shape comparison language[转]

        link: http://www.cnblogs.com/yhlx125/p/3635623.html   Shape comparison language 首先说说我遇到的一个问题: IR ...

  10. Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)

    上一篇文章介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 ...