SQL语句语法详解

一、实验介绍

1.1 实验内容

本次实验主要介绍了 SQL 语句的基本语法。

1.2 实验知识点

  • 数据定义语句
  • 数据操作语句
  • MySQL事务处理
  • 数据库管理语句
  • 复制语句

1.3 实验环境

课程使用的实验环境为 Ubuntu Linux 14.04 64 位版本。实验中会用到程序:

  • Mysql 5.5.50
  • Xfce终端

二、实验步骤

2.1 数据定义语句

ALTER DATABASE语法
ALTER {DATABASE | SCHEMA} [db_name]
    alter_specification [, alter_specification] ...
ALTER {DATABASE | SCHEMA} [db_name]
    UPGRADE DATA DIRECTORY NAME

alter_specification:
    [DEFAULT] CHARACTER SET charset_name
  | [DEFAULT] COLLATE collation_name

ALTER DATABASE用于更改数据库的全局特性,这些特性储存在数据库目录中的db.opt文件中。要使用ALTER DATABASE,您需要获得数据库的ALTER权限。CHARACTER SET子句用于更改默认的数据库字符集。ALTER SCHEMA语句等价于ALTER DATABASE

举例:

a-b-c(这是在旧格式)将被更改为#mysql50#a-b-c,这就导致你每次查询数据库名称都需要添加前缀#mysql150#,在这种情况下使用语句UPGRADE DATA DIRECTORY NAME明确地告诉服务器数据库目录名称需要重新编码到当前的编码形式:

ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;

#mysql150#的情况下直接查询到数据库a-b-c

ALTER TABLE语法
ALTER [IGNORE] TABLE tbl_name
    alter_specification [, alter_specification] ...

alter_specification:
    ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
  | ADD [COLUMN] (column_definition,...)
  | ADD INDEX [index_name] [index_type] (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
        PRIMARY KEY [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]]
        FOREIGN KEY [index_name] (index_col_name,...)
        [reference_definition]
  | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  | CHANGE [COLUMN] old_col_name column_definition
        [FIRST|AFTER col_name]
  | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
  | DROP [COLUMN] col_name
  | DROP PRIMARY KEY
  | DROP INDEX index_name
  | DROP FOREIGN KEY fk_symbol
  | DISABLE KEYS
  | ENABLE KEYS
  | RENAME [TO] new_tbl_name
  | ORDER BY col_name
  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
  | DISCARD TABLESPACE
  | IMPORT TABLESPACE
  | table_options
  | partition_options
  | ADD PARTITION partition_definition
  | DROP PARTITION partition_names
  | COALESCE PARTITION number
  | REORGANIZE PARTITION partition_names INTO (partition_definitions)
  | ANALYZE PARTITION partition_names
  | CHECK PARTITION partition_names
  | OPTIMIZE PARTITION partition_names
  | REBUILD PARTITION partition_names
  | REPAIR PARTITION partition_names

ALTER TABLE用于更改表的结构。例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或者表。您还可以更改表的评注和表的类型。CREATE TABLE中的子句的语法相近。其中包括table_options修改,选项有ENGINEAUTO_INCREMENT和AVG_ROW_LENGTH等。

举例:

t1转换为InnoDB表,可以使用如下语句:

ALTER TABLE t1 ENGINE = InnoDB;

ENGINE子句,使用ALTER TABLE重建表,即使在该表t1中原本已经制定了存储引擎,以上操作仍然生效。

CREATE DATABASE语法
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification [, create_specification] ...]

create_specification:
    [DEFAULT] CHARACTER SET charset_name
  | [DEFAULT] COLLATE collation_name

CREATE DATABASE用于创建数据库,并进行命名。如果要使用CREATE DATABASE,您需要获得数据库CREATE权限。

CREATE INDEX语法
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    [USING index_type]
    ON tbl_name (index_col_name,...)

index_col_name:
    col_name [(length)] [ASC | DESC]
CREATE INDEX被映射到一个ALTER TABLE语句上,用于创建索引。

FULLTEXT索引只能对CHARVARCHARTEXT类型数据编制索引,并且只能在MyISAM表中编制。SPATIAL索引只能对MyISAM表中的空间数据编制索引。

举例:

customer表中name列的前十个字符的索引part_of_name

CREATE INDEX part_of_name ON customer (name(10));

name列的索引速度。此外,使用列的前缀建立索引可以使得索引文件更小,这样可以节省大量的磁盘空间,还可以加速INSERT操作。

CREATE TABLE语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options] [select_statement]

or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(] LIKE old_tbl_name [)];

create_definition:
    column_definition
  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
  | KEY [index_name] [index_type] (index_col_name,...)
  | INDEX [index_name] [index_type] (index_col_name,...)
  | [CONSTRAINT [symbol]] UNIQUE [INDEX]
        [index_name] [index_type] (index_col_name,...)
  | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)
  | [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (index_col_name,...) [reference_definition]
  | CHECK (expr)

column_definition:
    col_name type [NOT NULL | NULL] [DEFAULT default_value]
        [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
        [COMMENT 'string'] [reference_definition]

type:
    TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  | INT[(length)] [UNSIGNED] [ZEROFILL]
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
  | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME
  | TIMESTAMP
  | DATETIME
  | CHAR(length) [BINARY | ASCII | UNICODE]
  | VARCHAR(length) [BINARY]
  | TINYBLOB
  | BLOB
  | MEDIUMBLOB
  | LONGBLOB
  | TINYTEXT [BINARY]
  | TEXT [BINARY]
  | MEDIUMTEXT [BINARY]
  | LONGTEXT [BINARY]
  | ENUM(value1,value2,value3,...)
  | SET(value1,value2,value3,...)
  | spatial_type

index_col_name:
    col_name [(length)] [ASC | DESC]

reference_definition:
    REFERENCES tbl_name [(index_col_name,...)]
               [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
               [ON DELETE reference_option]
               [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

table_options: table_option [table_option] ...

table_option:
    {ENGINE|TYPE} = engine_name
  | AUTO_INCREMENT = value
  | AVG_ROW_LENGTH = value
  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
  | CHECKSUM = {0 | 1}
  | COMMENT = 'string'
  | CONNECTION = 'connect_string'
  | MAX_ROWS = value
  | MIN_ROWS = value
  | PACK_KEYS = {0 | 1 | DEFAULT}
  | PASSWORD = 'string'
  | DELAY_KEY_WRITE = {0 | 1}
  | ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
  | UNION = (tbl_name[,tbl_name]...)
  | INSERT_METHOD = { NO | FIRST | LAST }
  | DATA DIRECTORY = 'absolute path to directory'
  | INDEX DIRECTORY = 'absolute path to directory'

partition_options:
    PARTITION BY
           [LINEAR] HASH(expr)
        |  [LINEAR] KEY(column_list)
        |  RANGE(expr)
        |  LIST(column_list)
    [PARTITIONS num]
    [  SUBPARTITION BY
           [LINEAR] HASH(expr)
         | [LINEAR] KEY(column_list)
      [SUBPARTITIONS(num)]
    ]
    [(partition_definition), [(partition_definition)], ...]

partition_definition:
    PARTITION partition_name
        [VALUES {
                  LESS THAN (expr) | MAXVALUE
                | IN (value_list) }]
        [[STORAGE] ENGINE [=] engine-name]
        [COMMENT [=] 'comment_text' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] (tablespace_name)]
        [NODEGROUP [=] node_group_id]
        [(subpartition_definition), [(subpartition_definition)], ...]

subpartition_definition:
    SUBPARTITION logical_name
        [[STORAGE] ENGINE [=] engine-name]
        [COMMENT [=] 'comment_text' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] (tablespace_name)]
        [NODEGROUP [=] node_group_id]

select_statement:
    [IGNORE | REPLACE] [AS] SELECT ...   (Some legal select statement)

CREATE TABLE用于创建带给定名称的表。前提是您必须拥有表CREATE的权限。

举个复制表的例子:

orig_tb1已经被定义好的基础上使用语句CREATE TABLE ... LIKE去创建一个含有相应列属性和索引相同的另外一个空表new_tb1

CREATE TABLE new_tbl LIKE orig_tbl;

那么,完全克隆一个表的内容以及结构就可以使用如下语句:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;
DROP DATABASE语法
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

DROP DATABASE用于丢弃数据库中的所有表格并删除数据库。使用此语句时要非常小心!如果要使用DROP DATABASE,您需要获得数据库DROP权限。IF EXISTS用于防止当数据库不存在时发生错误。DROP DATABASE,则链接和原数据库都被丢弃。DROP DATABASE会返回已被丢弃表的数目。此数目相当于被丢弃的.frm文件的数目。

DROP INDEX语法
DROP INDEX index_name ON tbl_name

DROP INDEX用于从表tbl_name中取消名称为index_name的索引。本语句如果被映射到一个ALTER TABLE语句中,就是用于取消索引。

举例:

t上的主键,刚好索引名就是PRIMARY,这时应该给索引名指定引号标识符,因为PRIMARY是一个保留字:

DROP INDEX `PRIMARY` ON t;
DROP TABLE语法
DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]

DROP TABLE用于移除一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被移除,所以使用本语句要小心!注意:对于一个带分区的表,DROP TABLE会永久性地移除表定义,移除各分区,并移除储存在这些分区中的所有数据。DROP TABLE还会移除与被移除表有关联的分区定义(.par)文件。IF EXISTS用于防止错误发生。当使用IF EXISTS时,对于每个不存在的表,会生成一个NOTE

RENAME TABLE语法
RENAME TABLE tbl_name TO new_tbl_name
    [, tbl_name2 TO new_tbl_name2] ...

本语句用于对一个或多个表进行重命名。

注意:你不能直接使用RENAME给一个TEMPORARY类型的表重命名。但是你可以添加ALTER TABLE语句实现orig_name的重命名:

mysql> ALTER TABLE orig_name RENAME new_name;

2.2 数据操作语句

DELETE语法

单表语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

多表语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*] ...]
    FROM table_references
    [WHERE where_definition]

or:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*] ...]
    USING table_references
    [WHERE where_definition]

tbl_name中有些行满足由where_definition给定的条件,那么DELETE就会删除这些行,并返回被删除的记录的数目。DELETE语句中没有WHERE子句,则所有的行都被删除。当您不想知道被删除的行的数目时,有一个更快的方法,即使用TRUNCATE TABLE

举例:

DELETE语句中含有ORDER BY子句,则按照子句中指定的顺序删除行,再结合LIMIT语句会显得非常有优势。somelog中匹配WHERE子句条件的所有行,并根据timestamp_column这一列数据进行排序,然后删除第一(最老的)行:

mysql> DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
DO语法
DO expr [, expr] ...

DO用于执行表达式,但是不返回任何结果。DOSELECT expr的简化表达方式。DO有一个优势,就是如果您不太关心结果的话,DO的速度稍快。 DO主要用于执行有副作用的函数,比如RELEASE_LOCK()

举例:

SELECT有停止的作用,但是也产生了一个结果集:

mysql> SELECT SLEEP(5);

DO语句的神奇:

mysql> DO SLEEP(5);

以上例子适用于禁止产生结果集的存储函数或触发器。

HANDLER语法
HANDLER tbl_name OPEN [ AS alias ]
HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE

HANDLER语句提供通往表存储引擎接口的直接通道。HANDLER可以用于MyISAMInnoDB表。HANDLER...OPEN语句用于打开一个表,通过后续的HANDLER...READ语句建立读取表的通道。本表目标不会被其它线程共享,也不会关闭,直到线程调用HANDLER...CLOSE或线程中止时为止。如果您使用一个别名打开表,如果要使用其它HANDLER语句进一步参阅表则必须使用此别名,而不能使用表名。

INSERT语法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

or:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

or:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

INSERT用于向一个已有的表中插入新行。INSERT...VALUESINSERT...SET形式的语句根据明确指定的值插入行。INSERT...SELECT形式的语句插入从其它表中选出的行。

举例:

INSERT语句可以使用VALUES语法插入多行数据。要想实现这一点,每一列的值列表必须用括号括起来,并使用逗号隔开。例如:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
LOAD DATA INFILE语法
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char' ]
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...)]

LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为文字字符串类型。

举例:

persondata.txt中加载数据到表persondata中:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
REPLACE语法
REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...

或:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...

或:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...

REPLACE的运行模式与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。

SELECT语法
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr, ...
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name']
    [FROM table_references
    [WHERE where_definition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_definition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC] , ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [FOR UPDATE | LOCK IN SHARE MODE]]

SELECT用于从一个或多个表中恢复选择的行,也可以用于在不检索任何表的情况下计算。

例如:

mysql> SELECT 1 + 1;

DUAL为一个虚拟的表名:

mysql> SELECT 1 + 1 FROM DUAL;

1) JOIN语法

JOIN语法。这些语法用于SELECT语句的table_references部分和多表DELETEUPDATE语句:

table_references:
    table_reference [, table_reference] …

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [[AS] alias]
        [{USE|IGNORE|FORCE} INDEX (key_list)]
  | ( table_references )
  | { OJ table_reference LEFT OUTER JOIN table_reference
        ON conditional_expr }

join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON condition
  | table_reference LEFT [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
  | table_reference RIGHT [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor

join_condition:
    ON conditional_expr
  | USING (column_list)

table_factor的语法被扩展了,前者只接受table_reference,不接受括号内的table_reference列表。2) UNION语法

SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]

UNION用于把来自多个SELECT语句的结果组合到一个结果集中。

举例:

SELECT列的数据类型不匹配,那么在UNION中列的类型和长度应该考虑所有的SELECT语句的返回值。比如:

mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);

SELECT语句被重复写入输出集;

思考一下,为什么?并把答案写入到实验报告。

UPDATE语法

单表语法:

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

多表语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]

UPDATE语法可以将新值更新到原有表中的行和列。SET子句指示要修改哪些列和要给予哪些值。WHERE子句指定应更新哪些行。如果没有WHERE子句,则更新所有的行。如果指定了ORDER BY子句,则按照被指定的顺序对行进行更新。LIMIT子句用于给定一个限值,限制可以被更新的行的数目。

例子:

t中的id列有12这两个值,并且在2被更新到3之前,1会被更新为2,那么就会出错。为了避免这个问题,添加一个ORDER BY子句让拥有较大id值的行更早更新:

UPDATE t SET id = id + 1 ORDER BY id DESC;

2.3 MySQL实用工具语法

DESCRIBE语法(获取有关列的信息)
{DESCRIBE | DESC} tbl_name [col_name | wild]

DESCRIBE可以提供有关表中各列的信息。它是SHOW COLUMNS FROM的快捷方式。

USE语法
USE db_name

USE db_name语句可以通告MySQL把db_name数据库作为默认(当前)数据库使用,用于后续的语句。

2.4 MySQL事务处理和锁定语句

START TRANSACTION,COMMIT和ROLLBACK语法
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

以下语句提供事务的使用控制:

START TRANSACTION

BEGIN

  • 语句可以开始一项新的事务。

COMMIT

  • 可以提交当前事务,使其永久更改。

ROLLBACK

  • 可以回滚当前事务,取消变更。

SET AUTOCOMMIT

  • 语句可以禁用或启用当前连接中默认的

autocommit

  • 模式,。

autocommit模式运行。这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中。InnoDBBDBNDB簇),则您可以使用以下语句禁用autocommit模式:

SET AUTOCOMMIT=0;

AUTOCOMMIT变量设置为零,禁用autocommit模式之后,您必须使用COMMIT把变更存储到磁盘中,或者如果您想要忽略从事务开始进行以来做出的变更,请使用ROLLBACKautocommit模式,则您可以使用START TRANSACTION语句:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

START TRANSACTIONautocommit仍然被禁用,直到您使用COMMITROLLBACK结束事务为止。然后autocommit模式恢复到原来的状态。BEGINBEGIN WORK被作为START TRANSACTION的别名受到支持,用于对事务进行初始化。START TRANSACTION是标准的SQL语法,并且是启动一个ad-hoc事务的推荐方法。BEGIN语句与BEGIN关键词的使用不同。BEGIN关键词可以启动一个BEGIN...END复合语句。后者不会开始一项事务。

您也可以按照如下方法开始一项事务:

START TRANSACTION WITH CONSISTENT SNAPSHOT;

WITH CONSISTENT SNAPSHOT子句用于启动一个一致的读取,用于具有此类功能的存储引擎。目前,该子句只适用于InnoDB,该子句的效果与发布一个START TRANSACTION,后面跟一个来自任何InnoDB表的SELECT的效果一样。UNLOCK TABLES被执行。

为了获得最好的结果,事务应只使用由单一事务存储引擎管理的表执行。否则,会出现以下问题:

  • 如果您使用的表来自多个事务安全型存储引擎(例如

InnoDB

  • ),并且事务隔离等级不是

SERIALIZABLE

  • ,则有可能当一个事务提交时,其它正在进行中的、使用同样的表的事务将只会发生由第一个事务产生的变更。也就是,用混合引擎不能保证事务的原子性,并会造成不一致。(如果混合引擎事务不经常有,则您可以根据需要使用

SET TRANSACTION ISOLATION LEVEL

  • 把隔离等级设置到

SERIALIZABLE

  • 。)
  • 如果您在事务中使用非事务安全型表,则对这些表的任何变更被立刻存储,不论

autocommit

  • 模式的状态如何。
  • 如果您在更新了事务中一个事务表之后,发布一个

ROLLBACK

  • 语句,则会出现一个

ER_WARNING_NOT_COMPLETE_ROLLBACK

  • 警告。对事务安全型表的变更会被回滚,但是非事务安全型表没有发生任何改变。

COMMIT之上。其中被回滚的事务不被计入日志。(例外情况:对非事务表的更改不会被回滚。如果一个被回滚的事务包括对非事务表的更改,则整个事务使用一个ROLLBACK语句计入日志末端,以确保对这些表的更改进行复制。)SET TRANSACTION ISOLATION LEVEL更改事务的隔离等级。

SAVEPOINT和ROLLBACK TO SAVEPOINT语法
SAVEPOINT identifier
ROLLBACK [WORK] TO SAVEPOINT identifier
RELEASE SAVEPOINT identifier

InnoDB支持SQL语句SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT和可选的用于ROLLBACKWORK关键词。SAVEPOINT语句用于用标识符名称设置命名一个事务保存点。如果当前事务有一个同样名称的保存点,则旧的保存点被删除,新的保存点就会被设置。ROLLBACK TO SAVEPOINT语句会向以命名的保存点回滚一个事务。如果在保存点被设置后,当前事务对行进行了更改,则这些更改会在回滚中被撤销。但是,InnoDB不会释放被存储在保存点之后的存储器中的行锁定。(注意,对于新插入的行,锁定信息被存储在行中的事务ID承载;锁定没有被分开存储在存储器中。在这种情况下,行锁定在撤销中被释放。)在被命名的保存点之后设置的保存点被删除。

如果语句返回以下错误,则意味着不存在带有指定名称的保存点:

ERROR 1181: Got error 153 during ROLLBACK

RELEASE SAVEPOINT语句会从当前事务的一组保存点中删除已命名的保存点,不出现提交或回滚。如果保存点不存在,会出现错误。COMMIT或执行不能命名保存点的ROLLBACK,则当前事务的所有保存点被删除。

LOCK TABLES和UNLOCK TABLES语法
LOCK TABLES
    tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
    [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...

LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。DROP TABLE

SET TRANSACTION语法
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

本语句用于设置事务隔离等级,用于下一个事务或者当前会话。

SET TRANSACTION会为下一个(还未开始)事务设置隔离等级。如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,用于从该点以后创建的所有新连接,且原有的连接不受影响。要进行此操作,您需要SUPER权限。使用SESSION关键词可以设置默认事务等级,用于对当前连接执行所有将来事务。

XA事务SQL语法

XA事务,应使用以下语句:

XA {START|BEGIN} xid [JOIN|RESUME]

XA END xid [SUSPEND [FOR MIGRATE]]

XA PREPARE xid

XA COMMIT xid [ONE PHASE]

XA ROLLBACK xid

XA RECOVER

XA STARTJOINRESUME子句不被支持。XA ENDSUSPEND [FOR MIGRATE]子句不被支持。XA语句以XA关键词为开头,多数语句要求一个xid值。xidXA事务的标识符,它指示该语句适用于哪个事务。xid值由客户端提供,或由MySQL服务器生成。xid值包含一到三个部分:

xid: gtrid [, bqual [, formatID ]]

gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个用于标识由gtridbqual值使用的格式的数字。根据语法,bqualformatID是可选的。如果没有给定,默认的bqual值是'',默认的fromatID值是1gtridbqual必须为字符串文字,每个的长度最多为64字节(不是字符)。gtridbqual可以用多种方法指定。您可以使用带引号的字符串('ab'),十六进制字符串(0x6162, X'ab'),或位值(b'nnnn')formatID是一个无符号的整数。

2.5 数据库管理语句

2.5.1 账户管理语句

1) CREATE USER语法

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
    [, user [IDENTIFIED BY [PASSWORD] 'password']] ...

CREATE USER用于创建新的MySQL账户。要使用CREATE USER,您必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。对于每个账户,CREATE USER会在mysql.user表中创建一个新记录。如果试图建立一个已经存在的账户,则会报错。IDENTIFIED BY子句,可以为账户给定一个密码。举例如下:sha256_password认证的插件和密码设置为'new-password'的账户'jeffrey'@'localhost',要求每隔180天建立一个新的密码:

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH sha256_password BY 'new-password'
  PASSWORD EXPIRE INTERVAL 180 DAY;

2) DROP USER语法

DROP USER user [, user] ...

DROP USER语句用于删除一个或多个MySQL账户。要使用DROP USER,您必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。3) GRANTREVOKE语法

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER 'cipher' [AND]]
        [ISSUER 'issuer' [AND]]
        [SUBJECT 'subject']]
    [WITH with_option [with_option] ...]

object_type =
    TABLE
  | FUNCTION
  | PROCEDURE

with_option =
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

GRANTREVOKE语句允许系统管理员创建MySQL用户账户,授予权限和撤销权限。4) RENAME USER语法

RENAME USER old_user TO new_user
    [, old_user TO new_user] ...

RENAME USER语句用于对原有MySQL账户进行重命名。要使用RENAME USER,您必须拥有全局CREATE USER权限或mysql数据库UPDATE权限。如果旧 账户不存在或者新账户已存在,则会出现错误。old_usernew_user值的给定方法与GRANT语句一样。

例如:

RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';

5) SET PASSWORD语法

SET PASSWORD = PASSWORD('some password');
SET PASSWORD FOR user = PASSWORD('some password');

SET PASSWORD语句用于向一个原有MySQL用户账户赋予密码。

第一个语法是为当前用户设置密码,其中使用一个非匿名账户连接到服务器上的任何客户即都可以更改该账户的密码。

UPDATE权限的客户端可以这么做。user值应以为固定格式user_name@host_name,此处user_namehost_namemysql.user表登录项的UserHost列中列出的完全一样。

2.5.2 表维护语句

1) ANALYZE TABLE语法

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

MyISAM, BDBInnoDB表进行锁定。对于MyISAM表,本语句与使用myisamchk --analyze相当。

当您对除常数以外的对象执行联合时,MySQL使用已存储的关键字分布来决定,表按什么顺序进行联合。

ANALYZE TABLE语句会返回一个含有下列的结果集:

2) CHECK TABLE语法

CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

CHECK TABLEMyISAMInnoDB表执行检查。对于MyISAM表,关键字统计数据在检查的同时也被更新。CHECK TABLE也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在。CHECK TABLE语句会返回一个含有以下列的结果集:

3) CHECKSUM TABLE语法

CHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED ]

报告表的校验和

4) OPTIMIZE TABLE语法

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

VARCHARBLOBTEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保存在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件碎片。OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,只对特定的表每周一次或每月一次执行该语句即可。5) REPAIR TABLE语法

REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE
    tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

REPAIR TABLE用于修复被破坏的表。默认情况下,REPAIR TABLEmyisamchk --recover tbl_name具有相同的效果。REPAIR TABLEMyISAMARCHIVE表起作用。REPAIR TABLE很有可能从MyISAM表中找回所有数据。如果您的表经常被破坏,您应该尽力找到原因,以避免使用REPAIR TALBE

本语句会返回一个含有以下列的结果集:


SET语法
SET variable_assignment [, variable_assignment] ...

variable_assignment:
      user_var_name = expr
    | [GLOBAL | SESSION] system_var_name = expr
    | @@[global. | session.]system_var_name = expr

SET用于设置不同类型的变量,这些变量会影响服务器或客户端的操作。SET可以用于向用户变量或系统变量赋值。

SHOW语法

1) SHOW CHARACTER SET语法

SHOW CHARACTER SET [LIKE 'pattern'];

SHOW CHARACTER SET语句用于显示所有可用的字符集。如果选定LIKE子句,该子句用于指定哪些字符集名称可以匹配。2) SHOW COLLATION语法

SHOW COLLATION [LIKE 'pattern'];

SHOW COLLATION语句输出所有可用的字符集。该语句如果设置可选LIKE子句,那么pattern将指定哪些归类名可以匹配。3) SHOW COLUMNS语法

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern'];

SHOW COLUMNS显示在一个给定表中的各列的信息。对于视图,本语句也起作用。4) SHOW CREATE DATABASE语法

SHOW CREATE {DATABASE | SCHEMA} db_name;

CREATE DATABASE语句创建的给定数据库。也可以使用SHOW CREATE SCHEMA。5) SHOW CREATE TABLE语法

SHOW CREATE TABLE tbl_name;

CREATE TABLE语句创建的给定表格。本语句对视图也起作用。6) SHOW DATABASES语法

SHOW {DATABASES | SCHEMAS} [LIKE 'pattern'];

SHOW DATABASES可以列举在MySQL服务器主机上的所有数据库。您也可以使用mysqlshow命令得到此数据库清单。您只能看到您拥有的权限可以允许看到的的数据库,除非您拥有全局SHOW DATABASES权限。--skip-show-database选项方式启动,那么您根本不能使用本语句,除非您拥有SHOW DATABASES权限。7) SHOW ENGINE语法

SHOW ENGINE engine_name {LOGS | STATUS };

SHOW ENGINE显示存储引擎的日志或状态信息。8) SHOW ENGINES语法

SHOW [STORAGE] ENGINES;

SHOW ENGINES显示存储引擎的状态信息。对于检查一个存储引擎是否被支持,或者对于查看默认引擎是什么,本语句十分有用。9) SHOW ERRORS语法

SHOW ERRORS [LIMIT [offset,] row_count];
SHOW COUNT(*) ERRORS;

SHOW WARNINGS接近,不过该语句只显示错误,并不同时显示错误、警告和注意信息。10) SHOW GRANTS语法

SHOW GRANTS FOR user;

GRANT语句。11) SHOW INDEX语法

SHOW INDEX FROM tbl_name [FROM db_name];

SHOW INDEX会返回表索引信息。其格式与ODBC中的SQLStatistics调用相似。12) SHOW INNODB STATUS语法

SHOW INNODB STATUS;

SHOW ENGINE INNODB STATUS,但不赞成使用后者。13) SHOW LOGS语法

SHOW [BDB] LOGS;

14) SHOW OPEN TABLES语法

SHOW OPEN TABLES [FROM db_name] [LIKE 'pattern'];

SHOW OPEN TABLES列举当前在表缓存中被打开的非TEMPORARY表。15) SHOW PRIVILEGES语法

SHOW PRIVILEGES;

SHOW PRIVILEGES显示MySQL服务器支持的系统权限列表。确切的输出内容需要根据您的服务器的版本而定。16) SHOW PROCESSLIST语法

SHOW [FULL] PROCESSLIST;

SHOW PROCESSLIST显示正在运行的线程。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程,否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。17) SHOW STATUS语法

SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern'];

SHOW STATUS提供服务器状态信息。此信息也可以使用mysqladmin extended-status命令获得。18) SHOW TABLE STATUS语法

SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'];

SHOW TABLE STATUS的性质与SHOW TABLE的类似;不过,可以提供每个表的大量信息。您也可以使用mysqlshow --status db_name命令得到此信息列表。本语句也显示视图信息。19) SHOW TABLES语法

SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern'];

SHOW TABLES列举了给定数据库中的非TEMPORARY表。您也可以使用mysqlshow db_name命令得到此列表。FULL修改符,这样SHOW FULL TABLES就可以显示到第二个输出列。对于一个表,第二列的值为BASE TABLE;对于一个视图,第二列的值为VIEW。注释:如果您对一个表没有权限,则该表不会在来自SHOW TABLESmysqlshow db_name命令的输出中显示。20) SHOW TRIGGERS语法

SHOW TRIGGERS [FROM db_name] [LIKE expr];

SHOW TRIGGERS列出了目前被MySQL服务器定义的触发程序。

2.5.5 其他管理语句

1) CACHE INDEX语法

CACHE INDEX
  tbl_index_list [, tbl_index_list] ...
  IN key_cache_name

tbl_index_list:
  tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]

CACHE INDEX语句把表索引分配给某个关键缓存。该语句只用于MyISAM表。2) FLUSH语法

FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ...

FLUSH语句。要执行FLUSH,您必须拥有RELOAD权限。3) KILL语法

KILL [CONNECTION | QUERY] thread_id;

mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止其中一个线程。KILL允许可选参数CONNECTIONQUERY修改符:KILL CONNECTION

  • 与不含修改符的

KILL

  • 一样:它会终止与给定的

thread_id

  • 有关的连接。

KILL QUERY

  • 会终止当前与正在执行的语句的连接,但是会保持连接的原状。

PROCESS权限,则您可以查看所有线程。如果您拥有SUPER权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。mysqladmin processlistmysqladmin kill命令来检查和终止线程。4) LOAD INDEX INTO CACHE语法

LOAD INDEX INTO CACHE
  tbl_index_list [, tbl_index_list] ...

tbl_index_list:
  tbl_name
    [[INDEX|KEY] (index_name[, index_name] ...)]
    [IGNORE LEAVES]

LOAD INDEX INTO CACHE语句会把一个表索引预载入到某个关键缓存中。5) RESET语法

RESET reset_option [, reset_option] ...

RESET语句被用于清除不同的服务器操作的状态。它也作为FLUSH语句的更强大的版本。RESET,您必须拥有RELOAD权限。reset_option可以为以下的任何一项:MASTER

  • 可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。(在以前版本的MySQL中,被称为

FLUSH MASTER

  • 。)

QUERY CACHESLAVE

  • 可以使从属服务器忘记其在主服务器二进制日志中的复制位置,另外,也可以通过删除原有的中继日志文件和开始一个新文件来重新设置中继日志。

2.6 复制语句

2.6.1 用于控制主服务器的SQL语句

1) PURGE MASTER LOGS语法

PURGE {MASTER | BINARY} LOGS TO 'log_name';
PURGE {MASTER | BINARY} LOGS BEFORE 'date';

首先介绍什么是二进制日志。二进制日志是一组记录MySQL服务器进行数据修改时的信息文件;该日志由一组二进制文件和索引文件组成。

PURGE MASTER LOGS语法就是用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些被删除的日志文件也会被移出索引文件的记录列表,以致指定的日志文件被排在日志列表首部。2) RESET MASTER语法

RESET MASTER;

可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。

3) SET SQL_LOG_BIN语法

SET SQL_LOG_BIN = {0|1};

SUPER权限的账户连接,则可以禁用或启用当前连接的二进制日志记录。如果客户端没有此权限,则语句被拒绝,并伴随错误提示。4) SHOW BINLOG EVENTS语法

SHOW BINLOG EVENTS
   [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

'log_name',则显示第一个二进制日志。5) SHOW MASTER LOGS语法

SHOW MASTER LOGS;
SHOW BINARY LOGS;

用于列出服务器中的二进制日志文件。

6) SHOW MASTER STATUS语法

SHOW MASTER STATUS;

SUPER或者REPLICATION CLIENT权限才能执行该语句。7) SHOW SLAVE HOSTS语法

SHOW SLAVE HOSTS;

--report-host=slave_name选项为开头的从属服务器不会显示在本清单中。

2.5.2 用于控制从服务器的SQL语句

1) CHANGE MASTER TO语法

CHANGE MASTER TO master_def [, master_def] ...

master_def:
      MASTER_HOST = 'host_name'
    | MASTER_USER = 'user_name'
    | MASTER_PASSWORD = 'password'
    | MASTER_PORT = port_num
    | MASTER_CONNECT_RETRY = count
    | MASTER_LOG_FILE = 'master_log_name'
    | MASTER_LOG_POS = master_log_pos
    | RELAY_LOG_FILE = 'relay_log_name'
    | RELAY_LOG_POS = relay_log_pos
    | MASTER_SSL = {0|1}
    | MASTER_SSL_CA = 'ca_file_name'
    | MASTER_SSL_CAPATH = 'ca_directory_name'
    | MASTER_SSL_CERT = 'cert_file_name'
    | MASTER_SSL_KEY = 'key_file_name'
    | MASTER_SSL_CIPHER = 'cipher_list'

可以更改从属服务器用于与主服务器进行连接和通讯的参数。

MASTER_USER, MASTER_PASSWORD,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH, MASTER_SSL_CERT,MASTER_SSL_KEY和MASTER_SSL_CIPHER这些参数用于向从属服务器提供有关如何与主服务器连接的信息。 即使对于在编译时没有SSL支持的从属服务器,SSL选项(MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY和MASTER_SSL_CIPHER)也可以被更改。它们被保存到master.info文件中,但是会被忽略,直到您使用SSL支持已启用的服务器。2) MASTER_POS_WAIT()语法

SELECT MASTER_POS_WAIT('master_log_file', master_log_pos);

该语法实际上是一个函数,而不是一个语句。它被用于确认从属服务器已读取并执行最后到达主服务器上二进制日志的给定位置。

RESET SLAVE语法

RESET SLAVE;

master.inforelay-log.info文件,以及所有的中继日志,并启动一个新的中继日志。注释:所有的中继日志被删除,即使它们没有被从属服务器SQL线程完全的执行。(如果您已经发布了一个STOP SLAVE语句或如果从属服务器的载入量很大,那么以上情况将会发生在从属服务器上。)master.info文件中的连接信息通过使用在对应的启动选项中指定的值,被立即重新设置了。此信息包括主服务器主机、主服务器接口、主服务器用户和主服务器密码等值。当从属服务器SQL线程被中止时,它位于正在复制的临时表的中,当发布RESET SLAVE语句时,已被复制的临时表在从属服务器中被删除。4) SET GLOBAL SQL_SLAVE_SKIP_COUNTER语法

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n;

n个事件,一般有效作用于当复制被某个语句终止的时候还原。

仅当从属线程没有正在运行时,本语句是有效的,否则会产生错误。

5) START SLAVE语法

START SLAVE [thread_type [, thread_type] ... ]

START SLAVE [SQL_THREAD] UNTIL
    MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos

START SLAVE [SQL_THREAD] UNTIL
    RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos

thread_type: IO_THREAD | SQL_THREAD

START SLAVE会同时启动两个从属服务器线程。I/O线程从主服务器中读取查询事件,并把它们存储在中继日志中,SQL线程读取中继日志并执行查询。START SLAVE语句要求SUPER权限。6) STOP SLAVE语法

STOP SLAVE [thread_type [, thread_type] ... ]

thread_type: IO_THREAD | SQL_THREAD

STOP SLAVE的执行要求具有SUPER权限。START SLAVE相似,本语句在使用时可以添加IO_THREADSQL_THREAD选项,指明将被中止的线程。SLAVE STOP,在MySQL 5.1中仍然接受这种用法,以便与以前版本兼容,但是现在不赞成使用该语句。

2.7 用于预处理语句的SQL语法

预处理语句的SQL语法基于以下三个SQL语句:

PREPARE stmt_name FROM preparable_stmt;
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;

PREPARE语句用于准备一个语句,并赋予它一个名称stmt_name,借此在以后引用该语句。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。如果是文本,那么必须展现一个单一的SQL语句,而不是多个语句。使用本语句,?字符可以被用于标记参数,以指示当您执行查询时,数据值在哪里与查询结合在一起。?字符不应加引号,即使您想要把它们与字符串值结合在一起,也不要加引号。参数标记符只能被用于数据值应该出现的地方,不用于SQL关键词和标识符等。

如果带有此名称的预备语句已经存在,则在新的语言被预备以前,它会被隐含地解除分配。这意味着,如果新语句包含一个错误并且不能被预备,则会返回一个错误,并且不存在带有给定名称语句。

预备语句用于客户端内部会话:

  • 在此会话内,如果语句被创建,那么其它客户端看不到它。
  • 在预备了一个语句后,您可使用一个

EXECUTE

  • 语句(该语句引用了预制语句名称)来执行它。如果预制语句包含任何参数标记符,则您必须提供一个列举了用户变量(其中包含要与参数结合的值)的

USING

  • 子句。参数值只能由用户变量提供,

USING

  • 子句必须准确地指明用户变量。用户变量的数目与语句中的参数标记符的数量一样多。
  • 您可以多次执行一个给定的预制语句,在每次执行前,把不同的变量传递给它,或把变量设置为不同的值。

DEALLOCATE PREPARE语句。尝试在解除分配后执行一个预制语句会导致错误。

如果您终止了一个客户端会话,同时没有对以前已预制的语句解除分配,则服务器会自动解除分配。

CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE和多数的SHOW语句。目前不支持其它语句。