美文网首页我爱编程
Oracle 数据库系统笔记(二)

Oracle 数据库系统笔记(二)

作者: C_Hans | 来源:发表于2017-07-31 00:30 被阅读0次

Oracle 数据库系统笔记(二)

简述

SQL: 由 IBM 公司 San Jose 研究所的两位研究员于 1974 年提出的结构化数据(查询)语言,并在 System R 上实现, 1986 年通过 ANSI, 1987 年通过 ISO, 不同厂商的 DBMS 支持的 SQL 一般在标准 SQL 基础上对 SQL 功能进行了扩展.例如 Oracle 的 PL/SQL, Microsoft SQL Server 的 Transact-SQL(T-SQL).
SQL 的主要功能:

SQL 功能 命令
DDL(数据定义) CREATE, DROP, ALTER
DML(数据操纵) SELECT, INSERT, UPDATE, DELETE,TRUNCATE
DCL(数据控制) GRANT, REVOKE

多表查询

通过 WHERE 字句定义连接

select emp.* , dept.*
from emp, dept
where emp.deptno = dept.deptno;

在 FROM 字句中定义连接

select t1.c1, t2.c2
from t1 <conn type> t2
on (conn condition)
where <query condition> 
内连接([INNER] JOIN)
  • 等值连接
  • 非等值连接
select emp2.ename, emp2.sal
from emp emp1, emp emp2
WHERE emp1.sal < emp2.sal and emp1.ename = 'SMITH';
  • 自然连接
SELECT emp.empno, emp.ename, dept.dname
FROM emp JOIN dept
ON (emp.deptno = dept.deptno);
外连接
select emp.empno, emp.ename, dept.dname
from emp left|right|full outer join dept dept
on (emp.deptno = dept.deptno);
交叉连接

不能使用 where 子句, 返回笛卡尔积

select emp.empno, emp.ename, dept.dname
from emp cross join dept dept

EXISTS 谓词子查询

select deptno, dname, loc
from dept
where exists(
            select *
            from emp
            where emp.deptno = dept.deptno and ename = 'SMITH'
            );

SQL 常用函数

Function_name 描述
avg() 求平均值
count() 返回指定列的个数(NULL 值除外)
first() 返回指定列的第一个值, 类似:last()
max() 返回最大值, 类似 min()
sum() 返回总值
group by 指定列分组
having 类似where 子句,但可用于聚合函数
upper() & lower() 大小写转换

SQL 语句优化

0.尽量不用 '*' 查询

  • SQL 语句执行过程
    • SQL 语句从客户端进程传递至服务器端进程
    • 查找共享池中是否有此 SQL 语句
    • 判断语句语法正确性
    • 查找数据字典验证表和列定义
    • 检查当前用户操作权限
    • 确定语句最佳执行计划
    • 将语句和执行计划保存到共享的SQL区
  • set timing on : 显示语句执行时间

1. 多用 'commit'

  • 建议在 end 前使用

2.尽量用 WHERE 代替 HAVING

3.用 truncate 代替 delete

4.用表连接代替表的多次查询

5.exists 代替 in, distinct

SQL*Plus

SQL*Plus 是用户与 Oracle 数据库进行交互的客户端工具,支持 SQL 语句, PL*SQL 语句, 各种 SQL*Plus 命令,以及格式化输出结果.

SQL*Plus 命令类型

命令种类 命令说明
SQL 命令 DDL, DML, DCL 等
PL/SQL 通过 PL/SQL 语句编写的各种过程, 函数, 触发器和包等
SQL*Plus 格式化结果,保存,编辑,查看,执行 前两种程序,设置环境变量等

常用语句

  • prompt "Please input: ": 向屏幕发送交互信息.
  • accept variable [datatype] [format] [prompt text] [hide] : 提示用户输入数据, 例如: accept tempno number prompt 'Please input a number: ' hide
  • & 与 && , 提示输入变量, && 只提示一次输入.
  • SHO[W] option; :显示当前 SQL*PLUS环境的系统变量 , 错误信息, 初始化参数, 当前用户等.
  • @file_name.sql : 执行脚本文件.与 start [file_name] 类似.
  • spool [file_name]: 把输出结果复制到指定文件, 结束前需 off 该指令.
  • set linesize|pagesize 160|20 : 设置行|页显示大小.
  • set pause on|off: 启动|关闭分页显示.
  • ttitle|btitle [left|center|bold|format] [text] [on|off]: 设置页眉页脚显示内容及格式

PL/SQL

PL/SQL 语言是 Ada 编程语言的结构化编程语言,由 oracle 从 6.0 开始提供的专用于 oracle 产品的数据库编程语言.

命名块分类:

  • 子程序(subprogram) : 包括函数,储存过程等
  • 触发器
  • 程序包

基本结构

SET SERVEROUTPUT ON; --打开数据输出函数
DECLARE <option>
-- 声明变量,常量, 用户定义数据类型, 游标等
BEGIN
-- 主程序体,编写 PL/SQL 语句, 函数和存储过程
EXCEPTION
--异常处理程序
END;

数据类型

PL/SQL 中既可以使用 SQL 数据类型,也可以使用 %type 和 %rowtype 数据类型,指定为对应列或对应行的数据类型

  • 绑定变量
-- 声明
var b_result number;
-- 赋值
exec :b_result := 1234; 
-- 打印绑定变量
print b_result;
bind.png

PL/SQL 匿名块 DML 示例

DECLARE
    v_deptno NUMBER(2,0) := 60;
    v_dname dept.dname%TYPE;
    v_loc dept.loc%type := '北京';
BEGIN 
    --插入数据
    dbms_output.put_line('-----Operation Start------');
    INSERT INTO dept VALUES(v_deptno, '财政部', v_loc);
    COMMIT;
    dbms_output.put_line('-----插入成功------');
    --更新数据
    UPDATE dept SET loc = '广州' WHERE deptno = 60;
    COMMIT;
    dbms_output.put_line('-----更新成功------');
    --删除数据
    DELETE FROM dept WHERE deptno= 60;
    COMMIT;
    dbms_output.put_line('-----删除成功------');
end;

函数与存储过程

区别:

  • 函数不能进行 DML 操作, 有返回值,
  • 存储过程进行 DML 操作, 无返回值.
--函数定义
CREATE [OR REPLACE] FUNCTION function_name
 (arg1 [ { IN | OUT | IN OUT }] type1 [DEFAULT value1],
 [arg2 [ { IN | OUT | IN OUT }] type2 [DEFAULT value1]],
 ......
 [argn [ { IN | OUT | IN OUT }] typen [DEFAULT valuen]])
 [ AUTHID DEFINER | CURRENT_USER ]
RETURN return_type
 IS | AS
    <类型.变量的声明部分>
BEGIN
    执行部分
    RETURN expression
EXCEPTION
    异常处理部分
END function_name; 

参数传递:

  • 传址法
    使用 IN 或默认时将实参的地址传递给形参
  • 传值法
    使用 OUT 或 IN OUT 时将实参的实际数据传递给形参
-- 存储过程创建
CREATE [OR REPLACE] PROCEDURE procedure_name
([arg1 [ IN | OUT | IN OUT ]] type1 [DEFAULT value1],
 [arg2 [ IN | OUT | IN OUT ]] type2 [DEFAULT value1]],
 ......
 [argn [ IN | OUT | IN OUT ]] typen [DEFAULT valuen])
    [ AUTHID DEFINER | CURRENT_USER ]
{ IS | AS }
  <声明部分>
BEGIN
  <执行部分>
EXCEPTION
  <可选的异常错误处理程序>
END procedure_name;
游标(cursor)
-- 使用 游标 处理多条数据
create or replace procedure p_printemp(i_depid number)
as
v_name employees.first_name%type;
v_sal employees.salary%type;
v_hdate employees.hire_date%type;
cursor cur_emp is
    select first_name, salary, hire_date
         from employees where employees.department_id = i_depid;
begin
    open cur_emp;
    fetch cur_emp into v_name, v_sal, v_hdate;
    while cur_emp%FOUND loop
        dbms_output.put_line(v_name || ': ' || v_sal || ', ' || v_hdate);
        fetch cur_emp into v_name, v_sal, v_hdate;
    end loop;
    close cur_emp;
exception 
    when no_data_found then 
        dbms_output.put_line('您输入的编号不存在');
end;
/
show error;
exec p_printemp(100);
流程控制语句
DECLARE
    v_empno  employees.employee_id%TYPE :=&empno;
    V_salary employees.salary%TYPE;
    V_comment VARCHAR2(35);
BEGIN
   SELECT salary INTO v_salary FROM employees 
   WHERE employee_id = v_empno;
   IF v_salary < 1500 THEN
       V_comment:= '太少了,加点吧~!';
   ELSIF v_salary <3000 THEN
      V_comment:= '多了点,少点吧~!';
   ELSE
      V_comment:= '没有薪水~!';
   END IF;
   DBMS_OUTPUT.PUT_LINE(V_comment);
   exception
     when no_data_found then
        DBMS_OUTPUT.PUT_LINE('没有数据~!');
     when others then
        DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || sqlerrm);        
END;

相关文章

网友评论

    本文标题:Oracle 数据库系统笔记(二)

    本文链接:https://www.haomeiwen.com/subject/xyaclxtx.html