SQL语句针对数据表的操作(一)

总览

DDL

序号语言分类操作关键字
1数据定义语言 DDL创建表(临时表)CREATE TABLE(CREATE TEMPORARY TABLE)
2数据定义语言 DDL创建表复制CREATE TABLE… AS…;
3数据定义语言 DDL修改表——添加,删除,修改,重命名列ALTER TABLE…ADD/DROP COLUMN/COLUMN/CHANGE…;
4数据定义语言 DDL删除表DROP TABLE
5数据定义语言 DDL清空表TRUNCATE TABLE
6数据定义语言 DDL重命名表RENAME TABLE…TO…;

DML

序号语言分类操作关键字
1数据操作语言 DML插入数据INSERT INTO…VALUES…;
2数据操作语言 DML更新数据UPDATE…SET…;
3数据操作语言 DML删除数据DELETE FROM…WHERE…;
4数据操作语言 DML合并数据MERGE INTO…;

DQL

序号语言分类操作关键字
1数据查询语言 DQL选择数据SELECT…FROM…WHERE…;
2数据查询语言 DQL联合查询SELECT…FROM…UNION…SELECT…FROM…;

DCL

序号语言分类操作关键字
1数据控制语言 DCL授予权限GRANT…ON…TO…;
2数据控制语言 DCL撤销权限REVOKE…ON…FROM…;
3数据控制语言 DCL/事物控制语言 TCL开始事物START TRANSACTION;
4数据控制语言 DCL/事物控制语言 TCL提交事物COMMIT;
5数据控制语言 DCL/事物控制语言 TCL回滚事物ROLLBACK;
6数据控制语言 DCL/事物控制语言 TCL保存点SAVEPOINT

适用于大多数关系型数据库管理系统(RDBMS),如MySQL,PostgreSQL、SQL Server、Oracle等。不过,具体语法和功能可能会根据不同的数据库系统有所差异。

详细解释及语法示例(本篇只含DDL与DML,其余详解会在(二)中展示)

DDL

创建表

语法
CREATE TABLE table_name (
    column1 datatype constraints,
    column2 datatype constraints,...
  	);
解释:
元素解释
CREATE TABLE table_name指定要创建的新表的名称
table_name新表的名称,必须遵循数据库系统对表名的命名规则
()定义表中的列(字段)以及它们的属性
column1, column2, …列的名称。在定义列时,需要为每个列指定一个唯一的名称。
datatype列的数据类型,定义该列可以存储的数据种类。例如,INT, VARCHAR, DATE, DECIMAL 等
constraints可选用于指定对列数据的限制或规则,常见的约束包括 NOT NULL(不允许空值)、PRIMARY KEY(主键)、FOREIGN KEY(外键)、UNIQUE(唯一值)、CHECK(检查特定条件)和 DEFAULT(默认值)。
示例
CREATE TABLE employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    birth_date DATE,
    salary DECIMAL(10, 2) CHECK (salary > 0)
);

解释:

创建了一个名为 employees 的新表。
id 列是一个整数类型,被设置为主键,这意味着它的值必须是唯一的,并且不能为空。
first_name 和 last_name 列是可变长度的字符串,最大长度为50个字符,并且不允许为空值。
birth_date 列是日期类型,可以存储员工的出生日期。
salary 列是十进制类型,可以存储带有两位小数的数值。还有一个检查约束,确保存储的薪水值大于0。

注意事项:
序号事项
1在创建表时,应该仔细考虑每个列的数据类型和约束,以确保数据的完整性和准确性。
2在某些数据库系统中,表名和列名可能对大小写敏感,因此需要根据数据库的具体规则来命名。
3创建表之前,需要检查数据库中是否已经存在同名的表,以避免命名冲突。
4在创建表时,还可以指定其他表级约束,如 INDEX(索引)或 REFERENCES(引用其他表的外键)。

创建临时表

临时表是一种特殊类型的表,它仅在当前数据库会话中存在,当会话结束时,临时表及其数据会被自动删除。

语法:
CREATE TEMPORARY TABLE table_name (
    ...
);
解释:
元素解释
CREATE TEMPORARY TABLESQL关键字,用于指示接下来的操作是关于创建一个临时表的。
table_name临时表的名称
()定义了临时表中的列(字段)以及它们的属性,与创建常规表时的列定义相同,包括列名、数据类型和可选的约束条件
示例:
CREATE TEMPORARY TABLE temp_employees (
    id INT,
    name VARCHAR(100),
    department VARCHAR(50)
);
解释:

创建了一个名为 temp_employees 的临时表
有三个列:
id(整数类型),
name(可变长度字符串,最大长度为100个字符),
department(可变长度字符串,最大长度为50个字符)

注意事项:
序号事项
1临时表仅在创建它的数据库会话中可见,其他会话无法访问它,即使它们有足够的权限也不行。
2当创建临时表的会话结束时(例如,当用户断开连接或执行了 END 语句),数据库系统会自动删除临时表及其所有数据。
3临时表可以具有与常规表相同的结构,包括索引、触发器、约束等。
4在某些数据库系统中,临时表可以有全局和会话两种范围。全局临时表在所有会话中可见,直到创建它的会话结束;而会话临时表仅在创建它的会话中可见。
5临时表通常用于存储中间结果或进行复杂的数据操作,而不需要将数据永久存储在数据库中。

创建表复制

基于现有表的数据创建一个新表

语法:
CREATE TABLE new_table_name AS SELECT * FROM existing_table_name;
解释:
元素解释
CREATE TABLE指示接下来的操作是关于创建一个新表
new_table_name新表选择的名称。
AS用于将 CREATE TABLE 语句与 SELECT 语句连接起来,表示新表的结构和数据将基于 SELECT 语句的结果。
SELECT * FROM existing_table_name用于从现有表中检索所有列的数据
*通配符,表示选择所有列
existing_table_name是想要从中复制数据的现有表的名称

1.SELECT * FROM existing_table_name 首先执行,从 existing_table_name 表中选择所有列的数据。
2.然后,数据库系统使用这些数据创建一个新表 new_table_name。
3.新表 new_table_name 将具有与 existing_table_name 相同的列和数据类型,但是它不复制任何表级属性,如索引、触发器或约束(除了 NOT NULL 约束,如果原表列上有这个约束,新表列也会有)。

示例:
CREATE TABLE new_employees AS SELECT * FROM employees;
解释:

创建了一个名为 new_employees 的新表,它包含 employees 表中所有列的数据

注意事项:
序号事项
1新表 new_table_name 是一个独立的实体,对它的更改不会影响原始表 existing_table_name。
2如果 existing_table_name 表中有任何约束(如主键、外键或唯一约束),这些约束不会自动复制到新表 new_table_name 中。
3如果只想复制表结构而不复制数据,可以使用 CREATE TABLE new_table_name LIKE existing_table_name;(在某些数据库系统中有效)。
4在创建新表之前,确保你有足够的权限来执行这个操作,并且新表名在数据库中是唯一的,以避免命名冲突。
5在执行这个操作之前,可能需要考虑性能影响,特别是如果 existing_table_name 包含大量数据时

修改表

一、添加列

向现有数据库表添加一个新的列(字段)。

语法:
ALTER TABLE table_name ADD column_name datatype;
解释:
元素解释
ALTER TABLE用于指示接下来的操作是关于修改一个已经存在的表的结构。
table_name要添加新列的表的名称
ADD用于指示想要向表中添加一个新的列
column_name新列的名称
datatype这是新列的数据类型,它定义了该列可以存储的数据种类。例如,INT, VARCHAR, DATE, DECIMAL 等。
示例:
ALTER TABLE employees ADD email VARCHAR(100);
解释:

向名为 employees 的表中添加了一个名为 email 的新列,其数据类型为 VARCHAR,最大长度为100个字符

扩展:

ALTER TABLE employees ADD email VARCHAR(100) NOT NULL;

NOT NULL 约束确保了 email 列在插入新行时必须有值,不能为空。

注意事项:
序号事项
1在添加新列时,你可能还需要指定其他属性,如 NOT NULL(不允许空值)、DEFAULT(默认值)等约束。
2在某些数据库系统中,添加列可能会触发相关触发器或影响依赖于该表的其他数据库对象。
3添加列通常是一个即时操作,但可能会根据表中已有数据量的多少而耗费不同时间。
4在执行 ALTER TABLE 操作之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。
5使用此语句需要足够的权限来修改表结构。
二、删除列

从现有数据库表中删除一个列(字段)

语法:
ALTER TABLE table_name DROP COLUMN column_name;
解释:
元素解释
ALTER TABLESQL关键字,用于指示接下来的操作是关于修改一个已经存在的表的结构。
table_name这是你要从中删除列的表的名称。
DROP COLUMNSQL关键字,用于指示你想要从表中删除一个列。
column_name这是你要删除的列的名称。
示例:
ALTER TABLE employees DROP COLUMN email;
解释:

从名为 employees 的表中删除了一个名为 email 的列。

注意事项:
序号事项
1在删除列之前,请确保该列不是任何数据库约束(如主键、外键或唯一约束)的一部分,因为这些约束可能依赖于该列的存在。
2删除列将永久移除该列及其所有数据,因此操作之前应仔细考虑。
3在某些数据库系统中,删除列可能会触发相关触发器或影响依赖于该表的其他数据库对象,如视图或存储过程。
4删除列的操作通常是不可逆的,一旦执行,被删除的数据将无法恢复(除非有数据库备份)。
5在执行 ALTER TABLE 操作之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。
6使用此语句需要足够的权限来修改表结构。
三、修改列

用于修改现有数据库表中某个列的数据类型

语法:
ALTER TABLE table_name MODIFY COLUMN column_name datatype;
解释:
元素解释
ALTER TABLESQL关键字,用于指示接下来的操作是关于修改一个已经存在的表的结构。
table_name要修改列的表的名称
MODIFY COLUMNSQL关键字,用于指示想要修改表中某个列的属性。
column_name要修改的列的名称
datatype这是新的数据类型,希望列在修改后使用的数据类型。例如,INT, VARCHAR, DATE, DECIMAL 等。
示例:
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(10, 2);
解释:

将名为 employees 的表中 salary 列的数据类型修改为 DECIMAL(10, 2)
这意味着 salary 列可以存储最多10位数字,其中包括2位小数。

注意事项:
序号事项
1在修改列的数据类型时,必须确保新的数据类型与现有数据兼容,否则可能会出现数据丢失或精度问题。
2如果列中已有数据,且新数据类型与旧数据类型不兼容,数据库可能会拒绝执行该操作,或者需要额外的转换步骤。
3在某些数据库系统中,如果列上存在任何约束(如 NOT NULL、DEFAULT 等),你可能需要在修改数据类型的同时重新指定这些约束。
4在修改列的数据类型之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。
5使用此语句需要足够的权限来修改表结构。

在某些数据库系统中,如MySQL,可能需要使用稍微不同的语法:

ALTER TABLE employees MODIFY salary DECIMAL(10, 2);

如Oracle,语法可能会有所不同:

ALTER TABLE employees MODIFY (salary DECIMAL(10, 2));
四、重命名列
语法:
ALTER TABLE table_name CHANGE old_column_name new_column_name datatype;
解释:
元素解释
ALTER TABLESQL关键字,用于指示接下来的操作是关于修改一个已经存在的表的结构。
table_name要修改列的表的名称
CHANGESQL关键字,用于指示想要更改表中某个列的名称,并且可以选择性地更改其数据类型。
old_column_name这是当前存在于表中,你想要重命名和/或更改数据类型的列的名称
new_column_name这是新的列名称,将 old_column_name 改成这个名称
datatype这是新的数据类型,你希望列在重命名后使用的数据类型。例如,INT, VARCHAR, DATE, DECIMAL 等。
示例:
ALTER TABLE employees CHANGE salary annual_salary DECIMAL(10, 2);
解释:

将名为 employees 的表中 salary 列的名称更改为 annual_salary
并且将其数据类型修改为 DECIMAL(10, 2)
这意味着 annual_salary 列可以存储最多10位数字,其中包括2位小数。

注意事项:
序号事项
1在更改列的名称和数据类型时,必须确保新的数据类型与现有数据兼容,否则可能会出现数据丢失或精度问题。
2如果列中已有数据,且新数据类型与旧数据类型不兼容,数据库可能会拒绝执行该操作,或者需要额外的转换步骤。
3在某些数据库系统中,如果列上存在任何约束(如 NOT NULL、DEFAULT 等),你可能需要在更改数据类型的同时重新指定这些约束。
4在更改列的名称和数据类型之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。
5使用此语句需要足够的权限来修改表结构。
6如果只想更改列的名称而不更改数据类型,可以在 CHANGE 子句中重复旧的数据类型。

删除表

语法:
DROP TABLE table_name;
解释:
元素解释
DROP TABLESQL关键字,用于指示接下来的操作是关于从数据库中删除一个表。
table_name这是要删除的表的名称。
示例:
DROP TABLE employees;
解释:

删除了名为 employees 的表。

注意事项:
序号事项
1删除表是一个永久性的操作,一旦执行,表及其所有内容都将被永久移除,并且无法恢复(除非有数据库备份)。
2在删除表之前,应该仔细考虑,因为这可能会影响到依赖于该表的其他数据库对象,如视图、存储过程、触发器或外键约束。
3如果其他表中的外键约束引用了要删除的表,那么删除操作可能会失败,除非你使用额外的SQL语句来首先删除或修改这些外键约束。
4在执行 DROP TABLE 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失。
5使用此语句需要足够的权限来删除表。
6在某些数据库系统中,删除表可能会导致存储空间未被回收,需要定期执行维护操作来优化数据库性能。

清空表

语法:
TRUNCATE TABLE table_name;
解释:
元素解释
TRUNCATE TABLESQL关键字,用于指示接下来的操作是关于清空表中的所有数据行。
table_name:需要清空数据的表的名称。
示例:
TRUNCATE TABLE employees;
解释:

清空了名为 employees 的表中的所有数据行
但是表结构(包括列定义、索引、约束等)保持不变。

注意事项:
序号事项
1TRUNCATE TABLE 语句删除表中的所有数据行,这个过程比逐行删除数据(例如,使用 DELETE FROM table_name;)要快得多,因为它不记录每行删除的日志,而是直接删除数据文件中的内容。
2与 DELETE 语句不同,TRUNCATE TABLE 不会激活与删除行相关的触发器(如 DELETE 触发器)。
3执行 TRUNCATE TABLE 操作后,表中的自增列(如果有的话)通常会重置为起始值。
4在某些数据库系统中,TRUNCATE TABLE 可能不支持事务回滚,即一旦执行,就无法撤销操作(除非有数据库备份)。
5使用此语句需要足够的权限来清空表。
6在执行 TRUNCATE TABLE 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失。
7在多用户环境中,执行 TRUNCATE TABLE 可能会影响其他用户或系统正在使用的数据,因此在执行之前应通知所有可能受影响的用户或系统。

TRUNCATE TABLE 通常用于测试环境中快速清除数据,或者在不再需要表中数据但希望保留表结构的情况下使用。在生产环境中使用之前,应该非常谨慎,并确保不会影响到业务流程。

重命名表

语法:
RENAME TABLE old_table_name TO new_table_name;
解释:
元素解释
RENAME TABLESQL关键字,用于指示接下来的操作是关于更改表的名称。
old_table_name要更改名称的表的当前名称。
TO关键字,用于分隔旧表名和新表名,表明 old_table_name 将被重命名为后面的 new_table_name。
new_table_name这是新的表名称,将 old_table_name 改成这个名称。
示例:
RENAME TABLE employees TO staff;
解释:

将名为 employees 的表重命名为 staff。

注意事项:
序号事项
1使用 RENAME TABLE 语句之前,应该确保新的表名在数据库中是唯一的,以避免命名冲突。
2更改表名不会影响表中的数据或表结构,只是改变了表的名称。
3在某些数据库系统中,RENAME TABLE 可能不支持在同一数据库中重命名表,或者可能需要管理员权限才能执行。
4在执行 RENAME TABLE 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失或损坏。
5更改表名可能会影响依赖于该表的其他数据库对象,如视图、存储过程、触发器或外键约束。在更改表名之前,应该检查是否有其他对象依赖于该表,并确保它们可以正确地引用新的表名。

DML

插入数据

向数据库表中插入新的行。

语法:
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
解释:
元素解释
INSERT INTOSQL关键字,用于指示接下来的操作是关于向表中插入数据的。
table_name想要插入数据的表的名称。
(column1, column2, …)可选的,列名列表。当你知道要插入哪些列的值时,可以使用列名列表来指定哪些列将接收值。如果省略列名列表,默认情况下,值将被插入到所有列中,前提是这些列的数据类型兼容。
VALUES (value1, value2, …)必须的,它定义了要插入的值。这些值必须与列名列表中的列顺序相对应,并且数据类型必须与列定义兼容。
示例:
INSERT INTO employees (id, name, department) VALUES (1, 'John Doe', 'Sales');
解释:

向名为 employees 的表中插入了一个新行
其中 id 列的值为1,name 列的值为 ‘John Doe’,department 列的值为 ‘Sales’。

注意事项:
序号事项
1如果你省略了列名列表,你需要确保提供的值的数量与表中的列数相匹配,并且数据类型兼容。
2如果你为表中的某个列提供了值,其他列(如果没有默认值或列为 NOT NULL)也必须有值,除非你使用 INSERT IGNORE 或 INSERT ON DUPLICATE KEY UPDATE 这样的语法来忽略或更新可能存在的重复行。
3在执行 INSERT 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失或损坏。
4使用此语句需要足够的权限来插入数据。
5如果你想要插入多个行,可以使用多个 VALUES 子句,每个子句都包含一组值

例如:

INSERT INTO employees (id, name, department) VALUES (2, 'Jane Smith', 'Marketing'), (3, 'Alice Johnson', 'HR');

更新数据

更新数据库表中满足特定条件的行(记录)的列值

语法:
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
解释:
元素解释
UPDATE table_nameSQL关键字,用于指示接下来的操作是关于更新表中的数据的。
SETSQL关键字,用于指定要更新的列及其新值。
column1 = value1, column2 = value2这是更新操作的列值对。column1 和 column2 是表中的列名,而 value1 和 value2 是这些列的新值。
WHERE condition这是可选的,用于指定哪些行应该被更新。只有满足 WHERE 子句中指定条件的行才会被更新。
condition是一个布尔表达式,通常涉及比较操作符(如 =, <>, >, <, >=, <=)和逻辑操作符(如 AND, OR, NOT)。
示例:
UPDATE employees SET salary = salary * 1.10 WHERE department = 'Sales';
解释:

新了名为 employees 的表中 salary 列的值
将所有在 department 列上值为 ‘Sales’ 的行的 salary 增加10%。

注意事项:
序号事项
1如果没有指定 WHERE 子句,那么表中的所有行都会被更新,这是一个非常危险的操作,因为它会更改表中的所有数据。
2在执行 UPDATE 操作之前,通常建议先执行一个 SELECT 查询来确认将要更新的行,以确保不会意外更新错误的数据。
3更新操作通常是不可逆的,一旦执行,被更新的数据可能无法恢复(除非有数据库备份)。
4在某些数据库系统中,UPDATE 操作可能会触发触发器(trigger),这些触发器可能会执行额外的操作,例如记录更新日志或维护相关表的数据完整性。
5使用 UPDATE 语句时,需要确保拥有足够的权限来执行更新操作。

删除数据

从数据库表中删除满足特定条件的行(记录)

语法:
DELETE FROM table_name WHERE condition;
解释:
元素解释
DELETE FROMSQL关键字,用于指示接下来的操作是关于从表中删除数据的。
table_name要从中删除行的表的名称。
WHERE condition可选,用于指定哪些行应该被删除。只有满足 WHERE 子句中指定条件的行才会被删除
condition是一个布尔表达式,通常涉及比较操作符(如 =, <>, >, <, >=, <=)和逻辑操作符(如 AND, OR, NOT)。
示例:
DELETE FROM employees WHERE department = 'Sales';
解释:

删除了名为 employees 的表中 department 列上值为 ‘Sales’ 的所有行。

注意事项:
序号事项
1如果省略了 WHERE 子句,那么表中的所有行都会被删除,这是一个非常危险的操作,因为它会清空整个表。
2在执行 DELETE 操作之前,通常建议先执行一个 SELECT 查询来确认将要删除的行,以确保不会意外删除错误的数据。
3删除操作通常是不可逆的,一旦执行,被删除的数据可能无法恢复(除非有数据库备份)。
4在某些数据库系统中,DELETE 操作可能会触发触发器(trigger),这些触发器可能会执行额外的操作,例如记录删除日志或维护相关表的数据完整性。
5使用 DELETE 语句时,需要确保拥有足够的权限来执行删除操作

合并数据

将数据从一个或多个源表合并到一个目标表中。在Oracle数据库中称为 MERGE,而在SQL Server中称为 MERGE 或 UPSERT。

语法:
MERGE INTO target_table USING source_table ON (condition)
WHEN MATCHED THEN
    UPDATE SET target_table.column = source_table.column
WHEN NOT MATCHED THEN
    INSERT (column_list) VALUES (value_list);
解释:
元素解释
MERGE INTO target_table指定了要合并数据的目标表。
USING source_table指定源表,即从中获取数据的表。source_table 是包含要合并到目标表中的数据的表。
ON (condition)这个子句定义了目标表和源表之间的匹配条件。只有当条件为真时,才会对目标表中的行执行更新或插入操作。condition 是一个布尔表达式,通常涉及两个表的列比较。
WHEN MATCHED THEN当目标表中的行与源表中的行根据 ON 子句中的条件匹配时,这个子句定义了要执行的操作。在这个子句中,可以指定 UPDATE 语句来更新目标表中的行。
UPDATE SET target_table.column = source_table.column:这个子句指定了如何更新目标表中的行。可以列出多个列和它们的新值,这些值通常来自源表。
WHEN NOT MATCHED THEN当源表中的行在目标表中没有匹配的行时,这个子句定义了要执行的操作。在这个子句中,可以指定 INSERT 语句来向目标表中插入新行。
INSERT (column_list) VALUES (value_list)这个子句指定了要插入到目标表中的新行的列和对应的值。column_list 是要插入数据的列名列表,而 value_list 是与列对应的值列表。
示例:
MERGE INTO employees AS target_table USING sales_reports AS source_table
ON (target_table.employee_id = source_table.employee_id)
WHEN MATCHED THEN
    UPDATE SET target_table.sales_amount = source_table.sales_amount * 1.10
WHEN NOT MATCHED THEN
    INSERT (employee_id, sales_amount)
    VALUES (source_table.employee_id, source_table.sales_amount * 1.10);
解释:

正在修改名为 employees 的表。
根据 employee_id 列匹配 sales_reports 表中的数据。
如果 employee_id 匹配,则更新 sales_amount 列,使其增加10%。
如果 employee_id 不匹配,则插入新的行,sales_amount 列的值也增加10%。

注意事项:
序号事项
1MERGE 语句可能在不同数据库系统中的语法略有不同。
2在执行 MERGE 操作之前,通常建议进行备份,因为这是一个可以更改大量数据的操作。
3并非所有数据库系统都支持 MERGE 语句。例如,MySQL 在早期版本中不支持这个语句,但在 8.0 版本中引入了类似的功能。
  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值