首页 > 数据库 >详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE

详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE

时间:2023-11-16 14:47:05浏览次数:43  
标签:TRUNCATE 删除 -- DROP course SQL DELETE

本文分享自华为云社区《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,提示表不存在

cke_120.png

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

cke_121.png

3)DROP TABLE 执行成功

cke_122.png

4)查看执行结果

cke_123.png

四、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)创建实验表并初始化数据

cke_124.png

2)TRUNCATE TABLE执行成功

cke_125.png

3)查看执行结果

cke_126.png

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)创建实验表并初始化

cke_127.png

2)根据分区进行删数据

cke_128.png

五、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;

cke_129.png

六、应用场景

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

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

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

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

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

七、小结

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

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

标签:TRUNCATE,删除,--,DROP,course,SQL,DELETE
From: https://www.cnblogs.com/huaweiyun/p/17836188.html

相关文章

  • 【转】[SQL Server]在尝试加载程序集 ID 65545 时 Microsoft .NET Framework 出错。
    转自:https://blog.51cto.com/u_15075521/3979736消息10314,级别16,状态11,第44行在尝试加载程序集ID65545时Microsoft.NETFramework出错。服务器可能资源不足,或者不信任该程序集。请重新运行查询,或检查有关的文档了解如何解决程序集信任问题。有关此错误的详细信息:Syst......
  • PostgreSQL技术大讲堂 - 第34讲:调优工具pgBagder部署
       PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第34讲:调优工具pgBagder部署 第34讲:11月18日(周六)......
  • MySQL 8.0 目前仍旧没有解决timestamp时间戳溢出的问题
    在MySQL中,TIMESTAMP列的默认范围是从'1970-01-0100:00:01'到'2038-01-1903:14:07'。如果插入的时间值超出了该范围,MySQL会将其视为无效值,并将其设置为'0000-00-0000:00:00'。在MySQL8.0.35最新版本中,timestamp时间戳溢出的问题目前仍旧没有解决。如下图所示:为了解决这个问题,只......
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
    2023年11月15日,对.net的开发圈是一个重大的日子,.net8.0正式版发布。圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net5.0的时候就各种吹风Aot编译,直到6.07.0使用仍然比较麻烦,我个人比较期待本次更新的aot体验。有的群友几个小时都等不了啦,半夜就开始更新预......
  • Setence Case using Javascript/SQL Server
    Howto ChangeaaaorAAAtobeAaa<scripttype="text/javascript"language="javascript">functionCorrectName(e){if(e.value!=""&&/^[a-zA-Z]/.test(e.value)){e.value=e.valu......
  • 02MYSQL
    字符编码与配置文件#查看MySQL默认字符编码\s"""如果是5.X系列显示的编码有多种latin1gbk如果是8.X系列显示的统一是utf8mb4utf8mb4是utf8优化版本支持存储表情"""#统一字符编码5.X默认编码有多种可能会导致乱码的情况所以......
  • Linux(Centos7)升级MySQL 5.7到8.0.31
    一、下载MySQL安装包下载地址:https://downloads.mysql.com/archives/community/二、备份mkdir/home/mysqlbackmysqldump-uroot-p--all-databases>/home/mysqlback/mysqldback.sql三、卸载MySQL注:卸载之前一定要先备份好数据库1.检查当前系统是否安装过MySQLrpm-q......
  • MySQL8 安装后 data文件夹迁移
    安装后data文件夹默认在C盘:C:\ProgramData\MySQL\MySQLServer8.0\Data想迁移到D盘:1、停止MySQL服务2、将Data文件夹剪切到D盘3、修改 C:\ProgramData\MySQL\MySQLServer8.0\my.ini,将datadir参数修改为新路径:D:/AMySQL80\Data(注意路径中间是左斜杆,最后一个是右斜杠,全用......
  • oracle SQL 实现对数据库的的脱敏和对称加密
    之前的kettleETL太慢了insertintoselect83w数据220skettle83w数据etl3h26w~功能变更耗时另外如果需要再次对其他字段做脱敏时间又比较耗时需要再次编写环节复制表INSERTINTOXXXXSELECT*FROMXXXX_JM;验证数据--源表总数SELECTCOUNT(*)F......
  • mendix 连接默认数据库改为mss sql
    mendix支持的默认msssql数据库为2019/2022+先下载连接驱动jdbchttps://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15.当提示"The"Encrypt"propertyissetto"true"andthe"trust......