-- 基本查询
SELECT * FROM employees WHERE dept = 'IT' FETCH FIRST 10 ROWS ONLY;
-- 分页查询 (DB2 V9.7+)
SELECT * FROM employees ORDER BY id
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- 使用 Common Table Expression (CTE)
WITH dept_avg AS (
SELECT dept, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept
)
SELECT * FROM dept_avg WHERE avg_salary > 50000;
-- 插入数据 (含RETURNING子句)
INSERT INTO employees (id, name, dept)
VALUES (123, 'John', 'HR')
RETURNING id, CURRENT TIMESTAMP AS created_time;
-- 更新数据 (带FROM子句)
UPDATE emp e
SET e.salary = e.salary * 1.05
FROM department d
WHERE e.dept_id = d.id AND d.budget > 1000000;
-- 删除数据 (关联删除)
DELETE FROM orders
WHERE customer_id IN (
SELECT id FROM customers
WHERE status = 'INACTIVE'
);
-- 创建表 (含高级选项)
CREATE TABLE employees (
empno INT GENERATED BY DEFAULT AS IDENTITY,
name VARCHAR(50) NOT NULL,
salary DECIMAL(9,2) COMPRESS SYSTEM DEFAULT 0,
hire_date DATE NOT NULL WITH DEFAULT CURRENT DATE,
resume CLOB(10M),
CONSTRAINT pk_emp PRIMARY KEY (empno),
CONSTRAINT chk_salary CHECK (salary >= 0)
) IN userspace1 INDEX IN indexspace1;
-- 修改表结构
ALTER TABLE employees
ADD COLUMN phone VARCHAR(15)
BEFORE hire_date;
ALTER TABLE employees
ALTER COLUMN salary SET DATA TYPE DECIMAL(10,2);
-- 创建临时表
DECLARE GLOBAL TEMPORARY TABLE session_temp (
id INT,
log_time TIMESTAMP
) ON COMMIT PRESERVE ROWS;
-- 创建索引 (含INCLUDE列)
CREATE INDEX idx_emp_dept ON employees(dept)
INCLUDE (salary)
ALLOW REVERSE SCANS;
-- 创建集群索引
CREATE CLUSTERED INDEX idx_emp_cluster ON employees(dept, hire_date);
-- 重组索引
REORG INDEX idx_emp_name ALLOW WRITE ACCESS;
MERGE INTO employee_target AS t
USING (SELECT * FROM employee_source) AS s
ON t.emp_id = s.emp_id
WHEN MATCHED THEN
UPDATE SET t.salary = s.salary * 1.1,
t.last_updated = CURRENT TIMESTAMP
WHEN NOT MATCHED THEN
INSERT (emp_id, name, dept, salary)
VALUES (s.emp_id, s.name, s.dept, s.salary)
ELSE IGNORE;
SELECT
empno,
dept,
salary,
RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS dept_rank,
AVG(salary) OVER (ORDER BY hire_date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS moving_avg
FROM employees;
-- 创建JSON表
CREATE TABLE product_json (
id INT PRIMARY KEY,
data CLOB CHECK (data IS JSON)
);
-- JSON查询
SELECT data->'$.price' AS price,
JSON_VAL(data, '$.category') AS category
FROM product_json
WHERE JSON_EXISTS(data, '$.tags?(@ == "electronics")');
-- 生成详细执行计划
EXPLAIN PLAN FOR
SELECT * FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE d.budget > 1000000;
-- 查看解释表
SELECT * FROM explain_statement;
-- 收集统计信息
RUNSTATS ON TABLE schema.employees
WITH DISTRIBUTION AND DETAILED INDEXES ALL;
-- 更新统计信息
CALL sysproc.admin_cmd('RUNSTATS ON TABLE employees');
-- 查看当前锁
SELECT * FROM sysibmadm.locks_held
WHERE lock_object_type = 'TABLE';
-- 锁超时设置
SET CURRENT LOCK TIMEOUT = 30; -- 单位:秒
CREATE OR REPLACE PROCEDURE update_salary (
IN p_dept VARCHAR(30),
IN p_rate DECIMAL(5,2)
)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE v_count INT;
-- 记录操作日志
INSERT INTO audit_log (action_time, action)
VALUES (CURRENT TIMESTAMP, 'Salary update started');
-- 更新工资
UPDATE employees
SET salary = salary * (1 + p_rate/100)
WHERE dept = p_dept;
-- 获取影响行数
GET DIAGNOSTICS v_count = ROW_COUNT;
-- 插入审计记录
INSERT INTO audit_log (action_time, action)
VALUES (CURRENT TIMESTAMP, 'Updated ' || v_count || ' records');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT = 'Update failed';
END;
# 导出数据
db2 "EXPORT TO empdata.del OF DEL
SELECT * FROM employees WHERE dept='IT'"
# 导入数据
db2 "IMPORT FROM empdata.del OF DEL
INSERT INTO employees"
# 使用LOAD工具
db2 "LOAD FROM data.del OF DEL
REPLACE INTO employees
STATISTICS YES WITH DISTRIBUTION"
-- 备份数据库
BACKUP DB sample TO /backup;
-- 恢复数据库
RESTORE DB sample FROM /backup TAKEN AT 20230801120000;
-- 重组表
CALL sysproc.admin_cmd('REORG TABLE employees');
-- 行权限控制
CREATE PERMISSION row_access
ON employees
FOR ROWS WHERE VERIFY_GROUP_FOR_USER(dept) = 1
ENFORCED FOR ALL ACCESS;
-- 列级别加密
CREATE TABLE sensitive_data (
id INT,
credit_card VARCHAR(50) ENCRYPT WITH 'AES256'
);
锁等待超时
-- 强制释放连接
FORCE APPLICATION (1234);
-- 查看锁链
SELECT * FROM sysibmadm.lockwaits;
表空间监控
SELECT tbsp_name,
total_pages/1024 AS total_GB,
used_pages/1024 AS used_GB
FROM sysibmadm.tbsp_utilization;
性能诊断
-- 获取实时SQL监控
SELECT * FROM TABLE(MON_GET_ACTIVITY(NULL, -1))
WHERE APPL_NAME = 'my_app';
以上内容覆盖了 DB2 数据库的核心操作和高级功能。实际使用时需注意: