连接查询
1.什么是连接查询
目前我们所接触的数据库都是关系型数据库,表和表之间存在关联关系,通常的业务需要我们多张表联合结合获取数据.
这种多表联合获取数据的方式,叫做连接查询
在实际开发的时候,通过单表获取数据的情况比较少见
2.连接查询的分类
-按照连接查询的方式分
*内连接
两张表进行连接查询,如果只查询两张表完全匹配的记录,那么这种查询方式叫内连接
等值练级,非等值连接,自连接
*外连接
在内连接的基础之上(完全匹配),将其中一张表的数据全部显示出来,那么另外一张表肯定会有数据
无法与其匹配,会自动模拟出空值,进行匹配,那么这种查询方式叫外连接
左(外)连接,右(外)连接
-按照连接查询的语法出现的年代分
*SQL92
*SQL99
3.连接查询如果不加连接条件会出现什么情况?
笛卡尔积
4.如果避免笛卡尔积?
连接的时候加上查询条件
但是匹配的次数并没有减少
5.案例:查询员工所在的部门,要求显示员工编号,员工姓名以及对应的部门编号和部门名称
emp e员工表 dept d部门表
-SQL92内连接中的等值连接
select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where e.deptno = d.deptno;
-SQL99内连接中的等值连接 inner可以省略
select e.empno,e.ename,d.deptno,d.dname from emp e (inner) join dept d on e.deptno = d.deptno;
SQL92和SQL99的比较
SQL92:连接条件和查询条件混合在一起,可读性差
SQL99:连接条件和查询条件分开,语句更清晰
6.案例:查询员工的工资对应的等级,要求显示员工的编号,员工姓名以及对应的工资等级
emp e 员工表 salgrade s工资等级表
-SQL92内连接中的非等值连接
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;
-SQL99内连接中的非等值连接
select e.empno,e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
7.案例:查询员工对应的上级领导,要求要是员工的编号,员工姓名以及对应的上级领导的姓名
emp e 员工表 emp m领导表
-SQL92内连接中的自连接
select e.empno,e.ename,m.ename from emp e,emp m where e.mgr = m.empno;
-SQL99内连接中的自连接
select e.empno,e.ename,m.ename from emp e join emp m on e.mgr = m.empno;
8.案例:查询员工所在的部门,要求显示员工编号,员工姓名以及对应的部门编号和部门名称,要求:显示所有的部门
emp e 员工 dept d部门
任何一个左外连接都对应一个右外连接
-SQL99外连接中的左外连接
select e.empno,e.ename,d.deptno,d.dname from dept d left join emp e on e.deptno = d.deptno;
-SQL99外连接中的右外连接
select e.empno,e.ename,d.deptno,d.dname from emp e right join dept d on e.deptno = d.deptno;
-SQL92外连接中的左外连接
select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where d.deptno = e.deptno(+);
-SQL92外连接中的右外连接
select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+) = d.deptno;
9.案例:查询员工的上级领导,要求显示员工的编号,员工姓名以及对应的上级领导的姓名 要求:将所有员工显示出来
-SQL99外连接中的左外连接
select e.empno,e.ename,nvl(m.ename,'这是Boss') from emp e left join emp m on e.mgr = m.empno;
10.多张表如何进行连接查询? a b c a->b a->c
学生选课的设计
学生表 t_student s
id name
----------------------
1 张三
2 李四
3 王五
课程表 t_course c
id name
-----------------
100 C++
200 Java
300 Jsp
学生选课表 t_student_course_relation sc
sid cid sid是一个外键,关联学生表中的主键;cid也是一个外键,关联课程表中的主键 sid+cid是联合主键
---------------------------------------------------
1 100
1 200
1 300
2 100
2 300
3 200
要求:编写查询语句,将2号学生选的课程查询出来,显示学生的姓名,课程名称
select
s.name,c.name
from
t_student_course_relation sc
join
t_student s
on
s.id = sc.sid
join
t_course c
on
c.id = sc.cid
where
s.id = 2;