若一个查询同时涉及到两个或者两个以上的表,则称之为连接查询。常见的包括:等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外连接查询(左右连接)。
1.等值与非等值连接查询(内连接)。
(等值连接的图)
参考表数据库表:
(表1与表2做了外键关联)
等值连接概念:当连接运算符为=时为等值连接,相当于两表执行笛卡尔后,取两表连结列值相等的记录。
查询语句:
SELECT A.*, B.*
FROM student A INNER JOIN sc B
ON A.`sno`=B.`sno`;
另外一种写法:
SELECT student.* ,sc.*
FROM student , sc
WHERE student.`sno` = sc.`sno`;
两种写法除了语法上的差别,没有明显差距,主要方便了解。看了大多数博客上写的都是第一次,可能有一定优劣,有兴趣的可以自己去百度下。
查询结果都是一样:
非等值连接概念:连接规则由等号以外的运算符组成。>,=,<,,>=,<=,<>,!=,between等。
这里只使用大于号">"比较两个表的连接列的值,相当于两表执行笛卡尔后,取一个表大于另一个表的连结列值的记录。(这两个表查询的结果并没有太大的意义,只是为了方便理解概念)
查询语句:
SELECT A.*, B.*
FROM student A INNER JOIN sc B
ON A.`sno`>B.`sno`;
另外一种写法:
SELECT student.* ,sc.*
FROM student , sc
WHERE student.`sno` >sc.`sno`;
查询的结果仍然一样:
自然连接:在等值连接中把重复的属性列去掉则为自然连接。(自然连接并不是自连接,两者要有一定区分度)
查询语句(仍然是两种写法,不过我懒的copy了 -_-):
SELECT student.* ,sc.`cno`,sc.`grade`
FROM student , sc
WHERE student.`sno` = sc.`sno`;
查询结果:
2.外连接(左右连接)
左连接概念:指将左表的所有记录与右表符合条件的记录,返回的结果除内连接的结果,还有左表不符合条件的记录,并在右表相应列中填NULL。
查询语句:
SELECT student.*,sc.`cno`,sc.`grade`
FROM student LEFT JOIN sc
ON student.`sno`=sc.`sno`;
右外连接:指将右表的所有记录与左表符合条件的记录,返回的结果除内连接的结果,还有右表不符合条件的记录,并在左表相应列中填NULL。(画图功底太low,就不多此一举了 -_-)
查询语句:
SELECT student.*,sc.`cno`,sc.`grade`
FROM student RIGHT JOIN sc
ON student.`sno`=sc.`sno`;
这里要提示一下:
on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。
而inner jion(内连接)没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
3.自身连接(自连接)
自身连接概述:连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,成为表的自身连接,也就是所谓的自连接。
自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
这里以一个课程的数据库表来做实例。
查询语句:
SELECT a.*,b.name
FROM SUBJECT a , SUBJECT b
WHERE a.`pno`=b.`cno`;
查询结果:
有些课程没有先行课,因此我们可以用左关联结合自连接来查询,便于观察。
查询语句:
SELECT a.*,b.name
FROM SUBJECT a LEFT JOIN SUBJECT b
ON a.`pno`=b.`cno`;
查询结果: