1、等值连接与非等值连接
当连接运算符为等号时为等值连接,当为其他运算符时为非等值连接。
等值连接:
select studentno,sname --查询刘老师老师教过的学生的学号,姓名 from student,teach_class,teacher where student.classno=teach_class.classno and teach_class.teacherno=teacher.teacherno and teacher.tname='刘老师'
非等值连接:
select * from bus_goods bg,bus_goods bg2 where bg.price >bg2.price
可以等值\非等值连接查询的结果理解为,将笛卡尔积的结果进行过滤,等到符合条件的
2、自身连接
连接操作发生在一个表以其自身进行连接。
select teacher.*--查询同时教授“c1”和“c2”号课程的教师信息 from teach_class t1,teach_class t2,teacher where t1.teacherno=teacher.teacherno and t2.teacherno=teacher.teacherno and t1.courseno='c1' and t2.courseno='c2'
3、外连接
左外连接:只保留左边关系的悬浮元组(在连接操作中被舍弃的元组称为“悬浮元组”)。如果进行等值连接查询,只要两个表进行连接的字段连接不成功,两个表中的数据就不会被查询出来,但是左外连接查询的时候,左边表的所有数据都会进行显示,即使不能与右边的表连接成功。
右外连接:只保留右边关系的悬浮元组。
select course.*--查询没有任何学生选修的课程编号和课程名称及学分 from course left outer join score on (course.courseno=score.courseno) where score.studentno is null
在课程表与分数表的左外连接查询中,课程表的所有数据都会显示出来的,即使有些课程没有分数(没有学生选修)
添加左外连接语句:
SELECT *
FROM course LEFT OUTER JOIN score ON (course.courseno=score.courseno)
courseno cname type period credit studentno courseno usually finall -------- ------------ ------ ------ ------ ---------- -------- ------- -------- 201801 数据库 必修 64 2.00 2020043005 201801 77 78 201801 数据库 必修 64 2.00 2020043006 201801 79 78 201801 数据库 必修 64 2.00 2020043007 201801 89 78 201801 数据库 必修 64 2.00 2020043008 201801 93 89 201801 数据库 必修 64 2.00 2020043009 201801 78 60 201801 数据库 必修 64 2.00 2020043010 201801 78 60 201801 数据库 必修 64 2.00 2020043009 201801 (NULL) (NULL) 201802 大数据 选修 32 2.00 2020043009 201802 73 70 201803 单片机 选修 32 2.00 2020043009 201803 99 89 201803 单片机 选修 32 2.00 2020043006 201803 90 89 201803 单片机 选修 32 2.00 2020043005 201803 87 89 201804 毛概 必修 64 4.00 2020043007 201804 69 70 201804 毛概 必修 64 4.00 2020043009 201804 (NULL) (NULL) 201805 软件工程 选修 32 2.00 2020043005 201805 79 78 201805 软件工程 选修 32 2.00 2020043006 201805 87 89 201805 软件工程 选修 32 2.00 2020043007 201805 80 92 201806 人工智能 选修 32 2.00 (NULL) (NULL) (NULL) (NULL)
不添加左外连接语句:
SELECT *
FROM course,score
WHERE course.courseno=score.courseno
courseno cname type period credit studentno courseno usually finall -------- ------------ ------ ------ ------ ---------- -------- ------- -------- 201801 数据库 必修 64 2.00 2020043005 201801 77 78 201801 数据库 必修 64 2.00 2020043006 201801 79 78 201801 数据库 必修 64 2.00 2020043007 201801 89 78 201801 数据库 必修 64 2.00 2020043008 201801 93 89 201801 数据库 必修 64 2.00 2020043009 201801 78 60 201801 数据库 必修 64 2.00 2020043010 201801 78 60 201801 数据库 必修 64 2.00 2020043009 201801 (NULL) (NULL) 201802 大数据 选修 32 2.00 2020043009 201802 73 70 201803 单片机 选修 32 2.00 2020043009 201803 99 89 201803 单片机 选修 32 2.00 2020043006 201803 90 89 201803 单片机 选修 32 2.00 2020043005 201803 87 89 201804 毛概 必修 64 4.00 2020043007 201804 69 70 201804 毛概 必修 64 4.00 2020043009 201804 (NULL) (NULL) 201805 软件工程 选修 32 2.00 2020043005 201805 79 78 201805 软件工程 选修 32 2.00 2020043006 201805 87 89 201805 软件工程 选修 32 2.00 2020043007 201805 80 92
在进行连接操作的时候,课程的表信息是存在的,但是在分数表里面找不到对应的课程的分数,如果不添加左外连接是不能显示出课程的表的信息的,添加了外连接语句后,即使连接失败依旧能够显示出相应的信息
4、嵌套查询
ANY:某个值
ALL: 所有值
select studentno,sname,classno--查询入学成绩比本班平均入学成绩高的学生信息 from student s1 where point>( select AVG(point) from student s2 where s1.classno=s2.classno )
5、内连接
隐式内连接:
select su.id ,sru.uid ,su.name from sys_user su ,sys_role_user sru where su.id = sru.uid
显式内连接:
select su.id ,sru.uid ,su.name from sys_user su inner join sys_role_user sru on (su.id = sru.uid )
select su.id ,sru.uid ,su.name from sys_user su join sys_role_user sru on (su.id = sru.uid )
隐式内连接与显式内连接的查询结果是一样的,但是隐式连接容易理解。显式连接可以减少字段的扫描,有更快的执行速度。