oracle数据库

  • Post author:
  • Post category:其他




数据库复习(复习用)

/*

数据库对象

1 function 函数

2 trigger 触发器

3 table 表格

4 index 索

5 view 视图

6 synonym 同义词

7 tablespace 表空间

8 user 用户

9 sequence 系列

*/

/*

Oracle 数据类型

字符串 : varchar2 超过4000个字节使用long

整数/小数: number(p,s) p代表精度 s代表小数位数

日期: data

*/

–授权

GRANT CONNECT,RESOURCE TO CS;

–取消授权

REVOKE CONNECT FROM CS;

nvl(a,‘b’) 如果a为null ,就用b替代

SELECT * FROM SCOTT.EMP

–复制表

CREATE TABLE NEMP

AS

SELECT * FROM EMP;

–复制表格式

CREATE TABLE NNEMP

AS

SELECT * FROM EMP WHERE 1=2;

–去重复 DISTINCT

INSERT INTO SCOTT.EMP ()

SELECT , FROM DUAL

UNION

REPLACE 替换

EXTRACT(MONTH FROM HIREDATE) 得到月份

–转varchar2

TO_CHAR()

SELCT TO_CHAR() FROM DUAL;

–转数字

TO_NUMBER

SELCT TO_NUMBER() FROM DUAL;

–转日期

TO_DATE

SELECT TO_DATE() FROM DUAL;

–得到本机当前日期

SELECT SYSDATE FROM DUAL;

SELECT SYSTIMESTAMP FROM DUAL;

–月份增加

SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL

–日期之间的月份

SELECT MONTHS_BETWEEN(SYSDATE,SYSDATE) FROM DUAL;

–得到年月日

SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;

SELECT EXTRACT(MONTHS FROM SYSDATE) FROM DUAL;

SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL;

–本月最后一天

SELECT LAST_DAY(SYSDATE) FROM DUAL;

–下一个星期一

SELECT NEXT_DAY (SYSDATE,‘星期一’) FROM DUAL;

–超过12点为下一天

SELECT ROUND (SYSDATE) FROM DUAL;

–当前日期

SELECT TRUNC (SYSDATE) FROM DUAL;

–字符长度

SELECT LENGTH(’’) FROM DUAL;

–全大写

SELECT UPPER(‘ADADSa’) FROM DUAL;

–全小写

SELECT LOWER(’’) FROM DUAL;

–替换

SELECT REPLACE(’’,A,B) FROM DUAL;

–从第2位开始截取后面的全部

SELECT SUBSTR(‘A123123’,2) FROM DUAL;

–从第2位开始截取3位

SELECT SUBSTR(’’,2,3) FROM DUAL;

–拼接

SELECT CONCAT(’’,’’) FROM DUAL;

–首字母大写

SELECT INITCAP(’’) FROM DUAL;

–去两边 L为右边,r为左边

SELECT LTRIM(‘1a123’,‘1’) FROM DUAL;

SELECT RTRIM(’’,’’) FROM DUAL;

–得到字符的出现位置

SELECT INSERT(’’,’’) FROM DUAL;

SELECT INSERT (’’,’’,19) FROM DUAL;

–得到ascii码

SELECT ASCII(‘A’) FROM DUAL;

–ascii码转

SELECT CHAR(89) FROM DUAL;

–填充

SELECT LPAD(‘123’,7,‘X’) FROM DUAL;

SELECT RPAD(‘123’,7,‘X’) FROM DUAL;

–自定义 和if 条件差不多

SELECT DECODE(‘G’,‘G’,‘2’,‘A’,5) FROM DUAL;

–绝对值

SELECT ABS(-23) FROM DUAL;

SELECT POWER(4,3) FROM DUAL;–幂值

SELECT SQRT(225) FROM DUAL;–平方根

SELECT MOD(10,3) FROM DUAL;–得余数

SELECT CEIL(23.42) FROM DUAL;–向上得整

SELECT FLOOR(22.22) FROM DUAL;–向下得整

SELECT SIGN(0) FROM DUAL;–大于0为1,等于0位0,小于0为-1

SELECT ROUND (23.234,1) FROM DUAL;–小数后一位,四舍五入

SELECT TRUNC(22.361,1) FROM DUAL;–取有效字

DECLARE

SNO NUMBER(8);

SNAME VARCHAR2(22);

BEGIN

SELECT ENAME FROM SCOTT.EMP WHERE EMPTNO=SNO;

END;

–赋值方式(两种)

SNO:=12;

SELECT ENAME INTO EN FROM SCOTT.EMP WHERE EMPTNO=SNO;

–引用数据类型

SDATE SCOTT.EMP.HIREDATE%TYPE;

–引用整行的数据类型

SALL SCOTT.EMP%ROWTYPE;

IF条件结构

BEGIN

IF() THEN

ELSIF() THEN

ELSE

END;

–键盘输入值

SNO NUMBER(7):=’&SNO’

CASE 结构

BEGIN

CASE ‘’

WHEN … THEN …;

WHEN … THEN …;

AND CASE;

END;

–LOOP 循环

DECLARE

I NUMBER(5):=1;

BEGIN

<>

LOOP

EXIT AA WHERE I=100;

END LOOP;

END;

–while循环

DECLARE

BEGIN

WHILE(I<30) LOOP

END LOOP;

END;

–for循环

for i in 1…100 loop

end loop;

–自定义异常

DECLARE

SNO NUMBER (7):=1122;

SSAL EMP.SAL%TYPE;

–定义异常

MYE EXCEPTION;

BEGIN

SELECT SAL FROM EMP WHERE EMPTNO=SNO;

if

–抛出异常

RAISE MYE;

else

–处理异常

EXCEPTION WHEN MYE THEN

–输出

END;

CREATE OR REPLACE FUNCTION MY(SNO NUMBER)(不能带长度)

RETURN VARCHAR2(不能带长度)

IS

–局部变量

BEGIN

END;

–调用行数的两种方法

SELECT MYF(123) FROM DUAL;

BEGIN

DBMS_OUTPUT.PUT_LINE(MYF(123))

END;



ORACLE题集

1.基于scott方案中的emp表的empno、ename和job字段创建一新的雇员表,包括编号、姓名和工作三个字段。雇员表中的编号、

姓名和工作字段分别来自于scott方案中emp表的empno、ename和job字段。

CREATE TABLE NEMP

AS

SELECT EMPNO,ENAME,JOB FROM SCOTT.EMP

SELECT * FROM NEMP

2.创建一个出版社表Perss,其表结构如下:

publishID char(8) 出版社编号

publishName varchar2(50) 出版社名称

publishAddress varchar2(50) 出版社地址

publishPhoneNo varchar2(15) 出版社电话

publishEmail varchar2(30) 出版社电子邮箱

CREATE TABLE NNEMP(

publishID char(8),

publishName varchar2(50),

publishAddress varchar2(50) ,

publishPhoneNo varchar2(15),

publishEmail varchar2(30)

)

SELECT * FROM NNEMP

3.编写SQL代码向出版社表Perss中添加一列publishCredit,类型varchar2(20),默认值good。

ALTER TABLE NNEMP ADD (publishCredit VARCHAR2(20) DEFAULT ‘GOOD’)

4.编写SQL代码删除出版社表Perss中的publishCredit列。

ALTER TABLE NNEMP DROP (publishCredit)

5.编写SQL代码删除一张表。

DROP TABLE NNEMP

6.向已创建的出版社表Perss中插入记录:

20101001 清华出版社 北京 010-12345733 12345@qq.com

20101002 电子工业大学出版社 河南 0371-6666666 soft@cnzz.com

INSERT INTO NNEMP

SELECT ‘20101001’,‘清华出版社’,‘北京’,‘010-12345733’,‘12345@qq.com’ FROM DUAL UNION

SELECT ‘20101002’, ‘电子工业大学出版社’, ‘河南’, ‘0371-6666666’, ‘soft@cnzz.com’ FROM DUAL

7.将出版社Perss表中“电子工业大学出版社”的电话修改为“0371-9999999”。

UPDATE NNEMP SET publishPhoneNo=‘0371-9999999’ WHERE publishName=‘电子工业大学出版社’;

SELECT * FROM NNEMP

8.删除出版社Perss表中“清华出版社”的记录。

DELETE NNEMP WHERE publishName=‘清华出版社’


简单查询

9.查询scott.emp表中所有列。

SELECT * FROM SCOTT.EMP

10.查询scott.emp表中的ename列。

SELECT ENAME FROM SCOTT.EMP

11.查询scott.emp表中ename列,将其列名改为“雇员姓名”。

SELECT ENAME AS 雇员姓名 FROM SCOTT.EMP

12.查询scott.emp表中sal、comm两项工资的总和。

SELECT SAL+NVL(COMM,0) FROM SCOTT.EMP

13.消除emp表中job列的重复值。

–去重复

SELECT DISTINCT JOB FROM SCOTT.EMP

14.查看scott.emp表中在10号部门的所有员工具体情况。

SELECT * FROM SCOTT.EMP WHERE DEPTNO=10

15.查询scott.emp表中工资在1500和3000之间的雇员编号。

SELECT * FROM SCOTT.EMP WHERE SAL BETWEEN 1500 AND 3000

16.查询scott.emp表中在10、20或30号部门工作的雇员编号。

SELECT * FROM SCOTT.EMP WHERE DEPTNO=10 OR DEPTNO =20 OR DEPTNO=30

17.查询scott.emp表中名字中含有K字母的雇员姓名。

SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE ‘%K%’

18.查询comm列为NULL的雇员信息。

SELECT * FROM SCOTT.EMP WHERE COMM IS NULL

19.查询10号部门工资在1000元以上的雇员信息。

SELECT * FROM SCOTT.EMP WHERE DEPTNO =10 AND SAL>1000

20.将emp表按照部门号升序、员工编号降序排列。

SELECT * FROM SCOTT.EMP ORDER BY DEPTNO ,EMPNO DESC

21.统计scott.emp表中各部门的人数。

SELECT DEPTNO,COUNT(DEPTNO) FROM SCOTT.EMP GROUP BY DEPTNO

22.统计各部门人数,将多于5人的部门编号输出。

SELECT DEPTNO,COUNT(DEPTNO) FROM SCOTT.EMP GROUP BY DEPTNO HAVING COUNT(*)>=5

23.将scott.emp表中的内容复制一份到newemp表。

CREATE TABLE NEWEMP

AS

SELECT *FROM SCOTT.EMP

SELECT *FROM NEWEMP

DROP TABLE NEWEMP


内置函数

24.查看A的ASCII码。

SELECT ASCII(‘A’) FROM DUAL

25.查看ASCII码为65的字符。

SELECT CHR(65) FROM DUAL

26.使用LENGTH函数求字符串‘This is Oracle 11g’。

SELECT LENGTH(‘This is Oracle 11g’) FROM DUAL

27.使用CONCAT函数将EMP表中各元组的ename添加在job之后。

SELECT CONCAT(JOB,ENAME) FROM EMP;

28.使用SUBSTRING函数、SUBSTR函数

SELECT SUBSTR(‘12345’,3) FROM DUAL

29.使用MOD函数求8除以3的余数。

SELECT MOD(8,3) FROM DUAL

30.使用ROUND函数取整。

SELECT ROUND(10.01) FROM DUAL

31.聚合函数:

求scott.emp表中sal+500后的平均值。

SELECT AVG(SAL+500) FROM SCOTT.EMP

求scott.emp表中不同sal值的平均值。

SELECT AVG(SAL) FROM SCOTT.EMP

求scott.emp表中sal的最大值和最小值。

SELECT MAX(SAL),MIN(SAL) FROM SCOTT.EMP

求scott.emp表所有员工的人数。

SELECT COUNT(*) FROM SCOTT.EMP

求scott.emp表sal列之和

SELECT SUM(SAL) FROM SCOTT.EMP

32.日期函数:

求当前系统时间。

SELECT SYSDATE,SYSTIMESTAMP FROM DUAL

求当前月份的最后一天。

SELECT LAST_DAY(SYSDATE) FROM DUAL

求当前日期与2016年12月20日之间相隔的月数。

SELECT MONTHS_BETWEEN(SYSDATE,TO_DATE(‘2016-12-20’,‘YYYY-MM-DD’)) FROM DUAL

求下一个星期一的日期。

SELECT NEXT_DAY(SYSDATE,‘星期一’) FROM DUAL

求你现在的年龄。

SELECT 2022- EXTRACT(YEAR FROM TO_DATE(‘2003-06-07’,‘YYYY-MM-DD’)) FROM DUAL

33.转换函数:

将123转换成字符串。

SELECT TO_CHAR(123) FROM DUAL

将’123’转换成数值型。

SELECT TO_NUMBER(‘123’) FROM DUAL;

将当前日期转换成日期型。

SELECT TO_DATE(‘2022-12-2’,‘YYYY-MM-DD’) FROM DUAL

将‘970.13’转换成数值型后再加上100。

SELECT TO_NUMBER(‘970.12’)+100 FROM DUAL


多表连查

34.查询scott.emp表各雇员信息与其所在部门信息。

SELECT A.

,B.

FROM SCOTT.EMP A

JOIN

SCOTT.DEPT B

on A.DEPTNO=B.DEPTNO

WHERE 1=1

35.查询scott.emp表各雇员名字和所在部门名称。

SELECT A.ENAME,B.DNAME FROM SCOTT.EMP A

JOIN

SCOTT.DEPT B

ON A.DEPTNO=B.DEPTNO

WHERE 1=1

36.查询比SMITH工资高的雇员姓名。KING

SELECT * FROM SCOTT.EMP WHERE SAL > (SELECT SAL FROM SCOTT.EMP WHERE ENAME =‘WARD’)

37.查询各雇员名字和所在部门名称。

SELECT A.ENAME,B.DNAME FROM SCOTT.EMP A

JOIN

SCOTT.DEPT B

ON A.DEPTNO=B.DEPTNO

WHERE 1=1


嵌套查询(子查询)

38.查询SMITH所在部门的详细信息。

SELECT * FROM SCOTT.DEPT WHERE DEPTNO IN(

SELECT DEPTNO FROM SCOTT.EMP WHERE ENAME=‘KING’)

39.查询与SMITH在同一部门的员工信息。

SELECT * FROM SCOTT.EMP WHERE DEPTNO IN(

SELECT DEPTNO FROM SCOTT.EMP WHERE ENAME=‘KING’)

40.找出其他部门比10号部门某员工工资高的雇员信息。

SELECT * FROM SCOTT.EMP WHERE DEPTNO NOT IN(

SELECT DEPTNO FROM SCOTT.EMP WHERE ENAME =‘CLARK’)

AND SAL>

(SELECT SAL FROM SCOTT.EMP WHERE ENAME=‘CLARK’)

41.找出SMITH所在部门的详细信息。

SELECT * FROM SCOTT.DEPT WHERE DEPTNO IN(

SELECT DEPTNO FROM SCOTT.EMP WHERE ENAME=‘FORD’)

42.查看职务为CLERK或SALESMAN的雇员信息。

SELECT * FROM SCOTT.EMP WHERE JOB=‘CLERK’ OR JOB=‘SALESMAN’


高级查询

43.查询所有员工的人数和他们的平均工资

SELECT COUNT(*),AVG(SAL) FROM SCOTT.EMP

44.查询部门编号为20的所有员工信息

SELECT * FROM SCOTT.EMP WHERE DEPTNO=20

45.查询部门编号为20,部门中工资最高的员工信息

SELECT * FROM SCOTT.EMP WHERE SAL IN(

SELECT MAX(SAL) FROM SCOTT.EMP WHERE DEPTNO=20) AND DEPTNO =20

46.查询将金COMM高于工资SAL 20%的员工信息

SELECT * FROM SCOTT.EMP WHERE COMM>(SAL*0.2)

47.查询所有有奖金的员工信息

SELECT * FROM SCOTT.EMP WHERE COMM IS NOT NULL;

48.查询工龄大于或等于10年的员工信息

SELECT * FROM SCOTT.EMP WHERE (EXTRACT(YEAR FROM HIREDATE)+10)<1980

49.查询员工名正好为8个字母的员工信息

SELECT * FROM SCOTT.EMP WHERE LENGTH(ENAME)=4

50.查询员工的姓名和工资,并按工资降序排序

SELECT ENAME,SAL FROM SCOTT.EMP ORDER BY SAL DESC

51.查询所有员工的姓名、部门号、工资,结果先按部门号升序排序,再按工资降序排序

SELECT ENAME,DEPTNO,SAL FROM SCOTT.EMP ORDER BY DEPTNO,SAL DESC

52.查询各个部门中的员工的人数和平均资

SELECT DEPTNO,COUNT(*),AVG(SAL) FROM SCOTT.EMP GROUP BY DEPTNO

53.统计各个工种的员工的人数和平均工资

SELECT JOB,COUNT(*),AVG(SAL) FROM SCOTT.EMP GROUP BY JOB


PL/SQL编程:

54.根据scott.emp表中DEPTNO字段的值,为姓名为SMITH的雇员修改工资;若部门号为10,则工资加100;若部门号为20, WARD

则工资加300;否则工资加400。

SELECT * FROM SCOTT.EMP WHERE ENAME=‘WARD’

DECLARE

DEP SCOTT.EMP.DEPTNO%TYPE;

BEGIN

SELECT DEPTNO INTO DEP FROM SCOTT.EMP WHERE ENAME=‘WARD’;

IF(DEP=10) THEN

UPDATE SCOTT.EMP SET SAL=SAL+100 WHERE ENAME=‘WARD’;

DBMS_OUTPUT.PUT_LINE(‘100’);

ELSIF(DEP=20) THEN

UPDATE SCOTT.EMP SET SAL=SAL+300 WHERE ENAME=‘WARD’;

DBMS_OUTPUT.PUT_LINE(‘300’);

ELSE

UPDATE SCOTT.EMP SET SAL=SAL+400 WHERE ENAME=‘WARD’;

DBMS_OUTPUT.PUT_LINE(‘400’);

END IF;

END;

55.将ename、sal、comm、hiredate分别改用“雇员姓名”、“薪水”、“红利”和“聘用日期”。

SELECT ENAME 雇员姓名,SAL 薪水,COMM 红利,HIREDATE 聘用日期 FROM SCOTT.EMP ;


函数

  1. 定义一个函数,求1+2+3+……+100的和并返回。

    CREATE OR REPLACE FUNCTION F

    RETURN NUMBER

    IS

    S NUMBER(8):=0;

    I NUMBER (8):=1;

    BEGIN

    WHILE(I<=100) LOOP

    S:=S+I;

    I:=I+1;

    END LOOP;

    RETURN S;

    END;

BEGIN

DBMS_OUTPUT.PUT_LINE(F);

END;

  1. 定义一个函数,根据给定的员工编号返回scott.emp表中员工的姓名。

    CREATE OR REPLACE FUNCTION F(X NUMBER)

    RETURN VARCHAR2

    IS

    SNAME EMP.ENAME%TYPE;

    BEGIN

    SELECT ENAME INTO SNAME FROM EMP WHERE EMPNO=X;

    RETURN SNAME;

    END;

SELECT F(7521) FROM DUAL

  1. 定义一个函数,根据给定的部门编号返回scott.emp表中该部门员工的总数和该部门员工的最低月薪和最高月薪。

    CREATE OR REPLACE FUNCTION F(X NUMBER)

    RETURN VARCHAR2

    IS

    RS NUMBER;

    MA NUMBER;

    MI NUMBER;

    BEGIN

    SELECT COUNT(*),MAX(SAL),MIN(SAL) INTO RS,MA,MI FROM EMP WHERE DEPTNO=X;

    RETURN ‘人数:’||RS||‘最高工资:’||MA||‘最低工资:’||MI;

    END;

SELECT F(10) FROM DUAL

59. 在scott.emp表上创建一个函数deptavgsal,输入参数为部门编号,返回该部门的平均工资。

CREATE OR REPLACE FUNCTION DEPTAVGSAL(X NUMBER)

RETURN NUMBER

IS

ASL EMP.SAL%TYPE;

BEGIN

SELECT AVG(SAL) INTO ASL FROM EMP WHERE DEPTNO=X;

RETURN ASL;

END;

SELECT DEPTAVGSAL(10) FROM DUAL;

  1. 在scott.emp表上创建一个函数deptsal,输入参数为员工编号,返回该员工所在部门的平均工资。

    CREATE OR REPLACE FUNCTION DEPTSAL(X NUMBER)

    RETURN NUMBER

    IS

    GZ NUMBER;

    BEGIN

    SELECT AVG(SAL) INTO GZ FROM EMP WHERE DEPTNO IN(

    SELECT DEPTNO FROM EMP WHERE EMPNO=X);

    RETURN GZ;

    END;

SELECT DEPTSAL(7782) FROM DUAL

61. 在scott.emp表上创建一个函数deptnum,输入部门编号,返回该部门的员工人数,并调用该函数。

CREATE OR REPLACE FUNCTION DEPTNUM(X NUMBER)

RETURN NUMBER

IS

RS NUMBER;

BEGIN

SELECT COUNT(*) INTO RS FROM EMP WHERE DEPTNO=X;

RETURN RS;

END;

SELECT DEPTNUM(10) FROM DUAL

62. 删除上题创建的函数

DROP FUNCTION DEPTNUM

触发器

  1. 创建一个触发器FirstTrigger,当用户删除scott.emp表中的数据时提示:有用户删除了emp表中数据。

    CREATE OR REPLACE TRIGGER FIRSTTIRGGER

    AFTER DELETE

    ON EMP

    FOR EACH ROW

    BEGIN

    IF(:OLD.ENAME=‘WARD’) THEN

    RAISE_APPLICATION_ERROR(-20001,‘有用户删除了emp表中的数据’);–错误代号只能以2开头

    END IF;

    END;

DELETE FROM EMP WHERE ENAME=‘WARD’

64. 创建一个触发器MyTrigger,它的作用是当表scott.dept中的deptno列的值发生变化时,自动更新表scott.emp中的deptno列的值,从而保证数据的完整性。

CREATE OR REPLACE TRIGGER TIG

AFTER UPDATE

ON DEPT

FOR EACH ROW

DECLARE

XX NUMBER;

OL NUMBER;

BEGIN

IF(:NEW.DEPTNO!=10 OR :NEW.DEPTNO!=20 OR:NEW.DEPTNO!=30 OR :NEW.DEPTNO!=40) THEN
XX:= :NEW.DEPTNO;
OL:= :OLD.DEPTNO;
UPDATE EMP SET DEPTNO=XX WHERE DEPTNO=OL;
END IF;

END;

UPDATE DEPT SET DEPTNO=50 WHERE DEPTNO=10;

SELECT * FROM DEPT

65. 在scott.dept表上创建一个触发器,当删除该表中的记录时,可以同时删除EMP表中记录,保证参照完整性。–在触发触发器时会把值传进来

CREATE OR REPLACE TRIGGER TIGG

AFTER DELETE

ON DEPT

FOR EACH ROW

DECLARE

DEP DEPT.DEPTNO%TYPE;

BEGIN

DEP:= :OLD.DEPTNO;

DELETE FROM EMP WHERE DEPTNO=DEP;

END;

DELETE DEPT WHERE DEPTNO=30;

SELECT * FROM EMP

  1. 删除上题中创建的触发器。

DROP TRIGGER FIRSTTIRGGER

–查询删除的表

select * from recyclebin

–恢复删除的表 (emp为要恢复的表)

flashback table emp to before drop;

select * from emp



版权声明:本文为weixin_63719049原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。