1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

yashandb教程FG023-YashanDB DML语句实战

本文档风哥主要介绍YashanDB DML语句的实战应用,包括YashanDB DML语句的概念、类型、执行原理,以及INSERT、UPDATE、DELETE语句的具体实现和性能优化,风哥教程参考YashanDB官方文档SQL语言参考手册内容,适合DBA和开发人员在学习和测试中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 YashanDB DML语句概念

YashanDB DML(Data Manipulation Language)语句是用于操作数据库中数据的语句,主要包括INSERT、UPDATE、DELETE等操作。DML语句是数据库操作中最常用的语句之一,用于实现数据的增删改操作。学习交流加群风哥微信: itpux-com

YashanDB DML语句的特点:

  • 用于操作表中的数据
  • 会产生事务日志
  • 可以回滚
  • 会锁定相关数据
  • 影响数据库性能

1.2 YashanDB DML语句类型

YashanDB支持以下类型的DML语句:

# DML语句类型
– INSERT:向表中插入数据
– UPDATE:更新表中的数据
– DELETE:删除表中的数据
– MERGE:合并数据(插入或更新)
– TRUNCATE:截断表中的数据(DDL语句,但常用于数据操作)

1.3 YashanDB DML语句执行原理

YashanDB DML语句的执行原理:

  • 解析:解析SQL语句,生成执行计划
  • 执行:执行SQL语句,操作数据
  • 日志:生成重做日志和撤销日志
  • 锁定:锁定相关数据,确保数据一致性
  • 提交:提交事务,持久化数据
风哥提示:DML语句的执行性能直接影响数据库的整体性能。建议在编写DML语句时,充分考虑性能因素,避免不必要的操作。学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 YashanDB DML语句规划

在生产环境中使用YashanDB DML语句时,需要进行以下规划:

# DML语句需求分析
– 明确数据操作的业务需求
– 确定操作的数据量和频率
– 评估对系统性能的影响

# DML语句设计
– 优化SQL语句结构
– 合理使用索引
– 避免全表扫描
– 考虑事务边界

# DML语句权限规划
– 确保用户拥有必要的操作权限
– 遵循最小权限原则
– 避免使用不必要的权限

# DML语句监控
– 监控DML语句的执行性能
– 识别慢DML语句
– 定期分析执行计划

2.2 YashanDB DML语句性能考虑

YashanDB DML语句的性能考虑:

性能影响因素:

  • 数据量:操作的数据量越大,执行时间越长
  • 索引:合理的索引可以提高DML语句性能
  • 锁定:锁定冲突会影响并发性能
  • 日志:日志写入会影响DML语句性能
  • 事务:大事务会影响系统性能

2.3 YashanDB DML语句最佳实践

YashanDB DML语句最佳实践:

  • 使用批量操作:批量插入、更新、删除数据
  • 合理使用索引:为WHERE子句中的列创建索引
  • 避免全表扫描:使用WHERE子句过滤数据
  • 优化事务:合理设置事务边界,避免大事务
  • 监控性能:定期监控DML语句的执行性能
  • 测试充分:在测试环境充分测试DML语句
风哥提示:DML语句的性能优化是数据库性能调优的重要部分。建议在编写DML语句时,充分考虑性能因素,避免不必要的操作。更多学习教程公众号风哥教程itpux_com

Part03-生产环境项目实施方案

3.1 YashanDB INSERT语句实现

3.1.1 YashanDB基本INSERT语句

— 创建测试表
CREATE TABLE fgedu_customers (
customer_id NUMBER PRIMARY KEY,
customer_name VARCHAR2(100),
email VARCHAR2(100),
phone VARCHAR2(20),
address VARCHAR2(200),
create_date DATE
);

— 创建序列
CREATE SEQUENCE fgedu_customer_seq START WITH 1 INCREMENT BY 1;

— 基本INSERT语句
INSERT INTO fgedu_customers (customer_id, customer_name, email, phone, address, create_date)
VALUES (fgedu_customer_seq.NEXTVAL, ‘张三’, ‘zhangsan@example.com’, ‘13800138001’, ‘北京市朝阳区’, SYSDATE);

— 执行结果
1 row created.

— 省略列名的INSERT语句
INSERT INTO fgedu_customers
VALUES (fgedu_customer_seq.NEXTVAL, ‘李四’, ‘lisi@example.com’, ‘13900139001’, ‘上海市浦东新区’, SYSDATE);

— 执行结果
1 row created.

— 插入部分列
INSERT INTO fgedu_customers (customer_id, customer_name, create_date)
VALUES (fgedu_customer_seq.NEXTVAL, ‘王五’, SYSDATE);

— 执行结果
1 row created.

3.1.2 YashanDB批量INSERT语句

— 使用INSERT ALL批量插入
INSERT ALL
INTO fgedu_customers (customer_id, customer_name, email, phone, address, create_date)
VALUES (fgedu_customer_seq.NEXTVAL, ‘赵六’, ‘zhaoliu@example.com’, ‘13700137001’, ‘广州市天河区’, SYSDATE)
INTO fgedu_customers (customer_id, customer_name, email, phone, address, create_date)
VALUES (fgedu_customer_seq.NEXTVAL, ‘孙七’, ‘sunqi@example.com’, ‘13600136001’, ‘深圳市南山区’, SYSDATE)
INTO fgedu_customers (customer_id, customer_name, email, phone, address, create_date)
VALUES (fgedu_customer_seq.NEXTVAL, ‘周八’, ‘zhouba@example.com’, ‘13500135001’, ‘杭州市西湖区’, SYSDATE)
SELECT * FROM DUAL;

— 执行结果
3 rows created.

— 使用子查询插入
INSERT INTO fgedu_customers (customer_id, customer_name, create_date)
SELECT fgedu_customer_seq.NEXTVAL, ‘客户’ || level, SYSDATE
FROM DUAL
CONNECT BY level <= 5; -- 执行结果 5 rows created.

3.1.3 YashanDB INSERT … SELECT语句

— 创建目标表
CREATE TABLE fgedu_customer_backup (
customer_id NUMBER PRIMARY KEY,
customer_name VARCHAR2(100),
create_date DATE
);

— 使用INSERT … SELECT插入数据
INSERT INTO fgedu_customer_backup (customer_id, customer_name, create_date)
SELECT customer_id, customer_name, create_date
FROM fgedu_customers
WHERE customer_id <= 5; -- 执行结果 5 rows created. -- 查看备份表数据 SELECT * FROM fgedu_customer_backup; CUSTOMER_ID CUSTOMER_NAME CREATE_DATE ----------- ------------- ------------ 1 张三 2026-04-11 2 李四 2026-04-11 3 王五 2026-04-11 4 赵六 2026-04-11 5 孙七 2026-04-11

3.2 YashanDB UPDATE语句实现

3.2.1 YashanDB基本UPDATE语句

— 基本UPDATE语句
UPDATE fgedu_customers
SET email = ‘zhangsan_new@example.com’,
phone = ‘13800138002’
WHERE customer_id = 1;

— 执行结果
1 row updated.

— 查看更新结果
SELECT customer_id, customer_name, email, phone
FROM fgedu_customers
WHERE customer_id = 1;

CUSTOMER_ID CUSTOMER_NAME EMAIL PHONE
———– ————- ———————– —————
1 张三 zhangsan_new@example.com 13800138002

— 使用表达式更新
UPDATE fgedu_customers
SET phone = ‘139’ || SUBSTR(phone, 4)
WHERE customer_id = 2;

— 执行结果
1 row updated.

— 查看更新结果
SELECT customer_id, customer_name, phone
FROM fgedu_customers
WHERE customer_id = 2;

CUSTOMER_ID CUSTOMER_NAME PHONE
———– ————- —————
2 李四 13900139001

3.2.2 YashanDB批量UPDATE语句

— 批量更新
UPDATE fgedu_customers
SET address = ‘未知地址’
WHERE address IS NULL;

— 执行结果
5 rows updated.

— 查看更新结果
SELECT customer_id, customer_name, address
FROM fgedu_customers
WHERE address = ‘未知地址’;

CUSTOMER_ID CUSTOMER_NAME ADDRESS
———– ————- ———-
3 王五 未知地址
8 客户1 未知地址
9 客户2 未知地址
10 客户3 未知地址
11 客户4 未知地址
12 客户5 未知地址

3.2.3 YashanDB UPDATE … JOIN语句

— 创建地址表
CREATE TABLE fgedu_addresses (
customer_id NUMBER PRIMARY KEY,
new_address VARCHAR2(200)
);

— 插入地址数据
INSERT INTO fgedu_addresses VALUES (1, ‘北京市海淀区’);
INSERT INTO fgedu_addresses VALUES (2, ‘上海市静安区’);
INSERT INTO fgedu_addresses VALUES (3, ‘广州市越秀区’);

— 使用UPDATE … JOIN更新
UPDATE fgedu_customers c
SET c.address = (
SELECT a.new_address
FROM fgedu_addresses a
WHERE a.customer_id = c.customer_id
)
WHERE EXISTS (
SELECT 1
FROM fgedu_addresses a
WHERE a.customer_id = c.customer_id
);

— 执行结果
3 rows updated.

— 查看更新结果
SELECT c.customer_id, c.customer_name, c.address
FROM fgedu_customers c
WHERE c.customer_id <= 3; CUSTOMER_ID CUSTOMER_NAME ADDRESS ----------- ------------- ------------- 1 张三 北京市海淀区 2 李四 上海市静安区 3 王五 广州市越秀区

3.3 YashanDB DELETE语句实现

3.3.1 YashanDB基本DELETE语句

— 基本DELETE语句
DELETE FROM fgedu_customers
WHERE customer_id = 12;

— 执行结果
1 row deleted.

— 查看删除结果
SELECT COUNT(*) FROM fgedu_customers WHERE customer_id = 12;

COUNT(*)
———-
0

— 删除多条记录
DELETE FROM fgedu_customers
WHERE customer_id BETWEEN 8 AND 11;

— 执行结果
4 rows deleted.

— 查看删除结果
SELECT COUNT(*) FROM fgedu_customers WHERE customer_id BETWEEN 8 AND 11;

COUNT(*)
———-
0

3.3.2 YashanDB DELETE … WHERE EXISTS语句

— 使用DELETE … WHERE EXISTS删除
DELETE FROM fgedu_customers c
WHERE EXISTS (
SELECT 1
FROM fgedu_addresses a
WHERE a.customer_id = c.customer_id
);

— 执行结果
3 rows deleted.

— 查看删除结果
SELECT COUNT(*) FROM fgedu_customers;

COUNT(*)
———-
3

3.3.3 YashanDB TRUNCATE语句

— 使用TRUNCATE语句截断表
TRUNCATE TABLE fgedu_customer_backup;

— 执行结果
Table truncated.

— 查看截断结果
SELECT COUNT(*) FROM fgedu_customer_backup;

COUNT(*)
———-
0

风哥提示:TRUNCATE语句比DELETE语句执行速度快,因为它不生成事务日志,也不触发触发器。但TRUNCATE语句不能回滚,使用时需要谨慎。from yashandb视频:www.itpux.com

Part04-生产案例与实战讲解

4.1 YashanDB INSERT语句实战案例

在生产环境中,使用INSERT语句批量导入数据:

— 创建订单表
CREATE TABLE fgedu_orders (
order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
order_date DATE,
total_amount NUMBER,
status VARCHAR2(20)
);

— 创建订单明细表
CREATE TABLE fgedu_order_items (
item_id NUMBER PRIMARY KEY,
order_id NUMBER REFERENCES fgedu_orders(order_id),
product_id NUMBER,
quantity NUMBER,
unit_price NUMBER,
item_amount NUMBER
);

— 创建序列
CREATE SEQUENCE fgedu_order_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE fgedu_item_seq START WITH 1 INCREMENT BY 1;

— 批量插入订单数据
INSERT ALL
INTO fgedu_orders (order_id, customer_id, order_date, total_amount, status)
VALUES (fgedu_order_seq.NEXTVAL, 101, SYSDATE, 1000, ‘已下单’)
INTO fgedu_order_items (item_id, order_id, product_id, quantity, unit_price, item_amount)
VALUES (fgedu_item_seq.NEXTVAL, fgedu_order_seq.CURRVAL, 201, 2, 200, 400)
INTO fgedu_order_items (item_id, order_id, product_id, quantity, unit_price, item_amount)
VALUES (fgedu_item_seq.NEXTVAL, fgedu_order_seq.CURRVAL, 202, 1, 600, 600)

INTO fgedu_orders (order_id, customer_id, order_date, total_amount, status)
VALUES (fgedu_order_seq.NEXTVAL, 102, SYSDATE, 1500, ‘已付款’)
INTO fgedu_order_items (item_id, order_id, product_id, quantity, unit_price, item_amount)
VALUES (fgedu_item_seq.NEXTVAL, fgedu_order_seq.CURRVAL, 203, 3, 300, 900)
INTO fgedu_order_items (item_id, order_id, product_id, quantity, unit_price, item_amount)
VALUES (fgedu_item_seq.NEXTVAL, fgedu_order_seq.CURRVAL, 204, 2, 300, 600)
SELECT * FROM DUAL;

— 执行结果
6 rows created.

— 查看订单数据
SELECT * FROM fgedu_orders;

ORDER_ID CUSTOMER_ID ORDER_DATE TOTAL_AMOUNT STATUS
——– ———– ———- ———— ———-
1 101 2026-04-11 1000 已下单
2 102 2026-04-11 1500 已付款

— 查看订单明细数据
SELECT * FROM fgedu_order_items;

ITEM_ID ORDER_ID PRODUCT_ID QUANTITY UNIT_PRICE ITEM_AMOUNT
——- ——– ———- ——– ———- ———–
1 1 201 2 200 400
2 1 202 1 600 600
3 2 203 3 300 900
4 2 204 2 300 600

4.2 YashanDB UPDATE语句实战案例

在生产环境中,使用UPDATE语句更新订单状态:

— 更新订单状态
UPDATE fgedu_orders
SET status = ‘已发货’,
order_date = SYSDATE
WHERE order_id = 1;

— 执行结果
1 row updated.

— 查看更新结果
SELECT * FROM fgedu_orders WHERE order_id = 1;

ORDER_ID CUSTOMER_ID ORDER_DATE TOTAL_AMOUNT STATUS
——– ———– ———- ———— ———-
1 101 2026-04-11 1000 已发货

— 批量更新订单状态
UPDATE fgedu_orders
SET status = ‘已完成’
WHERE order_date < SYSDATE - 7; -- 执行结果 0 rows updated. -- 更新订单金额(基于订单明细) UPDATE fgedu_orders o SET o.total_amount = ( SELECT SUM(item_amount) FROM fgedu_order_items i WHERE i.order_id = o.order_id ); -- 执行结果 2 rows updated. -- 查看更新结果 SELECT * FROM fgedu_orders; ORDER_ID CUSTOMER_ID ORDER_DATE TOTAL_AMOUNT STATUS -------- ----------- ---------- ------------ ---------- 1 101 2026-04-11 1000 已发货 2 102 2026-04-11 1500 已付款

4.3 YashanDB DELETE语句实战案例

在生产环境中,使用DELETE语句清理过期数据:

— 删除过期订单(假设30天前的订单)
DELETE FROM fgedu_order_items
WHERE order_id IN (
SELECT order_id
FROM fgedu_orders
WHERE order_date < SYSDATE - 30 ); -- 执行结果 0 rows deleted. -- 删除对应的订单 DELETE FROM fgedu_orders WHERE order_date < SYSDATE - 30; -- 执行结果 0 rows deleted. -- 清理测试数据 DELETE FROM fgedu_order_items; DELETE FROM fgedu_orders; -- 执行结果 4 rows deleted. 2 rows deleted. -- 验证删除结果 SELECT COUNT(*) FROM fgedu_orders; SELECT COUNT(*) FROM fgedu_order_items; COUNT(*) ---------- 0 COUNT(*) ---------- 0
生产环境建议:在删除大量数据时,建议分批删除,避免长时间锁定表。同时,在删除数据前,建议先备份数据,以防止误操作。更多视频教程www.fgedu.net.cn

Part05-风哥经验总结与分享

5.1 YashanDB DML语句使用经验

YashanDB DML语句使用经验总结:

  • INSERT语句:批量插入比单条插入性能更高,建议使用INSERT ALL或FORALL
  • UPDATE语句:使用WHERE子句过滤数据,避免全表更新
  • DELETE语句:批量删除时注意锁定问题,建议分批删除
  • TRUNCATE语句:适用于清空表数据,执行速度快,但不能回滚
  • 事务管理:合理设置事务边界,避免大事务
  • 性能监控:定期监控DML语句的执行性能

5.2 YashanDB DML语句故障排除

# 常见问题及解决方法

## 1. INSERT语句执行缓慢
– 症状:插入数据速度慢
– 原因:缺少索引、日志写入慢、磁盘I/O瓶颈
– 解决:添加适当的索引,优化日志配置,检查磁盘性能

## 2. UPDATE语句锁定冲突
– 症状:更新操作卡住
– 原因:锁定冲突,其他会话持有锁
– 解决:检查锁定情况,调整事务隔离级别,优化更新语句

## 3. DELETE语句执行缓慢
– 症状:删除数据速度慢
– 原因:缺少索引、锁定冲突、大事务
– 解决:添加适当的索引,分批删除,优化DELETE语句

## 4. TRUNCATE语句失败
– 症状:TRUNCATE语句执行失败
– 原因:表被其他会话锁定
– 解决:确保没有其他会话使用该表,然后重试

## 5. 事务回滚失败
– 症状:DML语句执行后回滚失败
– 原因:事务过大,回滚段不足
– 解决:减小事务大小,增加回滚段空间

5.3 YashanDB DML语句使用建议

YashanDB DML语句使用建议:

  • 批量操作:使用批量插入、更新、删除,提高性能
  • 索引优化:为WHERE子句中的列创建索引
  • 事务管理:合理设置事务边界,避免大事务
  • 锁定管理:减少锁定时间,避免锁定冲突
  • 性能监控:定期监控DML语句的执行性能
  • 备份策略:在执行大量DML操作前,备份数据
风哥提示:DML语句是数据库操作的核心,其性能直接影响系统的整体性能。建议在编写DML语句时,充分考虑性能因素,优化语句结构,以提高系统性能。学习交流加群风哥微信: itpux-com

持续改进:DML语句的优化是一个持续的过程,需要根据实际情况不断调整和改进。建议定期review DML语句的执行情况,优化语句结构,以提高系统性能和可靠性。更多学习教程公众号风哥教程itpux_com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息