在实际的业务当中,往往需要多张表连接查询,这就会涉及到JOIN 连接
1. JOIN 连接的类型
- INNER JOIN :内连接, 可以只写JOIN ,只有连接的两个表中,都存在连接标准的数据才会保留下来,相当于两个表的交集。如果前后连接的是同一个表,也叫自连接。
- LEFT JOIN :左连接,也叫左外连接。操作符左边表中符合WHERE子句中的所有记录将会被返回,操作右边表中如果没有符合ON后面连接的条件时,那么右边表指定选择的列将会返回NULL。
- RIGHT JOIN:右连接,也叫右外连接。返回右边表所有符合WHERE语句的记录,左表中匹配不上的字段值用NULL来代替。
- FULL JOIN:全连接。返回所有表中符合WHERE语句条件的所有记录。如果表中指定字段没有符合条件的值的话,用NULL来代替。
2. INNER JOIN 内连接
- 通过JOIN语句就可以将几个表通过那几个列连接起来
- INNER JOIN,可以省略掉 ‘INNER ’ 只写JOIN就可以
基本语法:
select <字段名>from <表a>JOIN <表b>ON a.<字段名> = b.<字段名>;
实例1:将学生表和教师表通过教师编号Tid连接起来
select * from students AS s join teachers AS ton s.Tid = t.Tid;
执行结果:
查看输出结果,from后面的students表会作为基础表放在前面,后面在根据关联的Tid,去拼接是哪个join后面的teachers 表。
如果将两个表进行调换下位置,那么teachers表将会作为基础表放在前面
select * from teachers AS tjoin students AS son t.Tid = s.Tid;
执行结果:
查看结果时发现,teachers表中一个有6个老师,现在只输出了4个老师,这是因为没出现的2个老师在students里没有对应的学生,所以内连接,只会输出两个表中相互匹配的数据,2个表的交集
JOIN…ON后面可以跟多个连接条件,条件之间使用AND进行连接就可以了。
3. 多表内连接
- JOIN不仅仅可以连接两个表,在实际业务中,连接很多表进行查询都是常事,因此多表内连接也是需要掌握的。
基本语法:
select <字段名>from <表a>JOIN <表b>ON a.<字段名> = b.<字段名>JOIN <表c>ON a.<字段名> = C.<字段名>
多表连接过程中,FROM后面的表作为基础表,每次和其他表进行连接,是不变的
实例2:学生表同时去连接教师表和课程表,通过教师编号Tid连接起来
select * from students as sjoin teachers as ton s.Tid = t.Tidjoin suject as uon s.Tid = u.Tid;
执行结果:
4. USING 关键字
- 当JOIN…ON后面作为合并条件的列名时,在两个表中相同时,可以使用USING
(…,…)来简化,取代ON…AND… - 如果列名不一样,是不能够使用USING 关键字来简化的,需要特别注意
例如:
select * from students as s join teachers as ton s.Tid = t.Tidand s.Sname= t.Sname
就可以使用 USING 来简化成:
select * from students as s join teachers as tUSING(Tid,Sname)
5. 自连接
- 顾名思义,表仅仅能跟别的表进行连接,还能够跟自己连接,就是自连接。
实例3:编写一个SQL查询,查找所有至少连续出现三次的字,表结构如下:
select DISTINCT a.numFROM NUM a JOIN NUM bon a.id+1 = b.idJOIN NUM con a.id+2 = c.idWHERE a.num = b.num and a.num = c.num
执行结果: