SQL查询 - 表连接
一、连接查询简介
连接查询中用来连接连个表的条件称为连接条件或连接谓词。其形式为:
[<表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查询 - 表连接的更多相关文章
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- sql server 表连接
本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: SQL多表连接查询(详细实例)_新客网 表2:course 截图如下: SQL多表连接查询(详细实例)_新 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点
mysql数据库表及数据准备语句: USE test; DROP TABLE IF EXISTS `teacher_table`; DROP TABLE IF EXISTS `student_tabl ...
- SQL多表连接查询(详细实例)(转)
http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...
- SQL多表连接查询(具体实例)
本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图例如以下: 表2:course 截图例如以下: (此时这样建表仅仅是为了演示连接SQL语句.当然实际开发中我们 ...
- SQL多表连接
在KS系统中分配好权限以后,在用户登录的时候就要通过用户查到角色,通过角色查到界面,界面又属于某个菜单,一共要查4个表.并且不能有重复的记录这个时候就用到了SQL的内连接.SQL的多表连接很方便,以前 ...
- sql之表连接 筛选条件放在 连接外和放在连接里的区别
使用一个简单的例子,说明他们之间的区别 使用的表:[Sales.Orders]订单表和[Sales.Customers]客户表,和上一篇博客的表相同 业务要求:查询出 : 所有的用户 在 2012-1 ...
- sql之表连接和group by +组函数的分析
1.首先我们来先看一个简单的例子: 有[Sales.Orders]订单表和[Sales.Customers]顾客表,表的机构如下 业务要求:筛选 来自“按时打算”国家的用户以及所下的订单数 sele ...
随机推荐
- 用c#开发微信 (11) 微统计 - 阅读分享统计系统 1 基础架构搭建
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...
- .net 获取当前周及根据年和周获取起始结束时间
获取当前日期周数 int str = new System.Globalization.GregorianCalendar().GetWeekOfYear(System.DateTime.Now, S ...
- 读《你必须知道的.NET》继承本质论 Bird bird=new Chicken()
我们创建如下的三层继承层次类. public abstract class Animal { public abstract void ShowType(); } public class Bird ...
- [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论
前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...
- python数据采集与多线程效率分析
以前一直使用PHP写爬虫,用Snoopy配合simple_html_dom用起来也挺好的,至少能够解决问题. PHP一直没有一个好用的多线程机制,虽然可以使用一些trick的手段来实现并行的效果(例如 ...
- dom4j 读取xml
package core.util; import java.io.File; import java.util.Iterator; import java.util.List; import org ...
- 如何将Scrapy 部署到Scrapyd上?
安装上传工具 1.上传工具 scrapyd-client 2.安装方法: pip install scrapyd-client 3.上传方法: python d:\Python27\Scripts\s ...
- 如何关闭Linux里边的selinux ?
原文地址: http://jingyan.baidu.com/article/6d704a131ba67828da51ca73.html 有很多的Linux使用者因为对selinux不熟悉,所以都会将 ...
- Advacned Puppet: Puppet Master性能调优
本文是Advanced Puppet系列的第一篇:Puppet master性能调优,谈一谈如何优化和提高C/S架构下master端的性能. 故事情节往往惊人地类似:你是一名使用Puppet管理线上业 ...
- Git – fatal: Unable to create ‘/.git/index.lock’: File exists错误解决办法
有时候在提交的时候,中间提交出错,导致有文件被lock,所以会报下面的错误: fatal: Unable to create ‘/msg/.git/index.lock’: File exists. ...