标准SQL基础语句-数据定义语言(DDL)

105 阅读4分钟

前言

SQL(Structured Query Language)是用于管理关系型数据库的标准语言,主要分为以下几类:

  1. 数据查询语言(DQL) :SELECT
  2. 数据操作语言(DML) :INSERT, UPDATE, DELETE
  3. 数据定义语言(DDL) :CREATE, ALTER, DROP
  4. 数据控制语言(DCL) :GRANT, REVOKE
  5. 事务控制语言(TCL) :COMMIT, ROLLBACK

基础SQL语句-数据定义语言

  1. CREATE TABLE创建表

    CREATE TABLE用于创建新表,需要定义表名、列名和每列的数据类型。

    基本语法:

    CREATE TABLE table_name (
    column1 datatype constraints,
    column2 datatype constraints,
    ...
    );
    
    常用数据类型:
    • 整数INTSMALLINTBIGINT
    • 小数DECIMAL(precision, scale)FLOAT
    • 字符串VARCHAR(n)CHAR(n)TEXT
    • 日期时间DATETIMEDATETIMETIMESTAMP
    • 布尔值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
  2. 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;  -- MySQL
    
    2.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`
    1ALTER TABLE courses ADD COLUMN start_date DATE
    2ALTER 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;
    3ALTER TABLE courses ADD CONSTRAINT CHECK(start_date>2020ALTER TABLE courses
        ADD CONSTRAINT chk_start_date CHECK (start_date > '2020-01-01');
    4ALTER TABLE courses RENAME course_offerings
        缺少关键词TO
        ALTER TABLE courses
        RENAME TO course_offerings;
    
  3. 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
    
  4. TRUNCATE TABLE

    TRUNCATE TABLE用于快速清空表中的所有数据,但保留表结构。

    TRUNCATE TABLE table_name [RESTART IDENTITY];
    
    • 比DELETE更快(不记录单行删除)
    • 重置自增列(除非使用CONTINUE IDENTITY
    • 不能带WHERE条件
    • 通常不可回滚(事务中某些数据库支持回滚)

    TRUNCATE与DELETE的区别:

    特性TRUNCATEDELETE
    执行速度
    可回滚通常不可可以
    重置自增值
    触发触发器通常不触发触发
    使用场景清空整个表有条件删除部分数据

    练习:

    --假设有表`user_sessions`(包含自增列session_id),请写出:
    --1.  清空该表所有数据
    --2.  清空该表并重置自增计数器
    1TRUNCATE TABLE user_sessions
    2、
    若数据库为Mysql、SQL Server,必定自动重置自增值:TRUNCATE TABLE user_sessions
    若数据库为PostgreSQL,必须显式指定 `RESTART IDENTITY` 才会重置序列:TRUNCATE TABLE user_sessions RESTART IDENTITY;
    
  5. 最佳实践指南

    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;