• 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班'  
     
     
  • 相关阅读:
    Leetcode 647 回文子串
    计算机专业课程——答案搜集
    Centos搭建go环境以及go入门
    android studio实现圆角的button
    关于区块链的认识和看法
    LeetCode 96. 不同的二叉搜索树
    LeetCode 120. Triangle (三角形最小路径和)详解
    LeetCode 64最小路径和
    微信发起摄像头接口请求 上传头像 图片
    Vue解决项目白屏以及(反向代理)
  • 原文地址:https://www.cnblogs.com/guanghe/p/6054113.html
Copyright © 2020-2023  润新知