IBM DB2 数据库

1. 数据查询 (SELECT)
-- 基本查询
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;
2. 数据操作 (DML)
-- 插入数据 (含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'
);

二、DDL 数据定义

1. 表管理
-- 创建表 (含高级选项)
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;
2. 索引管理
-- 创建索引 (含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;

三、高级功能

1. MERGE 语句
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;
2. 窗口函数
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;
3. JSON 支持 (DB2 11.1+)
-- 创建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")');

四、性能优化

1. 执行计划分析
-- 生成详细执行计划
EXPLAIN PLAN FOR
SELECT * FROM employees e 
JOIN departments d ON e.dept_id = d.id
WHERE d.budget > 1000000;

-- 查看解释表
SELECT * FROM explain_statement;
2. 统计信息维护
-- 收集统计信息
RUNSTATS ON TABLE schema.employees 
WITH DISTRIBUTION AND DETAILED INDEXES ALL;

-- 更新统计信息
CALL sysproc.admin_cmd('RUNSTATS ON TABLE employees');
3. 锁监控
-- 查看当前锁
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;

六、实用工具命令

1. 数据导入导出
# 导出数据
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"
2. 数据库维护
-- 备份数据库
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'
);

常见问题处理

  1. 锁等待超时

    -- 强制释放连接
    FORCE APPLICATION (1234);
    
    -- 查看锁链
    SELECT * FROM sysibmadm.lockwaits;
    

  2. 表空间监控

    SELECT tbsp_name, 
           total_pages/1024 AS total_GB,
           used_pages/1024 AS used_GB
    FROM sysibmadm.tbsp_utilization;
    

  3. 性能诊断

    -- 获取实时SQL监控
    SELECT * FROM TABLE(MON_GET_ACTIVITY(NULL, -1)) 
    WHERE APPL_NAME = 'my_app';
    


以上内容覆盖了 DB2 数据库的核心操作和高级功能。实际使用时需注意:

  • 版本差异(LUW vs z/OS)
  • 事务隔离级别(CS/RR/RS等)
  • 数据库配置参数(缓冲池、日志设置等)
  • 定期维护(reorg/runstats/备份)

你可能感兴趣的:(sql,数据库,mysql)