一、SQL 概述
1. 定义:
- SQL(Structured Query Language)即结构化查询语言,是一种用于管理关系型数据库的标准语言。DM SQL 是达梦数据库对 SQL 标准的实现,用于操作和管理达梦数据库中的数据。
- 它允许用户执行各种数据库操作,如查询数据、插入、更新和删除数据、创建和修改数据库对象(如表、视图、索引等)。
2.特点:
- 具有高度的通用性,可在不同的操作系统和数据库管理系统上使用。
- 语法简洁明了,易于学习和使用。
- 支持多种数据库操作,功能强大。
二、数据库对象
1. 表(table)
- 定义:表是数据库中存储数据的基本单位,由行和列组成。每一行代表一条记录,每一列代表一个字段。
- 创建表:使用CREATE TABLE语句,指定表名、列名、数据类型和约束条件。例如:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
department_id INT
);
- 插入数据:使用INSERT INTO语句,向表中插入新的记录。例如:
INSERT INTO employees (employee_id, first_name, last_name, department_id)
VALUES (1, 'John', 'Doe', 1);
- 查询数据:使用SELECT语句,从表中检索数据。例如:
SET SCHEMA (模式名);--默认选着你想要的模式下的表,不用再写成dmhr.employee (模式.表名)
SELECT * FROM employees;
2. 视图(View):
- 定义:视图是一种虚拟表,它是从一个或多个表中导出的表。视图并不实际存储数据,而是根据定义它的查询语句动态生成数据。
- 创建视图:使用CREATE VIEW语句,指定视图名和查询语句。例如:
CREATE VIEW employee_names AS
SELECT first_name, last_name FROM employees;
- 使用视图:可以像使用表一样使用视图进行查询。例如:
SELECT * FROM employee_names;
3. 索引(Index):
- 定义:索引是一种数据库对象,用于提高查询性能。它通过对表中的一个或多个列创建索引结构,使得数据库可以更快地定位和检索数据。
- 创建索引:使用CREATE INDEX语句,指定索引名、表名和列名。例如:
CREATE INDEX idx_employee_last_name ON employees(last_name);
- 索引类型:包括 B 树索引、位图索引等。不同类型的索引适用于不同的查询场景。
三、数据查询
1.基本查询
- SELECT语句用于从一个或多个表中检索数据。它可以指定要检索的列、表名、条件等。例如:
SELECT column1, column2 FROM table_name WHERE condition;
补充:WHERE子句用于指定查询条件,可以使用比较运算符(如=、<、>等)、逻辑运算符(如AND、OR、NOT等)和通配符(如%、_等)。
2.聚合函数
- 聚合函数用于对一组数据进行计算,并返回一个单一的值。常见的聚合函数有SUM(求和)、AVG(平均值)、COUNT(计数)、MAX(最大值)、MIN(最小值)等。例如:
SELECT SUM(salary) AS total_salary FROM employees;
3.分组查询
- 使用GROUP BY子句可以将数据按照一个或多个列进行分组,然后对每个组进行聚合计算。例如:
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
4.排序查询
- 使用ORDER BY子句可以对查询结果进行排序。可以按照一个或多个列进行升序(ASC)或降序(DESC)排序。例如:
SELECT * FROM employees
ORDER BY salary DESC;
四、事务处理
1. 事务的概念:
- 事务是一组数据库操作的集合,这些操作要么全部成功,要么全部失败。事务具有原子性、一致性、隔离性和持久性(ACID)特性
2.事务的控制:
- 使用BEGIN TRANSACTION开始一个事务,使用COMMIT提交事务,使事务中的所有操作永久生效,使用ROLLBACK回滚事务,撤销事务中的所有操作。例如:
BEGIN TRANSACTION;
-- 数据库操作
COMMIT;
五、存储过程和函数
1. 存储过程:
- 定义:存储过程是一组预先编译好的 SQL 语句和控制流语句的集合,存储在数据库中,可以被反复调用。
- 创建存储过程:使用CREATE PROCEDURE语句,指定存储过程名、参数和 SQL 语句。例如:创建了一个名为
get_employee_salary
的存储过程,根据输入的员工编号(employee_id
),从employees
表中查询出对应的员工工资,并通过输出参数返回该工资值。
CREATE PROCEDURE get_employee_salary(IN employee_id INT, OUT salary DECIMAL(10,2))
BEGIN
SELECT salary INTO salary FROM employees WHERE employee_id = employee_id;
END;
- 调用存储过程:使用CALL语句调用存储过程,并传递参数。例如:
CALL get_employee_salary(1, @salary);
SELECT @salary;
2. 函数:
- 定义:函数是一种可以返回一个值的存储过程。它与存储过程类似,但必须有一个返回值。
- 创建函数:使用CREATE FUNCTION语句,指定函数名、参数和返回值类型,以及函数体中的 SQL 语句。
- 例如:定义一个calculate_total_salary函数计算并返回一个表示所有员工工资总和的值,返回的数据类型被定义为
DECIMAL(10,2)
,
CREATE FUNCTION calculate_total_salary() RETURNS DECIMAL(10,2)
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(salary) INTO total FROM employees;
RETURN total;
END;
- 调用函数:可以在 SQL 语句中直接调用函数。例如:
SELECT calculate_total_salary();
六、游标
1. 游标概念
- 游标是一种用于处理结果集的数据库对象。它允许用户逐行遍历结果集,并对每一行进行操作。
2.游标使用步骤
- 声明游标:使用DECLARE CURSOR语句声明一个游标,并指定查询语句。例如:
DECLARE cursor_employees CURSOR FOR
SELECT * FROM employees;
- 打开游标:使用OPEN语句打开游标。例如:
OPEN cursor_employees;
- 逐行读取数据:使用FETCH语句逐行读取游标中的数据,并将数据存储在变量中。例如:
FETCH NEXT FROM cursor_employees INTO @employee_id, @first_name, @last_name, @department_id;
- 关闭游标:使用CLOSE语句关闭游标。例如:
CLOSE cursor_employees;
3.游标使用的拓展
1.自定义类型定义动态数组。变量分配一个包含5个元素的数组空间,for循环遍历范围(从11到5)
DECLARE
TYPE array_type IS ARRAR INT[];--定义数组类型
a array_type; --用自己定义的数组类型声明数据
BEGIN
a:=NEW INT[5];--动态分配空间
FOR i IN 1...4 LOOP
a[i] :=i*11;
print a[i];
END LOOP;
PRINT ARRAYLEN(a);
END;
如图示例:
2. 编写一个DM SQL代码块,使用FOR循环和游标,从表中读取职位ID为31的员工的employee_id、employee_name、phone_num和email,并打印这些信息。
DECLARE
CURSOR emp_cursor(v job id INT IS
SELECT employee_id, employee_name, phone_num,email FROM employee WHERE job_id =
v_job_id;v_emp_rec emp_cursorsROWTYPE;
BEGIN
FOR v_emp_rec IN emp_cursor(31) LOOP
PRINT v_emp_rec.employee_id ||','||
v_emp_rec.employee_name ||', '||
v_emp_rec.phone_num ||','||
v_emp_rec.email;
END LOOP;
END;
七、错误处理
1. 错误类型:
- DM SQL 中的错误类型包括语法错误、运行时错误和逻辑错误等。
2. 错误处理机制:
- 可以使用BEGIN TRY...END TRY和BEGIN CATCH...END CATCH块来捕获和处理错误。例如:
BEGIN TRY
-- 数据库操作
END TRY
BEGIN CATCH
-- 错误处理
END CATCH;
3. 例题:
编写一个DM SQL代码块,模拟更新dmhr.employee表中的员工姓名。如果根据提供的employee_id没有找到相应的员工,则手动抛出一个自定义异常invalid_employee_id,并在异常处理部分输出错误信息。同时捕获并输出DM的标准错误代码和错误信息。
要求输入说明:
v_employee_id = '8888'(此 employee_id 不存在)
DECLARE
v_empnameemployee.employee nameTYPE :=;empname:
invalid employee_id EXCEPTION;
BEGIN
UPDATE employee SET salary=salary+100 WHERE employee_name=v_empname;
IF SQL%NOTFOUND THEN RAISE invalid employee id;
END IF;
EXCEPTION
WHEN invalid_employee_id THEN
PRINT(“没有该编码的员工’);
PRINT('sqlcode:'||SQLCODE);
PRINT('--sqlcode:'||SQLERRM);
WHEN OTHERS THEN
NULL;
END;
八、总结
掌握这些 DM SQL 程序基础内容,就可以在达梦数据库环境下进行常规的数据库开发与管理操作,为更复杂的数据库应用构建打下良好根基啦。