全面解析达梦数据库SQL语句——以INSERT和UPDATE语句为例
INSERT语句
一、INSERT语句的基本用法
INSERT语句用于向数据库表中插入新的数据行。其基本语法如下:
INSERT INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);
以下是对INSERT语句各部分的详细解释:
-
INSERT INTO关键字:表示向表中插入数据。
-
table_name:指定要插入数据的表名。
-
column1, column2, …:列出表中的列名,用于指定要插入数据的列。
-
VALUES关键字:表示提供要插入的数据值。
-
value1, value2, …:对应列名的数据值。
二、INSERT语句的使用场景及举例
1. 插入单行数据
假设我们有一个员工表employees,包含列id(员工编号)、name(姓名)、age(年龄)和department(部门)。
其结构如下:
以下是一个插入单行数据的例子:
INSERT INTO employees (id, name, age, department)VALUES (1, '张三', 30, '研发部');
2. 插入多行数据
在某些情况下,我们可能需要同时插入多行数据。
此时,可以采用以下语法:
INSERT INTO employees (id, name, age, department)
VALUES (2, '李四', 28, '市场部'),
(3, '王五', 32, '财务部'),
(4, '赵六', 29, '人事部');
3. 插入部分列的数据
如果我们只想插入部分列的数据,可以只列出这些列名,并对应提供数据值。
以下是一个插入部分列的数据例子:
INSERT INTO employees (name, department)VALUES ('孙七', '研发部');
在这个例子中,我们只插入了name和department两列的数据,id和age列将自动设置为NULL或默认值
。
三、高级插入技巧
1. 从另一个表中选择数据插入
达梦数据库支持从另一个表中查询数据并插入到当前表中。
以下是一个例子:
INSERT INTO employees (id, name, age, department)SELECT id, name, age, departmentFROM temp_employees;
在这个例子中,我们从temp_employees表中选择数据并插入到employees表中。
2. 使用默认值插入数据
如果表中的列设置了默认值,可以在插入数据时省略这些列,达梦数据库将自动填充默认值。
以下是一个例子:
INSERT INTO employees (name, department)VALUES ('周八', '市场部');
假设age列有默认值25,那么在插入数据时,age列将自动设置为25。
四、注意事项
-
在使用INSERT语句时,确保提供的值与列的数据类型相匹配,以避免数据类型错误。
-
如果表中有不允许NULL的列且没有默认值,必须在INSERT语句中提供这些列的值。
-
在插入大量数据时,考虑使用批量插入或事务处理,以提高效率并保证数据的一致性。
-
如果列有约束(如主键、唯一性约束、外键等),插入的数据必须满足这些约束。
-
在使用子查询插入数据时,确保子查询返回的列与目标表的列兼容。
五、实际应用案例
案例:批量插入员工数据
假设我们有以下员工数据需要批量插入到employees表中:
INSERT INTO employees (id, name, age, department)VALUES
(1, '张三', 27, '研发部'),
(2, '李四', 28, '市场部'),
(3, '王五', 30, '财务部'),
(4, '赵六', 26, '人事部');
数据行详细解释
-
第一行数据 (1, ‘张三’, 27, ‘研发部’):
id 列的值为 1,表示员工编号。
name 列的值为 ‘张三’,表示员工姓名。
age 列的值为 27,表示员工年龄。
department 列的值为 ‘研发部’,表示员工所属部门。 -
第二行数据 (2, ‘李四’, 28, ‘市场部’):
类似地,这行数据插入了一个编号为2,姓名为李四,年龄为28岁,属于市场部的员工。 -
第三行数据 (3, ‘王五’, 30, ‘财务部’):
插入了一个编号为3,姓名为王五,年龄为30岁,属于财务部的员工。 -
第四行数据 (4, ‘赵六’, 26, ‘人事部’):
插入了一个编号为4,姓名为赵六,年龄为26岁,属于人事部的员工。
UPDATE语句
一、UPDATE语句概述
UPDATE语句是SQL语言中用于修改表中数据的命令。通过UPDATE语句,可以更改表中的现有记录。
其基本语法如下:
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
[WHERE 条件];
各部分说明
-
UPDATE 表名
UPDATE关键字:这是SQL语句的开始,表示你想要更新一个表中的数据。
表名:指定要更新数据的表。这里必须给出一个存在的表名。 -
SET 列名1 = 值1, 列名2 = 值2, …
SET关键字:用于指定要更新的列以及它们的新值。
列名1 = 值1:这是第一个要更新的列及其新值。列名1是表中存在的列名,值1可以是字面量、变量、表达式或子查询的结果。
, 列名2 = 值2:可以继续列出更多列及其新值,用逗号分隔。这意味着你可以一次性更新多个列。 -
[WHERE 条件]
WHERE关键字:这是一个可选的子句,用于指定哪些记录应该被更新。如果不使用WHERE子句,则表中所有记录的指定列都会被更新。
条件:这是一个表达式,其结果为布尔值(TRUE或FALSE)。只有满足这个条件的记录才会被更新。这通常涉及比较操作符(如=、<>、>、<、>=、<=)和逻辑操作符(如AND、OR、NOT)。
二、UPDATE语句的详细用法
1. 基本用法
最基本的用法是不带WHERE子句,这将更新表中所有记录的指定列。
示例:将employee表中所有员工的salary增加1000。
UPDATE employee
SET salary = salary + 1000;
2. 更新指定记录
通常情况下,我们会使用WHERE子句来指定要更新的记录。
示例:将employee表中department_id为10的员工的salary增加500。
UPDATE employee
SET salary = salary + 500
WHERE department_id = 10;
3. 更新多个列
可以同时更新多个列。
示例:将employee表中employee_id为100的员工的salary增加500,并将department_id更改为20。
UPDATE employee
SET salary = salary + 500, department_id = 20
WHERE employee_id = 100;
4. 使用表达式和函数
可以在SET子句中使用表达式和函数来计算新值。
示例:将employee表中所有员工的salary增加10%。
UPDATE employee
SET salary = salary * 1.1;
5. 使用子查询
可以在WHERE子句中使用子查询来指定更新的条件。
示例:将employee表中department_id与department表中id相等的员工的salary增加500。
UPDATE employee
SET salary = salary + 500
WHERE department_id IN (SELECT id FROM department);
6. 多表更新
在达梦数据库中,可以使用UPDATE语句结合JOIN子句来更新多个表中的数据。
示例:将employee表中与department表中name为’Finance’的部门相关联的员工的salary增加1000。
UPDATE employee e
JOIN department d ON e.department_id = d.id
SET e.salary = e.salary + 1000
WHERE d.name = 'Finance';
三、注意事项
- 数据完整性:在更新数据前,应确保更新操作不会违反任何数据完整性约束。
- 事务处理:对于重要数据的更新,应使用事务来确保操作的原子性,一致性,隔离性和持久性。
- 性能优化:在更新大量数据时,应考虑批量更新,并避免在WHERE子句中使用非索引列,以减少性能开销。
四、实际应用案例
假设我们有一个名为employees的表,其结构如下:
案例一:假设公司要给所有年龄大于平均年龄的员工加薪
示例代码如下:
UPDATE employees
SET salary = salary * 1.05
WHERE age > (SELECT AVG(age) FROM employees);
代码行详细解释
1.UPDATE employees
-
UPDATE关键字表示这是一个更新操作。
-
employees是你要更新的表名。
2.SET salary = salary * 1.05:
-
SET关键字用于指定要更新的列以及它们的新值。
-
salary = salary * 1.05是一个表达式,它将当前salary列的值乘以1.05(即增加了5%)。这意味着每个符合条件的员工的薪水都会增加5%。
3.WHERE age > (SELECT AVG(age) FROM employees):
-
WHERE关键字用于指定更新操作的条件。只有满足这个条件的记录才会被更新。
-
age >是一个比较运算符,它比较employees表中每个员工的age列与子查询返回的值。
-
(SELECT AVG(age) FROM employees)是一个子查询,它计算employees表中所有员工年龄的平均值(AVG(age))。
案例二:假设公司要给所有在销售部门工作的员工加薪,并且更新他们的工作地点:
示例代码如下:
UPDATE employees
SET salary = salary * 1.15, department = 'Sales - New York'
WHERE department = 'Sales';
代码行详细解释
- UPDATE employees: 这部分指定了要更新的表名为employees。
- SET salary = salary * 1.15, department = ‘Sales - New York’: 这部分指定了要更新的列及其新值。
- salary = salary * 1.15: 这里,salary列的值将被更新为当前值的115%。这通常用于给员工加薪,在这种情况下,每个人的薪水增加了15%。
- department = ‘Sales - New York’: 同时,department列的值将被更新为’Sales - New York’。这可能是因为部门名称发生了变化或者部门的位置信息被添加到了名称中。
- WHERE department = ‘Sales’: 这部分是一个条件子句,它限制了UPDATE操作只应用于那些department列值为’Sales’的行。这意味着只有当前在Sales部门的员工的薪水会被增加,并且他们的部门名称会被更新为’Sales - New York’。