连接是二元运算,可以对两个或多个表进行查询,结果通常是含有参加连接运算的两个或多个表的指点列的表
在SQL中,连接有两大类表示形式,一是符合SQL标准连接谓词(where)的表达形式,二是oracle扩展的使用关键字JION的表达形式。
1.连接谓词
可以在select语句的where子句中使用比较运算符给出连接条件对表进行连接,将这种表示形式称为连接谓词表示形式。
--查找数据库每个班的学生信息。 select * from school_students,school_class where stu_class=class_id;
连接谓词中的两个列(字段)称为连接字段,它们必须是可比的,连接谓词的比较符可以是<,<=,=,>,>=,!=和<>,当比较符为=是就是等值连接,若在目标列中去除相同的字段名,则为自然连接。
--查找选修了100014课程且成绩在70分以上的学生姓名及成绩。 select stu_name 姓名, result_number 成绩 from school_students, school_result where result_stu=stu_id and result_course='100014' and result_number>=70;
连接和子查询可能都要涉及两个或多个表,区别是:连接可以合并两个或多个表,而带子查询的select语句的结果只能来自一个表。子查询的结果是用来作为选择结果数据时进行参照的。
--查找选修了“数据库技术及应用”课程且成绩在70分以上的学生学号、姓名、---课程名及成绩。 select stu_id 学号, stu_name 姓名, course_name 课程名, result_number 成绩 from school_students, school_course, school_result where stu_id=result_stu and course_id=result_course and course_name='数据库技术及应用' and result_number>=70;
2.以JOIN关键字指定的连接
oracle的PL/SQL语句扩展以jion关键字指定连接的表示方法,增强了表的连接运算能力。
内连接:按照On所指定的连接条件合并两个表,返回满足条件的行
--查找数据库每个班的学生信息。 select * from school_students join school_class on class_id=stu_class ;
内连接还可以用于连接多个表的连接
--查找选修了100014课程且成绩在70分以上的学生姓名及成绩。 select stu_name 姓名, result_number 成绩 from SCHOOL_STUDENTS join school_result on stu_id=result_stu where result_course='100014' and result_number>=70;
外连接:外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。
外连接包括三种:
1 左外链接:结果表中除了包括满足连接条件的行外,还包括左表的所有行
--查找所有班级学生情况及,若班级没有学生,也要显示其情况。 select class_name,stu_name from SCHOOL_CLASS left join school_students on stu_class=class_id;
2 右外链接:结果表中除了包括满足连接条件的行外,还包括右表的所有的行
--查找所有班级学生情况及,学生没有班级,也要显示其情况。 select class_name,stu_name from SCHOOL_CLASS right join school_students on stu_class=class_id;
3 完全链接:结果表除了包括满足连接条件的行外,还包括两个表的所有行
4.交叉连接:交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每行与第二个表的每一行拼接后形成的表,因此结果表的行数等于两个表行数之积。
--列出学生所有可能的选课情况。 select class_name,stu_name from SCHOOL_CLASS cross join school_students ;
注意:交叉连接也可以使用where子句进行条件限定