PL/SQL语法--PL/SQL和SQL的异同

目录

  • 引言
  • 一、核心概念
    • 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 版权协议,严谨转载。不得擅自复制、发布、传播、改编或以其他任何形式使用本文内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请立刻停止编写 Dockerfiles 并使用 docker init

您是那种觉得编写 Dockerfile 和 docker-compose.yml 文件很痛苦的人之一吗? 我承认,我就是其中之一。 我总是想知道我是否遵循了 Dockerfile、 docker-compose 文件的最佳编写实践,我害怕在不知不觉中引入了安全漏洞。 但是现在&#xff0c…

【数据结构和算法初阶(C语言)】时间复杂度(衡量算法快慢的高端玩家,搭配例题详细剖析)

目录 1.算法效率 1.1如何衡量一个算法的好坏 1.2 算法的复杂度 2.主菜-时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.2.1算法的最好,最坏和平均的情况 3.经典时间复杂度计算举例 3.1计算冒泡排序的时间复杂度 3.2计算折半查找的时间复杂度 3.…

Vue3 学习笔记(Day5)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. Vue3 学习笔记(Day1) 2. Vue3 学习笔记(Day2&…

《Docker Compose深度解析:多环境配置、服务扩展与发现》

《Docker Compose深度解析:多环境配置、服务扩展与发现》 1. 引言 Docker Compose 是 Docker 官方提供的用于定义和运行多容器 Docker 应用程序的工具。在上一篇中,我们已经介绍了 Docker Compose 的基本概念和用法。本篇将进一步深入,探讨…

提升培训考试效率的系统设计策略

随着培训的重要性日益凸显,如何提升培训考试系统的效率成为了许多组织和机构关注的焦点。 一、设计自适应的考试界面 培训考试系统的界面应该能够自适应不同的屏幕尺寸和设备类型,如电脑、平板电脑和手机。采用响应式设计技术,确保考生在不同…

Leetcode115. 不同的子序列 -代码随想录

题目: 代码(首刷看解析 2024年2月29日): 不晓得这种超过int和long的测试案例是用来恶心谁的,用DP都没机会取模 class Solution { public:// 动态规划const int MOD 1000000007;int numDistinct(string s, string t) {long n s.…

折线图sns.lineplot()

折线图sns.lineplot 介绍代码介绍 season官网 sns.lineplot() 是 Seaborn 库中用于绘制折线图的函数。这个函数可以可视化数据集中不同变量之间的关系,特别适合展示随时间变化的数据趋势。 下面是 sns.lineplot() 函数的一般用法和一些常用参数: sns.lineplot(x=‘x轴数据…

Mysql8.0 数据库表的基本操作

1,创建表 CREATE TABLE 表名称( 字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型, ) mysql> create table tb_student(-> sid INT,-> sname VARCHAR(20)-> ); Query OK, 0 rows affected (1.19 sec)mysql> …

市场复盘总结 20240229

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率中 60% 最常用…

06|Mysql内部组件结构

1. 连接器 客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是由连接器完成的 mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306连接步骤: 1、如果用户名或密码不对,你就会收到一个"Access denied for us…

2024年华为OD机试真题-高效货运-Python-OD统一考试(C卷)

题目描述: 1.老李是货运公司承运人,老李的货车额定载货重量为wt 2.现有两种货物,货物A单件重量为wa,单件运费利润为pa,货物B单件重量为wb,单件运费利润为pb 3.老李每次发车时载货总重量刚好为货车额定载货重…

ChatGPT第四讲

ChatGPT的回答从哪里来? ChatGPT回答问题时通常比问题本身更长,这是因为它需要通过补充额外的信息来提供完整的答案。它的回答来源于对现有信息的抽取和整合,那么具体是怎么进行抽取和整合的呢,下面我们带着这个疑问来详细讨论一下…

【转载】Windows 11 任务栏位置调整

更改注册表(部分win11版本有效) Win R快捷键打开「运行」——执行regedit命令打开「注册表编辑器」进入路径: 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3 修改Settings这个二进制的第 2 行…

前端同时传递文件数据+非文件数据,前后端解决方案

之前录制视频《文件上传组件》的时候有位观众提了个问题,如果我没有理解错的话,应该就是前后同时传递文件数据 非文件数据,前后端数据该如何接收,这里我给出我自己的解决方案 tip:下文在编写前端代码的时候,用到了这篇…

使用WebAssembly提升Web应用性能

文章目录 使用WebAssembly提升Web应用性能引言一、什么是WebAssembly1. WebAssembly的定义2. WebAssembly的目标和用途 二、WebAssembly与JavaScript的比较1. 执行速度2. 类型检查3. 内存管理4. 适用场景 三、WebAssembly的优势1. 提升性能2. 安全性3. 可移植性4. 集成性 四、如…

MYSQL安装及卸载

目录 一、下载 二、解压 三、配置 1. 添加环境变量 2. 初始化MySQL 3. 注册MySQL服务 4. 启动MySQL服务 5. 修改默认账户密码 四、登录MySQL 五、卸载MySQL 一、下载 点开下面的链接:MySQL :: Download MySQL Community Server 点击Download 就可以下载对…

Linux-基础命令(黑马学习笔记)

Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树形结构 Windows系统可以拥有多个盘符,如C盘、D盘、E盘 Linux没有盘符这个概念,只有一个根目录 /,所有文件都在它下面 Linux路径的描述方式 ● 在Linux系统中,路径之…

真实与虚幻的边界:算法备案的重要不言而喻

曾经需要耗费大量时间和精力的人脸生成、替换,现在只需通过先进的深度合成算法便能轻松实现;而以往难以触及的人物属性编辑和操控,如今也已成为创作者手中的得力工具。深度合成技术在图像和视频编辑领域的应用,已然掀起了革命性的…

【AI绘画·24年1月最新】Stable Diffusion整合包安装!解压即用--秋葉aaaki 大佬的作品,试用

前言 Stable Diffusion 之前费老大的劲部署安装,解决报错。搞完之后,突然发现有个现成集成包可以用,真是效率高到不行,今天搞下来试试 我电脑配置: CPU: 12th Gen Intel Core™ i7-12700F 2.10 GHz 内存32G&#xff0…

Vuex使用之Vue3

1. 搭建Vuex环境 创建文件:src/store/index.js //引入Vueximport { createStore } from vuex//准备actions对象——响应组件中用户的动作const actions {jia(context, value) {context.commit(JIA, value)}}//准备mutations对象——修改state中的数据const mutatio…