前言
SQL(Structured Query Language)是用于管理关系型数据库的标准语言,主要分为以下几类:
- 数据查询语言(DQL) :SELECT
- 数据操作语言(DML) :INSERT, UPDATE, DELETE
- 数据定义语言(DDL) :CREATE, ALTER, DROP
- 数据控制语言(DCL) :GRANT, REVOKE
- 事务控制语言(TCL) :COMMIT, ROLLBACK
基础SQL语句-数据定义语言
-
CREATE TABLE创建表
CREATE TABLE用于创建新表,需要定义表名、列名和每列的数据类型。
基本语法:
CREATE TABLE table_name ( column1 datatype constraints, column2 datatype constraints, ... );常用数据类型:
- 整数:
INT,SMALLINT,BIGINT - 小数:
DECIMAL(precision, scale),FLOAT - 字符串:
VARCHAR(n),CHAR(n),TEXT - 日期时间:
DATE,TIME,DATETIME,TIMESTAMP - 布尔值:
BOOLEAN
常用约束:
PRIMARY KEY- 主键NOT NULL- 非空UNIQUE- 唯一值DEFAULT- 默认值CHECK- 条件检查FOREIGN KEY- 外键
练习:
--请创建一个`courses`表,包含以下字段和约束: --`course_id`(整数,主键) --`course_name`(字符串,最长50字符,非空) --`credit`(小数,精度3位,小数1位,值在0.5到10之间) --`department`(字符串,最长30字符) --`is_elective`(布尔值,默认false) CREATE TABLE courses ( course_id INT PRIMARY KEY, course_name VARCHAR(50) NOT NULL, credit DECIMAL(3,1) CHECK (credit >= 0.5 AND credit <= 10), department VARCHAR(30), is_elective BOOLEAN DEFAULT false );DECIMAL(3,1)表示最多3位数字,其中1位小数(如 9.5 或 12.0)CHECK约束也可以用BETWEEN语法:credit BETWEEN 0.5 AND 10- 主键约束会自动创建唯一索引
- 设置初始值为DEFAULT
- 整数:
-
ALTER TABLE
2.1 添加列
ALTER TABLE table_name ADD COLUMN column_name datatype [constraints] [DEFAULT default_value];2.2 修改列
ALTER TABLE table_name ALTER COLUMN column_name [SET DATA] TYPE new_datatype; -- PostgreSQL/SQL Server ALTER TABLE table_name MODIFY COLUMN column_name new_datatype; -- MySQL2.3 删除列
ALTER TABLE table_name DROP COLUMN column_name [CASCADE|RESTRICT];2.4 添加约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_type (column_name);2.5 删除约束
ALTER TABLE table_name DROP CONSTRAINT constraint_name;2.6 重命名操作
ALTER TABLE table_name RENAME COLUMN old_name TO new_name; ALTER TABLE old_table_name RENAME TO new_table_name;2.7 修改默认值
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT new_default; ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT;- 大表结构变更可能锁表,需在低峰期操作
- 某些变更可能导致数据丢失(如缩小字段长度)
- 不同数据库系统的语法可能有差异
练习:
--假设已有`courses`表,请写出SQL语句: --添加`start_date`列(DATE类型) --将`instructor`列改为可为NULL --添加约束确保`start_date`不早于2020年 --将表重命名为`course_offerings` 1、ALTER TABLE courses ADD COLUMN start_date DATE 2、ALTER TABLE courses DROP CONSTRAINT instructor × 原表没有名为"instructor"的约束,应该是修改列属性--正确做法是修改列的NOT NULL属性 -- PostgreSQL/SQL Server语法: ALTER TABLE courses ALTER COLUMN instructor DROP NOT NULL; -- MySQL语法: ALTER TABLE courses MODIFY COLUMN instructor VARCHAR(50) NULL; 3、ALTER TABLE courses ADD CONSTRAINT CHECK(start_date>2020) ALTER TABLE courses ADD CONSTRAINT chk_start_date CHECK (start_date > '2020-01-01'); 4、ALTER TABLE courses RENAME course_offerings 缺少关键词TO ALTER TABLE courses RENAME TO course_offerings; -
DROP TABLE
DROP TABLE用于完全删除表(包括表结构和所有数据) 基本语法:
DROP TABLE [IF EXISTS] table_name [CASCADE|RESTRICT];IF EXISTS:表不存在时不报错(推荐使用)CASCADE:级联删除依赖对象(视图、外键等)RESTRICT:如果有依赖对象则拒绝删除(默认)- 删除后数据不可恢复(除非有备份)
- 生产环境操作前务必确认
- 不同数据库的CASCADE行为可能略有不同
练习:
--假设数据库中有表`experimental_data`和依赖它的视图`data_summary`,请写出: --1. 安全删除`old_courses`表(可能不存在) --2. 强制删除`experimental_data`表及其所有依赖对象 DROP TABLE IF EXISTS DROP TABLE experimental_data CASCADE -
TRUNCATE TABLE
TRUNCATE TABLE用于快速清空表中的所有数据,但保留表结构。
TRUNCATE TABLE table_name [RESTART IDENTITY];- 比DELETE更快(不记录单行删除)
- 重置自增列(除非使用
CONTINUE IDENTITY) - 不能带WHERE条件
- 通常不可回滚(事务中某些数据库支持回滚)
TRUNCATE与DELETE的区别:
特性 TRUNCATE DELETE 执行速度 快 慢 可回滚 通常不可 可以 重置自增值 是 否 触发触发器 通常不触发 触发 使用场景 清空整个表 有条件删除部分数据 练习:
--假设有表`user_sessions`(包含自增列session_id),请写出: --1. 清空该表所有数据 --2. 清空该表并重置自增计数器 1、TRUNCATE TABLE user_sessions 2、 若数据库为Mysql、SQL Server,必定自动重置自增值:TRUNCATE TABLE user_sessions 若数据库为PostgreSQL,必须显式指定 `RESTART IDENTITY` 才会重置序列:TRUNCATE TABLE user_sessions RESTART IDENTITY; -
最佳实践指南
5.1. 命名规范
- 表名/列名使用小写和下划线(如
user_orders) - 约束命名:
pk_表名(主键),fk_表名_列名(外键),chk_表名_规则(检查约束)
5.2 生产环境操作原则
-
任何DROP/TRUNCATE前先备份: CREATE TABLE backup_table AS SELECT * FROM target_table;
-
使用IF EXISTS防止错误: DROP TABLE IF EXISTS temp_data;
- 表名/列名使用小写和下划线(如