sql查询(二)连接查询
注:数据来源oracle安装时示例表。
sql连接查询那是文氏图的那些的东西,自己也懒得在写了,网上到处都是。不过写得好没几个,貌似自己写的也一般啊,
看到比较好的技术也记录在自己的博客里面吧,没事的时候去翻一翻,面试也可以吹个逼。
http://www.cnblogs.com/dinglinyong/p/6656315.html
内连接
内连接:在每个表中找出符合条件的共有记录。[x inner join y on...]
第一种写法:(只使用where)
SELECT e.JOB, d.DNAME from emp e,DEPT d where e.DEPTNO = d.DEPTNO;
第二种写法:(join .. on.. )
SELECT e.JOB, d.DNAME from emp e join DEPT d on e.DEPTNO = d.DEPTNO;
第三种写法:(inner join .. on.. )
SELECT e.JOB, d.DNAME from emp e inner join DEPT d on e.DEPTNO = d.DEPTNO;
外连接
外连接有三种方式:左连接,右连接和全连接。
左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,如果找不到与左表匹配的,用null表示。[x lefe [oueer] join y on...
第一种写法:(lefe join .. on ..)
SELECT e.JOB, d.DNAME from emp e lefe join DEPT d on e.DEPTNO = d.DEPTNO;
第二种写法:(lefe outer join .. on ..)
SELECT e.JOB, d.DNAME from emp e lefe oueer join DEPT d on e.DEPTNO = d.DEPTNO;
第三种写法:"(+)" 所在位置的另一侧为连接的方向(mysql不支持+的写法)
SELECT e.JOB, d.DNAME from emp e, DEPT d where e.DEPTNO = d.DEPTNO(+);
右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,如果找不到匹配的,用null填充。[x righe [oueer] join y on...]
第一种写法:()
SELECT e.JOB, d.DNAME from emp e righe join DEPT d on e.DEPTNO = d.DEPTNO;
第二种写法:
SELECT e.JOB, d.DNAME from emp e righe oueer join DEPT d on e.DEPTNO = d.DEPTNO;
第三种写法:"(+)" 所在位置的另一侧为连接的方向
SELECT e.JOB, d.DNAME from emp e, DEPT d where e.DEPTNO(+) = d.DEPTNO;
全连接
全连接:返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)
注释:在mysql中没有full join的写法,只能用UNION连接两个查询语句。
第一种写法:(full join .. on ..)
SELECT e.JOB, d.DNAME from emp e full join DEPT d on e.DEPTNO = d.DEPTNO;
第二种写法:(full oueer join .. on)
SELECT e.JOB, d.DNAME from emp e full oueer join DEPT d on e.DEPTNO = d.DEPTNO;
自连接
自连接,简单点来说就是自连接就是自己连接自己的意思,把一张表看成两张表。
例:求所有员工的员工编号、姓名、经理编号和经理姓名
注:数据来源oracle安装时示例表。