七整合SQL基础和PL-SQL基础

Posted NotFoundObject

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七整合SQL基础和PL-SQL基础相关的知识,希望对你有一定的参考价值。

--Oracle数据库重要知识点整理 2017-01-24 soulsjie
  /*数据查询语句介绍
  数据定义语句介绍
  数据控制语句介绍
  数据操纵语句介绍*/
-------------------------------  
--一、创建及维护表
-------------------------------
    --1.1 创建
    CREATE TABLE ZYJ_GONGZI(
    Id integer not null,
    gongzi number,
    fafang_date date,
    us_name varchar(256)
    );
    --1.2 维护表
    --1.2.1增加一个字段
    ALTER TABLE ZYJ_GONGZI ADD marsk VARCHAR(256);
    --1.2.2 修改一个字段
    ALTER TABLE ZYJ_GONGZI MODIFY marsk VARCHAR(150);
    --1.2.3删除表中的某个字段
    ALTER TABLE ZYJ_GONGZI DROP COLUMN marsk;
    --1.2.4将表重命名
    ALTER TABLE ZYJ_GONGZI RENAME TO ZYJ_RICE;
    ALTER TABLE ZYJ_RICE RENAME TO ZYJ_GONGZI;
    --1.2.5修改表中的字段名
    ALTER TABLE ZYJ_GONGZI RENAME COLUMN fafang_date TO fafang_riqi;
    ALTER TABLE ZYJ_GONGZI RENAME COLUMN fafang_riqi TO fafang_date;
    --1.2.6 给表添加注释
    COMMENT ON TABLE ZYJ_GONGZI IS ‘soulsjie 练习SQL创建的工资表‘;
    --1.2.7 给字段添加注释
    COMMENT ON COLUMN ZYJ_GONGZI.ID IS ‘工资表序号‘;

--------------------------------------
--二、临时表的分类、创建、使用
--------------------------------------

--------------------------------------
--三、删除及截断表
--------------------------------------
    --1.删除表 delete 只是删除表的数据不释放表数据在内存中占用的空间
    DELETE TABLE ZYJ_GONGZI;
    --2.DROP table 删除表结构和数据
    DROP TABLE ZYJ_GONGZI;
    --3.截断表
    TRUNCATE TABLE ZYJ_GONGZI;

--------------------------------------
--四、显示查看表信息
    SELECT table_name FROM USER_TABLES;
--------------------------------------

--------------------------------------
--五、ORACLE常用数据类型
--------------------------------------
    /*
    Text 用于文本或文本与数字的组合。最多 255个字符。   
    Memo Memo 用于更大数量的文本。最多存储 65,536个字符。
    注释:无法对 memo 字段进行排序。不过它们是可搜索的。
    Byte 允许 0 到 255 的数字。 1 字节
    Integer 允许介于 -32,768 到 32,767 之间的数字。2 字节
    Long 允许介于 -2,147,483,648 与 2,147,483,647 之间的全部数字 4 字节
    Single 单精度浮点。处理大多数小数。 4 字节
    Double 双精度浮点。处理大多数小数。 8 字节
    Currency 用于货币。支持 15 位的元,外加 4 位小数。
    提示:您可以选择使用哪个国家的货币。8 字节
    AutoNumber AutoNumber 字段自动为每条记录分配数字,通常从 1 开始。 4 字节
    Date/Time 用于日期和时间 8 字节
    Yes/No 逻辑字段,可以显示为 Yes/No、True/False 或 On/Off 。在代码中,使用常量 True 和 False (等价于 1 和 0)注释:Yes/No 字段中不允许 Null 值,1 比特
    Ole Object 可以存储图片、音频、视频或其他 BLOBs (Binary Large OBjects) 最多 1GB
    Hyperlink 包含指向其他文件的链接,包括网页。   
    Lookup Wizard 允许你创建一个可从下列列表中进行选择的选项列表。4 字节
    */

--------------------------------------
--六、伪列ROWID和ROWNUM介绍以及使用
--------------------------------------

--------------------------------------
--七、Oracle常用运算符和操作符的使用
--------------------------------------
    SELECT 1+2 FROM DUAL;  --‘+‘
    SELECT 2-3 FROM DUAL;  --‘-‘
    SELECT 2*3 FROM DUAL;  --‘*‘
    SELECT 2/3 FROM DUAL;  --‘/‘
    SELECT MOD(3,2) FROM DUAL;--取余
    DECLARE
    BEGIN
      DBMS_OUTPUT.put_line(‘ss‘||‘aa‘);--连接字符
      END;
 
--------------------------------------
--八、简单查询
--------------------------------------
    --8.1日期列使用
    SELECT fafang_date FROM ZYJ_GONGZI;
    --8.2DISTINCT的使用
    SELECT DISTINCT identi FROM ZYJ_GONGZI;
    --8.3处理NULL
    --8.4连接字符串
    SELECT ‘A‘||‘B‘ FROM DUAL;
    --8.5WHERE语句
    SELECT* FROM ZYJ_GONGZI WHERE GONGZI>9000;
    --8.6ORDER BY子句|ASC|DESC
    SELECT us_name FROM ZYJ_GONGZI ORDER BY ID DESC;
    SELECT us_name FROM ZYJ_GONGZI ORDER BY ID asc;
    --8.7多列排序
    SELECT * FROM ZYJ_GONGZI ORDER BY fafang_date,id DESC;--按发放时间排序,如果时间一样按序号大小排序
    
--------------------------------------
--九、复杂查询
--------------------------------------
    --9.1分组查询以及HAVING子句的使用,HAVING子句可以对结果进项筛选
    SELECT AVG(GONGZI) AS 平均工资 FROM ZYJ_GONGZI GROUP BY identi;--计算每类员工的平均工资
    --9.2分组函数MAX|MIN|AVG|SUM|COUNT使用
    --9.3连接查询语句
    SELECT G.US_NAME,B.IDENTI_NAME FROM ZYJ_GONGZI G,ZYJ_BUMEN B WHERE G.IDENTI=B.IDENTI;
    --9.4相等连接查询
    --9.5不等连接查询
    --9.6自连接查
    --9.7内连接和外连接区别及使用
    --9.8子查询或嵌套查询的使用
    --9.9集合操作符的使用
    SELECT * FROM (SELECT ID FROM ZYJ_GONGZI UNION SELECT ID FROM ZYJ_BUMEN);--并集组合所有结果,并删除重复记录
    SELECT * FROM (SELECT ID FROM ZYJ_GONGZI INTERSECT SELECT ID FROM ZYJ_BUMEN);--交集 显示相同的数据结果
    SELECT * FROM (SELECT ID FROM ZYJ_GONGZI MINUS SELECT ID FROM ZYJ_BUMEN);--差集  A MINUS B 相当于 A-B

--------------------------------------
--十、常见内置函数
--------------------------------------
    --10.1 INSTR|LOWER|UPPER|LTRIM|RTRIM|TRIM|SUBSTR|REPLACE使用
    SELECT INSTR(‘HELLO‘,‘H‘) FROM DUAL;--INSTR(字符串1,字符串2) 返回字符串2在字符串1的出现位置,字符串位置从1开始计
    SELECT LOWER(‘HELLO‘)FROM DUAL; --返回指定字符串的全小写字符串
    SELECT UPPER(‘hello‘) FROM DUALL;--返回指点字符串的全大写字符
    --10.2 LTRIM去除字符串左边的空格
    --10.3 RTRIM去除字符串右边的空格
    --10.4 TRIM去除字符串两边的空格
    SELECT SUBSTR(‘ZHESHIZIFUCHUAN‘,10,5) FROM DUAL;--从字符串的第10个字符开始截取5个字符
    SELECT REPLACE(‘HAHAJIEJIE‘,‘JIE‘,‘QIAN‘) FROM DUAL;--在字符串中将所有的jie替换成qian
    --10.5 SYSDATE|ADD_MONTHS|LAST_DAY(d)|MONTHS_BETWEEN(d1,d2)|NEXT_DAY使用
    SELECT SYSDATE FROM DUAL;
    SELECT ADD_MONTHS(SYSDATE,1) FROM DUAL;
    --10.6 TO_CHAR|TO_DATE|TO_NUMBER使用 字符转换
    SELECT TO_NUMBER(‘152‘)-2 FROM DUAL;
    SELECT TO_DATE(‘2018/12/26‘,‘YYYY/MM/DD‘) FROM DUAL;

--------------------------------------
--十一、数据操作语句
--------------------------------------
    --11.1 INSERT语句使用
    INSERT ALL
    INTO ZYJ_GONGZI(ID,GONGZI,FAFANG_DATE,US_NAME)
    VALUES (1,6300,to_date(‘2017-02-16‘,‘yyyy-mm-dd‘),‘Jie‘)
    INTO ZYJ_GONGZI(ID,GONGZI,FAFANG_DATE,US_NAME)
    VALUES (2,6322,to_date(‘2017-03-16‘,‘yyyy-mm-dd‘),‘Jies‘)
    INTO ZYJ_GONGZI(ID,GONGZI,FAFANG_DATE,US_NAME)
    VALUES (3,4855,to_date(‘2017-04-16‘,‘yyyy-mm-dd‘),‘Tom‘)
    INTO ZYJ_GONGZI(ID,GONGZI,FAFANG_DATE,US_NAME)
    VALUES (4,4698,to_date(‘2017-03-16‘,‘yyyy-mm-dd‘),‘bob‘)
    SELECT 1 FROM DUAL;
    --11.2 UPDATE语句使用
    UPDATE ZYJ_GONGZI SET fafang_date=to_date(‘2018-02-16‘,‘yyyy-mm-dd‘) WHERE ID=1;
    --11.3 DELETE语句使用
    DELETE FROM ZYJ_GONGZI WHERE ID=4;

--------------------------------------
--十二、事务和约束
--------------------------------------
    --12.1 事务介绍
    --事务:当前会话对数据的处理只能在当前会话有效必须提交事务,这部分数据才能被其他会话访问
    --提交及回滚事务使用
    SELECT * FROM ZYJ_GONGZI;
    DELETE FROM ZYJ_GONGZI WHERE ID=4;--对数据进行删除操作
    ROLLBACK;--回滚删除的操作
    --提交事务使用:COMMIT;即可
    --事务和锁
    --12.2 数据约束类型
    --PRIMARY KEY 主键约束
    --CONSTRAINT fk_waijian FOREIGN KEY(ID) REFERENCE ZYJ_BUMEN(ID);
    --CONSTRAINT un_weiyi UNIQUE (ID);
    --CONSTRAINT ck_jiancha CHECK(ID>10);
    --数据约束的定义及维护
    --ALTER TABLE ZYJ_GONGZI ADD CONSTRAINT pkS_zhujian UNIQUE(us_name);添加新的约束
    --ALTER TABLE ZYJ_GONGZI MODIFY CONSTRAINT pkS_zhujian CHECK(ID>10);修改约束
    --ALTER TABLE ZYJ_GONGZI DROP CONSTRAINT pkS_zhujian;--删除约束
    
--------------------------------------
--十三、视图索引序列
--------------------------------------
    --13.1 创建维护以及使用视图
    --创建个人部门归属的视图
    CREATE VIEW gerenguishu AS SELECT G.US_NAME,B.IDENTI_NAME FROM ZYJ_GONGZI G,ZYJ_BUMEN B WHERE G.IDENTI=B.IDENTI;
    --13.2 视图的使用
    SELECT * FROM gerenguishu;
    --13.3 创建索引
    CREATE INDEX chazhaoxinxi ON ZYJ_BUMEN(ID,IDENTI_NAME);
    --序列创建以及使用
    --同义词创建

--------------------------------------
--十四、PL/SQL语句
--------------------------------------
--14.1 PL/SQL语句块介绍以及基本语法
    DECLARE
    [变量声明]
    BEGIN --开始
      {函数体}
      EXCEPTION
        [异常处理]
      END;--结束
    --14.2 定义及使用变量
    DECLARE
    AA INTEGER:=12;
    BB VARCHAR(20):=‘JIE‘;
    BEGIN
      DBMS_OUTPUT.put_line(‘AA的值是:‘||AA);
      DBMS_OUTPUT.put_line(‘BB的值是:‘||BB);
      END;
    --14.3 IF语句使用
    DECLARE
    AA INTEGER:=1;
    BEGIN
      IF AA=1 THEN
        DBMS_OUTPUT.put_line(‘数值为1‘);
        ELSIF AA=2 THEN
          DBMS_OUTPUT.put_line(‘数值为2‘);
          ELSE
            DBMS_OUTPUT.put_line(‘其他数值‘);
            END IF;
      END;
    --14.4 CASE语句使用
    DECLARE
    AA INTEGER:=5;
    BEGIN
      CASE AA
        WHEN 1 THEN DBMS_OUTPUT.put_line(‘数值为1‘);
        WHEN 2 THEN DBMS_OUTPUT.put_line(‘数值为2‘);
        ELSE DBMS_OUTPUT.put_line(‘其他数值‘);
        END CASE;
      END;
    --14.5 基本循环语句使用
    DECLARE
    AA INTEGER:=0;
    BEGIN
      LOOP
        EXIT WHEN AA>10;
        AA:=AA+1;
        DBMS_OUTPUT.put_line(AA);
        END LOOP;
      END;
    --14.6 WHILE循环语句使用
    DECLARE
    AA INTEGER:=0;
    BEGIN
      WHILE AA<10 LOOP
        DBMS_OUTPUT.put_line(AA);
        AA:=AA+1;
        END LOOP;
      END;
    --14.7 FOR循环语句使用
    DECLARE
    AA INTEGER:=0;
    BEGIN
      FOR AA IN 1..10 LOOP
        DBMS_OUTPUT.put_line(AA);
        END LOOP;
      END;
    --14.8 游标定义及使用
    DECLARE
    CURSOR YB IS SELECT g.id,g.gongzi FROM ZYJ_GONGZI g;
    temp YB%ROWTYPE;--创建辅助行级变量
    BEGIN
       IF NOT YB%ISOPEN THEN
         OPEN YB;--打开游标
          DBMS_OUTPUT.put_line(TO_DATE(sysdate)||‘open success!‘);
          END IF;
          LOOP --循环读取数据
            FETCH YB INTO temp;
            DBMS_OUTPUT.put_line(‘员工编号:‘||temp.id||‘的工资是:‘||temp.gongzi);
            EXIT WHEN YB%NOTFOUND;
            END LOOP;
          CLOSE YB;--关闭游标
           DBMS_OUTPUT.put_line(sysdate||‘close success!‘);
      END;
      
--------------------------------------
--十五、函数和过程
--------------------------------------
    --函数及存储过程创建
    --15.1创建函数
    CREATE OR REPLACE FUNCTION F_JIE(AA INTEGER) RETURN INTEGER IS
    temp INTEGER;
    BEGIN
      temp:=AA;
      DBMS_OUTPUT.put_line(‘你输入的数字是‘||temp);
      RETURN AA;
      END F_JIE;     
    --15.2创建过程
    CREATE OR REPLACE PROCEDURE p_JIE IS
    CURSOR YB IS SELECT US_NAME FROM ZYJ_GONGZI;--创建游标
    temp YB%ROWTYPE;--创建行级变量
    BEGIN
      IF NOT YB%ISOPEN THEN OPEN YB;
      END IF;
      LOOP
        EXIT WHEN YB%NOTFOUND;
        FETCH YB INTO temp;--游标遍历表格
        DBMS_OUTPUT.put_line(temp.us_name);
        END LOOP;
      END P_JIE;
    --15.3调用函数
    SELECT F_JIE(&ad) FROM DUAL;--函数调用
    --15.4调用过程
    BEGIN
      P_JIE;
      END;
    --15.5异常处理以及异常抛出
    DECLARE
    temp INTEGER:=1;
    temp2 INTEGER:=1;
    err_info EXCEPTION;--自定义异常
    BEGIN
      IF temp=temp2 THEN
      RAISE err_info;
      END IF;
      EXCEPTION WHEN err_info THEN
        DBMS_OUTPUT.put_line(‘警告两个id重复!‘);
      END;

--------------------------------------
--附录、连接查询时用到的辅助表
--------------------------------------
CREATE TABLE ZYJ_BUMEN(
id INTEGER PRIMARY KEY,--主键
identi VARCHAR(20),--部门标识
identi_name VARCHAR(20)--部门名
);
COMMENT ON TABLE ZYJ_BUMEN IS ‘soulsjie 练习SQL创建的部门表‘;
--插入数据
INSERT ALL INTO ZYJ_BUMEN VALUES(1,‘laoban‘,‘老板部‘)
INTO ZYJ_BUMEN VALUES(2,‘jingli‘,‘经理部‘)
INTO ZYJ_BUMEN VALUES(3,‘yuangong‘,‘员工部‘)
SELECT 1 FROM DUAL;
SELECT * FROM ZYJ_BUMEN;


























































































































































































































































































































































以上是关于七整合SQL基础和PL-SQL基础的主要内容,如果未能解决你的问题,请参考以下文章

实验七-附加:PL/SQL编程基础

Oracle面试题(基础篇)

Oracle面试题(基础篇)

Oracle面试题(基础篇)

数据库基础

Oracle PL/SQL语句基础学习笔记(上)