truncate、delete与drop区别
相同点:
- truncate 和不带 where 子句的 delete 、以及 drop 都会删除表内所有数据。
- drop 、 truncate 都是 DDL 语句(数据定义语言),执行后会自动提交。
不同点:
- truncate 和 delete 只删除数据不删除表的结构;drop 语句将删除表的结构被依赖的约束、触发器、索引;
- 一般来说,执行速度: drop > truncate > delete。
在数据库操作中,DELETE是可恢复的操作,而TRUNCATE、DROP是不可恢复的操作。
truncate和delete的区别
- 操作方式:TRUNCATE TABLE是一种DDL(数据定义语言)操作,用于快速删除整个表中的数据,包括释放表占用的存储空间,但不会记录在事务日志中。DELETE是一种DML(数据操纵语言)操作,用于逐行删除指定条件下的数据,并记录在事务日志中。
- 返回值:TRUNCATE TABLE操作不返回任何删除的行数或删除结果,而DELETE操作返回已删除的行数。
- 回滚:TRUNCATE TABLE不可回滚,即无法撤消删除操作。DELETE语句可以在事务中使用,可以通过ROLLBACK来撤销删除操作。
- 触发器:TRUNCATE TABLE不激活表上的触发器,而DELETE语句会触发与表关联的DELETE触发器。
- 速度和效率:由于TRUNCATE TABLE是一种快速删除整个表中的数据的操作,相对于DELETE语句,它通常更快且具有更好的性能。
having和where的区别
- WHERE在查询之前对行进行筛选,而HAVING在分组后对结果进行筛选。
- WHERE可以在任何SELECT查询中使用,而HAVING通常与GROUP BY一起使用。
- WHERE对单个行进行筛选,HAVING对分组后的结果进行筛选。
假设我们有一个名为 orders 的表,包含以下列: order_id 、 customer_id 、 order_date 和total_amount 。我们想要根据销售总额分组,并找出销售总额大于 1000 的顾客。
使用WHERE子句进行筛选:
SELECT customer_id, SUM(total_amount) AS total_sales
FROM orders
WHERE total_amount > 1000
GROUP BY customer_id;
在这个例子中,
WHERE
子句用于在查询之前对行进行过滤,筛选出销售总额大于
1000
的订单。然后,根据顾客ID
进行分组,并计算每个顾客的销售总额。
使用HAVING子句进行筛选:
SELECT customer_id, SUM(total_amount) AS total_sales
FROM orders
GROUP BY customer_id
HAVING total_sales > 1000;
在这个例子中,我们先将订单表按顾客
ID
分组,然后计算每个顾客的销售总额。然后,在
HAVING
子句中,我们筛选出销售总额大于1000
的顾客。需要注意的是,
HAVING
子句在分组之后进行筛选。