sql 怎么才能学好
1.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级答案:SELECTe.empno,e.ename,d.dname,m.ename,s.grade...
1. 列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级
答案:
SELECT e.empno,e.ename,d.dname,m.ename,s.grade
FROM emp e,dept d,emp m,salgrade s
WHERE sal>(SELECT AVG(sal) FROM emp) AND e.mgr=m.empno AND d.deptno=e.deptno(+) AND e.sal BETWEEN s.losal AND s.hisal ;
怎么思考这样的题? 展开
答案:
SELECT e.empno,e.ename,d.dname,m.ename,s.grade
FROM emp e,dept d,emp m,salgrade s
WHERE sal>(SELECT AVG(sal) FROM emp) AND e.mgr=m.empno AND d.deptno=e.deptno(+) AND e.sal BETWEEN s.losal AND s.hisal ;
怎么思考这样的题? 展开
3个回答
展开全部
首先你这语句不正确:sal>(SELECT AVG(sal) FROM emp) 应该成e.sal.....,再你这结果有遗漏,少了一条数据。下面是初学者的理解sql和写sql的过程:
这个你可以这样理解:
首先是将所有用到的表都找出来:员工emp, 部门(dept)和工资等级表(salgrade)
其次:将这些表进行联结,并找出所需字段
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e,dept d, emp m
WHERE e.deptno(+)= d.deptno AND m.empno(+) = e.mgr;
--工资等级表(salgrade)无法联结,先放下,并选择emp为基表,因为要领导,所以需要自联结,此处应注意还有一个人没有领导,所以采用左联结,所以你原始的语句不完整
此时思考:薪金高于公司平均薪金的所有员工,则添加sal>(SELECT AVG(sal) FROM emp)
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e, dept d, emp m, salgrade s
WHERE e.deptno(+) = d.deptno AND m.empno(+) = e.mgr
AND e.sal>(SELECT AVG(sal) FROM emp);
再思考:公司的工资等级,则添加:e.sal BETWEEN s.losal AND s.hisal 条件过滤
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e, dept d, emp m, salgrade s
WHERE e.deptno(+) = d.deptno AND m.empno(+) = e.mgr
AND e.sal>(SELECT AVG(sal) FROM emp)
AND e.sal BETWEEN s.losal AND s.hisal;
至此则检查,看看有没有遗漏的,结束。
其实写SQL,初学者不仅仅要多练,还应该掌握一些方法和好的思维。其中比较好的方法是将SQL分解(特别是复杂的sql),就像上面的一样,逐一理解,逐层来写,这样久而久之就形成了一种好的逻辑思维,写起来就特别的顺畅,有逻辑,而且有时这样写出的语句往往是比较好的。另一个好的思维就是集合的思想,sql语句要有集合的思想(也就是数学中的集合),摒弃所谓单纯的面向对象和过程的思维。你可以去找找这方面的书籍,好像有一本叫SQL的沉思还不错,记不清了。
简单的SQL也许这些对你没有帮助,但是复杂的SQL,这是很好的解决思路。一不小心就说了这么多。
这个你可以这样理解:
首先是将所有用到的表都找出来:员工emp, 部门(dept)和工资等级表(salgrade)
其次:将这些表进行联结,并找出所需字段
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e,dept d, emp m
WHERE e.deptno(+)= d.deptno AND m.empno(+) = e.mgr;
--工资等级表(salgrade)无法联结,先放下,并选择emp为基表,因为要领导,所以需要自联结,此处应注意还有一个人没有领导,所以采用左联结,所以你原始的语句不完整
此时思考:薪金高于公司平均薪金的所有员工,则添加sal>(SELECT AVG(sal) FROM emp)
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e, dept d, emp m, salgrade s
WHERE e.deptno(+) = d.deptno AND m.empno(+) = e.mgr
AND e.sal>(SELECT AVG(sal) FROM emp);
再思考:公司的工资等级,则添加:e.sal BETWEEN s.losal AND s.hisal 条件过滤
SELECT e.empno,e.ename,d.dname,m.ename
FROM emp e, dept d, emp m, salgrade s
WHERE e.deptno(+) = d.deptno AND m.empno(+) = e.mgr
AND e.sal>(SELECT AVG(sal) FROM emp)
AND e.sal BETWEEN s.losal AND s.hisal;
至此则检查,看看有没有遗漏的,结束。
其实写SQL,初学者不仅仅要多练,还应该掌握一些方法和好的思维。其中比较好的方法是将SQL分解(特别是复杂的sql),就像上面的一样,逐一理解,逐层来写,这样久而久之就形成了一种好的逻辑思维,写起来就特别的顺畅,有逻辑,而且有时这样写出的语句往往是比较好的。另一个好的思维就是集合的思想,sql语句要有集合的思想(也就是数学中的集合),摒弃所谓单纯的面向对象和过程的思维。你可以去找找这方面的书籍,好像有一本叫SQL的沉思还不错,记不清了。
简单的SQL也许这些对你没有帮助,但是复杂的SQL,这是很好的解决思路。一不小心就说了这么多。
展开全部
我的经验是学习sql肯定是练习第一,而且主要是练习select,这个是基础的基础,几乎所有的sql语句都会用到select,至于书我是没发现什么主打练习的教材,还是自己多设计一些练习吧,比如oracle就打开scott用户就可以做练习了
希望能解决您的问题。
希望能解决您的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主要你的语句在多个表里面,不然没这样复杂的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询