SQL语句语法大全.docx
- 文档编号:25955743
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:186
- 大小:135.41KB
SQL语句语法大全.docx
《SQL语句语法大全.docx》由会员分享,可在线阅读,更多相关《SQL语句语法大全.docx(186页珍藏版)》请在冰豆网上搜索。
SQL语句语法大全
第13章:
SQL语句语法
目录
13.1.数据定义语句
13.1.1.ALTERDATABASE语法
13.1.2.ALTERTABLE语法
13.1.3.CREATEDATABASE语法
13.1.4.CREATEINDEX语法
13.1.5.CREATETABLE语法
13.1.6.DROPDATABASE语法
13.1.7.DROPINDEX语法
13.1.8.DROPTABLE语法
13.1.9.RENAMETABLE语法
13.2.数据操作语句
13.2.1.DELETE语法
13.2.2.DO语法
13.2.3.HANDLER语法
13.2.4.INSERT语法
13.2.5.LOADDATAINFILE语法
13.2.6.REPLACE语法
13.2.7.SELECT语法
13.2.8.Subquery语法
13.2.9.TRUNCATE语法
13.2.10.UPDATE语法
13.3.MySQL实用工具语句
13.3.1.DESCRIBE语法(获取有关列的信息)
13.3.2.USE语法
13.4.MySQL事务处理和锁定语句
13.4.1.STARTTRANSACTION,COMMIT和ROLLBACK语法
13.4.2.不能回滚的语句
13.4.3.会造成隐式提交的语句
13.4.4.SAVEPOINT和ROLLBACKTOSAVEPOINT语法
13.4.5.LOCKTABLES和UNLOCKTABLES语法
13.4.6.SETTRANSACTION语法
13.4.7.XA事务
13.5.数据库管理语句
13.5.1.账户管理语句
13.5.2.表维护语句
13.5.3.SET语法
13.5.4.SHOW语法
13.5.5.其它管理语句
13.6.复制语句
13.6.1.用于控制主服务器的SQL语句
13.6.2.用于控制从服务器的SQL语句
13.7.用于预处理语句的SQL语法
本章介绍了SQL语句的语法。
13.1. 数据定义语句
13.1.1.ALTERDATABASE语法
13.1.2.ALTERTABLE语法
13.1.3.CREATEDATABASE语法
13.1.4.CREATEINDEX语法
13.1.5.CREATETABLE语法
13.1.6.DROPDATABASE语法
13.1.7.DROPINDEX语法
13.1.8.DROPTABLE语法
13.1.9.RENAMETABLE语法
13.1.1. ALTERDATABASE语法
ALTER{DATABASE|SCHEMA}[db_name]
alter_specification[,alter_specification]...
alter_specification:
[DEFAULT]CHARACTERSETcharset_name
|[DEFAULT]COLLATEcollation_name
ALTERDATABASE用于更改数据库的全局特性。
这些特性储存在数据库目录中的db.opt文件中。
要使用ALTERDATABASE,您需要获得数据库ALTER权限。
CHARACTERSET子句用于更改默认的数据库字符集。
COLLATE子句用于更改默认的数据库整序。
在第10章:
字符集支持中对字符集和整序名称进行了讨论。
数据库名称可以忽略,此时,语句对应于默认数据库。
也可以使用ALTERSCHEMA。
13.1.2. ALTERTABLE语法
ALTER[IGNORE]TABLEtbl_name
alter_specification[,alter_specification]...
alter_specification:
ADD[COLUMN]column_definition[FIRST|AFTERcol_name]
|ADD[COLUMN](column_definition,...)
|ADDINDEX[index_name][index_type](index_col_name,...)
|ADD[CONSTRAINT[symbol]]
PRIMARYKEY[index_type](index_col_name,...)
|ADD[CONSTRAINT[symbol]]
UNIQUE[index_name][index_type](index_col_name,...)
|ADD[FULLTEXT|SPATIAL][index_name](index_col_name,...)
|ADD[CONSTRAINT[symbol]]
FOREIGNKEY[index_name](index_col_name,...)
[reference_definition]
|ALTER[COLUMN]col_name{SETDEFAULTliteral|DROPDEFAULT}
|CHANGE[COLUMN]old_col_namecolumn_definition
[FIRST|AFTERcol_name]
|MODIFY[COLUMN]column_definition[FIRST|AFTERcol_name]
|DROP[COLUMN]col_name
|DROPPRIMARYKEY
|DROPINDEXindex_name
|DROPFOREIGNKEYfk_symbol
|DISABLEKEYS
|ENABLEKEYS
|RENAME[TO]new_tbl_name
|ORDERBYcol_name
|CONVERTTOCHARACTERSETcharset_name[COLLATEcollation_name]
|[DEFAULT]CHARACTERSETcharset_name[COLLATEcollation_name]
|DISCARDTABLESPACE
|IMPORTTABLESPACE
|table_options
|partition_options
|ADDPARTITIONpartition_definition
|DROPPARTITIONpartition_names
|COALESCEPARTITIONnumber
|REORGANIZEPARTITIONpartition_namesINTO(partition_definitions)
|ANALYZEPARTITIONpartition_names
|CHECKPARTITIONpartition_names
|OPTIMIZEPARTITIONpartition_names
|REBUILDPARTITIONpartition_names
|REPAIRPARTITIONpartition_names
ALTERTABLE用于更改原有表的结构。
例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或表。
您还可以更改表的评注和表的类型。
允许进行的变更中,许多子句的语法与CREATETABLE中的子句的语法相近。
其中包括table_options修改,选项有ENGINE,AUTO_INCREMENT和AVG_ROW_LENGTH等。
请见13.1.5节,“CREATETABLE语法”。
存储引擎不支持有些操作,如果进行这些操作,会出现警告。
使用SHOWWARNINGS可以显示出这些警告。
请参见13.5.4.22节,“SHOWWARNINGS语法”。
如果您使用ALTERTABLE更改列规约,但是DESCRIBEtbl_name提示您列规约并没有改变,则可能是因为MySQL忽略了您所做的更改。
忽略更改的原因见13.1.5.1节,“沉寂的列规格变更”。
例如,如果您试图把VARCHAR列更改为CHAR列,此时,如果表包含其它长度可变的列,则MySQL仍会使用VARCHAR。
ALTERTABLE运行时会对原表进行临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。
在执行ALTERTABLE时,其它用户可以阅读原表,但是对表的更新和修改的操作将被延迟,直到新表生成为止。
新表生成后,这些更新和修改信息会自动转移到新表上。
注意,如果您在执行ALTERTABLE时使用除了RENAME以外的选项,则MySQL会创建一个临时表。
即使数据并不需要进行复制(例如当您更改列的名称时),MySQL也会这么操作。
对于MyISAM表,您可以通过把myisam_sort_buffer_size系统变量设置到一个较高的值,来加快重新创建索引(该操作是变更过程中速度最慢的一部分)的速度。
· 要使用ALTERTABLE,您需要获得表的ALTER,INSERT和CREATE权限。
· IGNORE是MySQL相对于标准SQL的扩展。
如果在新表中有重复关键字,或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTERTABLE的运行。
如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。
如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。
并且,对错误值进行修正,使之尽量接近正确值。
· 您可以在一个ALTERTABLE语句里写入多个ADD,ALTER,DROP和CHANGE子句,中间用逗号分开。
这是MySQL相对于标准SQL的扩展。
在标准SQL中,每个ALTERTABLE语句中每个子句只允许使用一次。
例如,在一个语句中取消多个列:
· mysql>ALTERTABLEt2DROPCOLUMNc,DROPCOLUMNd;
· CHANGEcol_name,DROPcol_name和DROPINDEX是MySQL相对于标准SQL的扩展。
· MODIFY是Oracle对ALTERTABLE的扩展。
· COLUMN只是自选项目,可以忽略。
· 如果您使用ALTERTABLEtbl_nameRENAMETOnew_tbl_name并且没有其它选项,则MySQL只对与tabletbl_name相对应的文件进行重命名。
不需要创建一个临时表。
(您也可以使用RENAMETABLE语句对表进行重命名。
请参见13.1.9节,“RENAMETABLE语法”。
)
· column_definition子句使用与CREATETABLE中的ADD和CHANGE子句相同的语法。
注意,此语法包括列名称,而不只是列类型。
请参见13.1.5节,“CREATETABLE语法”。
· 您可以使用CHANGEold_col_namecolumn_definition子句对列进行重命名。
重命名时,需给定旧的和新的列名称和列当前的类型。
例如:
要把一个INTEGER列的名称从a变更到b,您需要如下操作:
· mysql>ALTERTABLEt1CHANGEabINTEGER;
如果您想要更改列的类型而不是名称,CHANGE语法仍然要求旧的和新的列名称,即使旧的和新的列名称是一样的。
例如:
mysql>ALTERTABLEt1CHANGEbbBIGINTNOTNULL;
您也可以使用MODIFY来改变列的类型,此时不需要重命名:
mysql>ALTERTABLEt1MODIFYbBIGINTNOTNULL;
· 如果您使用CHANGE或MODITY缩短列长时,列中存在有索引,并且缩短后的列长小于索引长度,则MySQL会自动缩短索引的长度。
· 当您使用CHANGE或MODIFY更改列的类型时,MySQL会尽量把原有的列值转化为新的类型。
· 您可以使用FIRST或AFTERcol_name在一个表行中的某个特定位置添加列。
默认把列添加到最后。
您也可以在CHANGE或MODIFY语句中使用FIRST和AFTER。
· AFTERCOLUMN用于指定列的新默认值,或删除旧的默认值。
如果旧的默认值被删除同时列值为NULL,则新的默认值为NULL。
如果列值不能为NULL,MySQL会指定一个默认值,请参见13.1.5节,“CREATETABLE语法”。
· DROPINDEX用于取消索引。
这是MySQL相对于标准SQL的扩展。
请参见13.1.7节,“DROPINDEX语法”。
· 如果列从表中被取消了,则这些列也从相应的索引中被取消。
如果组成一个索引的所有列均被取消,则该索引也被取消。
· 如果一个表只包含一列,则此列不能被取消。
如果您想要取消表,应使用DROPTABLE。
· DROPPRIMAYDEY用于取消主索引。
注释:
在MySQL较早的版本中,如果没有主索引,则DROPPRIMARYKEY会取消表中的第一个UNIQUE索引。
在MySQL5.1中不会出现这种情况。
如果在MySQL5.1中对没有主键的表使用DROPPRIMARYKEY,则会出现错误信息。
如果您向表中添加UNIQUEKEY或PRIMARYKEY,则UNIQUEKEY或PRIMARYKEY会被储存在非唯一索引之前,这样MySQL就可以尽早地检查出重复关键字。
· ORDERBY用于在创建新表时,让各行按一定的顺序排列。
注意,在插入和删除后,表不会仍保持此顺序。
当您知道多数情况下您会按照特定的顺序查询各行时,可以使用这个选项;在对表进行了大的改动后,通过使用此选项,您可以提高查询效率。
在有些情况下,如果表按列排序,对于MySQL来说,排序可能会更简单。
· 如果您对一个MyISAM表使用ALTERTABLE,则所有非唯一索引会被创建到一个单独的批里(和REPAIRTABLE相同)。
当您有许多索引时,这样做可以使ALTERTABLE的速度更快。
这项功能可以明确激活。
ALTERTABLE...DISABLEKEYS让MySQL停止更新MyISAM表中的非唯一索引。
然后使用ALTERTABLE...ENABLEKEYS重新创建丢失的索引。
进行此操作时,MySQL采用一种特殊的算法,比一个接一个地插入关键字要快很多。
因此,在进行成批插入操作前先使关键字禁用可以大大地加快速度。
使用ALTERTABLE...DISABLEKEYS除了需要获得以前提到的权限以外,还需要获得INDEX权限。
· Innodb存储引擎支持FOREIGNKEY和REFERENCES子句。
Innodb存储引擎执行ADD[CONSTRAINT[symbol]]FOREIGNKEY(...)REFERENCES...(...)。
请参见15.2.6.4节,“FOREIGNKEY约束”。
对于其它存储引擎,这些子句会被分析,但是会被忽略。
对于所有的存储引擎,CHECK子句会被分析,但是会被忽略。
请参见13.1.5节,“CREATETABLE语法”。
接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序,创建带参考数据的表。
请参见1.8.5节,“MySQL与标准SQL的差别”。
· InnoDB支持使用ALTERTABLE来取消外键:
· ALTERTABLEyourtablenameDROPFOREIGNKEYfk_symbol;
要了解更多信息,请参见15.2.6.4节,“FOREIGNKEY约束”。
· ALTERTABLE忽略DATADIRECTORY和INDEXDIRECTORY表选项。
· 如果您想要把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集,应使用如下语句:
· ALTERTABLEtbl_nameCONVERTTOCHARACTERSETcharset_name;
警告:
前面的操作转换了字符集之间的列类型。
如果您有一列使用一种字符集(如latin1),但是存储的值实际上使用了其它的字符集(如utf8),这种情况不是您想要的。
此时,您必须对这样的列进行以下操作。
ALTERTABLEt1CHANGEc1c1BLOB;
ALTERTABLEt1CHANGEc1c1TEXTCHARACTERSETutf8;
这种方法能够实现此功能的原因是,当您转换到BLOB列或从BLOB列转换过来时,并没有发生转换。
如果您指定CONVERTTOCHARACTERSET为二进制,则TEXT列被转换到相应的二进制字符串类型(BINARY,VARBINARY,BLOB)。
这意味着这些列将不再有字符集,接下来的CONVERTTO操作也将不适用于这些列。
要仅仅改变一个表的默认字符集,应使用此语句:
ALTERTABLEtbl_nameDEFAULTCHARACTERSETcharset_name;
词语DEFAULT为自选项。
如果您在向表中添加一个新列时(例如,使用ALTERTABLE...ADDcolumn)没有指定字符集,则此时使用的字符集为默认字符集。
警告:
ALTERTABLE...DEFAULTCHARACTERSET和ALTERTABLE...CHARACTERSET是等价的,只用于更改默认的表字符集。
· 如果InnoDB表在创建时,使用了.ibd文件中的自己的表空间,则这样的文件可以被删除和导入。
使用此语句删除.ibd文件:
· ALTERTABLEtbl_nameDISCARDTABLESPACE;
此语句用于删除当前的.ibd文件,所以应首先确认您有一个备份。
如果在表空间被删除后尝试打开表格,则会出现错误。
要把备份的.ibd文件还原到表中,需把此文件复制到数据库目录中,然后书写此语句:
ALTERTABLEtbl_nameIMPORTTABLESPACE;
见15.2.6.6节,“使用按表的表空间”。
· 使用mysql_info()CAPI函数,您可以了解有多少记录已被复制,以及(当使用IGNORE时)有多少记录由于重复关键字的原因已被删除。
请参见25.2.3.34节,“mysql_info()”。
· ALTERTABLE也可以用于对带分区的表进行重新分区,功能包括添加、取消、合并和拆分各分区,还可以用于进行分区维护。
对带分区的表使用partition_options子句和ALTERTABLE可以对表进行重新分区,使用时依据partition_options定义的分区方法。
本子句以PARTITIONBY为开头,然后使用与用于CREATETABLE的partition_options子句一样的语法和规则(要了解详细信息,请参见13.1.5节,“CREATETABLE语法”)。
注释:
MySQL5.1服务器目前接受此语法,但是不实际执行;等MySQL5.1开发出来后,将执行此语法。
用于ALTERTABLEADDPARTITION的partition_definition子句支持用于CREATETABLE语句的partition_definition子句的同样名称的选项。
(要了解语法和介绍,请参见13.1.5节,“CREATETABLE语法”。
)例如,假设您有一个按照以下方式创建的带分区的表:
CREATETABLEt1(
idINT,
year_colINT
)
PARTITIONBYRANGE(year_col)(
PARTITIONp0VALUESLESSTHAN(1991),
PARTITIONp1VALUESLESSTHAN(1995),
PARTITIONp2VALUESLESSTHAN(1999)
);
您可以在表中增加一个新的分区p3,该分区用于储存小于2002的值。
添加方法如下:
ALTERTABLEt1ADDPARTITIONp3VALUESLESSTHAN(2002);
注释:
您不能使用ALTERTABLE向一个没有进行分区的表添加分区。
DROPPARTITION用于取消一个或多个RANGE或LIST分区。
此命令不能用于HASH或KEY分区;用于这两个分区时,应使用COALESCEPARTITION(见后)。
如果被取消的分区其名称列于partition_names清单中,则储存在此分区中的数据也被取消。
例如,如果以前已定义的表t1,您可以采用如下方法取消名称为p0和p1的分区:
ALTERTABLEDROPPARTITIONp0,p1;
ADDPARTITION和DROPPARTITION目前不支持IF[NOT]EXISTS。
也不可能对一个分区或一个已分区的表进行重命名。
如果您希望对一个分区进行重命名,您必须取消分区,再重新建立;如果您希望对一个已分区的表进行重新命名,您必须取消所有分区,然后对表进行重命名,再添加被取消的分区。
COALESCEPARTITION可以用于使用HASH或KEY进行分区的表,以便使用number来减少分区的数目。
例如,假设您使用下列方法创建了表t2:
CREATETABLEt2(
nameVARCHAR(30),
startedDATE
)
PARTITIONBYHASH(YEAR(started))
PARTITIONS(6);
您可以使用以下命令,把t2使用的分区的数目由6个减少到4个:
ALTERTABLEt2COALESCEPARTITION2;
包含在最后一个number分区中的数据将被合并到其余的分区中。
在此情况下,分区4和分区5将被合并到前4个分区中(编号为0、1、2和3的分区)。
如果要更改部分分区,但不更改所有的分区,您可以使用REORGANIZEPARTITION。
这个命令有多种使用方法:
o 把多个分区合并为一个分区。
通过把多个分区的名称列入partition_names清单,并为partition_definition提供一个单一的定义,可以实现这个功能。
o 把一个原有的分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 语句 语法 大全