目录
- 引言
- 一、核心概念
- 1、SQL释义:
- 2、PL/SQL释义:
- 二、功能特点以及实际应用场景
- 1、异同点
- 2、实际应用场景举例:
- 三、性能与效率对比
- 四、总结
- 五、其他
引言
在Oracle数据库开发与管理中,SQL与PL/SQL作为两种不可或缺的语言工具,时常引发开发者们的好奇与探究。SQL作为结构化查询语言,无疑是全球数据库从业者必备的基础技能,用于处理数据的增删改查和基本的数据操纵。然而,PL/SQL的内涵则更为丰富,它是Oracle数据库独有的过程化SQL扩展,赋予了SQL更多的程序化处理能力和逻辑控制结构。
随着项目的复杂度逐渐提升,简单的SQL语句已不足以满足某些高级业务逻辑的需求。此时,PL/SQL的价值便凸显出来——它允许开发人员编写存储过程、触发器和其他复杂的数据库对象,从而实现更高效、更具可重用性的数据库应用程序。
在此背景下,深入理解SQL与PL/SQL之间的联系与差异,成为了广大开发者提升技术水平、优化数据库应用性能的关键环节。通过对比它们的语法结构、执行方式、适用场景和功能特性,我们可以更精准地把握何时选用SQL进行基本查询操作,何时借助PL/SQL的强大功能来处理复杂的数据库任务。
本文将以通俗易懂的方式,带领大家一同探讨SQL与PL/SQL的核心概念、功能特点以及实际应用场景下的异同点,让您在实践中更好地权衡和运用这两种语言,从而在数据库开发之路上越走越远。
更多PL/SQL语法与案例解析请查看专栏。
一、核心概念
1、SQL释义:
-
SQL 全称是(Structured Query Language),是一种结构化查询语言,包括数据查询(Data Retrieval)、数据定义(Data Definition)、数据操作(Data Manipulation)、关系操作(Relational Operations)、数据聚合(Data Aggregation)、数据控制(Data Control)。
-
数据查询(Data Retrieval):SQL最核心的功能是查询数据。通过SELECT语句从数据库表中检索特定数据。例如,从一个员工表中选取所有员工的姓名和工资:
-- 查询员工姓名、薪水 SELECT Name, Salary FROM Employees;
-
数据定义(Data Definition):SQL允许创建、修改和删除数据库对象,如表、视图、索引、存储过程等。创建一个表的示例:
-- 新建员工表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,Name VARCHAR(50),JobTitle VARCHAR(50),HireDate DATE );
-
数据操作(Data Manipulation): SQL提供INSERT、UPDATE和DELETE语句用于插入、更新和删除数据记录。例如,插入一条员工记录:
INSERT INTO Employees (Employee_ID, Name, Work, Hire_Date) VALUES (1, 'John Doe', 'Manager', '2022-01-01');
-
关系操作(Relational Operations): SQL支持表间关系的处理,包括JOIN操作(内连接、外连接等),以及嵌套查询(Subqueries)。例如,联接员工表和部门表以获取员工与其所在部门的信息:
-- 关联查询员工姓名和部门名称 SELECT E.Name, D.DepartmentName FROM Employees E LEFT JOIN Departments D ON E.DepartmentID = D.DepartmentID;
-
数据聚合(Data Aggregation): SQL支持对数据进行统计和聚合操作,如COUNT(计数)、SUM(求和)、AVG(平均值)、MAX(最大值)和MIN(最小值)。例如,统计员工表中的总人数:
-- 查询员工合计薪水 SELECT SUM(SALARY) FROM Employees;
-
数据控制(Data Control) :SQL还涉及权限管理和事务控制,包括使用GRANT、REVOKE语句设置用户的访问权限,以及通过COMMIT、ROLLBACK进行事务处理,确保数据的一致性和完整性。例如:
-- 授权用户 accenture 对 Employees 表的有查询和插入的权限(在另一用户下授权) GRANT SELECT, INSERT ON Employees TO accenture;-- 撤销之前赋予 accenture 对 Employees 表的插入权限 REVOKE INSERT ON Employees FROM accenture ;-- 对更新语句提交事务 BEGIN TRANSACTION;UPDATE Employees SET Salary = Salary * 1.1 WHERE DepartmentID = 10; COMMIT;
-
-
SQL的核心功能主要是围绕着对数据库中的数据进行查询、定义、操作、关系处理、聚合计算以及权限控制等方面展开,为用户提供了对数据库进行全方位管理的能力。
2、PL/SQL释义:
-
PL/SQL 全称是(Procedural Language extensions to SQL),是Oracle 为SQL语言提供的一种过程性编程语言扩展。它可以让开发者编写复杂的编程逻辑,这在纯SQL语言中是无法实现的。以下是对PL/SQL的详细描述:
-
过程性语言:PL/SQL是一种过程性语言,这意味着它包含了控制结构,如循环(LOOP)、条件语句(IF-THEN-ELSE)、错误处理(EXCEPTION)等,这使得开发者可以编写复杂的业务逻辑。例如:你可以使用条件语句和循环语句来控制程序的执行流程
-- 经典语法,BEGIN END语法BEGINDECLARE x NUMBER := 1; -- 声明,其中 := 是赋值BEGIN IF x = 1 THEN -- 判断条件DBMS_OUTPUT.PUT_LINE('x 是 1');ELSEDBMS_OUTPUT.PUT_LINE('x 不是 1'); -- 输出语句END IF;END; END;
-
SQL的扩展:PL/SQL是SQL的扩展,它允许开发者在程序中直接嵌入SQL语句,如SELECT、INSERT、UPDATE、DELETE等,这使得数据操作更为方便。
-- 在PL/SQL 块里嵌入SQL语句,下面的是Select查询语句 BEGINDECLARE x NUMBER;BEGINSELECT COUNT(*) INTO x FROM employees;DBMS_OUTPUT.PUT_LINE('有 ' || x || ' 个员工。'); -- || 是拼接符,与CONCAT()函数功能一致END; END;
-
块结构:PL/SQL的代码是以块的形式组织的,一个块可以包含一段或多段可执行的代码。块结构使得代码更易于理解和维护。
-- 删除员工表数据,并提交事务。 以Begin ... End 块包裹 BEGINDELETE FROM employees;COMMIT; END;
-
异常处理:PL/SQL提供了强大的异常处理机制,开发者可以定义并处理各种异常,这有助于提高程序的健壮性。
-- PL/SQL 异常处理,类似于Java中的Try...Catch 捕获异常功能 BEGIN -- CSDN-小小野猪DECLARE -- 声明关键词: DECLAREx NUMBER := 1;y NUMBER := 0;z NUMBER;BEGINBEGINz := x / y;EXCEPTIONWHEN ZERO_DIVIDE THENDBMS_OUTPUT.PUT_LINE('有异常:0不可作为除数');END;END; END;
-
存储过程和函数:PL/SQL允许开发者编写存储过程和函数,这些过程和函数可以被存储在数据库中,供其他程序或触发器调用。存储过程入门可参考:
1、Oracle存储过程入门教程(通俗理解存储过程),有详细介绍。
2、118个真实应用场景的Oracle存储过程案例及开发指南(从入门到熟练使用)资源。-- 声明存储过程: CREATE OR REPLACE PROCEDURE greet(name IN VARCHAR2) AS -- IN是入参 BEGINDBMS_OUTPUT.PUT_LINE('你好, ' || name); END;
-
游标管理:PL/SQL提供了光标管理的功能,开发者可以使用光标来处理SQL查询返回的结果集。
-- 使用游标关键词CURSOR 开启游标 CSDN-小小野猪 DECLARE CURSOR c IS SELECT * FROM employees; -- c标识游标的名称,整个查询语句作为游标 c 的数据源r c%ROWTYPE; -- %ROWTYPE 类型,r 变量的结构将与游标查询结果的每一行数据结构完全匹配。 BEGINOPEN c; -- 打开游标LOOP -- 循环处理FETCH c INTO r;EXIT WHEN c%NOTFOUND; -- 当游标无法获取新行时退出循环DBMS_OUTPUT.PUT_LINE('员工姓名:: ' || r.first_name || ' ' || r.last_name);END LOOP;CLOSE c; -- 关闭游标 END;
-
-
PL/SQL是一种强大的数据库编程语言,它结合了SQL数据查询和处理的能力与过程化编程语言的特点,如变量、条件控制(if-then-else、case等)、循环(for loop、end loop等)、异常处理等,为数据库编程提供了更高的抽象级别和更强的灵活性。
二、功能特点以及实际应用场景
1、异同点
-
异:PL/SQL是Oracle数据库专门支持的一种过程化编程语言,它在SQL的基础上进行了扩展,引入了诸如变量、常量、控制结构(如循环、条件语句、异常处理)、自定义函数和存储过程等编程元素。而SQL(Structured Query Language)则是用于管理和处理关系型数据库的标准语言,主要用于查询、插入、更新和删除数据。
-
同:两者都用于与数据库交互,都包含对数据操作的基本命令(如SELECT、INSERT、UPDATE、DELETE等)。但在PL/SQL中,你可以把这些SQL命令封装在过程、函数、触发器等程序结构中。
2、实际应用场景举例:
-
存储过程:创建一个存储过程用于批量处理员工薪资调整,包含【多个逻辑操作】,如计算新薪资、更新数据库记录、记录审计日志等。在一个事务中完成整个操作,确保原子性和一致性。
-- 创建存储过程,包含多个处理逻辑 CREATE OR REPLACE PROCEDURE adjust_salaries(p_department_id NUMBER, p_percentage_increase NUMBER) ISCURSOR emp_cur IS SELECT * FROM Employees WHERE DepartmentID = p_department_id;v_employee_record emp_cur%ROWTYPE; BEGINFOR v_employee_record IN emp_cur LOOP-- 薪水调整(操作一) CSDN-小小野猪v_employee_record.Salary := v_employee_record.Salary * (1 + p_percentage_increase / 100); -- 更新薪水(操作二) CSDN-小小野猪UPDATE Employees SET Salary = v_employee_record.Salary WHERE EmployeeID = v_employee_record.EmployeeID;END LOOP;COMMIT; EXCEPTIONWHEN OTHERS THEN -- 异常捕获ROLLBACK;DBMS_OUTPUT.PUT_LINE('An error occurred while adjusting salaries: ' || SQLERRM); END;
-
定义一个触发器,在插入新员工记录时自动为其分配唯一的员工编号。
-- 定义触发器 CSDN-小小野猪 CREATE OR REPLACE TRIGGER assign_employee_id BEFORE INSERT ON Employees -- 触发器触发时机是插入员工操作之前 FOR EACH ROW BEGINSELECT MAX(EmployeeID) + 1 INTO :NEW.EmployeeID FROM Employees; END;
-
编写一个自定义函数,用于解决中文排序问题。
-- 自定义中文映射阿拉伯数字函数 CSDN-小小野猪 CREATE OR REPLACE FUNCTION P_ORDER_CHINESE_TO_ARABIC(V_NUM VARCHAR2) RETURN NUMBER IS BEGIN-- 根据不同的中文数字,映射到对应的阿拉伯数字CASE V_NUMWHEN '一' THEN RETURN 1;WHEN '二' THEN RETURN 2;WHEN '三' THEN RETURN 3;WHEN '四' THEN RETURN 4;WHEN '五' THEN RETURN 5;WHEN '六' THEN RETURN 6;WHEN '七' THEN RETURN 7;WHEN '八' THEN RETURN 8;WHEN '九' THEN RETURN 9;WHEN '十' THEN RETURN 10;-- ... 其他数字可继续添加END CASE; END;
三、性能与效率对比
-
Oracle数据库有声明:只要是对数据的操作可以使用存储过程执行,速度比其他语言获取数据再加工要快。
-
讨论在特定情况下,使用PL/SQL相较于单纯SQL有优势,例如批量处理数据、减少网络通信开销等。但在单个处理逻辑时应该选用SQL,根据合适的场景选择合适的语法以提高性能和资源利用率。
四、总结
- SQL语句通常由客户端发送到数据库服务器执行,每次执行都是针对单个请求响应。而PL/SQL程序可以在数据库服务器端预编译并存储,随后由服务器端调用执行,特别适用于批量处理和复杂逻辑操作。
- 在执行效率上,PL/SQL可以减少网络传输次数,因为可以将多个SQL语句组合在一个存储过程或函数中一次性执行,从而提高性能。
- SQL主要用于简单的数据查询和修改,而PL/SQL则支持复杂的编程逻辑,例如可以编写循环来处理一组记录,或者使用条件判断语句来根据不同情况执行不同的操作。
- PL/SQL可以将相关的函数和过程封装起来,实现代码的复用和模块化,而SQL不支持这种级别的封装。
- SQL作为一种标准化的语言,可以在多种支持SQL的数据库系统中使用。然而,PL/SQL是Oracle数据库专有的,不能直接在其他数据库系统(如MySQL、SQL Server等)中使用。
- 在哪些情况下更适合使用SQL?哪些情况下应使用PL/SQL?这是经常困扰开发者的问题,这时需要根据具体业务需求、性能要求以及团队的技术栈等因素综合考虑。
五、其他
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,严谨转载。不得擅自复制、发布、传播、改编或以其他任何形式使用本文内容。