SQL 连接

查询 :子查询(嵌套查询)
 


连接查询

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;

 

原文地址:https://www.cnblogs.com/2016-cxp/p/8654853.html