Oracle基础函数及对象示例学习总结

--##字符函数,大小写处理函数
SELECT LOWER('ABcDe') 
FROM dual;  --  abcde,全部转换为小写

SELECT UPPER('ABcDe') 
FROM dual;  --  ABCDE,全部转换为大写

SELECT INITCAP('aBcDe') 
FROM dual; --   Abcde,首字母大写


--##字符函数,字符串处理函数
SELECT SUBSTR('ABcDe',2,2)
FROM dual; --   Bc,截取字符串
SELECT SUBSTR('ABcDe',2)
FROM dual; --   BcDe,截取字符串
SELECT SUBSTR('ABcDe',-3,2)
FROM dual; --   cD,截取字符串

SELECT INSTR('ABcDefgdDh','D',3,2)
FROM dual; --   9,从第三个字符串开始查询第二个字符D的位置
SELECT INSTR('ABcDefgdDh','D')
FROM dual; --   4,从第一个字符串开始查询第一个字符D的位置

SELECT LPAD('ABcDe',10,'D')
FROM dual; --   DDDDDABcDe,左侧不足补字符串D
SELECT LPAD('ABcDe',3,'D')
FROM dual; --   ABc

SELECT RPAD('ABcDe',10,'D')
FROM dual; --   ABcDeDDDDD,右侧不足补字符串D
SELECT RPAD('ABcDe',3,'D')
FROM dual; --   ABc

SELECT REPLACE('ABcDeEe','e',8)
FROM dual;    --ABcD8E8,替换字符

SELECT LENGTH('ABcDe')
FROM dual; --   5,计算字符串长度

SELECT CONCAT('Hello','World') 
FROM dual; --   HelloWorld,连接字符串

SELECT TRIM('H' FROM 'HelloWorld') 
FROM dual;    --elloWorld,去除首字母
SELECT TRIM('d' FROM 'HelloWorld') 
FROM dual;    --HelloWorl,去除尾字母
SELECT TRIM('' FROM 'HelloWorld') 
FROM dual;    --,隐藏字符


--数字函数
SELECT ROUND(245.1234) FROM dual; --245
SELECT ROUND(245.1234,2) FROM dual;  --245.12
SELECT ROUND(245.6234,0) FROM dual;  --246
SELECT ROUND(245.1234,-2) FROM dual;  --200
SELECT ROUND(255.1234,-2) FROM dual;  --300

SELECT ROUND(-245.1234,2) FROM dual;  --  -245.12
SELECT ROUND(-245.6234,0) FROM dual;  --  -246
SELECT ROUND(-245.1234,-2) FROM dual;  -- -200
SELECT ROUND(-255.1234,-2) FROM dual;  -- -300

SELECT TRUNC(245.1234,2) FROM dual;  --   245.12
SELECT TRUNC(245.6234,0) FROM dual;  --   245
SELECT TRUNC(245.1234,-2) FROM dual;  --  200
SELECT TRUNC(255.1234,-2) FROM dual;  --  200

SELECT MOD(1600,300) FROM dual;       --  100
SELECT MOD(1500,300) FROM dual;       --  0 


--日期函数
SELECT SYSDATE 
FROM dual;    --  2012-05-12 12:50:18 ,当前日期

SELECT MONTHS_BETWEEN('15-4月-2012','01-1月-2012') 
FROM dual;    --  3.45161290322581,两个日期之间的月数

SELECT ADD_MONTHS(SYSDATE,2)
FROM dual;    --2012-07-12 14:23:32,添加月份到日期字段中

SELECT NEXT_DAY('15-4月-2012',3)
FROM dual;    --2012-04-17 ,添加天数到日期字段中
SELECT NEXT_DAY(SYSDATE,'星期一') 
FROM dual;    

SELECT LAST_DAY(SYSDATE)
FROM dual;    --2012-05-31 14:25:22,本月份的最后一天

SELECT ROUND(SYSDATE,'month') 
FROM dual;    --2012-05-01,月份四舍五入
SELECT ROUND(SYSDATE) 
FROM dual;    --2012-05-13

SELECT TRUNC(SYSDATE,'month') 
FROM dual;    --月份截取
SELECT TRUNC(SYSDATE,'day') 
FROM dual; 


--转化函数
SELECT '123' + 123 FROM dual;         --246,字符串隐式转化

SELECT TO_CHAR(123456.6543,'L099,999.00') AS "Number Format"
FROM dual;                                --若是常量数字,需在前加0
SELECT TO_CHAR(123456.6543,'$099,999.00') AS "Number Format"
FROM dual;
SELECT TO_CHAR(SYSDATE,'DAY DD-MON-YYYY') AS "Data Format"
FROM dual;                  --星期二 15-5月 -2012

SELECT TO_DATE('12-5-2012','DD-MM-YYYY') 
FROM dual;                  --格式字符串必须有。没有意义?

SELECT TO_NUMBER('5432.1234') 
FROM dual;
SELECT TO_NUMBER('15,155,100.56','999,999,999.00') 
FROM dual;                  --变量字符串与格式字符串的格式必须一致


--常规函数
SELECT NVL(NULL,0) FROM dual;     --    0
SELECT NVL(NULL,'N/A') FROM dual; --    N/A
SELECT NVL(123,0) FROM dual;      --    123
SELECT NVL('学生','N/A') FROM dual; --    学生

SELECT NVL2(NULL,0,1) FROM dual;  --    1
SELECT NVL2(123,0,1) FROM dual;  --    0

SELECT NULLIF(1,1) FROM dual;    --    NULL
SELECT NULLIF(2,1) FROM dual;    --    2
SELECT NULLIF('好','不好') FROM dual;    --    好

SELECT COALESCE(NULL,NULL,'不好','好') FROM dual;     -- 不好,参数必须为同一数据类型

--DECODE示例
DECODE 

SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG',  1.10*salary,
               'ST_CLERK', 1.15*salary,
               'SA_REP',   1.20*salary,
                           salary) REVISED_SALARY
FROM   employees;

--CASE THEN示例
CASE
  WHEN THEN
  WHEN THEN
  ELSE
END

SELECT last_name, job_id, salary,
CASE job_id 
     WHEN 'IT_PROG'  THEN  1.10*salary
     WHEN 'ST_CLERK' THEN  1.15*salary
     WHEN 'SA_REP'   THEN  1.20*salary
     ELSE      salary 
END "REVISED_SALARY"
FROM   employees;


--##分组函数
AVG
COUNT
MAX
MIN
SUM
STDDEV
VARIANCE


/*
IN、ANY、ALL运算符
    IN 等于列表中的任意一个。
    < ANY 意味着低于最高值;> ANY 意味着高于最低值;= ANY 等同于 IN。
    < ALL 意味着低于最低值;> ANY 意味着高于最高低值。

示例:
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary < ANY
(SELECT salary
FROM   employees
WHERE  job_id = 'IT_PROG')
AND    job_id <> 'IT_PROG';
    
*/

--创建脚本示例
INSERT INTO departments (department_id, department_name, location_id)
VALUES (&"Department Id",'&"Department Name"',&Location_Id);


/*
MERGE语句
    提供有条件地在数据表中更新或插入数据的功能。
    如果该行存在就执行UPDATE,如果是新行则执行INSERT
示例:在COPY_EMP表中插入或更新行,以便与EMPLOYEES表匹配
MERGE INTO copy_emp  c
    USING employees e
    ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
    UPDATE SET
        c.first_name = e.first_name,
        c.last_name  = e.last_name,
        ...
        c.department_id  = e.department_id
WHEN NOT MATCHED THEN
    INSERT VALUES(e.employee_id, e.first_name, e.last_name,
        e.email, e.phone_number, e.hire_date, e.job_id,
        e.salary, e.commission_pct, e.manager_id, 
        e.department_id);

*/


--显式事务控制语句
COMMIT
ROLLBACK
SAVEPOINT name_values
ROLLBACK TO SAVEPOINT name_values

--ALTER TABLE语句示例
ALTER TABLE dept80
ADD (job_id VARCHAR2(9));

ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));

ALTER TABLE dept80
DROP COLUMN job_id;

--SET UNUSED标记不可用与删除表全部不可用字段
ALTER TABLE emp SET UNUSED(department_id)       
ALTER TABLE emp DROP UNUSED COLUMNS;       --不能删除某一个不可用字段,若删除将全部删除。

--RENAME重命名对象
RENAME employees2 TO emp

--COMMENT向表中添加字段
COMMENT ON TABLE employees
IS 'Employee Information';

--约束类型
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK

CREATE TABLE employees(
   employee_id  NUMBER(6),
   first_name   VARCHAR2(20),
   ...
   job_id       VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));

CREATE TABLE employees(
    employee_id      NUMBER(6),
    email            VARCHAR2(25),
    ...
    department_id    NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
    REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));

CREATE TABLE employees(
   employee_id      NUMBER(6),
   hire_date        DATE NOT NULL,
   ...  
CONSTRAINT emp_email_uk UNIQUE(email));

CREATE TABLE employees(
   employee_id      NUMBER(6),
   ...
   salary NUMBER(2)
CONSTRAINT emp_salary_min CHECK (salary > 0),...

ALTER TABLE employees
ADD CONSTRAINT  emp_manager_fk 
FOREIGN KEY(manager_id) 
REFERENCES employees(employee_id);

ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;

ALTER TABLE departments
DROP PRIMARY KEY CASCADE; --删除departments表上的PRIMARY KEY约束,并删除employees.department_id列上关联的FOREIGN KEY约束。

ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE;   --禁用约束

ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk; --启用约束


/*
级联约束
    CASCADE CONSTRAINTS子句是和 DROP COLUMN子句一起使用的。
    CASCADE CONSTRAINTS子句会删除涉及到在已删除列上定义的主键或唯一关键字的所有引用完整性约束。
    CASCADE CONSTRAINTS子句还将删除在已删除列上定义的鄋多列约束。


CREATE TABLE test1 (
   pk NUMBER PRIMARY KEY,
   fk NUMBER,
   col1 NUMBER,
   col2 NUMBER,
CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1,
CONSTRAINT ck1 CHECK (pk > 0 and col1 > 0),
CONSTRAINT ck2 CHECK (col2 > 0));

ALTER TABLE test1 
DROP (pk) CASCADE CONSTRAINTS;

ALTER TABLE test1 
DROP (pk, fk, col1) CASCADE CONSTRAINTS;

*/


--视图使用WITH CHECK OPTION子句
CREATE OR REPLACE VIEW empvu20
AS     
SELECT * FROM employees
WHERE department_id = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck --引用约束empvu20_ck


--视图拒绝DML操作
WITH READ ONLY


--排序TOP-N分析:伪列ROWNUM关键字
SELECT ROWNUM as RANK, last_name, salary 
FROM  (SELECT last_name,salary FROM employees
ORDER BY salary DESC)
WHERE ROWNUM <= 3;


--序列
CREATE SEQUENCE dept_deptid_seq
                INCREMENT BY 10     --步长
                START WITH 120      --开始位
                MAXVALUE 9999       --结束位
                NOCACHE             --
                NOCYCLE;            --达到结束位不重新开始循环

ALTER SEQUENCE dept_deptid_seq
               INCREMENT BY 20
               MAXVALUE 999999
               NOCACHE
	       NOCYCLE;

--序列中的伪列,
NEXTVAL 
CURRVAL

INSERT INTO departments(department_id,department_name,location_id)
VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);

SELECT dept_deptid_seq.CURRVAL
FROM dual;

--索引
CREATE INDEX  emp_last_name_idx
ON employees(last_name);


--同义词
CREATE SYNONYM  emp
FOR  employees;

CREATE PUBLIC SYNONYM  dept
FOR departments





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。