SQL回炉之二:多表连接


1.子表在WHERE里

--工资高于平均工资
SELECT ename,sal
FROM emp
WHERE sal > (SELECT avg(sal) FROM emp);


2.子表是分组后的数据

--每组工资最高的人
SELECT emp.ename,emp.deptno,emp.empno
FROM emp
JOIN (SELECT max(sal) m_s,deptno m_d FROM emp GROUP BY deptno) max
ON (emp.sal = max.m_s AND emp.deptno = max.m_d);

--下边这种是错的,因为凡是等于此值得就会筛选出来,不论在哪组
--SELECT ename,deptno,empno
--FROM emp,
--(SELECT max(sal) max_sal FROM emp GROUP BY deptno)max
--WHERE sal IN max_sal;


3.用JOIN_ON 代替多表连接时WHERE的指定

SQL99的标准这个原来没学过,目的是把连接语句从WHERE中剔除
WHERE中只有数据过滤

--各部门平均工资等级
SELECT grade,avg.a_d
FROM salgrade
JOIN (SELECT avg(sal) a_s,deptno a_d FROM emp GROUP BY deptno)avg
ON (avg.a_s BETWEEN salgrade.losal AND salgrade.hisal);

--用WHERE方法,1:
SELECT e1.empno ,e1.ename ,e1.mgr ,e2.ename
FROM emp e1,emp e2
WHERE e1.mgr = e2.empno AND e1.empno = 7369 ;

--WHERE方法,2:避免笛卡尔积
SELECT * 
FROM emp,dept
WHERE (emp.deptno = dept.deptno) AND (emp.empno = 7902);

--JOIN_ON_USING
SELECT * 
FROM emp
JOIN dept
ON emp.deptno = dept.deptno --或不用ON,用USING deptno
WHERE emp.empno = 7902;

--三张表连接,多个JOIN
SELECT ename,dname,grade
FROM emp
JOIN dept ON (emp.deptno = dept.deptno)
JOIN salgrade ON (emp.sal BETWEEN salgrade.losal and salgrade.hisal)
WHERE emp.empno < 10000;


4.外连接(左、右、全)

连接时用LEFT JOIN、RIGHT JOIN或者FULL JOIN,
把左边、右边的表的独有项目显示出来

SELECT e1.ename,e2.ename
FROM emp e1 
LEFT JOIN emp e2 --RIGHT 或者 FULL
ON e1.mgr = e2.empno;






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值