多表连接查询
内连接/等值连接/条件连接
连接条件:两个表中相同含义字段相等
例如:查询学生的学号、姓名、选修课程号、成绩
语法:
…… [inner] join ... on 连接条件
…… from 表1,表2 where 连接条件
例子:
select student.sno,sname,cno,grade from student join enrollment on student.sno=enrollment.sno;
外连接
左外连接
执行过程:先执行一次内连接,然后再将左边表中不符合连接条件的记录也添加到连接结果中。
例如:查询学生的学号、姓名、选修课程号、成绩
语法:
left [outer] join ... on 连接条件
例子:
select student.sno,sname,cno,grade from student left join enrollment on student.sno=enrollment.sno;
右外连接
执行过程:先执行一次内连接,然后再将右边表中不符合连接条件的记录也添加到连接结果中。
例如:查询学生的学号、姓名、选修课程号、成绩
语法:
right [outer] join ... on 连接条件
例子:
select student.sno,sname,cno,grade from student right join enrollment on student.sno=enrollment.sno;
交叉连接/无条件连接
执行过程:
1、 从第一张表依次取出每一条记录
2、 取出每一条记录之后,与另外一张表的全部记录挨个匹配
3、 没有任何匹配条件,所有的结果都会进行保留
4、 记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数 + 第二张表字段数(笛卡尔积)
例如: 查询所有学生和课程可能选课情况
语法:
select * from 表1 cross join 表2
select * from 表1,表2
应用: 交叉连接产生的结果是笛卡尔积,实际应用较少。
笛卡尔积: 连接结果的记录数两个表中记录条数的乘积
自连接
例如:查询与Sue在同一个系学习的学生学号、姓名。
**多表连接方式:
**select sno,sname from student s1,student s2 where s1.name='Sue' and s1.sdept=s2.sdept;
子连接方式:
select sno,sname from student where sdept = (select sdept from student where sname='sue');
子查询
概念: 一个select中,嵌套另一个select,这种形式的查询称为子查询。
分类: where子查询(作为查询条件使用)、from子查询(作为子表来用)
关键字: all(所有)、any(任何)、exists(存在)
语法:
select ... from ... where (select ...)
关键字语法:
select ... from ... where age>all(select ...)
select ... from ... where age>any(select ...)
select ... from ... where exists(select ...)