MySQL多表查询操作

文章目录

  • 多表查询
    • 1交叉连接:
    • 2满外联接
    • 3内连接
    • 4左外连接
    • 5右外连接
    • 6对比练习
      • 题目1:
    • 7自连接
      • 注意:

多表查询

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 
	whereon	
对比结论:mysql能识别Oracle中使用 = 连接的书写方法。

7自连接

查询员工、老板信息,显示: xxx的老板是xxx
分析:将一张emp表当成两张表看待:员工表、老板表(员工表的老板 是 老板表的员工)

  1. 先按照oracle语法写
select e.ename, b.ename
from emp e, emp b
where e.mgr = b.empno
  1. 完善显示格式concat
select concat( e.ename, ' 的老板是 ',  b.ename )
from emp e, emp b
where e.mgr = b.empno
  1. 显示king的老板
select concat( e.ename, ' 的老板是 ',  b.ename )
from emp e, emp b
where e.mgr = b.empno (+)
  1. 改用MySQL支持的SQL99语法
select concat( e.ename, ' 的老板是 ',  b.ename )
from emp e left outer join emp b
on e.mgr = b.empno ;
  1. 滤空修正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()函数也存在。

你可能感兴趣的:(MySQL,数据库,mysql,sql,oracle)