首页 > 其他分享 >(ACL-2024)MELoRA:用于参数高效微调的迷你集成低秩适配器

(ACL-2024)MELoRA:用于参数高效微调的迷你集成低秩适配器

时间:2025-01-15 13:32:36浏览次数:3  
标签:frac 适配器 ACL 参数 et MELoRA LoRA 复杂度

MELoRA:用于参数高效微调的迷你集成低秩适配器

paper是山东大学发表在ACL 2024的工作

paper title:MELoRA: Mini-Ensemble Low-Rank Adapters for Parameter-Efficient Fine-Tuning

Code:https://github.com/chasonshi/melora

Abstract

参数高效微调 (PEFT) 是一种流行的定制预训练大型语言模型 (LLM) 的方法,尤其是在模型规模和任务多样性增加的情况下。 低秩自适应 (LoRA) 基于这样的思想:自适应过程本质上是低维的,即显著的模型变化可以用相对较少的参数来表示。然而,与全参数微调相比,降低秩会遇到特定任务的泛化误差挑战。我们提出了 MELoRA,这是一种小型集成低秩适配器,它使用更少的可训练参数,同时保持较高的秩,从而提供更高的性能潜力。核心思想是冻结原始预训练权重并训练一组仅具有少量参数的小型 LoRA。这可以捕捉到小型 LoRA 之间的显著多样性,从而提高泛化能力。我们对各种 NLP 任务进行了理论分析和实证研究。我们的实验结果表明,与LoRA相比,MELoRA在自然语言理解任务上可训练参数减少了8倍,在指令遵循任务上可训练参数减少了36倍,取得了更好的性能,证明了MELoRA的有效性。

1 Introduction

大型语言模型 (LLM) 已成为自然语言处理 (NLP) 的默认范式 (Brown et al, 2020)。微调 (FT) 是一种针对特定下游任务定制 LLM 的流行方法 (Ding et al, 2023b)。然而,随着模型规模和任务多样性的增加,完全 FT 变得不可行。参数高效微调 (PEFT) 已被提出通过减少可训练参数来减轻内存需求 (Rebuffi et al, 2017; Li and Liang,2021; Lester et al, 2021; Hu et al, 2022)。通常,PEFT 方法的核心思想是仅更新一小部分参数,例如适配器权重 (Rebuffi et al, 2017; Hu et al, 2022) 和提示权重 (Li and Liang, 2021; Lester et al, 2021)。

图1

图 1:LoRA(左)与所提出的 MELoRA(右)的比较。MELoRA 的核心思想是冻结原始预训练权重,并仅使用少量参数并行训练一组迷你 LoRA。

低秩自适应 (LoRA) (Hu et al, 2022) 被广泛使用,因为它的额外内存开销最小,并且没有额外的推理延迟。如图 1(左)所示,LoRA 使用低秩矩阵 (A, B) 来近似预训练权重 (W) 的更新。由于秩小于模型的隐藏维度,LoRA 的可训练参数总数比完整 FT 小得多。尽管具有显着的计算优势,但与完整 FT 相比,低秩近似可能会导致相当大的性能差距 (Hu et al, 2022; Zi et al, 2023)。因此,以下是一个关键挑战:

如何在保持计算优势的同时实现更高秩的变化?

为了在不引入更多可训练参数的情况下提高 LoRA 的秩,ReLoRA(Lialin 等人,2023)和 COLA(Xia 等人,2024)将多个 LoRA 附加到预训练的权重中。它们逐步合并旧的 LoRA 以预训练权重,并在训练期间堆叠新的 LoRA。本质上,这些方法以串联方式训练多个 LoRA。但是,一系列 LoRA 模块之间可能会有重叠。 因此,在这些方法中使用多个 LoRA 模块的直接和并不一定能保证秩的提高。在这项工作中,我们提出了一种简单而有效的方法,称为迷你集合低秩适配器(MELoRA),它将多个迷你 LoRA 并行堆叠,如图 1(右)所示。我们从理论上证明 MELoRA 可以在不增加额外参数开销的情况下确保更高的秩。我们沿对角线同时连接多个迷你 LoRA,以构建等效的块对角线 LoRA 矩阵。因此,每个迷你 LoRA 都相互独立,最终秩将是每个迷你 LoRA 秩的总和。每个迷你 LoRA 秩只是学习隐藏状态的不同维度。迷你 LoRA 中可训练权重 A 和 B 的形状将细得多。

我们对各种任务和模型进行了广泛的实验,以证明 MELoRA 的有效性。我们在自然语言理解任务中使用 RoBERTa-base 进行评估,在指令跟踪任务中使用 Llama-2-7B 进行评估。结果表明,MELoRA 在使用明显更少的参数的情况下实现了卓越的性能。例如,MELoRA 的可训练参数比 LoRA 少 36 倍,但在所有指令跟踪数据集上的表现均优于 LoRA。

我们的贡献总结如下:

  • 我们在 LoRA 的基础上提出了一种新方法(MELoRA),使其能够以更少的参数实现更高的秩和更好的性能。
  • 我们从理论上证明了与 LoRA 相比,MELoRA 保持了更高且灵活的排名,以及更低的复杂度。
  • 大量实验表明,MELoRA 在参数数量和性能方面均优于 LoRA。

2 Related Work

随着模型规模的不断扩大和下游任务的激增,全参数微调带来了计算挑战。为了应对这些挑战,参数高效微调 (PEFT) 受到了越来越多的研究者的关注,它只修改一小部分参数,同时保持大多数预训练模型参数不变。许多研究 (Rebuffi et al, 2017; Houlsby et al, 2019; Pfeiffer et al, 2021; Rücklé et al, 2021; Li and Liang, 2021; Lester et al, 2021; Hu et al, 2022) 讨论了减少推理开销、内存效率和存储优化等关键因素。特别是,LoRA (Hu et al, 2022) 引入了可训练的低秩矩阵来近似微调过程中的权重更新。由于其实现简单,在推理过程中不会引起任何明显的延迟,因此被广泛应用于许多领域。 人们提出了许多基于 LoRA 基本原理的先进技术。 这些扩展主要分为两类:自适应秩和定制更新策略。

2.1 Adaptive Rank


一些研究(Zhang et al, 2022; Lawton et al, 2023)认为,虽然流行的低秩自适应(LoRA)方法是有效的,但它使用的固定内在秩可能并不总是最佳的。他们强调了对更重要的参数使用更高秩的有效性。值得注意的是,AdaLoRA(Zhang et al, 2022)采用自适应方法进行奇异值剪枝,根据各个奇异值的大小定制秩选择。因此,该方法涉及在各个层中使用不同的秩。同样,Ding et al (2023a) 使用门单元来促进不同秩的剪枝。相比之下,Zhang et al (2023a) 提出了 IncreLoRA,这是一种增量参数分配方法,它根据每个模块的重要性得分在训练期间自适应地添加可训练参数。

2.2 Customized Update Strategies


改进 LoRA 的另一种方法是改变参数更新策略。一些工作致力于减少可训练参数的数量。 Kopiczko 等人 (2023) 引入了一个共享的冻结随机 LoRA 模块,该模块适用于所有预训练权重,并且仅训练 LoRA B 和 A 矩阵之间的缩放向量以减少可训练参数的数量。与传统 LoRA 相比,这种方法将可训练参数数量减少了 10 倍。(Zhang 等人,2023b) 的另一种方法涉及冻结 LoRA 中的 A 矩阵,从而有效地将可训练参数的数量减半。但这两种方法都会导致性能大幅下降。

QLoRA(Dettmers 等人,2023 年)进一步利用 4 位量化来有效且高效地微调 LLM。LoRAMoE(Dou 等人,2023 年)使用多个 LoRA 作为适应性专家,并使用路由器将它们置于前馈网络层中,以解决微调数据可能会破坏存储在 LLM 中的世界知识的问题。

为了在不同的秩设置下执行模型推理,Valipour 等人 (2023) 受到嵌套 dropout 技术的启发,提出了一种动态参数更新策略,使单个训练过程能够进行多秩推理。 Delta-LoRA (Zi 等人,2023) 不仅更新低秩矩阵 A 和 B,还使用两个低秩矩阵 A 和 B 的乘积的增量将学习传播到预训练权重 W。

尽管具有计算优势,但到目前为止,低秩近似会导致相当大的性能差距。为了解决这一限制,ReLoRA(Lialin 等人,2023 年)和 COLA(Xia 等人,2024 年)将多个 LoRA 附加到预训练权重中,以提高 LoRA 的秩,而无需引入更多可训练参数。它们逐步合并旧的 LoRA 层以预训练权重并在训练期间堆叠新的 LoRA 层。然而,训练中的秩下限没有理论上的保证。

与之前的研究不同,我们提出的方法沿对角线并行连接多个迷你 LoRA,以构建块对角 LoRA 矩阵。它确保最终秩将是每个迷你 LoRA 排名的总和。

3 Methodology

在本节中,我们介绍了所提出的迷你集合低秩适配器(MELoRA),这是一种新方法,涉及连接多个迷你 LoRA 模块的输出,如图 1 所示。

3.1 Preliminaries on Low-Rank Adapter


LoRA 将权重更新 Δ W \Delta W ΔW 分解为一个低秩乘积 B A B A BA。在训练过程中,预训练权重矩阵 W W W 被冻结,不会接收梯度更新,而 A A A 和 B B B 包含可训练的参数,如下方公式所示:

h = W x + Δ W x = W x + B A x h = W x + \Delta W x = W x + B A x h=Wx+ΔWx=Wx+BAx

其中:

  • W ∈ R d × d W \in \mathbb{R}^{d \times d} W∈Rd×d 是预训练的权重矩阵;
  • A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d 和 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r 是低秩投影矩阵;
  • x ∈ R d x \in \mathbb{R}^d x∈Rd 是输入特征;
  • r ≪ d r \ll d r≪d 表示低秩的大小。

在训练阶段的初始时刻:

  • A A A 的初始化:通过高斯分布随机初始化。
  • B B B 的初始化:初始化为零矩阵,以确保增量更新 B A = 0 B A=0 BA=0,即模型初始状态时不引入额外的更新。

3.2 Matrix Rank Theory


在线性代数中,有一些有用的不等式用于描述矩阵秩的性质:

R ( M 1 + M 2 ) ≤ R ( M 1 ) + R ( M 2 ) , max ⁡ ( R ( M 1 ) , R ( M 2 ) ) ≤ R ( concat ⁡ ( M 1 , M 2 ) ) ≤ R ( M 1 ) + R ( M 2 ) , R ( diag ⁡ i = 0 n M i ) = ∑ i = 1 n R ( M i ) , \begin{aligned} \mathcal{R}\left(M_1+M_2\right) & \leq \mathcal{R}\left(M_1\right)+\mathcal{R}\left(M_2\right), \\ \max \left(\mathcal{R}\left(M_1\right),\right. & \left.\mathcal{R}\left(M_2\right)\right) \\ & \leq \mathcal{R}\left(\operatorname{concat}\left(M_1, M_2\right)\right) \\ & \leq \mathcal{R}\left(M_1\right)+\mathcal{R}\left(M_2\right), \\ \mathcal{R}\left(\operatorname{diag}_{i=0}^n M_i\right) & =\sum_{i=1}^n \mathcal{R}\left(M_i\right), \end{aligned} R(M1​+M2​)max(R(M1​),R(diagi=0n​Mi​)​≤R(M1​)+R(M2​),R(M2​))≤R(concat(M1​,M2​))≤R(M1​)+R(M2​),=i=1∑n​R(Mi​),​

其中, R ( ⋅ ) \mathcal{R}(\cdot) R(⋅) 表示获取矩阵秩的操作。

  • 公式 2 表明,当矩阵进行简单的加法操作时,秩没有下界,可能小于两者中较大的秩。
  • 公式 3 指出,通过连接操作( concat ⁡ \operatorname{concat} concat),矩阵的秩不会增加,因为列向量可能存在线性相关性。
  • 公式 4 表明,当矩阵以对角方式拼接时,最终的秩是各个矩阵秩的总和。

3.3 Mini-Ensemble Low-Rank Adapter


在 MELoRA 中,我们在预训练权重上应用了 n n n 个迷你 LoRA 模块,如图 1 右侧所示。为了方便与 LoRA 进行比较,我们将每个迷你 LoRA 的秩设置为 r n \frac{r}{n} nr​。MELoRA 定义为多个迷你 LoRA 在不同隐藏维度上的拼接:

h = W x + Δ W x = W x + ( concat ⁡ i = 0 n B i A i x i ) = W x + ( diag ⁡ i = 0 n B i A i ) x = W x + ( diag ⁡ i = 0 n B i ) ( diag ⁡ i = 0 n A i ) x \begin{aligned} h & = W x + \Delta W x \\ & = W x + \left(\operatorname{concat}_{i=0}^n B_i A_i x_i\right) \\ & = W x + \left(\operatorname{diag}_{i=0}^n B_i A_i\right) x \\ & = W x + \left(\operatorname{diag}_{i=0}^n B_i\right)\left(\operatorname{diag}_{i=0}^n A_i\right) x \end{aligned} h​=Wx+ΔWx=Wx+(concati=0n​Bi​Ai​xi​)=Wx+(diagi=0n​Bi​Ai​)x=Wx+(diagi=0n​Bi​)(diagi=0n​Ai​)x​

其中:

  • A i ∈ R r n × d n , B i ∈ R d n × r n A_i \in \mathbb{R}^{\frac{r}{n} \times \frac{d}{n}}, B_i \in \mathbb{R}^{\frac{d}{n} \times \frac{r}{n}} Ai​∈Rnr​×nd​,Bi​∈Rnd​×nr​ 是迷你 LoRA 的低秩投影矩阵,
  • x , h ∈ R d x, h \in \mathbb{R}^d x,h∈Rd,
  • x i ∈ R d n x_i \in \mathbb{R}^{\frac{d}{n}} xi​∈Rnd​ 是从输入特征 x x x 分割出来的子特征,
  • n n n 表示拼接使用的迷你 LoRA 模块数量。

推导

根据公式 (5),MELoRA 可以被视为一种稀疏的 LoRA。图 2 展示了通过在 B i B_i Bi​ 和 A i A_i Ai​ 的非对角线位置填充零来获得等效矩阵 B B B 和 A A A 的过程。根据公式 (4),等效矩阵 B B B 和 A A A 的秩等于各个 B i B_i Bi​ 和 A i A_i Ai​ 秩的总和。

因为 r n ≪ d \frac{r}{n} \ll d nr​≪d,每个 B i B_i Bi​ 和 A i A_i Ai​ 的秩均为 r n \frac{r}{n} nr​,所以等效秩为:
n × r n = r . n \times \frac{r}{n} = r. n×nr​=r.

图2

图 2:展示了 MELoRA 如何采用一组迷你 LoRA 模块以获得稀疏等效的 B , A B, A B,A。 x ∈ R d x \in \mathbb{R}^d x∈Rd 表示一个具有 d d d 维的表示向量。 A i ∈ R r n × d n A_i \in \mathbb{R}^{\frac{r}{n} \times \frac{d}{n}} Ai​∈Rnr​×nd​ 和 B i ∈ R d n × r n B_i \in \mathbb{R}^{\frac{d}{n} \times \frac{r}{n}} Bi​∈Rnd​×nr​ 是每个迷你 LoRA 模块的低秩投影矩阵,其中 r ≪ d r \ll d r≪d。 0 表示零矩阵,不需要进行训练。


初始化方法

我们采用与 LoRA 相同的初始化方法:

  • 每个 A i A_i Ai​ 使用高斯随机初始化;
  • 每个 B i B_i Bi​ 初始化为零矩阵。

MELoRA 的三大优势

  1. 灵活性
    • MELoRA 在特征空间上分块操作,使得模型在更大秩范围内具有更好的适配能力。
  2. 稀疏性
    • MELoRA 将低秩矩阵分解为多个迷你矩阵,通过稀疏表示有效减少参数冗余。
  3. 可扩展性
    • 由于特征分块和拼接操作,MELoRA 更容易扩展到更高维度的特征空间或更复杂的任务。

(1) MELoRA 在较少参数下维持更高秩

MELoRA 的一个显著特点是能够在较少参数的情况下实现更高的秩。如第 3.2 节所讨论,简单的矩阵求和或拼接可能由于它们之间的潜在重叠性而无法显著增加秩。而在 MELoRA 中,矩阵 B i B_i Bi​ 和 A i A_i Ai​ 被分别排列在独立的列和行中,从而保证 diag ⁡ i = 0 n B i \operatorname{diag}_{i=0}^n B_i diagi=0n​Bi​ 和 diag ⁡ i = 0 n A i \operatorname{diag}_{i=0}^n A_i diagi=0n​Ai​ 的秩是各个 B i B_i Bi​ 和 A i A_i Ai​ 秩的总和。

图 2 说明了 MELoRA 的可训练参数数量由以下表达式决定:
n × ( d in n × r n + r n × d out n ) = d out × r + r × d in n . n \times\left(\frac{d_{\text{in}}}{n} \times \frac{r}{n} + \frac{r}{n} \times \frac{d_{\text{out}}}{n}\right) = \frac{d_{\text{out}} \times r + r \times d_{\text{in}}}{n}. n×(ndin​​×nr​+nr​×ndout​​)=ndout​×r+r×din​​.

而对于 LoRA,实现相同秩时的可训练参数数量为:
d out × r + r × d in ( Hu et al., 2022 ) . d_{\text{out}} \times r + r \times d_{\text{in}} \quad (\text{Hu et al., 2022}). dout​×r+r×din​(Hu et al., 2022).

因此,与 LoRA 相比,MELoRA 的可训练参数数量减少了一个比例因子 n n n。


意义

MELoRA 框架可以通过减少参数数量实现更高的秩,这表明在相同的参数预算下,MELoRA 能够有效利用资源,同时支持更大的秩,这对于大规模模型的高效微调具有重要意义。

(2) MELoRA 拥有更灵活的秩

MELoRA 的另一个优势是能够在不改变参数数量的情况下调整秩大小。近期研究(Hu et al., 2022;Valipour et al., 2023)指出,不同数据集上的模型性能与秩的变化密切相关。在 MELoRA 中,我们也可以将每个迷你 LoRA 的秩设置为 r r r。在这种情况下:

  • 单个迷你 LoRA 模块的矩阵 A A A 的维度为 R r × d n \mathbb{R}^{r \times \frac{d}{n}} Rr×nd​;
  • 矩阵 B B B 的维度为 R d n × r \mathbb{R}^{\frac{d}{n} \times r} Rnd​×r;
  • 可训练参数总数为:
    2 × r × d . 2 \times r \times d. 2×r×d.

等效的总秩为:
n × r . n \times r. n×r.

通过调整超参数 n n n(迷你 LoRA 模块的数量),可以改变等效秩 n × r n \times r n×r,而无需增加整体的参数数量。


意义

  1. 灵活性

    • MELoRA 提供了对秩的动态调节能力,可以根据不同任务和数据集的需求,灵活调整等效秩。
  2. 高效性

    • 在保持总参数数量不变的情况下,通过改变超参数 n n n 实现秩的调整,减少了模型重训练的需求。
  3. 适配性

    • 不同数据集对秩大小的需求不同,MELoRA 的这种灵活性使其在跨数据集或多任务学习场景下具有更强的适应能力。

(3) MELoRA 拥有更低的计算复杂度

我们在相同秩条件下比较 LoRA 和 MELoRA 的计算复杂度。设:

  • LoRA 中:
    • A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d, B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r;
  • MELoRA 中:
    • A i ∈ R r n × d n A_i \in \mathbb{R}^{\frac{r}{n} \times \frac{d}{n}} Ai​∈Rnr​×nd​, B i ∈ R d n × r n B_i \in \mathbb{R}^{\frac{d}{n} \times \frac{r}{n}} Bi​∈Rnd​×nr​, n n n 为迷你 LoRA 模块数量;
  • 输入特征向量 x ∈ R d x \in \mathbb{R}^d x∈Rd。

LoRA 的时间复杂度

对于 A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d 和 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r,LoRA 的矩阵乘法时间复杂度为:
LoRA 复杂度 = d 2 r + d r 2 . \text{LoRA 复杂度} = d^2 r + d r^2. LoRA 复杂度=d2r+dr2.

MELoRA 的时间复杂度

MELoRA 的时间复杂度是各个迷你 LoRA 模块的复杂度总和。每个模块的复杂度为:
( d n ) 2 r n + d n ( r n ) 2 , \left(\frac{d}{n}\right)^2 \frac{r}{n} + \frac{d}{n} \left(\frac{r}{n}\right)^2, (nd​)2nr​+nd​(nr​)2,
因此, n n n 个模块的总复杂度为:
MELoRA 复杂度 = n × ( ( d n ) 2 r n + d n ( r n ) 2 ) . \text{MELoRA 复杂度} = n \times \left(\left(\frac{d}{n}\right)^2 \frac{r}{n} + \frac{d}{n} \left(\frac{r}{n}\right)^2\right). MELoRA 复杂度=n×((nd​)2nr​+nd​(nr​)2).

化简后,MELoRA 的复杂度为:
MELoRA 复杂度 = d 2 r + d r 2 n 2 . \text{MELoRA 复杂度} = \frac{d^2 r + d r^2}{n^2}. MELoRA 复杂度=n2d2r+dr2​.


复杂度比较

MELoRA 的复杂度比 LoRA 减少了 n 2 n^2 n2 倍:
LoRA 复杂度 MELoRA 复杂度 = n 2 . \frac{\text{LoRA 复杂度}}{\text{MELoRA 复杂度}} = n^2. MELoRA 复杂度LoRA 复杂度​=n2.


意义

  1. 更高的效率

    • MELoRA 在保持相同秩的条件下,显著减少了计算操作的次数,特别是在 n n n 较大的情况下,能够极大地降低计算复杂度。
  2. 适合大规模模型

    • 对于具有高维输入( d d d 较大)的模型,MELoRA 能有效减少计算需求,使其更适合应用于大规模预训练模型的微调。
  3. 节省资源

    • 由于计算操作显著减少,MELoRA 能够降低训练时间和硬件资源消耗。

标签:frac,适配器,ACL,参数,et,MELoRA,LoRA,复杂度
From: https://blog.csdn.net/wl1780852311/article/details/145140789

相关文章

  • Oracle创建dblink(实现跨数据库查询)纯干货
    介绍     创建dblink实现跨库查询,创建本地数据库对远端数据库的dblink后,就可以像操作本地数据库一样操作远端数据库,这是Oracle给我们提供一个功能,让我们的跨库查询变得非常简单便捷。使用1.查看用户是否有创建dblink的权限(一般管理员用户SYS都有权限)select*fro......
  • Oracle查询表空间使用情况速度很慢
    现象监控表空间使用率及空间剩余量是数据库日常维护的重要内容。有时候在系统运行很长一段时间后,我们再去查询表空间使用情况,发现相同的查询语句执行时间会变长。这是因为我们在查询表空间使用情况的时候,需要从dba_free_space视图中获取剩余空间大小,如果该视图中对象过多,就......
  • Oracle系列---【ORA-01017用户名密码无效】
    1.问题项目启动时,报:ORA-01017用户名密码不对的错误,但是没有报具体哪个库错误,因为我是多数据源的项目。2.解决方案2.1定位到连接数据报错的用户和库名select*fromdba_audit_sessionwhereACTION_NAME='LOGON'ANDRETURNCODE=1017ORDERBYTIMESTAMPDESC;1.OS_USERNAM......
  • Oracle系列---【Oracle中密码的策略如何设置】
    在Oracle数据库中,profile是一个与用户关联的配置集合,用于控制用户账户的资源使用情况和密码策略。例如,profile可以定义用户的密码过期时间、账户锁定策略、并发会话数限制等。简单来说,profile是一组规则的集合,这些规则可以应用到一个或多个数据库用户,从而限制或管理他们的行......
  • Oracle数据库手动备份数据
    切记先不要执行第一句drop,先执行第二句select(可以先不加条件,因为目录名称可能不是DATA_BACKUP),看看DATA_BACKUP有没有,如果没有,按第三句sqlcreate创建一个存放文件的目录,然后按后续的sql授权这个目录:注:要在sys账号下使用如下sql(可在sqlplus下执行)。--前提directory=DATA_BACKUP创......
  • Oracle自定义函数:生成汉字首字母拼音码的函数、MD5
    1 生成汉字拼音码的函数使用方法:select用户名.函数名(需要获取首字母拼音码的字段名)from用户名.表名;selectoracle_user1.fgetpy(t.name)fromoracle_user1.studentt;函数定义:createorreplacefunctionfgetpy(v_strvarchar2)returnvarchar2asv_strleni......
  • Oracle 23ai新特性:使用列别名的 GROUP BY 和 HAVING 子句
    摘要随着数据库技术的不断发展,SQL语言也在不断进化,以更好地满足数据查询和分析的需求。本文将探讨如何在SQL查询中使用列别名(columnalias)或列位置(columnposition)来简化GROUPBY和HAVING子句,并提高查询的可读性和维护性。一、引言在SQL查询中,GROUPBY子句用于将......
  • Oracle 如何生成连续的数字/字符/时间序列
     文章目录使用层次查询生成序列生成一个连接的数字序列生成一个间隔的数字序列生成一个连续的字符序列生成一个间隔的时间序列使用表函数生成序列创建模拟的generate_series函数使用generate_series函数生成序列使用通用表表达式生成序列生成一个......
  • mysql、oracle、sqlserver的区别
    一、保存数据的持久性:        MySQL:是在数据库更新或者重启,则会丢失数据。                Oracle:把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复。                SqlServer:2014之后,也拥有了完全持久和延......
  • Oracle SQL每日一问之ORA-01723:zero-length columns are not allowed
    我:CREATETABLETABLE_1PARALLEL8ASSELECT/*+parallel(8)*/t1.emp_no,NULLemp_nameFROMtemp1t1;[AI机器人bot:]在你的SQL语句中,错误"zero-lengthcolumnsarenotallowed"可能是由于在创建表时没有为`NULLclct_flag`指定数据类型。即使在`CREATETAB......