暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL之连接查询(完结)

格鲁特的成长记录 2022-07-30
835


嗨,各位老板大家久等了,上篇我们分享了SQL中的单表查询,还没了解的小伙伴可以戳这里查看👉👉SQL之单表查询》。这篇我们分享连接查询以及子查询,如此一来,SQL中关于DQL(数据查询语言)就差不多结束了,小伙伴们就可以磨拳擦手,尝试自己写一些SQL语句啦!!!


distinct 去除重复项


在表中,一个列可能会包含多个重复值,有时也许希望仅仅列出不同(distinct)的值。


语法:

select distinct 字段名 from 表名;


注意:

distinct 只能放在第一个字段名之前,不能放在两个字段名之间,否则会报错;distinct是会将其之后的几个字段联合起来去重,不会分别去重几个字段的重复值。


示例:

select distinct 

column_name1,column_name2 

from 

table_name;


连接查询


概念:

从多张表中跨表查询查询数据被称为多表查询或连接查询,根据表连接的方式分类可以分为内连接、外连接、全连接。其中内连接包括等值连接、非等值连接、自连接;外连接包括左外连接(左连接)、右外连接(右连接)。



01

inner join内连接


当两张表同存在至少一个字段的值是匹配的,可以使用inner join 将两张表连接起来进行跨表查询,凡是满足匹配项的全部查询出来。其中inner 可以省略。



语法:

select 字段名1,字段名2 from 表名1 inner join 表名2 on 条件1;


其中,当条件1为值相等的连接称为等值连接,如表1.字段名1=表2.字段名2;当条件1为非相等的关系称为非等值连接,如表1.字段名1 between 表2.字段名2 and 表2.字段名3。


01

等值连接示例


select 

table_name1.column_name1,table_name2.column_name2 

from 

table_name1 

inner join 

table_name2 

on 

table_name1.column_name3=table_name2.column_name4;


为了提高效率,可以给以上示例的表起别名:


select 

A.column_name1,B.column_name2 

from 

table_name1 as A 

inner join 

table_name2 as B 

on 

A.column_name3=B.column_name4;


02

非等值连接示例


select 

table_name1.column_name1,table_name2.column_name2 

from 

table_name1 

inner join 

table_name2 

on 

table_name1.column_name3 

between 

table_name2.column_name4 

and 

table_name2.column_name5;


同样可以起别名:


select 

A.column_name1,B.column_name2 

from 

table_name1 as A 

inner join 

table_name2 as B 

on 

A.column_name3

 between 

B.column_name4 

and 

B.column_name5;


03

自连接


自连接属于扩展内容,只要知道连接表查询不只是可以连接多张不同的表,也可以同一张表建立关系查询,只需要把同一张表的内容看作是两张表就行


示例:

select 

A.column_name1,B.column_name2 

from 

table_name1 as A 

inner join 

table_name1 as B 

on 

A.column_name3 

between 

B.column_name4 

and 

B.column_name5;



02

left/right outer join外连接


在内连接中两张表是平等的,不分主次,会将两张表中所有匹配的查询出来,但是对于外连接来说,是通过join前的left/right 产生了主次关系,主表内容从左/右表(table1,主表)将全部数据查询出来,连接表(table2)只会查询出与主表匹配的数据,即使连接的表(table2)中没有匹配依然会返回结果,有匹配的返回匹配值,没有匹配的则结果为 NULL。其中outer可以省略,带着比较标准,可读性强。



语法:

select 字段名1,字段名2 from 表名1 left/right outer join 表名2 on 条件1;


其中,当使用left outer join 时表1为主表;当使用right outer join 时表2为主表。


示例:

select 

A.column_name1,B.column_name2 

from 

table_name1 as A 

left outer join 

table_name2 as B 

on 

A.column_name3=B.column_name4;


03

full outer join全连接


在外连接中是通过left/right outer join 实现了主表所有数据全部查询,那么full outer join是将两张表全部当成主表,两张表中的所有为匹配的数据也会查询出来。



示例:

select 

A.column_name1,B.column_name2 

from 

table_name1 as A 

full outer join

table_name2 as B 

on

A.column_name3=B.column_name4;


注:如果要将两张表的不匹配的数据查询出来则需要在语句后加where 连接表1.条件字段1 is null。



示例:

select

A.column_name1,B.column_name2 

from 

table_name1 as A 

left outer join 

table_name2 as B 

on 

A.column_name3=B.column_name4 

where 

B.column_name4 is null;



子查询

select语句中嵌套select语句,被嵌套的select语句称为子查询。子查询可以被嵌套在select\from\where后,用( )括起来。


where后的子查询:

可以将子查询的结果当作是一个条件


示例:

Select 

a.column_name1 

from 

table_name1 as a 

where 

a.column_name1 >

(

select 

min(a.column_name2) 

from 

);


from后的子查询:

可以将子查询的结果当作是一张表


示例:

Select 

a.*,b.column_name1 

from 

(

select

from 

table_name1

)

as a 

join 

table_name2 as b 

on 

a.column_name2 > 1000;


select后的子查询:

可以将子查询的结果当作是父查询字段


示例:

Select 

a.column_name1,

(

select 

b.column_name2 

from 

table_name2 as b 

where 

a.column_name3=b.column_name2

) 

from

table_name1 as a;


注意:对于select后的子查询,只能一次返回一条结果,多于一条,就报错了。


union合并查询结果集


UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。


示例:

select 

column_name1 

from 

table_name1 

union

select 

column_name1 

from 

table_name2;


注意:union操作符默认选取两个结果集中的不同的值,重复的值会去除,如果允许出现重复的值,则需要使用union all。


OK,SQL中的查询语言基本分享结束了,得说一句,SQL不难,难的是熟练和思路,一定要多做一些SQL的练习,平时没事多敲一敲,如果有问题可以再回到文章中找找思路,或者是一起沟通解决。感谢大家听我唠叨这么多,大家一起进步~




文章转载自格鲁特的成长记录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论