1、什么是连接查询?
从一张表中单独查询,称为单表查询
A表和B表联合起来查询数据,从A表取出一部分数据,从B表取出一部分数据,这种跨表查询,多张表联合起来查询数据,被称为连接查询
2、为什么要使用连接查询?
因为不同表之间的数据具有不同的用途和字段,连接查询可以将我们需要用到的两个表的不同字段进行关联,从而找到我们有用的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。
3、连接查询的分类?
根据语法的年代分类:
SQL92:1992年出现的语法
SQL99:1999年出现的语法
重点学习SQL99
根据表连接的方式分类:
内连接
等值连接
非等值连接
自连接
外连接
左外连接(左连接)
右外连接(右连接)
全连接(很少用,几乎不用)
注意事项:
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象(笛卡尔发现的,这是一个数学现象)
通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数
在进行表连接时,表起别名,很重要,效率问题
SQL92的缺点:结构不够清晰,表的连接条件,和后期进一步筛选的条件,都放在了where后面
SQL99的有点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后面继续添加where条件
怎么避免笛卡尔积现象?
连接时加条件,满足这个条件的筛选出来。
select name,auth from user,auth where user.auth_id = auth.auth_id;
内连接
1、等值与非等值连接查询
返回两个表中满足连接条件的数据;使用关键字 inner join 表示,也可以简写成 join。
用来连接两个表的条件称为连接条件或连接谓词,当连接运算符为 = 时,称为 等值连接 ,使用其他运算符时称为 非等值连接。
语法:
select 字段列表 from A表 inner join B表 on 连接条件;
注意事项:
inner 关键字可以省略
A表.列名 = B表.列名,等值连接
A表.列名 between B表.列名1 and B表.列名2,非等值连接
可用的连接运算符:>、<、=、>=、<=、!=、between等
其中最常用的是等值连接(=)
举例:
select a.name,b.auth_code from tableA join tableB on tableA.user_id = tableB.user_id; // 等值
select a.name,b.auth_code from tableA join tableB on tableA.user_id != tableB.user_id; // 非等值
外连接
分为左外连接、右外连接、全外连接;
左外连接(left outer join)首先返回左表中所有的数据;对于右表,返回满足连接条件的数据;如果没有相应的数据就返回空值。左外连接使用关键字 left outer join 表示,outer 可以省略,也可以简写成 left join。
右外连接(right outer join)首先返回右表中所有的数据;对于左表,返回满足连接条件的数据,如果没有相应的数据就返回空值。右外连接使用关键字 right outer join 表示,outer 可以省略,也可以简写成 right join。
带有left的是左外连接,又叫左连接,以左边的表为主表,右边的表为次表
带有right的是右外连接,又叫做右连接,以右边的表为主表,左边的表为次表
语法:
select 字段列表 from A表 [left | right] join B表 on 连接条件;
注意事项:
outer:可以省略,带着可读性要好一些
任何一个右连接都有左连接的写法,任何一个左连接都有右连接的写法
右外连接和左外连接可以相互转换
举例:
select a.id,a.name,b.price from tableA as a left join tableB as b on a.id = b.id; // 返回tableA表的所有数据,tableB表满足条件则返回数据,否则返回空值null
select a.id,a.name,b.price from tableA as a right join tableB as b on a.id = b.id; // 返回tableB表的所有数据,tableA表满足条件则返回数据,否则返回空值null
三张表。四张表怎么连接?
语法:
select
...
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
right join
d
on
a和d的连接条件
SQL中内连接和外连接可以混合,都可以出现