多表查询
补:SQL99是一个SQL的标bai准,SQL是结构化查du询语言的简称,只是一种查询操作语言,zhiSQL99是其中一个标准,之前有daoSQL92,95等。主流的数据库SQL Server2000/2005,Oracle等都支持SQL95以后的了,SQL99和95的分别不是很大,和92分别就大,我只知道剩Access用SQL92了。
1交叉连接:
叉集,即笛卡尔集 select e.*, d.* from emp e cross join dept d 无连接条件
2满外联接
任一边有值就会显示。 select e.*, d.* from emp e full outer join dept d on e.deptno=d.deptno 也可以省略outer关键字
3内连接
只返回满足连接条件的数据(两边都有的才显示)。 对应等值连接 select e.*, d.* from emp e inner join dept d on e.deptno=d.deptno 也可以省略inner关键字。 对应Oracle写法: select e.*, d.* from emp e , dept d where e.deptno=d.deptno
4左外连接
左边有值才显示。 select e.*, d.* from emp e left outer join dept d on e.deptno=d.deptno 也可以省略outer关键字
5右外连接
右边边有值才显示。 select e.*, d.* from emp e right outer join dept d on e.deptno=d.deptno 也可以省略outer关键字 【注意】SQL99中,外链接取值与关系表达式=号左右位置无关。取值跟from后表的书写顺序有关。
“xxx left outer join yyy” 则为取出xxx的内容。
“xxx right outer join yyy”则为取出yyy的内容
6对比练习
题目1:
查询员工信息,员工号,姓名,月薪,部门名称
select ... from emp e, dept d where e.deptno = d.deptno; Oracle实现: select e.deptno, e.ename, e.sal, d.dname from emp e, dept d where e.deptno = d.deptno SQL99实现: select e.deptno, e.ename, e.sal, d.dname from emp e inner join dept d on e.deptno = d.deptno 对比记忆规律: “,” → [inner] join where → on 对比结论:mysql能识别Oracle中使用 = 连接的书写方法。
7自连接
查询员工、老板信息,显示: xxx的老板是xxx
分析:将一张emp表当成两张表看待:员工表、老板表(员工表的老板 是 老板表的员工)
- 先按照oracle语法写
select e.ename, b.ename from emp e, emp b where e.mgr = b.empno
- 完善显示格式concat
select concat( e.ename, ' 的老板是 ', b.ename ) from emp e, emp b where e.mgr = b.empno
- 显示king的老板
select concat( e.ename, ' 的老板是 ', b.ename ) from emp e, emp b where e.mgr = b.empno (+)
- 改用MySQL支持的SQL99语法
select concat( e.ename, ' 的老板是 ', b.ename ) from emp e left outer join emp b on e.mgr = b.empno ;
- 滤空修正nvl
select concat( e.ename, ' 的老板是 ', nvl(b.ename, '他自己' ) ) from emp e left outer join emp b on e.mgr = b.empno ;
结论 nvl 在mysql下不能使用: ERROR 1305 (42000): FUNCTION mydb61.nvl does not exist
6. 滤空修正 ifnull
select concat( e.ename, ' 的老板是 ', ifnull(b.ename, '他自己' ) ) from emp e left outer join emp b on e.mgr = b.empno ;
注意:
Oracle中有一个通用函数,与MYSQL中的ifnull函数名字相近:
nullif:如nullif(a, b) 当 a = b 时返回null, 不相等的时候返回a值。nullif(‘L9,999.99’, ‘L9,999.99’)
mysql中nullif()函数也存在。