创建表
CREATE TABLE 用于定义表结构——指定列名、数据类型和约束规则。
建表时需要为每一列指定数据类型和约束。下表列出了本文用到的类型和约束,这里先混个眼熟,后续章节会有详细讲解。
常用数据类型:
| 类型 | 分类 | 说明 |
|---|---|---|
INT | 整数 | 标准整数,如工号、数量 |
SMALLINT | 整数 | 小范围整数,如年龄、部门代码 |
DECIMAL(m,d) | 精确小数 | m 总位数,d 小数位数,适合存金额 |
FLOAT | 近似小数 | 浮点数,适合存气温、体重等 |
CHAR(n) | 定长字符串 | 固定 n 个字符,如等级 A/B/C/D |
VARCHAR(n) | 变长字符串 | 最多 n 个字符,如姓名、地址 |
TEXT | 长文本 | 不限长度,如文章内容 |
DATE | 日期 | 年月日,如入职日期 |
常用约束:
| 约束 | 作用 |
|---|---|
PRIMARY KEY | 主键,唯一标识每一行,不允许重复和为空 |
NOT NULL | 该列必须有值,不能留空 |
DEFAULT | 插入数据时如果不填该列,自动使用默认值 |
UNIQUE | 该列的值不能重复 |
CHECK | 自定义校验规则,如年龄必须大于 0 |
语法:
CREATE TABLE 表名 (
列名1 数据类型 [列级约束],
列名2 数据类型 [列级约束],
...,
[表级约束]
);
从简单开始
先建一张最简单的表——飞翔科技官网的"座右铭",只存一条欢迎语:
-- 创建座右铭表(只有一个字段)
CREATE TABLE motto (
content VARCHAR(30) NOT NULL
);
-- 插入一条欢迎语
INSERT INTO motto VALUES ('愿你朝华相顾,愿你前程似锦。');
-- 查看结果
SELECT * FROM motto;
就这么简单:VARCHAR(30) 限定最多 30 个字符,NOT NULL 表示不能为空。建表、插入、查询,三步搞定。
再看一个完整的例子
以飞翔科技的工资场景为例,创建一张包含多列的员工表:
-- 创建员工表
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
dept_code SMALLINT DEFAULT 1,
join_year SMALLINT,
age SMALLINT,
basic_salary DECIMAL(10,2) NOT NULL,
performance_bonus DECIMAL(10,2) DEFAULT 0.00,
social_security DECIMAL(10,2) DEFAULT 0.00,
personal_tax DECIMAL(10,2) DEFAULT 0.00,
salary_grade CHAR(1),
full_attendance INT DEFAULT 1,
company_name VARCHAR(100) DEFAULT '广州飞翔科技'
);
提示:MySQL 中常用
TINYINT存小范围整数(如部门代码),用BOOLEAN存真/假值,用AUTO_INCREMENT实现主键自增。这些不属于 SQL 标准,但 MySQL、PostgreSQL、SQL Server 等主流数据库都有类似功能,只是写法不同。
表建好了,插入一条员工数据:
INSERT INTO employees (emp_id, emp_name, dept_code, join_year, age,
basic_salary, performance_bonus, social_security, personal_tax,
salary_grade, full_attendance)
VALUES (10001, '航仔', 2, 2018, 28, 8888.00, 18888.00, 2320.00, 1666.66,
'B', 1);
这条数据完全贴合飞翔科技的工资场景:航仔是技术部员工(dept_code = 2),2018 年入职,基本工资 8888.00,绩效奖金 18888.00,社保扣除 2320.00,个税 1666.66,工资等级 B,满勤标志为 1。每列的类型和默认值都经过精心设计,后续扩展和维护都会很顺手。
基于已有表创建新表
CREATE TABLE ... AS 可以从一张已有的表中复制数据,直接生成新表。新表的列名和数据类型由 SELECT 子句决定,查询出来的数据会自动填入。
语法:
CREATE TABLE 新表名 AS
SELECT 列1, 列2, ...
FROM 已有表
[WHERE 条件];
以飞翔科技为例,从员工表中筛选出技术部员工,单独建一张表:
-- 先确保 employees 表有数据(前面的例子已建过)
-- 基于员工表创建技术部花名册
CREATE TABLE tech_team AS
SELECT emp_id, emp_name, join_year
FROM employees
WHERE dept_code = 2;
-- 查看结果
SELECT * FROM tech_team;
这条语句做了三件事:①建了一张新表 tech_team,②它的列和数据类型来自 SELECT 中指定的三列,③把满足条件的数据一次性插了进去。
注意:
AS创建的新表只会复制数据,不会复制原表的主键、默认值等约束。如果新表需要这些约束,建好后需要用ALTER TABLE手动添加(后续章节会讲)。