SQL课程复习(十三)
第七章
连接查询
有两个联合表在查询表时,另外一张表是不会被查询出来的。要想查询时显示两张表的情况要用到连接查询。
子查询和联合查询的区别: 子查询是根据已经条件到其他的表去将数据查出来;联合查询是实实在在的将数据都查询出来
联接查询的作用和分类:通过联接查询可以将多个表作为一个表进行处理。当检索数据时,通过联接查询可检索出源于不同表的信息,提高用户操作的灵活性。
联接查询分为:交叉联接、内联接和外联接。(内链接,外链接,左右连接)
我们用到联接查询一般是在两张表都有一个主外键,这两个表有一个主外键相连的时候;如果没有也可以联合查询,当时那样联合查询就没有意义了。
交叉连接:产生笛卡尔积
含义:两个集合中的每一个成员,都与对方集合中的任意一个成员有关联。即第一个表的行数乘以第二个表的行数等于笛卡尔积大小。(t1有三行数据 1 2 3 ,t2有两行数据 4 5,他们的笛卡尔积会成一个新的t214 15 24 25 34 35“就是这六条数据”)
select * from Employee cross join Rank (出来的就是笛卡尔积,两张表都会被显示;但是有些数据没有价值)
笛卡尔积的数据很多但不一定有效
红色区域是笛卡尔积的数据
select * from Employee cross join Rank where Employee.RankID=Rank.RankID (加一个限制条件,这样出来的结果是有效的)
select e.Name,e.Birthday,e.Address,e.RankID,r.RankName from Employee e cross join Rank r where e.RankID=r.RankID (如果我不想要那些有null值的列就准确查询,就是有些表的字段我不查询)
注 :我在整理写的e和r是两张表的名字的简写,可以用这种方法去简写表名
联合查询的特点就是会将两张表的数据都显示出来,最终汇总到一张临时表中,再加上一个限制条件where <限制条件表达式>,就可以联合两张表,得到我们想要的信息。“不加where条件限制的话他就是一个笛卡尔积而已。where是在查询出来的笛卡尔积表中再来查询的”
内联接:
在进行两张表的联接查询中,仅返回匹配数据的联接方式称为内联接。
select * from Employee e inner join Rank r on e.RankID=r.RankID =select * from Employee e cross join Rank r where e.RankID=r.RankID (inner可以省略不写的,这两个语句功能相同)
内联接查询是联接查询中用的最多的联接查询
要多个表联接查询,直接用join+表名 on 有关联的主外键,通常这个on都是主外键。这样查询出来的数据才是有意义的数据。* 可以换成你想要任意字段,只要在你加入的表中的列名即可。
(同样可以加where来筛选数据)
另一种写法:
select * from Employee e , Rank r (就这样查询出来的结果就是笛卡尔积) where e.RankID=r.RankID
select * from Employee e , Rank r where e.RankID=r.RankID (这样的才是有效数据,表名是可以取别名的,取别名之后要找表中的列时要用 别名+ . +列名,才能找到准确的列名)
联接查询是可以用group by 分组,也可以用order by 来排序的
如果使用了聚合函数或者是分组,它是对于这个联合查询后的整张表再继续分组。
两个条件并列用and
外链接查询:
在内连接查询中,只有满足连接条件的记录才能出现在查询结果中。但在实际应用中,如果希望不满足连接条件的记录也在查询结果中出现,这时需要使用外连接查询。
根据不同的外连接形式,外连接所生成的结果集中不仅包含符合条件的数据记录,而且还包含左表或右表或左右表中所有的数据记录。
外链接分为左外链接和右外链接 :(用左连接就是以左边为基准,右链接就是以右边为基准)
(左外链接是将左边的那个表的信息都显示出来,然后去与另外一张表相比。如果右边表格有满足连接的记录就显示,如果没有满足连接的记录就显示为null值。)
(右外链接是将右边的那个表的信息都显示出来,然后去与另外一张表相比。如果左边表格有满足连接的记录就显示,如果没有满足连接的记录就显示为null值。)
语句写法:
select 字段名称 from 表名1 left/right/ 表名2 on 表名1.某个列=表名2.某个列
内链接和外链接的区别:
“内链接只会查询出有主外键相连接的数据,而外链接是将两张表放到一起来看。”
全外连接:(就是将左右连接都整和到一起)
select * from 表名1 full join 表名2 on 表名1.某个列=表名2.某个列
版权声明:本文为原创文章,版权归 Jun所有!
转载请注明出处:https://cranek.cn/?id=20