连接查询
1)多表连接查询实际上是通过各个表之间公共字段的关键性来查询数据的,它是关系数据库查询的最主要的特征。
2)常用的链接有:内连接,外连接,交叉连接(笛卡尔乘积链接)
1. 内连接
1) 内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。 简单来说,就是利用条件表达式来消除交叉连接的某些数据行。
2) 内连接种类分为三种:等值连接,自然连接,不等链接。
等值内连接返回的结果集是两个表中所有相匹配的数据,舍弃不匹配的数据。
3)等值内连接语法:select ...from 表1 [inner] join 表2 on <表达式>;
例:查询班级表(classinfo)和年级表(grade)两个表中满足连接条件的所有记录信息;
select c.*,g.*from classinfo as c join grade as g on c.gid=g.gid;
2. 外连接
外连接 (outer join):分为左外连接 (left outer join 或 left join) 、右外连接 (right outer join 或 right join) 。
(1)左外连接
1> 所谓左外联接,是以左表为基准,将两表的数据进行连接,然后将左表没有对应项显示为NULL;换种说法:就是根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,如果找不到与左表匹配的,用null表示。
2>语法:select ... from 表 1 left [outer] join 表2 on<表达式>;
例:连接教师表(teacher)和课程表(subject),查询教师姓名和课程名称(把没有代课的老师姓名也显示出来,课程名称为null);
select t.teachername 教师姓名,s.subname 课程名称 from teacher as t left join subject as s on t.tid=s.tid;
(2)右外连接
1>右外连接又称为右连接,右连接是左连接的反向连接。 使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。
2>语法:select ... from 表 1 right [outer] join 表2 on<表达式>;
例:连接教师表(teacher)和课程表(subject),查询教师姓名和课程名称(把没有代课的老师姓名也显示出来,课程名称为null);
select t.teachername 教师姓名,s.subname 课程名称 from teacher as t right join subject as s on t.tid=s.tid;
(3) 左外连接和右外连接的区别如下:
1、数据集合上的区别
(1)左外连接:是A与B的交集,然后连接A的所有数据。
(2)右外连接:是A与B的交集,然后连接B的所有数据。
2、计算方法上的区别
(1)左外连接:计算方法是,A左连接B记录=表3的公用记录集C +表A的记录集A1。
(2)右外连接:计算方法是,A右连接B记录=图3公共部分记录集C +表B记录集B1。
3.交叉连接
1)交叉连接 (笛卡尔积)返回被连接的两个表所有数据行的笛卡尔积,返回结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
2)交叉连接的语法格式如下:
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
例:查询出学生的学号,姓名,班级名称
SELECT studentinfo.studentno 学号,studentinfo.stuname 姓名, classinfo.classname 班级名 FROM studentinfo,classinfo WHERE studentinfo.cid=classinfo.cid;
3)涉及两个表以上的连接查询,其创建条件与两个表连接相同,只需在where条件中增加一个 'and' 复合条件。
注意:笛卡尔乘积返回的结果是存在大量的冗余(多余)的,为了能够避免出现笛卡尔乘积,需要在查询语句中使用where子句加以筛选,where子句可以根据两个表公共字段的关系查询数据。