[推荐]ORACLE SQL:
经典查询练手第二篇(不懂装懂,永世饭桶!)
——通过知识共享树立个人品牌。
本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!
本篇相对上篇来说比较简单,如果你对本篇的各测试做得不称心如意的话,我想你是时候给自己充下电了!
本文使用的实例表结构与表的数据如下:
scott.emp员工表结构如下:
NameTypeNullable Default Comments
-- -----------------------------------------
EMPNO NUMBER ( 4 )员工编号
ENAME VARCHAR2 ( 10 )Y员工姓名
JOB VARCHAR2 ( 9 )Y职位
MGR NUMBER ( 4 )Y上级编号
HIREDATEDATEY雇佣日期
SAL NUMBER ( 7 , 2 )Y薪金
COMM NUMBER ( 7 , 2 )Y佣金
DEPTNO NUMBER ( 2 )Y所在部门编号
-- 提示:工资=薪金+佣金
scott.dept部门表
NameTypeNullable Default Comments
-- ---------------------------------------
DEPTNO NUMBER ( 3 )部门编号
DNAME VARCHAR2 ( 14 )Y部门名称
LOC VARCHAR2 ( 13 )Y地点
scott.emp表的现有数据如下:
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
----------------------------------------------------------------
7369SMITHCLERK79021980-12-17800.0020
7499ALLENSALESMAN76981981-2-201600.00300.0030
7521WARDSALESMAN76981981-2-221250.00500.0030
7566JONESMANAGER78391981-4-22975.0020
7654MARTINSALESMAN76981981-9-281250.001400.0030
7698BLAKEMANAGER78391981-5-12850.0030
7782CLARKMANAGER78391981-6-92450.0010
7788SCOTTANALYST75661987-4-194000.0020
7839KINGPRESIDENT1981-11-175000.0010
7844TURNERSALESMAN76981981-9-81500.000.0030
7876ADAMSCLERK77881987-5-231100.0020
7900JAMESCLERK76981981-12-3950.0030
7902FORDANALYST75661981-12-33000.0020
7934MILLERCLERK77821982-1-231300.0010
102EricHuDeveloper14552011-5-2615500.0014.0010
104huyongPM14552011-5-2615500.0014.0010
105WANGJINGDeveloper14552011-5-2615500.0014.0010
17rowsselected
Scott.dept表的现有数据如下:
DEPTNODNAMELOC
---------------------------------
110信息科海口
10ACCOUNTINGNEWYORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
5050abc50def
60DeveloperHaiKou
7rowsselected
用SQL完成以下问题列表:
2.找出EMP表员工名字中含有A和N的员工姓名。
3.找出所有有佣金的员工,列出姓名、工资、佣金,显示结果按工资从小到大,佣金从大到小。
4.列出部门编号为20的所有职位。
5.列出不属于SALES的部门。
6.显示工资不在1000到1500之间的员工信息:名字、工资,按工资从大到小排序。
7.显示职位为MANAGER和SALESMAN,年薪在15000和20000之间的员工的信息:名字、职位、年薪。
8.说明以下两条SQL语句的输出结果:
SELECTEMPNO,COMMFROMEMPWHERECOMMISNULL;
SELECTEMPNO,COMMFROMEMPWHERECOMM=NULL;
9.让SELECT语句的输出结果为
SELECT*FROMSALGRADE;
SELECT*FROMBONUS;
SELECT*FROMEMP;
SELECT*FROMDEPT;
……
列出当前用户有多少张数据表,结果集中存在多少条记录。
10.判断SELECTENAME,SALFROMEMPWHERESAL>'1500'是否抱错,为什么?
各试题解答如下(欢迎大家指出不同的方法或建议!):
SQL>SELECTENAMEFROMSCOTT.EMPWHEREENAMELIKE'__A%';
ENAME
----------
ADAMS
BLAKE
CLARK
-------2.找出EMP表员工名字中含有A和N的员工姓名。----------
SQL>SELECTENAMEFROMSCOTT.EMPWHEREENAMELIKE'%A%'ANDENAMELIKE'%N%';
ENAME
----------
ALLEN
MARTIN
WANGJING
--------或--------
SQL>SELECTENAMEFROMSCOTT.EMPWHEREENAMELIKE'%A%N%';
ENAME
----------
ALLEN
MARTIN
WANGJING
/*--------3.找出所有有佣金的员工,列出姓名、工资、佣金,显示结果按工资从小到大,
佣金从大到小。----------*/
SQL>SELECTENAME,SAL+COMMASWAGE,COMM
2FROMSCOTT.EMP
3ORDERBYWAGE,COMMDESC;
ENAMEWAGECOMM
-----------------------------
TURNER15000.00
WARD1750500.00
ALLEN1900300.00
MARTIN26501400.00
EricHu551414.00
WANGJING551414.00
huyong551414.00
SMITH
JONES
JAMES
MILLER
FORD
ADAMS
BLAKE
CLARK
SCOTT
KING
17rowsselected
-------4.列出部门编号为20的所有职位。----------
SQL>SELECTDISTINCTJOBFROMEMPWHEREDEPTNO=20;
JOB
---------
ANALYST
CLERK
MANAGER
-------5.列出不属于SALES的部门。----------
SQL>SELECTDISTINCT*FROMSCOTT.DEPTWHEREDNAME<>'SALES';
DEPTNODNAMELOC
---------------------------------
10ACCOUNTINGNEWYORK
20RESEARCHDALLAS
40OPERATIONSBOSTON
5050abc50def
60DeveloperHaiKou
110信息科海口
6rowsselected
--或者:
SQL>SELECTDISTINCT*FROMSCOTT.DEPTWHEREDNAME!='SALES';
SQL>SELECTDISTINCT*FROMSCOTT.DEPTWHEREDNAMENOTIN('SALES');
SQL>SELECTDISTINCT*FROMSCOTT.DEPTWHEREDNAMENOTLIKE'SALES';
---6.显示工资不在1000到1500之间的员工信息:名字、工资,按工资从大到小排序。---------
SQL>SELECTENAME,SAL+COMMASWAGEFROMSCOTT.EMP
2WHERESAL+COMMNOTBETWEEN1000AND1500
3ORDERBYWAGEDESC;
ENAMEWAGE
--------------------
EricHu5514
huyong5514
WANGJING5514
MARTIN2650
ALLEN1900
WARD1750
6rowsselected
--或者
SQL>SELECTENAME,SAL+COMMASWAGEFROMSCOTT.EMP
2WHERESAL+COMM<1000ORSAL+COMM>1500
3ORDERBYWAGEDESC;
ENAMEWAGE
--------------------
EricHu5514
huyong5514
WANGJING5514
MARTIN2650
ALLEN1900
WARD1750
6rowsselected
/*-----7.显示职位为MANAGER和SALESMAN,年薪在15000和20000之间的员工的信息:名字、职位、年薪。----------*/
SQL>SELECTENAME姓名,JOB职位,(SAL+COMM)*12AS年薪
2FROMSCOTT.EMP
3WHERE(SAL+COMM)*12BETWEEN15000AND20000
4ANDJOBIN('MANAGER','SALESMAN');
姓名职位年薪
-----------------------------
TURNERSALESMAN18000
/*-----8.说明以下两条SQL语句的输出结果:
SELECTEMPNO,COMMFROMEMPWHERECOMMISNULL;
SELECTEMPNO,COMMFROMEMPWHERECOMM=NULL;
----------*/
SQL>SELECTEMPNO,COMMFROMEMPWHERECOMMISNULL;
EMPNOCOMM
--------------
7369
7566
7698
7782
7788
7839
7876
7900
7902
7934
10rowsselected
---------------------------------------------------------------
SQL>SELECTEMPNO,COMMFROMEMPWHERECOMM=NULL;
EMPNOCOMM
--------------
--说明:ISNULL是判断某个字段是否为空,为空并不等价于为空字符串或为数字0;
--而=NULL是判断某个值是否等于NULL,NULL=NULL和NULL<>NULL都为FALSE。
/*-----9.让SELECT语句的输出结果为
SELECT*FROMSALGRADE;
SELECT*FROMBONUS;
SELECT*FROMEMP;
SELECT*FROMDEPT;
……
列出当前用户有多少张数据表,结果集中存在多少条记录。
----------*/
SQL>SELECT'SELECT*FROM'||TABLE_NAME||';'FROMUSER_TABLES;
'SELECT*FROM'||TABLE_NAME||';'
---------------------------------------------
SELECT*FROMBONUS;
SELECT*FROMEMP;
SELECT*FROMDEPT;
--......等等,在此不列出。
---10.语句SELECTENAME,SALFROMEMPWHERESAL>'1500'是否抱错?---------
SQL>SELECTENAME,SALFROMEMPWHERESAL>'1500';
ENAMESAL
-------------------
ALLEN1600.00
JONES2975.00
BLAKE2850.00
CLARK2450.00
SCOTT4000.00
KING5000.00
FORD3000.00
EricHu5500.00
huyong5500.00
WANGJING5500.00
10rowsselected
SQL>SELECTENAME,SALFROMEMPWHERESAL>1500;
ENAMESAL
-------------------
ALLEN1600.00
JONES2975.00
BLAKE2850.00
CLARK2450.00
SCOTT4000.00
KING5000.00
FORD3000.00
EricHu5500.00
huyong5500.00
WANGJING5500.00
10rowsselected
--说明不会抱错,这儿存在隐式数据类型的。
© 2011 EricHu
原创作品,转贴请注明作者和出处,留此信息。
------------------------------------------------
cnBlobs:http://www.cnblogs.com/huyong/
优快云:http://blog.youkuaiyun.com/chinahuyong
作者:EricHu(DB、C/S、B/S、WebService、WCF、PM等)
出处:http://www.cnblogs.com/huyong/
Q Q:80368704 E-Mail: 80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)