本文分享自华为云社区《GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE》,作者:Gauss松鼠会小助手2 。

一、前言

在数据库中,SQL作为一种常用的数据库编程语言,扮演着至关重要的角色。SQL不仅可以用于创建、修改和查询数据库,还可以通过DROP、DELETE和TRUNCATE等语句来删除数据。这些语句是SQL语言中的最常用的命令,且它们有着不同的含义和使用场景。

本文以GaussDB数据库为平台,将详细介绍SQL中DROP、TRUNCATE和DELETE等语句的含义、使用场景以及注意事项,帮助读者更好地理解和掌握这些常用的数据库操作命令。

二、GaussDB的 DROP & TRUNCATE & DELETE 简述

1、简述

• DROP语句可以删除整个表,包括表结构和数据;

• TRUNCATE语句则可以快速地删除表中的所有数据,但不删除表结构。

• DELETE语句可以删除表中的数据,不包括表结构;

2、命令比对

大类

DROP

TRUNCATE

DELETE

SQL类型

DDL

DDL

DML

删除内容

删除表的所有数据,包括表结构、索引和权限等

删除表中所有数据,或指定分区的数据

删除表的全部或部分(+条件)数据

执行速度

速度最快

速度中等

速度最慢

Tip:在GaussDB数据库中,DROP是用于定义或修改数据库中的对象的命令之一。对象主要包括:库、模式、表空间、表、索引、视图、存储过程、函数、加密秘钥等,本次只针对其对表的操作。

三、GaussDB的DROP TABLE命令及示例

1、功能描述

DROP TABLE的功能是用来删除已存在的Table。

2、语法

DROP TABLE [IF EXISTS] [db_name.]table_name;

说明:SQL中加[IF EXISTS] ,可以防止因表不存在而导致执行报错。

参数:db_name:Database名称。如果未指定,将选择当前database。table_name:需要删除的Table名称。

3、示例

以下示例演示DROP命令的使用,依次执行如下SQL语句:

--删除整个表course

DROP TABLE IF EXISTS course

--创建course表

CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));

--初始化数据

INSERT INTO course VALUES('01' , '语文' , '02');

INSERT INTO course VALUES('02' , '数学' , '01');

INSERT INTO course VALUES('03' , '英语' , '03');

--3条记录

SELECT count(1) FROM course;

--删除整个表

DROP TABLE IF EXISTS course

--查看结果,表不存在(表结构及数据不存在)

SELECT count(1) FROM course;

1)DROP TABLE,提示表不存在

2)创建并初始化一张实验表

3)DROP TABLE 执行成功

4)查看执行结果

四、GaussDB的TRUNCATE命令及示例

1、功能描述

从表或表分区中移除所有数据,TRUNCATE快速地从表中删除所有行。它和在目标表上进行无条件的DELETE有同样的效果,但由于TRUNCATE不做表扫描,因而快得多, 且使用的系统和事务日志资源少。在大表上操作效果更明显。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。

2、语法

TRUNCATE [TABLE] table_name;

ALTER TABLE [IF EXISTS] table_name TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) }

参数:table_name:需要删除数据的Table名称。partition_name:需要删除的分区表的分区名称。partition_value:需要删除的分区表的分区值。

3、示例1

以下示例演示TRUNCATE命令的使用:

--创建course表

DROP TABLE IF EXISTS course;

CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));

--初始化数据

INSERT INTO course VALUES('01' , '语文' , '02');

INSERT INTO course VALUES('02' , '数学' , '01');

INSERT INTO course VALUES('03' , '英语' , '03');

--3条记录

SELECT count(1) FROM course;

--清空表

TRUNCATE TABLE course;

--或

TRUNCATE course;

--0条记录

SELECT count(1) FROM course;

1)创建实验表并初始化数据

2)TRUNCATE TABLE执行成功

3)查看执行结果

4、示例2

以下示例演示TRUNCATE命令的删除分区表数据

--创建列表分区(LIST)

DROP TABLE IF EXISTS orders;

CREATE TABLE orders (

id INT PRIMARY KEY,

customer_id INT,

order_date DATE,

product_id INT,

quantity INT

) PARTITION BY LIST (customer_id) (

PARTITION p1 VALUES (100),

PARTITION p2 VALUES (200),

PARTITION p3 VALUES (300),

PARTITION p4 VALUES (400),

PARTITION p5 VALUES (500)

);

--插入测试数据

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date'20230822',1,10);

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date'20230822',2,20);

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date'20230822',3,30);

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1004,200,date'20230822',4,40);

--查看分区p1、p2的数据

SELECT * FROM orders WHERE customer_id IN (100,200);

--或

--根据分区名称查询

SELECT * FROM orders PARTITION(p2);

--清空分区p1。

ALTER TABLE orders TRUNCATE PARTITION p1;

--或者

--清空分区p2=200。

ALTER TABLE orders TRUNCATE PARTITION for (200);

--查看分区p1、p2的数据

SELECT * FROM orders WHERE customer_id IN (100,200);

1)创建实验表并初始化

2)根据分区进行删数据

五、GaussDB的DELETE命令及示例

1、功能描述

从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。

2、注意事项

• 不支持DELETE语句中使用LIMIT。应使用WHERE条件明确需要更新的目标行。

• 不支持在单条SQL语句中,对多个表进行删除。

• DELETE语句中必须有WHERE子句,避免全表扫描。

• DELETE语句中禁止不应使用ORDER BY、GROUP BY子句,避免不必要的排序。

• 如果需要清空一张表,建议使用TRUNCATE,而不是DELETE。

• TRUNCATE会创建新的物理文件,并在事务结束时将原文件物理删除,清空磁盘空间。而DELETE会将表中数据进行标记,直到VACCUUM FULL阶段才会真正清理磁盘空间。

• DELETE有主键或索引的表,WHERE条件应结合主键或索引,提高执行效率。

• DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。

• 如果想保留标识计数值,请改用 DELETE

3、语法

DELETE FROM table_name [WHERE condition];

参数:table_name:需要删除数据的Table名称。condition:用于判断哪些行需要被删除。

4、示例

复用前面的实验表:

1)删除orders表中customer_id <200的所有数据:

DELETE FROM orders WHERE customer_id <200;

六、应用场景

• 需要根据一定的业务条件删除数据时、且数据量、性能可控的情况下,可以考虑使用 DELETE。

• 需要删除大批量数据时,同时要求速度快,效率高并且无需撤销时,可以使用 TRUNCATE。

• 在企业级开发中,实际上都是进行逻辑删除(将数据进行“删除标识”处理)、而并不进行物理上的删除。

• 在实际生产环境中,一般情况下删除业务处理(过渡表)中的数据。

• 在实际企业开发、维护过程中,不管使用 DELETE、TRUNCATE还是DROP命令前,都要考虑数据的备份。

七、小结

在GaussDB等数据库中,DROP、TRUNCATE和DELETE均是常用的删除数据的命令。但在实际业务使用中,需要根据不同的需求进行准确的选择,但无论选择那种删数方式,都需要考虑数据安全性——重要的事情说三遍:备份!备份!备份!

点击关注,第一时间了解华为云新鲜技术~

详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE的更多相关文章

  1. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  2. (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...

  3. 详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dengqi.blog.51cto.com/5685776/1223132 一:M ...

  4. 图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  5. 详解数据库三种删除方法: delete drop truncate

    Delete Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名称 where 列名称=值: 删除所有行:Del ...

  6. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  7. 详解WebService开发中四个常见问题(2)

    详解WebService开发中四个常见问题(2)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  8. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  9. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  10. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

随机推荐

  1. Util应用框架快速入门(4) - 集成测试开发入门

    本文演示Util应用框架开发的项目中如何编写集成测试. 准备 完成 Web Api 快速入门,本文将在之前生成的示例项目上讲解集成测试的开发. 测试概述 自动化测试对于Util应用框架的开发非常重要, ...

  2. java值传递机制

    目录 1. 基本数据类型 2. 引用数据类型 3. 总结 1. 基本数据类型 public class ValueTransferTest { public static void main(Stri ...

  3. 关于PaddleOCR识别时中文路径导致报错/没输出结果

    此处只做学习PaddleOCR时遇到的一些坑 一.Python版本与PaddleOCR兼容性问题 如果你在Python11的环境下安装PaddlePaddle,使用 paddleocr --image ...

  4. AirSim 自动驾驶仿真 (6) 设置采集参数和属性

    https://cloud.tencent.com/developer/article/2011384 1.配置文件在哪 默认情况下,文件位于用户目录下的AirSim文件夹,比如在Windows下,文 ...

  5. 编写高性能C#代码 —— Span<T>

    Span 提供任意内存的连续区域的类型安全和内存安全表示形式.它是在堆栈而不是托管堆上分配的ref结构,是对任意内存块的抽象 . 1.关于Span 在NET Core 2.1中首次引入 提供对任意内存 ...

  6. 25. 干货系列从零用Rust编写正反向代理,序列化之serde是如何工作的

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  7. Educational Codeforces Round 103 (Rated for Div. 2) A~D题解

    写在前边 链接:Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum 链接:A题链接 题目大意: 要求构造一个\ ...

  8. C#中LINQ的使用知多少?LINQ常功能整理,实例源代码解析

    LINQ(Language-Integrated Query)是C#语言中的一个强大的查询技术,它提供了一种统一的查询语法,可以用于查询和操作各种数据源,包括集合.数据库.XML等.下面详细描述了LI ...

  9. Android 实现APP可切换多语言

    原文: Android 实现APP可切换多语言 - Stars-One的杂货小窝 如果是单独给app加上国际化,其实很容易,创建对应的国家资源文件夹即可,如values-en,values-pt,ap ...

  10. c++算法练习day01【2022年蓝桥杯省赛B组题目】每天做一点、、、

    这个练习目前来说就比较宽松,打算在寒假(基本也就是这一个月每天刷几道题吧) 题目一: 小明决定从下周一开始努力刷题准备蓝桥杯竞赛.他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目.请你 ...