一、连接查询简介

  连接查询中用来连接连个表的条件称为连接条件或连接谓词。其形式为:

[<表1>].<列名1><连接运算符>[<表2>].<列2>  

  常见的连接运算符包括

  1、比较运算符:=、>、<、>=、<=、!=、between和and。

  2、逻辑运算符:not、and、or。

  3、使用between和and连接查询形式为[<表1>].<列名1><between>[<表2>].<列名2>and[<表2>].<列名3>。

二、连接按照结果集分类

  1、内连接:表中的行互相连接。结果集的行数等于每个表满足条件的行数的乘积,参与连接的表示平等的。

  2、外连接:参与连接的表有主次之分,主表的每一行数据去匹配从表的数据列,符合连接条件的数据将直接返回到结果集中,不符合连接条件的数据列将以null填充后返回到结果集中,其中外连接又分左外连接、右外连接和全连接3种。

  (一)、等值连接查询

select p.*,c.* from country as c,person as p where c.countryid = p.countryid

  等上面的等值连接中,两张表都有countryid字段,因此查出来的结果中就会有两列countryid

  (二)、在等值结果中消除数据就是自然连接

select p.name,c.countryname from country as c,person as p where c.countryid = p.countryid

  (三)、自身连接

  一个数据表自己与自己建立连接称为自身连接

、内连接查询

  1、内连接查询的语法结构如下:

      select <属性或表达式列表>
      from <表名> [inner] join <表名>
      on <连接条件>
      [ where <限定条件> ]

  inner可以省略,当只见到join时就是省略了inner。内连接就是传统的连接操作,这里用on子句指定连接条件,用where子句指定其他限定条件:

  select p.name,c.countryname from country as c inner join person p on p.countryid = c.countryid

、左外连接查询

  1、左外连接查询的语法结构:

    select <属性或表达式列表>
    from <表名> left outer join <表名>
    on <连接条件>
    [ where <限定条件> ]

  如:

  select p.name,c.countryname from country as c left join person p on p.countryid = c.countryid 

  在结果表中包含第一个表中满足条件的所有记录,如果是在连接连接上匹配的记录,则第二个表返回相应值,否则第二个表返回null。也就是说,不管第二个表有没有记录都会第一个表的所有字段都会返回,这就是外连接与内连接的区别。

五、右外连接查询

  1、右外连接查询的语法结构如下:

    select <属性或表达式列表>
    from <表名> right outer join <表名>
    on <连接条件>
    [ where <限定条件> ]

  如:

select p.name,c.countryname from country as c right join person p on p.countryid = c.countryid

  在结果表中包含第二个表中满足条件的所有记录。如果是在连接条件上匹配的记录,则第一个表返回相应值,否则第一个表返回null。

六、全外连接查询

  1、全外连接查询的语法结构如下:

   select <属性或表达式列表>
   from <表名> full outer join <表名>
   on <连接条件>
   where <限定条件>]

  如:

  select p.name,c.countryname from country as c full join person p on p.countryid = c.countryid

  在结果表中包含两个表中满足条件的所有记录。如果是在连接条件上匹配的元组,则另一个表返回相应则,没有则返回null。

七、交叉连接

  交叉连接Corss join,用于将第一张表的所有记录与第二张表的所有记录组合一次并返回,这个东西在生成测试数据库时很有用,例如,你定义7个姓,7个名,再交叉连接就能够产生49条记录。

   如有如下表:姓氏表

    

    名字表:

    

    执行如下SQL语句:

  select LastName + firstname from name2 cross join name1

       结果如下:

      

8、联合查询union(union all)

   union是一个特殊的运算符,用于将两个或两个以上的查询产生一个结果集。join将信息水平连接(添加更多列),而union将信息垂直连接(添加更多行)。

   当使用union处理查询时,要注意以下几个关键点。

   (1)、所有union的查询必须在select列表中有相同的列数。即如果第一个查询有3个列数,第二个查询也要只有3个列数。

   (2)、union返回结果的标题集仅从第一个查询中获得,无论第二个查询如何命名或取别名都不会更改。

   (3)、查询中对应的列的数据类型必须隐式一致。注意不要求完全一致,只需要隐式一致。

   (4)、与其他非union不同,union的默认返回选项为distinct,而不是all。union all语句与union的不同点仅仅在于遇到相同的记录,全部保留而已。

   例如还是用第7条的例子,执行如下语句:

select * from name1
union
select * from name2

   返回结果为:

   

   由于union默认是distinct查询,因此想要获得所有的记录时,可以用union all,这样就算上述例子中两个表都有'王',也会两条记录一起返回。

   现在来看一下综合示例:

   为了展示一下,建了两张表,并添加了几条记录,如下:

    person表

    

    country表

    

   1、查询一个列表,该列表要包含国家名称列表与该国家下的person总数。

select c.countryname,count(p.id)
from country as c
inner join person as p on c.countryid = p.countryid
group by c.countryname

    输出结果:

    

    现在在来加一个条件,要求人口数按升序排列:

select c.countryname,count(p.id) as co
from country as c
inner join person as p on c.countryid = p.countryid
group by c.countryname
order by co asc

    输出结果:

    

    再加一个条件,要求只输出person数大于2的记录:

select c.countryname,count(p.id) as co
from country as c
inner join person as p on c.countryid = p.countryid
group by c.countryname
having count(p.id) > 2
order by co asc

    输出结果为:

    

SQL查询 - 表连接的更多相关文章

  1. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  2. sql server 表连接

    本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: SQL多表连接查询(详细实例)_新客网 表2:course 截图如下: SQL多表连接查询(详细实例)_新 ...

  3. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  4. SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点

    mysql数据库表及数据准备语句: USE test; DROP TABLE IF EXISTS `teacher_table`; DROP TABLE IF EXISTS `student_tabl ...

  5. SQL多表连接查询(详细实例)(转)

    http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...

  6. SQL多表连接查询(具体实例)

    本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图例如以下: 表2:course  截图例如以下: (此时这样建表仅仅是为了演示连接SQL语句.当然实际开发中我们 ...

  7. SQL多表连接

    在KS系统中分配好权限以后,在用户登录的时候就要通过用户查到角色,通过角色查到界面,界面又属于某个菜单,一共要查4个表.并且不能有重复的记录这个时候就用到了SQL的内连接.SQL的多表连接很方便,以前 ...

  8. sql之表连接 筛选条件放在 连接外和放在连接里的区别

    使用一个简单的例子,说明他们之间的区别 使用的表:[Sales.Orders]订单表和[Sales.Customers]客户表,和上一篇博客的表相同 业务要求:查询出 : 所有的用户 在 2012-1 ...

  9. sql之表连接和group by +组函数的分析

    1.首先我们来先看一个简单的例子: 有[Sales.Orders]订单表和[Sales.Customers]顾客表,表的机构如下 业务要求:筛选  来自“按时打算”国家的用户以及所下的订单数 sele ...

随机推荐

  1. C#设计模式(20)——策略者模式(Stragety Pattern)

    一.引言 前面主题介绍的状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解. 二.策略者模式介绍 ...

  2. Asp.Net Web API 2第七课——Web API异常处理

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Ne ...

  3. WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  4. [MSSQL2005]再看CTE

    个人认为CTE最大的做点是可以处理树状存储的数据了 例如类似这样设计的数据表,ID,ParentID这样的设计使用CTE就非常方便,原因就是CTE可以自引用,达到类似递归的效果 那么问题来了,如何使用 ...

  5. 高手速成android开源项目【导航篇】

    Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧和创造力.学习开源代码是掌握技术的一个 ...

  6. clean code meaningful names

    ---恢复内容开始--- Meaningful Names: use Intention-Revealing Names //nice,Everyone who reads your code (in ...

  7. .NET Core尝试

    Dotnet Github网站 http://dotnet.github.io/getting-started/   微软ASP.NET站点 https://docs.asp.net/en/lates ...

  8. eclipse 远程调试

    http://blog.sina.com.cn/s/blog_86a6730b0101iean.html 注:远程服务器端可用以下方式替代: iptables -I from_external 3 - ...

  9. C语言实现二叉树-01版

    故事是这样开始的,项目经理有一天终于还是拍拍我肩膀说: 无论你的链表写得多么的好,无论是多么的灵活,我也得费老半天才查找到想要的数据: 这让我的工作非常苦恼,听说有一种叫做二叉树的数据结构,你看能不能 ...

  10. iOS开发-迭代器模式

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...