SQL基本CRUD

[sql] view plain copy
 
  1. --已知Oracle的Scott用户中提供了三个测试数据库表  
  2. --名称分别为dept,emp,salgrade。使用SQL语言完成一下操作  
  3.   
  4. --1,查询20号部门的所有员工信息:  
  5. SELECT *   
  6. FROM EMP E  
  7. WHERE E.DEPTNO = 20;   
  8.   
  9. --2,查询奖金(COMM)高于工资(SAL)的员工信息  
  10. SELECT *  
  11. FROM EMP  
  12. WHERE COMM > SAL;  
  13.   
  14. --3,查询奖金高于工资20%的员工信息  
  15. SELECT *  
  16. FROM EMP  
  17. WHERE COMM > SAL*0.2;  
  18.   
  19. --4,查询10号部门中工种为MANAGER和20号部门中  
  20. --工种为CLERK的员工的信息  
  21. SELECT *   
  22. FROM EMP E  
  23. WHERE (E.DEPTNO = 10 AND E.JOB = 'MANAGER')  
  24. OR (E.DEPTNO = 20 AND E.JOB = 'CLERK');  
  25.   
  26. --5,查询所有工种不是MANAGER和CLERK,且工资大于  
  27. --或等于2000的员工的详细信息  
  28. SELECT * FROM EMP  
  29. WHERE JOB NOT IN ('MANAGER','CLERK')  
  30. AND SAL >= 2000;  
  31.   
  32. --6,查询没有奖学金低于100的员工信息  
  33. SELECT *   
  34. FROM EMP   
  35. WHERE COMM IS NULL   
  36. OR COMM < 100;  
  37.   
  38. --7,查询员工工龄大于或等于10年的员工信息  
  39. SELECT *   
  40. FROM EMP  
  41. WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)/12 > 10;  
  42.   
  43. --8,查询员工信息,要求以首字母大写的方式显示  
  44. --所有员工的姓名  
  45. SELECT INITCAP(ENAME)   
  46. FROM EMP;  
  47. --  
  48. SELECT UPPER(SUBSTR(ENAME,1,1))||  
  49. LOWER(SUBSTR(ENAME,2))   
  50. FROM EMP;  
  51.   
  52. --9,查询在2月份入职的所有员工信息  
  53. SELECT *   
  54. FROM EMP  
  55. WHERE TO_CHAR(HIREDATE,'MM') = '02';  
  56.   
  57. --10,显示所有员工的姓名、入职的年份和月份  
  58. --按入职日期所在的月份排序,若月份相同则按  
  59. --入职的年份排序  
  60. SELECT ENAME,TO_CHAR(HIREDATE,'YYYY') YEAR,  
  61. TO_CHAR(HIREDATE,'MM') MONTH  
  62. FROM EMP  
  63. ORDER BY MONTH,YEAR  
  64.   
  65. --11,查询‘JONES’员工及所有其直接、  
  66. --间接下属员工的信息(递归算法)  
  67. SELECT E.*   
  68. FROM EMP E  
  69. START WITH ENAME = 'JONES'  
  70. CONNECT BY PRIOR EMPNO = MGR;  
  71.   
  72. --12,查询SCOTT员工及其直接、间接上级员工的信息  
  73. SELECT E.*  
  74. FROM EMP E  
  75. START WITH ENAME = 'SCOTT'  
  76. CONNECT BY PRIOR MGR = EMPNO;  
  77.   
  78. --13,查询从事同一种工作但不属于同一部门的员工信息  
  79. SELECT A.ENAME,A.JOB,A.DEPTNO,  
  80. B.ENAME,B.JOB,B.DEPTNO  
  81. FROM EMP A,EMP B  
  82. WHERE A.JOB = B.JOB AND A.DEPTNO != B.DEPTNO;  
  83.   
  84. --14,查询各个部门的详细信息以及部门人数、部门  
  85. --平均工资  
  86. SELECT D.DEPTNO,COUNT(E.EMPNO),AVG(E.SAL),  
  87. D.DNAME,D.LOC  
  88. FROM EMP E,DEPT D  
  89. WHERE E.DEPTNO = D.DEPTNO  
  90. GROUP BY D.DEPTNO,D.DNAME,D.LOC;  
  91.   
  92. --15,查询10号部门员工以及领导的信息  
  93. SELECT *  
  94. FROM EMP  
  95. WHERE EMPNO IN  
  96. (  
  97.       SELECT MGR   
  98.       FROM EMP  
  99.       WHERE DEPTNO = 10  
  100. )  
  101. OR DEPTNO = 10;  
  102.   
  103. --16,查询工资为某个部门平均工资的员工信息  
  104. SELECT *  
  105. FROM EMP  
  106. WHERE SAL IN  
  107. (  
  108.       SELECT AVG(SAL)  
  109.       FROM EMP  
  110.       GROUP BY DEPTNO  
  111. );  
  112.   
  113. --17,查询工资高于本部门平均工资的员工的信息  
  114. SELECT *   
  115. FROM EMP E1  
  116. WHERE SAL >   
  117. (  
  118.       SELECT AVG(SAL)  
  119.       FROM EMP E2  
  120.       WHERE E2.DEPTNO = E1.DEPTNO  
  121. );  
  122.   
  123. --18,查询工资高于本部们平均工资的员工的信息  
  124. SELECT E.*,A.AVGSAL  
  125. FROM EMP E,  
  126. (  
  127.      SELECT DEPTNO,AVG(SAL) AS AVGSAL  
  128.      FROM EMP  
  129.      GROUP BY DEPTNO  
  130. )A  
  131. WHERE A.DEPTNO = E.DEPTNO   
  132. AND E.SAL > A.AVGSAL;  
  133.   
  134. --19,统计各个工种的人数与平均工资  
  135. SELECT COUNT(*),E.JOB,AVG(E.SAL)  
  136. FROM EMP E  
  137. GROUP BY E.JOB;  
  138.   
  139. --20,查询所有员工入职以来的工作期限,用  
  140. --“**年**月**日”的形式表示  
  141. SELECT ENAME,TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)||  
  142. '年'||TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,HIREDATE),12))||  
  143. '月'||TRUNC(SYSDATE - ADD_MONTHS(HIREDATE,  
  144. MONTHS_BETWEEN(SYSDATE, HIREDATE)))||'日'  
  145. FROM EMP;  
  146.   
  147. --21,查询人数最多的部门信息  
  148. SELECT *   
  149. FROM DEPT  
  150. WHERE DEPTNO IN  
  151. (  
  152.       SELECT DEPTNO   
  153.       FROM   
  154.       (  
  155.              SELECT COUNT(*) COUNT,DEPTNO   
  156.              FROM EMP  
  157.              GROUP BY DEPTNO     
  158.       )  
  159.       WHERE COUNT IN  
  160.       (  
  161.              SELECT MAX(COUNT)   
  162.              FROM  
  163.              (  
  164.                     SELECT COUNT(*) COUNT,DEPTNO  
  165.                     FROM EMP   
  166.                     GROUP BY DEPTNO  
  167.              )  
  168.        )  
  169. );  
  170.   
  171. --22,以树状结构查询所有员工与领导  
  172. --之间的层次关系  
  173. SELECT SUBSTR(SYS_CONNECT_BY_PATH(ENAME,'->'),3),  
  174. LEVEL  
  175. FROM EMP  
  176. START WITH MGR IS NULL  
  177. CONNECT BY PRIOR EMPNO = MGR;  
  178.   
  179. --23,部门平均薪水最高的部门编号  
  180. SELECT *   
  181. FROM  
  182. (  
  183.        SELECT *   
  184.        AVG(SAL) AVGSAL,DEPTNO  
  185.        FROM EMP   
  186.        GROUP BY DEPTNO   
  187.        ORDER BY AVGSAL DESC  
  188. )  
  189. WHERE ROWNUM = 1;  
  190. --  
  191. SELECT DEPTNO, AVG(SAL)  
  192. FROM EMP   
  193. GROUP BY DEPTNO  
  194. HAVING AVG(SAL) =  
  195. (  
  196.        SELECT MAX(AVG(SAL)) AVGSAL  
  197.        FROM EMP   
  198.        GROUP BY DEPTNO  
  199. );  
  200.   
  201. --24,部门平均薪水最高的部门名称  
  202. SELECT D.*   
  203. FROM  DEPT D  
  204. WHERE DEPTNO IN  
  205. (  
  206.       SELECT DEPTNO   
  207.       FROM EMP   
  208.       GROUP BY DEPTNO  
  209.       HAVING AVG(SAL)=  
  210.       (  
  211.              SELECT MAX(AVG(SAL)) AVGSLA  
  212.              FROM EMP   
  213.              GROUP BY DEPTNO  
  214.       )  
  215. );  
  216.   
  217. --25,平均薪水最低的部门名称  
  218. SELECT D.DNAME   
  219. FROM  DEPT D  
  220. WHERE DEPTNO IN  
  221. (  
  222.       SELECT DEPTNO   
  223.       FROM EMP   
  224.       GROUP BY DEPTNO  
  225.       HAVING AVG(SAL)=  
  226.       (  
  227.              SELECT MIN(AVG(SAL)) AVGSLA  
  228.              FROM EMP   
  229.              GROUP BY DEPTNO  
  230.       )  
  231. );  
  232.   
  233. --26,平均薪水等级最低的部门的部门名称  
  234. SELECT D.DNAME  
  235. FROM DEPT D  
  236. WHERE D.DEPTNO IN  
  237. (  
  238.       SELECT A.DEPTNO   
  239.       FROM  
  240.       (  
  241.              SELECT E.DEPTNO  
  242.              FROM EMP E, SALGRADE S  
  243.              GROUP BY E.DEPTNO   
  244.              ORDER BY AVG(S.GRADE)  
  245.       )A  
  246.       WHERE ROWNUM = 1  
  247. );  
  248.   
  249. --27,部门经理人中,薪水最低的部门名称  
  250. SELECT DNAME   
  251. FROM DEPT  
  252. WHERE DEPTNO =  
  253. (  
  254.       SELECT DEPTNO   
  255.       FROM   
  256.       (  
  257.              SELECT DEPTNO   
  258.              FORM EMP   
  259.              WHERE JOB = 'MANAGER'  
  260.              GROUP BY DEPTNO  
  261.              ORDER BY MIN(SAL)  
  262.       )  
  263.       WHERE ROWNUM = 1  
  264. );  
  265.   
  266. --28,比普通员工的最高薪水还要高的经理人名称  
  267. SELECT ENAME   
  268. FROM EMP   
  269. WHERE SAL >  
  270. (  
  271.       SELECT MAX(SAL)  
  272.       FROM EMP  
  273.       WHERE JOB NOT IN   
  274.       ('MANAGER','PRESIDENT')  
  275. )  
  276. AND JOB = 'MANAGER'  
  277. OR JOB = 'PRESIDENT';  
  278.   
  279. --29,查询所有员工工资大于1000的部门的信息  
  280. SELECT *   
  281. FROM DEPT  
  282. WHERE  
  283. DEPTNO IN  
  284. (  
  285.        SELECT DEPTNO   
  286.        FROM EMP  
  287.        WHERE DEPTNO NOT IN  
  288.        (  
  289.          SELECT DISTINCT DEPTNO  
  290.          FROM EMP  
  291.          WHERE SAL < 1000  
  292.        )  
  293. );  
  294.   
  295. --30,查询所有员工工资都大于1000的部门的信息  
  296. --以及员工信息  
  297. SELECT *   
  298. FROM EMP E JOIN DEPT D  
  299. ON D.DEPTNO = E.DEPTNO  
  300. AND D.DEPTNO IN  
  301. (  
  302.     SELECT DEPTNO   
  303.     FROM EMP  
  304.     WHERE DEPTNO NOT IN  
  305.     (  
  306.           SELECT DISTINCT DEPTNO  
  307.           FROM EMP  
  308.           WHERE SAL < 1000  
  309.     )       
  310. );  
  311.   
  312. --31,查询所有工资都在900-3000之间的员工  
  313. --所在部门的员工信息  
  314. SELECT *  
  315. FROM DEPT  
  316. WHERE DEPTNO NOT IN  
  317. (  
  318.       SELECT DEPTNO  
  319.       FROM EMP  
  320.       WHERE SAL NOT BETWEEN 900 AND 30000  
  321. );  
  322.   
  323. --32,查询所有工资都在900-3000之间的  
  324. --员工所在部门的员工信息  
  325. SELECT *   
  326. FROM EMP A  
  327. WHERE A.DEPTNO IN  
  328. (  
  329.       SELECT DISTINCT E.DEPTNO   
  330.       FROM EMP E  
  331.       WHERE E.SAL BETWEEN 900 AND 3000  
  332. );  
  333.   
  334. --33,查询每个员工的领导所在部门的信息  
  335. SELECT D.*  
  336. FROM DEPT D  
  337. WHERE D.DEPTNO IN  
  338. (  
  339.       SELECT DISTINCT E2.DEPTNO  
  340.       FROM EMP E1,EMP E2  
  341.       WHERE E1.EMPNO = E2.MGR  
  342. );  
  343.   
  344. --34,查询30号部门中工资排序前3名的员工信息  
  345. SELECT *   
  346. FROM   
  347. (  
  348.        SELECT SAL   
  349.        FROM EMP  
  350.        WHERE DEPTNO = 30   
  351.        ORDER BY SAL DESC  
  352. )E  
  353. WHERE ROWNUM < 4;  
  354.   
  355. --35,查询工作等级为2级,1985年以后入职的工作  
  356. --地点为DALLAS的员工编号、姓名和工资  
  357. SELECT E.ENAME,E.EMPNO,E.SAL  
  358. FROM EMP E,SALGRADE S,DEPT D  
  359. WHERE (E.SAL BETWEEN S.LOSAL AND S.HISAL)  
  360. AND S.GRADE = 2  
  361. AND TO_CHAR(E.HIREDATE,'YYYY') > 1985  
  362. AND E.DEPTNO = D.DEPTNO  
  363. AND D.LOC = 'DALLAS';  
  364.   
  365. --36,将各部门员工的工资修改为该员工所在部门  
  366. --平均工资加1000  
  367. UPDATE EMP E   
  368. SET SAL = 1000 +   
  369. (  
  370.     SELECT AVG(SAL)  
  371.     FROM EMP  
  372.     WHERE DEPTNO = E.DEPTNO  
  373. );  
  374.   
  375. --37,删除重复部门,只留下一项  
  376. DELECT FROM DEPT D  
  377. WHERE ROWID !=  
  378. (  
  379.       SELECT MIN(ROWID)  
  380.       FROM DEPT   
  381.       WHERE DNAME = D.DNAME  
  382.       AND LOC = D.LOC  
  383. );  
  384.   
  385. --38,更新员工工资为它的主管工资,奖金  
  386. UPDATE EMP E  
  387. SET SAL =   
  388. (  
  389.     SELECT SAL   
  390.     FROM EMP  
  391.     WHERE EMPNO = E.MGR  
  392. ),  
  393. COMM =  
  394. (  
  395.      SELECT COMM   
  396.      FORM EMP   
  397.      WHERE  
  398.      EMPNO = E.MGR  
  399. );  
  400. --  
  401. UPDATE EMP E  
  402. SET (SAL,COMM) =   
  403. (  
  404.     SELECT SAL, COMM  
  405.     FROM EMP  
  406.     WHERE EMPNO = E.MGR  
  407. );  
  408.   
  409. --某大学图书馆为了更好管理图书,使用Oracle  
  410. --数据库建立了三个表:  
  411. --CARD 借书卡表:CNO(卡号),NAME(姓名),  
  412. --CLASS(班级)  
  413. --BOOKS图书表:BNO(书号),BNAME(书名),  
  414. --AUTHOR(作者),PRICE(单价),QUANTITY(库存册数)  
  415. --BORROW结束记录表:CNO(借书卡号),BNO(书号),  
  416. --RDATE(还书日期)  
  417. --备注:限定每人每种书只能借一本:库存册数  
  418. --随借书、还书而改变  
  419.   
  420. --39,写出建立BORROW表的SQL语句,要求定义  
  421. --主码完整性约束  
  422. CREATE TABLE BORROW  
  423. (  
  424.        CNO NUMBER REFERENCES CARD(CNO),  
  425.        BNO NUMBER REFERENCES BOOKS(BNO),  
  426.        RDATE DATE,  
  427.        PRIMARY KEY(CNO,BNO)  
  428. );  
  429.   
  430. --40,假定在建BOOKS表时没有定义主码,写出  
  431. --BOOKS表追加定义主码的语句  
  432. ALTER TABLE BOOKS   
  433. ADD PRIMARY KEY(BNO);  
  434.   
  435. --41,将CARD表的NAME最大列宽增加到10个字符  
  436. --(假定原为6个字符)  
  437. ALTER TABLE CARD   
  438. MODIFY NAME VARCHAR2(10);  
  439.   
  440. --42,为表增加一列NAME(系名),可变长,  
  441. --最大20个字符  
  442. ALTER TABLE CARD   
  443. ADD 系名 VARCHAR2(20);  
  444.   
  445. --43,找出借书超过5本的读者,输出借书  
  446. --卡号所借图书册数  
  447. SELECT CNO,COUNT(*)  
  448. FROM BORROW  
  449. GROUP BY CNO   
  450. HAVING COUNT(*) > 5;  
  451.   
  452. --44,查询借阅了“水浒”一书的读者,输出姓名班级  
  453. SELECT NAME, CLASS   
  454. FROM CARD  
  455. WHERE CNO IN  
  456. (  
  457.       SELECT CNO   
  458.       FROM BORROW BW, BOOKS BK  
  459.       WHERE BW.BNO = BK.BNO   
  460.       AND BK.NAME = '水浒'  
  461. );  
  462.   
  463. --45,查询过期未还图书,输出借阅者(卡号)  
  464. --书号及还书日期  
  465. SELECT *   
  466. FROM BORROW   
  467. WHERE RDATE < SYSDATE;  
  468.   
  469. --46,查询书名包括’网络‘关键词的图书,输出  
  470. --书号、书名、作者  
  471. SELECT BNO, BNAME,AUTHOR  
  472. FORM BOOKS  
  473. WHERE BNAME LIKE '%网络%';  
  474.   
  475. --47,查询现有图书中价格最高的图书,输出  
  476. --书名及作者  
  477. SELECT BNAME,AUTHOR   
  478. FROM BOOKS  
  479. WHERE PRICE =  
  480. (  
  481.       SELECT MAX(PRICE)  
  482.       FROM BOOKS  
  483. );  
  484.   
  485. --48,查询当前借了“计算方法”但没有借“计算方法  
  486. --习题集“的作者,输出其借书卡号,并按卡号  
  487. --降序排序输出  
  488. SELECT A.CNO  
  489. FROM BORROW A, BOOKS B  
  490. WHERE A.BNO = B.BNO   
  491. AND B.BNAME = '计算方法'  
  492. AND A.CNO NOT IN  
  493. (  
  494.     SELECT AA.CNO   
  495.     FORM BORROW AA,BOOKS BB  
  496.     WHERE AA.BNO = BB.BNO   
  497.     AND BB.BNAME = '计算方法习题集'  
  498. )  
  499. ORDER BY A.CNO DESC;  
  500.   
  501. --49,查询当前同时借有”计算方法“和组合”组合数学“  
  502. --两本数的作者,输出其借书卡号,并按卡号升序排列输出  
  503. SELECT DISTINCT A.CNO   
  504. FROM BORROW A,BOOKS B  
  505. WHERE A.BNO = B.BNO  
  506. AND B.BNAME IN  
  507. ('计算方法','组合数学')  
  508. ORDER BY A.CNO;  
  509.   
  510. --50,将”c01“班同学所借图书的还期都延长一周  
  511. UPDATE BORROW   
  512. SET RDATE = RDATE + 7  
  513. WHERE CNO IN  
  514. (  
  515.       SELECT DISTINCT CNO   
  516.       FROM CARD  
  517.       WHERE CLASS = 'C01'  
  518. );  
  519.   
  520. --51,从BOOKS表中删除当前无人借阅图书记录  
  521. DELETE FROM BOOKS  
  522. BNO NOT IN  
  523. (  
  524.     SELECT DISTINCT BK, BNO   
  525.     FROM BORROW BR,BOOKS BK  
  526.     WHERE BR.BNO = BK.BNO  
  527. );  
  528.   
  529. --52,如果经常按书名查询图书信息,  
  530. --请建立合适的索引  
  531. CREATE INDEX INX_BOOKS_BNAME   
  532. ON BOOKS(BNAME);   
  533.   
  534. --52,在BORROW表上建立一个触发器,完成如下功能:  
  535. --如果读者借阅的书名是”数据库技术应用“  
  536. --就将该读者的借阅记录保存在BORROW_SAVE表中  
  537. --(注:ORROW_SAVE表结构同BORROW表)  
  538. CREATE TRIGGER TR_SAVE   
  539. ON BORROWFOR INSERT,UPDATE AS IF  
  540. @@ROW COUNT > 0  
  541. INSERT BORROW_SAVE   
  542. SELECT I.*   
  543. FROM INSERTED I,BOOKS  
  544. WHERE I.BNO = B.BNO   
  545. AND B.BNAME = N'数据库应用技术';  
  546.   
  547. --53,建立一个视图,显示”01班学生的借书信息:  
  548. --(只要求显示姓名和书名)  
  549. CREATE VIEW V_VIEWASSELECT   
  550. A.NAME,B.BNAME  
  551. FROM BORROW AB,CARD A, BOOKS B  
  552. WHERE AB.CNO = A.CNO  
  553. AND AB.BNO = B.BNO   
  554. AND A.CLASS = N'01班'  
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值