补:SQL99是一个SQL的标bai准,SQL是结构化查du询语言的简称,只是一种查询操作语言,zhiSQL99是其中一个标准,之前有daoSQL92,95等。主流的数据库SQL Server2000/2005,Oracle等都支持SQL95以后的了,SQL99和95的分别不是很大,和92分别就大,我只知道剩Access用SQL92了。
叉集,即笛卡尔集
select e.*, d.*
from emp e cross join dept d
无连接条件
任一边有值就会显示。
select e.*, d.*
from emp e full outer join dept d
on e.deptno=d.deptno
也可以省略outer关键字
只返回满足连接条件的数据(两边都有的才显示)。 对应等值连接
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
左边有值才显示。
select e.*, d.*
from emp e left outer join dept d
on e.deptno=d.deptno
也可以省略outer关键字
右边边有值才显示。
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的内容
查询员工信息,员工号,姓名,月薪,部门名称
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中使用 = 连接的书写方法。
查询员工、老板信息,显示: xxx的老板是xxx
分析:将一张emp表当成两张表看待:员工表、老板表(员工表的老板 是 老板表的员工)
select e.ename, b.ename
from emp e, emp b
where e.mgr = b.empno
select concat( e.ename, ' 的老板是 ', b.ename )
from emp e, emp b
where e.mgr = b.empno
select concat( e.ename, ' 的老板是 ', b.ename )
from emp e, emp b
where e.mgr = b.empno (+)
select concat( e.ename, ' 的老板是 ', b.ename )
from emp e left outer join emp b
on e.mgr = b.empno ;
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()函数也存在。