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
- 用于操作表中的数据
- 会产生事务日志
- 可以回滚
- 会锁定相关数据
- 影响数据库性能
1.2 YashanDB DML语句类型
YashanDB支持以下类型的DML语句:
– INSERT:向表中插入数据
– UPDATE:更新表中的数据
– DELETE:删除表中的数据
– MERGE:合并数据(插入或更新)
– TRUNCATE:截断表中的数据(DDL语句,但常用于数据操作)
1.3 YashanDB DML语句执行原理
YashanDB DML语句的执行原理:
- 解析:解析SQL语句,生成执行计划
- 执行:执行SQL语句,操作数据
- 日志:生成重做日志和撤销日志
- 锁定:锁定相关数据,确保数据一致性
- 提交:提交事务,持久化数据
Part02-生产环境规划与建议
2.1 YashanDB DML语句规划
在生产环境中使用YashanDB 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语句
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
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 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 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 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 TABLE fgedu_customer_backup;
— 执行结果
Table truncated.
— 查看截断结果
SELECT COUNT(*) FROM fgedu_customer_backup;
COUNT(*)
———-
0
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语句清理过期数据:
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
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操作前,备份数据
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
