链接查询中用来链接连个表的条件称为链接条件或链接谓词。其形式为:数据库
[<表1>].<列名1><链接运算符>[<表2>].<列2>
常见的链接运算符包括测试
一、比较运算符:=、>、<、>=、<=、!=、between和and。3d
二、逻辑运算符:not、and、or。code
三、使用between和and链接查询形式为[<表1>].<列名1><between>[<表2>].<列名2>and[<表2>].<列名3>。blog
一、内链接:表中的行互相链接。结果集的行数等于每一个表知足条件的行数的乘积,参与链接的表示平等的。io
二、外链接:参与链接的表有主次之分,主表的每一行数据去匹配从表的数据列,符合链接条件的数据将直接返回到结果集中,不符合链接条件的数据列将以null填充后返回到结果集中,其中外链接又分左外链接、右外链接和全链接3种。ast
(一)、等值链接查询class
select p.*,c.* from country as c,person as p where c.countryid = p.countryid
等上面的等值链接中,两张表都有countryid字段,所以查出来的结果中就会有两列countryidbfc
(二)、在等值结果中消除数据就是天然链接select
select p.name,c.countryname from country as c,person as p where c.countryid = p.countryid
(三)、自身链接
一个数据表本身与本身创建链接称为自身链接
一、内链接查询的语法结构以下:
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
一、左外链接查询的语法结构:
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。也就是说,无论第二个表有没有记录都会第一个表的全部字段都会返回,这就是外链接与内链接的区别。
一、右外链接查询的语法结构以下:
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。
一、全外链接查询的语法结构以下:
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
结果以下:
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表
一、查询一个列表,该列表要包含国家名称列表与该国家下的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
输出结果为: