MySQL中CREATE语法

本文详细介绍了SQL中的CREATE语句,包括其语法结构、各部分的功能解析,特别是针对临时表、表存在性的检查、列定义等内容进行了深入讲解,并对表选项如引擎、字符集等进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初学数据库时,身为DDL的CREATE语句就是必修的,也可以说是最早接触的,可能很多人还是只清楚简单的CREATE TABLE table_name (…);我曾经也是如此,顶多知道括号后面可以跟一些引擎设置,字符集设置等等,这篇文章就是用来升华的,深入了解下CREATE基本语法。

一、语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
[(
COLUMN_DEFINITION,
...
)]
[TABLE_OPTIONS]
[SELECT_STATEMENT]

二、解析

(1)TEMPORARY
用于创建临时表,CREATE TEMPORARY TABLE table_name;这个临时表在当前会话结束或者连接断开后将自动消失。
临时表详细内容可见我的另一篇文章《MySQL中临时表(TEMPORARY)》

(2)IF NOT EXISTS
实际上就是在建表前加上一个判断,只有该表目前尚不存在时才执行CREATE TABLE操作。用此选项可以避免出现表已经存在无法再新建的错误。

(3)table_name
需要创建的表名。该表名必须符合标识符规则,通常的做法是在表名中仅使用字母、数字及下划线。

(4)COLUMN_DEFINITION
所创建的表中各列的相关属性定义。
语法如下:

column_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] 
[PRIMARY KEY]
| PRIMARY KEY (index_col_name,...) 
| KEY [index_name] (index_col_name,...) 
| INDEX [index_name] (index_col_name,...) 
| UNIQUE [INDEX] [index_name] (index_col_name,...) 
| [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) 
[COMMENT reference_definition] 
or CHECK (expr) 

如上所示,列的相关属性定义语法内容相当丰富,这里就简单介绍下,后续可能会来补充,不熟悉的也可以自行查阅资料。
1)column_name:
表中列的名字。必须符合标识符规则,而且在表中要唯一。
2)type:
列的数据类型。有的数据类型需要指明长度n,并用括号括起。目前MySQL提供的数据类型详见MySQL进阶_列类型篇。
3)NOT NULL | NULL:
指定该列是否允许为空。如果既不指定NULL也不指定NOT NULL,列被认为指定了NULL。
4)DEFAULT default_value:
为列指定默认值。如果没有为列指定默认值,MySQL自动地分配一个。
如果列可以取NULL作为值,缺省值是NULL。
如果列被声明为NOT NULL,缺省值取决于列类型:
1、对于没有声明AUTO_INCREMENT属性的数字类型,缺省值是0。对于一个AUTO_INCREMENT列,缺省值是在顺序中的下一个值。
2、对于除TIMESTAMP的日期和时间类型,缺省值是该类型适当的“零”值。对于表中第一个TIMESTAMP列,缺省值是当前的日期和时间。
3、对于除ENUM的字符串类型,缺省是空字符串。对于ENUM,缺省值是第一个枚举值。
5)AUTO_INCREMENT:
设置该列有自增属性,只有整型列才能设置此属性。
当你插入NULL值或0到一个AUTO_INCREMENT列中时,列被设置为value+1,在这里value是此前表中该列的最大值。AUTO_INCREMENT顺序从1开始。每个表只能有一个AUTO_INCREMENT列,并且它必须被索引。

(5)TABLE_OPTIONS
设置表的一些属性定义:
1)引擎设置
例如:ENGINE|TYPE = MYISAM
2)字符集设置
例如:CHARACTER SET gbk
3)排序规则设置
例如:COLLATE gbk_chinese_ci
COLLATE是用来做什么的?
是用来排序的规则。对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知mysql如何对该列进行排序和比较。简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCT、GROUP BY、HAVING语句的查询结果。另外,mysql建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。总之,凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关。

(6)SELECT_STATEMENT

//如下直接通过select查询出指定数据存入新建的表中
CREATE TABLE ...
SELECT ...

参考自:
https://www.jb51.net/article/6257.htm

越努力,越强大,没有理由让自己停下。

<think>好的,用户想了解SQL中CREATE语句的用法,特别是CREATE语法。首先,我需要回忆一下CREATE语句的不同类型,比如创建表、数据库、视图和函数。根据用户提供的引用,引用[1]提到Flink SQL支持的CREATE语句包括TABLE、DATABASE、VIEW、FUNCTION,而引用[2]详细说明了CREATE TABLE的语法结构。引用[3]则概述了SQL的重要性,但可能对CREATE语句的具体内容帮助不大。 首先,应该从最常见的CREATE TABLE开始,因为这是用户可能最常用的部分。需要解释基本语法结构,列名和数据类型,以及可能的约束如主键、外键等。引用[2]中的示例可以作为基础,但可能需要补充更多细节,比如约束和选项。 接下来是CREATE DATABASE,这部分相对简单,但需要提到数据库的创建和字符集设置。引用[1]中提到CREATE DATABASE,但具体语法可能需要进一步说明。 然后是CREATE VIEW,需要解释视图的作用,比如简化复杂查询,以及如何使用AS SELECT子句来定义视图。同样,引用[1]提到了CREATE VIEW,但可能需要更具体的语法示例。 CREATE FUNCTION部分,用户可能需要区分系统函数和自定义函数,特别是UDF的使用场景。引用[1]中提到了CREATE FUNCTION,但可能需要说明不同SQL实现中的差异,比如Flink SQL和其他数据库系统的区别。 此外,需要注意不同数据库系统(如MySQL、PostgreSQL)在CREATE语句上的差异,提醒用户查阅具体文档。同时,应该提供示例代码,帮助用户更好地理解语法结构。例如,CREATE TABLE的示例可以包括列定义和主键设置,而CREATE VIEW的示例可以展示如何封装SELECT语句。 用户可能还需要了解一些高级选项,比如临时表、分区表等,但根据引用内容,可能需要保持基础,避免过于复杂。同时,生成的相关问题需要考虑用户可能的后续疑问,比如主键和外键的区别,视图的优缺点,以及如何修改表结构(ALTER TABLE)等。 最后,确保回答结构清晰,分点说明每个CREATE语句的用法,语法示例使用正确的格式($$...$$),并引用提供的参考资料。检查是否有遗漏的部分,比如约束和索引,是否需要提到CREATE INDEX,但根据引用内容,可能不在当前范围内,所以暂时不提及。</think>以下为SQL中CREATE语句的用法说明,按语句类型分类详解: ### 一、CREATE TABLE #### 1. 基础语法 $$CREATE TABLE 表名称 ( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ... );$$ 用于创建存储数据的二维表格结构。例如创建学生表: ```sql CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, BirthDate DATE ); ``` #### 2. 核心要素 - **列定义**:每个列需指定数据类型(如$INT$, $VARCHAR(n)$, $DATE$) - **约束条件**:如主键约束$PRIMARY KEY$、非空约束$NOT NULL$、唯一约束$UNIQUE$ - **高级选项**:支持设置默认值$DEFAULT$、外键约束$FOREIGN KEY$等[^2] ### 二、CREATE DATABASE $$CREATE DATABASE 数据库名称 [CHARACTER SET 字符集名称];$$ 用于创建新数据库: ```sql CREATE DATABASE SchoolDB CHARACTER SET utf8mb4; ``` ### 三、CREATE VIEW $$CREATE VIEW 视图名称 AS SELECT 语句;$$ 创建虚拟表简化复杂查询: ```sql CREATE VIEW HonorStudents AS SELECT Name, GPA FROM Students WHERE GPA > 3.5; ``` ### 四、CREATE FUNCTION #### 1. 系统函数扩展 $$CREATE FUNCTION 函数名 RETURNS 返回值类型 LANGUAGE 语言 AS $$ 函数体 $$;$$ #### 2. 自定义函数(UDF) ```sql CREATE FUNCTION CalculateAge(birth_date DATE) RETURNS INT BEGIN RETURN YEAR(CURRENT_DATE) - YEAR(birth_date); END; ``` ### 五、注意事项 1. 不同数据库系统(MySQL/Oracle/SQL Server)存在方言差异 2. 创建对象前需检查是否存在,可通过`IF NOT EXISTS`子句避免重复创建 3. 权限要求:执行CREATE语句需要相应数据库权限[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值