嗨,各位老板大家久等了,上篇我们分享了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
a
);
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的练习,平时没事多敲一敲,如果有问题可以再回到文章中找找思路,或者是一起沟通解决。感谢大家听我唠叨这么多,大家一起进步~