联接:


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. angular run()运行块

    和配置块不同,运行块在注入器创建之后被执行,它是所有AngularJS应用中第一个被执行的方法. 运行块是AngularJS中与main方法最接近的概念.运行块中的代码块通常很难进行单元测试,它是和应 ...

  2. 【EF学习笔记05】----------操作内存中的数据

    SingleOrDefault实验 //SingleOrDefault实验 using (var db = new Entities()) { var classes = new Classes() ...

  3. JSP调用JAVA方法小例子

    用JAVA编写的函数 package doc; //定义一个包 public class Dy { //定义一个类 public static int Sub(int x,int y){ //定义函数 ...

  4. kettle转换提高性能拆分转换步骤_20161201

    今天是12月1号,前期用kettle做了月报自动报表的转换和作业,今天运行时候发现一个报表的程序跑起来失败,心里很纳闷,上过月刚跑的没问题,怎么会无缘无故的失败. 通过看kettle运行日志,发现一个 ...

  5. c# & Fizzler to crawl web page in a certain website domain

    使用fizzler [HtmlAgilityPackExtension]和c#进行网页数据提取:fizzler是HtmlAgilityPack的一个扩展,支持jQuery Selector: 提取数据 ...

  6. {Links}{Matting}{Saliency Detection}{Superpixel}Source links

    自然图像抠图/视频抠像技术发展情况梳理(image matting, alpha matting, video matting)--计算机视觉专题1 http://blog.csdn.net/ansh ...

  7. 获取ServletContext

    ServletConfig       config.getServletContext(): GenericServlet      this.getServletContext(); HttpSe ...

  8. Angular JS中 Promise用法

    一.Promise形象讲解A promise不是angular首创的,作为一种编程模式,它出现在1976年,比js还要古老得多.promise全称是 Futures and promises. 而在j ...

  9. window date type

    Most string operations can use the same logic for Unicode and for Windows code pages. The only diffe ...

  10. 初识ASP.NET CORE:一、HTTP pipeline

    完整的http请求在asp.net framework中的处理流程: Asp.Net HttpRequest--> HTTP.exe--> inetinfo.exe(w3wp.exe)-& ...