精华内容
下载资源
问答
  • MySQL - SQL语句语法(数据定义语句)

    千次阅读 2008-05-01 00:17:00
    数据定义语句 1.ALTER DATABASE语法 2. ALTER TABLE语法 3. CREATE DATABASE语法 4. CREATE INDEX语法 5. CREATE TABLE语法 6. DROP DATABASE语法 7. DROP INDEX语法 8. DROP TABLE语法 9. RENAME TA

     数据定义语句

    1. ALTER DATABASE语法
    ALTER {DATABASE | SCHEMA} [db_name]
        alter_specification [, alter_specification] ...
    
    alter_specification:
        [DEFAULT] CHARACTER SET charset_name
      | [DEFAULT] COLLATE collation_name
    

    ALTER DATABASE用于更改数据库的全局特性。这些特性储存在数据库目录中的db.opt文件中。要使用ALTER DATABASE,您需要获得数据库ALTER权限。

    CHARACTER SET子句用于更改默认的数据库字符集。COLLATE子句用于更改默认的数据库整序。数据库名称可以忽略,此时,语句对应于默认数据库。也可以使用ALTER SCHEMA。

    2. 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修改,选项有ENGINE, AUTO_INCREMENT和AVG_ROW_LENGTH等。请见13.1.5节,“CREATE TABLE语法”

    存储引擎不支持有些操作,如果进行这些操作,会出现警告。使用SHOW WARNINGS可以显示出这些警告。请参见13.5.4.22节,“SHOW WARNINGS语法”

    如果您使用ALTER TABLE更改列规约,但是DESCRIBE tbl_name提示您列规约并没有改变,则可能是因为MySQL忽略了您所做的更改。忽略更改的原因见13.1.5.1节,“沉寂的列规格变更”。例如,如果您试图把VARCHAR列更改为CHAR列,此时,如果表包含其它长度可变的列,则MySQL仍会使用VARCHAR。

    ALTER TABLE运行时会对原表进行临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。在执行ALTER TABLE时,其它用户可以阅读原表,但是对表的更新和修改的操作将被延迟,直到新表生成为止。新表生成后,这些更新和修改信息会自动转移到新表上。

    注意,如果您在执行ALTER TABLE时使用除了RENAME以外的选项,则MySQL会创建一个临时表。即使数据并不需要进行复制(例如当您更改列的名称时),MySQL也会这么操作。对于MyISAM表,您可以通过把myisam_sort_buffer_size系统变量设置到一个较高的值,来加快重新创建索引(该操作是变更过程中速度最慢的一部分)的速度。

    ·         要使用ALTER TABLE,您需要获得表的ALTER, INSERT和CREATE权限。

    ·         IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTER TABLE的运行。如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。并且,对错误值进行修正,使之尽量接近正确值。

    ·         您可以在一个ALTER TABLE语句里写入多个ADD, ALTER, DROP和CHANGE子句,中间用逗号分开。这是MySQL相对于标准SQL的扩展。在标准SQL中,每个ALTER TABLE语句中每个子句只允许使用一次。例如,在一个语句中取消多个列:

    ·                mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;

    ·         CHANGE col_name, DROP col_name和DROP INDEX是MySQL相对于标准SQL的扩展。

    ·         MODIFY是Oracle对ALTER TABLE的扩展。

    ·         COLUMN只是自选项目,可以忽略。

    ·         如果您使用ALTER TABLE tbl_name RENAME TO new_tbl_name并且没有其它选项,则MySQL只对与table tbl_name相对应的文件进行重命名。不需要创建一个临时表。(您也可以使用RENAME TABLE语句对表进行重命名。请参见13.1.9节,“RENAME TABLE语法”。)

    ·         column_definition子句使用与CREATE TABLE中的ADD和CHANGE子句相同的语法。注意,此语法包括列名称,而不只是列类型。请参见13.1.5节,“CREATE TABLE语法”

    ·         您可以使用CHANGE old_col_name column_definition子句对列进行重命名。重命名时,需给定旧的和新的列名称和列当前的类型。例如:要把一个INTEGER列的名称从a变更到b,您需要如下操作:

    ·                mysql> ALTER TABLE t1 CHANGE a b INTEGER;

    如果您想要更改列的类型而不是名称, CHANGE语法仍然要求旧的和新的列名称,即使旧的和新的列名称是一样的。例如:

    mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

    您也可以使用MODIFY来改变列的类型,此时不需要重命名:

    mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

    ·         如果您使用CHANGE或MODITY缩短列长时,列中存在有索引,并且缩短后的列长小于索引长度,则MySQL会自动缩短索引的长度。

    ·         当您使用CHANGE或MODIFY更改列的类型时,MySQL会尽量把原有的列值转化为新的类型。

    ·         您可以使用FIRST或AFTER col_name在一个表行中的某个特定位置添加列。默认把列添加到最后。您也可以在CHANGE或MODIFY语句中使用FIRST和AFTER。

    ·         AFTER COLUMN用于指定列的新默认值,或删除旧的默认值。如果旧的默认值被删除同时列值为NULL,则新的默认值为NULL。如果列值不能为NULL,MySQL会指定一个默认值,请参见13.1.5节,“CREATE TABLE语法”

    ·         DROP INDEX用于取消索引。这是MySQL相对于标准SQL的扩展。请参见13.1.7节,“DROP INDEX语法”

    ·         如果列从表中被取消了,则这些列也从相应的索引中被取消。如果组成一个索引的所有列均被取消,则该索引也被取消。

    ·         如果一个表只包含一列,则此列不能被取消。如果您想要取消表,应使用DROP TABLE。

    ·         DROP PRIMAY DEY用于取消主索引。注释:在MySQL较早的版本中,如果没有主索引,则DROP PRIMARY KEY会取消表中的第一个UNIQUE索引。在MySQL 5.1中不会出现这种情况。如果在MySQL 5.1中对没有主键的表使用DROP PRIMARY KEY,则会出现错误信息。

    如果您向表中添加UNIQUE KEY或PRIMARY KEY,则UNIQUE KEY或PRIMARY KEY会被储存在非唯一索引之前,这样MySQL就可以尽早地检查出重复关键字。

    ·         ORDER BY用于在创建新表时,让各行按一定的顺序排列。注意,在插入和删除后,表不会仍保持此顺序。当您知道多数情况下您会按照特定的顺序查询各行时,可以使用这个选项;在对表进行了大的改动后,通过使用此选项,您可以提高查询效率。在有些情况下,如果表按列排序,对于MySQL来说,排序可能会更简单。

    ·         如果您对一个MyISAM表使用ALTER TABLE,则所有非唯一索引会被创建到一个单独的批里(和REPAIR TABLE相同)。当您有许多索引时,这样做可以使ALTER TABLE的速度更快。

    这项功能可以明确激活。ALTER TABLE...DISABLE KEYS让MySQL停止更新MyISAM表中的非唯一索引。然后使用ALTER TABLE ... ENABLE KEYS重新创建丢失的索引。进行此操作时,MySQL采用一种特殊的算法,比一个接一个地插入关键字要快很多。因此,在进行成批插入操作前先使关键字禁用可以大大地加快速度。使用ALTER TABLE ... DISABLE KEYS除了需要获得以前提到的权限以外,还需要获得INDEX权限。

    ·         Innodb存储引擎支持FOREIGN KEY和REFERENCES子句。Innodb存储引擎执行ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...)。请参见15.2.6.4节,“FOREIGN KEY约束”。对于其它存储引擎,这些子句会被分析,但是会被忽略。对于所有的存储引擎,CHECK子句会被分析,但是会被忽略。请参见13.1.5节,“CREATE TABLE语法”。接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序,创建带参考数据的表。请参见1.8.5节,“MySQL与标准SQL的差别”

    ·         InnoDB支持使用ALTER TABLE来取消外键:

    ·                ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;

    要了解更多信息,请参见15.2.6.4节,“FOREIGN KEY约束”

    ·         ALTER TABLE忽略DATA DIRECTORY和INDEX DIRECTORY表选项。

    ·         如果您想要把表默认的字符集和所有字符列(CHAR, VARCHAR, TEXT)改为新的字符集,应使用如下语句:

    ·                ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

    警告:前面的操作转换了字符集之间的列类型。如果您有一列使用一种字符集(如latin1),但是存储的值实际上使用了其它的字符集(如utf8),这种情况不是您想要的。此时,您必须对这样的列进行以下操作。

    ALTER TABLE t1 CHANGE c1 c1 BLOB;
    ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

    这种方法能够实现此功能的原因是,当您转换到BLOB列或从BLOB列转换过来时,并没有发生转换。

    如果您指定CONVERT TO CHARACTER SET为二进制,则TEXT列被转换到相应的二进制字符串类型(BINARY, VARBINARY, BLOB)。这意味着这些列将不再有字符集,接下来的CONVERT TO操作也将不适用于这些列。

    要仅仅改变一个表的默认字符集,应使用此语句:

    ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;

    词语DEFAULT为自选项。如果您在向表中添加一个新列时(例如,使用ALTER TABLE...ADD column)没有指定字符集,则此时使用的字符集为默认字符集。

    警告:ALTER TABLE...DEFAULT CHARACTER SET和ALTER TABLE...CHARACTER SET是等价的,只用于更改默认的表字符集。

    ·         如果InnoDB表在创建时,使用了.ibd文件中的自己的表空间,则这样的文件可以被删除和导入。使用此语句删除.ibd文件:

    ·                ALTER TABLE tbl_name DISCARD TABLESPACE;

    此语句用于删除当前的.ibd文件,所以应首先确认您有一个备份。如果在表空间被删除后尝试打开表格,则会出现错误。

    要把备份的.ibd文件还原到表中,需把此文件复制到数据库目录中,然后书写此语句:

    ALTER TABLE tbl_name IMPORT TABLESPACE;

    15.2.6.6节,“使用按表的表空间”

    ·         使用mysql_info() C API函数,您可以了解有多少记录已被复制,以及(当使用IGNORE时)有多少记录由于重复关键字的原因已被删除。请参见25.2.3.34节,“mysql_info()”

    ·         ALTER TABLE也可以用于对带分区的表进行重新分区,功能包括添加、取消、合并和拆分各分区,还可以用于进行分区维护。

    对带分区的表使用partition_options子句和ALTER TABLE可以对表进行重新分区,使用时依据partition_options定义的分区方法。本子句以PARTITION BY为开头,然后使用与用于CREATE TABLE的partition_options子句一样的语法和规则(要了解详细信息,请参见13.1.5节,“CREATE TABLE语法”)。注释:MySQL 5.1服务器目前接受此语法,但是不实际执行;等MySQL 5.1开发出来后,将执行此语法。

    用于ALTER TABLE ADD PARTITION的partition_definition子句支持用于CREATE TABLE语句的partition_definition子句的同样名称的选项。(要了解语法和介绍,请参见13.1.5节,“CREATE TABLE语法”。)例如,假设您有一个按照以下方式创建的带分区的表:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999)
    );    

    您可以在表中增加一个新的分区p3,该分区用于储存小于2002的值。添加方法如下:

    ALTER TABLE t1 ADD PARTITION p3 VALUES LESS THAN (2002);

    注释:您不能使用ALTER TABLE向一个没有进行分区的表添加分区。

    DROP PARTITION用于取消一个或多个RANGE或LIST分区。此命令不能用于HASH或KEY 分区;用于这两个分区时,应使用COALESCE PARTITION(见后)。如果被取消的分区其名称列于partition_names清单中,则储存在此分区中的数据也被取消。例如,如果以前已定义的表t1,您可以采用如下方法取消名称为p0和p1的分区:

    ALTER TABLE DROP PARTITION p0, p1;

    ADD PARTITION和DROP PARTITION目前不支持IF [NOT] EXISTS。也不可能对一个分区或一个已分区的表进行重命名。如果您希望对一个分区进行重命名,您必须取消分区,再重新建立;如果您希望对一个已分区的表进行重新命名,您必须取消所有分区,然后对表进行重命名,再添加被取消的分区。

    COALESCE PARTITION可以用于使用HASH或KEY进行分区的表,以便使用number来减少分区的数目。例如,假设您使用下列方法创建了表t2:

    CREATE TABLE t2 (
        name VARCHAR (30),
        started DATE
    )
    PARTITION BY HASH(YEAR(started))
    PARTITIONS (6);

    您可以使用以下命令,把t2使用的分区的数目由6个减少到4个:

    ALTER TABLE t2 COALESCE PARTITION 2;

    包含在最后一个number分区中的数据将被合并到其余的分区中。在此情况下,分区4和分区5将被合并到前4个分区中(编号为0、1、2和3的分区)。

    如果要更改部分分区,但不更改所有的分区,您可以使用REORGANIZE PARTITION。这个命令有多种使用方法:

    o        把多个分区合并为一个分区。通过把多个分区的名称列入partition_names清单,并为partition_definition提供一个单一的定义,可以实现这个功能。

    o        把一个原有的分区拆分为多个分区。通过为partition_names命名一个分区,并提供多个partition_definitions,可以实现这个功能。

    o        更改使用VALUES LESS THAN定义的分区子集的范围或更改使用VALUES IN定义的分区子集的值清单。

    注释:对于没有明确命名的分区,MySQL会自动提供默认名称p0, p1, p2等。

    要了解有关ALTER TALBE...REORANIZE PARTITION命令的详细信息,请参见18.3节,“分区管理”

    ·         多个附加子句用于提供分区维护和修补功能。这些功能与用于非分区表的功能类似。这些功能由CHECK TABLE和REPAIR TABLE等命令(这些命令不支持用于分区表)执行。这些子句包括ANALYZE PARTITION, CHECK PARTITION, OPTIMIZE PARTITION, REBUILD PARTITION和REPAIR PARTITION.每个选项均为一个partition_names子句,包括一个或多个分区名称。需要更改的表中必须已存在这些分区。多个分区名称用逗号分隔。要了解更多信息,或要了解举例说明,请参见18.3.3节,“分区维护”

    以下例子展示了ALTER TABLE的使用。首先展示表t1。表t1采用如下方法创建:

    mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));

    把表t1重新命名为t2:

    mysql> ALTER TABLE t1 RENAME t2;

    把列a从INTERGER更改为TINYINT NOT NULL(名称保持不变),并把列b从CHAR(10)更改为CHAR(20),同时把列b重新命名为列c:

    mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

    添加一个新的TIMESTAMP列,名称为d:

    mysql> ALTER TABLE t2 ADD d TIMESTAMP;

    在列d和列a中添加索引:

    mysql> ALTER TABLE t2 ADD INDEX (d), ADD INDEX (a);

    删除列c:

    mysql> ALTER TABLE t2 DROP COLUMN c;

    添加一个新的AUTO_INCREMENT整数列,名称为c:

    mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
        ->     ADD PRIMARY KEY (c);

    注意我们为c编制了索引(作为PRIMARY KEY),因为AUTO_INCREMENT列必须编制索引。同时我们定义c为NOT NULL,因为主键列不能为NULL。

    当您添加一个AUTO_INCREMENT列时,列值被自动地按序号填入。对于MyISAM表,您可以在ALTER TABLE之前执行SET INSERT_ID=value来设置第一个序号,也可以使用AUTO_INCREMENT=value表选项来设置。请参见13.5.3节,“SET语法”

    如果值大于AUTO_INCREMENT列中的最大值,则您可以使用用于InnoDB表的ALTER TALBE...AUTO_INCREMENT=value表选项,来为新行设置序号。如果值小于列中当前的最大值,不会出现错误信息,当前的序列值也不改变。

    使用MyISAM表时,如果您不更改AUTO_INCREMENT列,则序列号不受影响。如果您取消一个AUTO_INCREMENT列,然后添加另一个AUTO_INCREMENT列,则序号重新排列,从1开始。

    A.7.1节,“与ALTER TABLE有关的问题”

    13.1.3. 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权限。

    有关合法数据库名称的规定列于9.2节,“数据库、表、索引、列和别名”。如果存在数据库,并且您没有指定IF NOT EXISTS,则会出现错误。

    create_specification选项用于指定数据库的特性。数据库特性储存在数据库目录中的db.opt文件中。CHARACTER SET子句用于指定默认的数据库字符集。COLLATE子句用于指定默认的数据库整序。字符集和整序名称在第10章字符集支持中讨论。

    有些目录包含文件,这些文件与数据库中的表对应。MySQL中的数据库的执行方法与这些目录的执行方法相同。因为当数据库刚刚被创建时,在数据库中没有表,所以CREATE DATABASE只创建一个目录。这个目录位于MySQL数据目录和db.opt文件之下。

    如果您手动在数据目录之下创建一个目录(例如,使用mkdir),则服务器会认为这是一个数据库目录,并在SHOW DATABASES的输出中显示出来。

    也可以使用CREATE SCHEMA。

    您还可以使用mysqladmin程序创建数据库。请参见8.5节,“mysqladmin:用于管理MySQL服务器的客户端”

    13.1.4. 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语句上,用于创建索引。请参见13.1.2节,“ALTER TABLE语法”

    通常,当使用CREATE TABLE创建表时,也同时在表中创建了所有的索引。请参见13.1.5节,“CREATE TABLE语法”。CREATE INDEX允许您向已有的表中添加索引。

    格式为(col1, col2,...)的一个列清单创建出一个多列索引。通过串接给定列中的值,确定索引值的格式。

    对于CHAR和VARCHAR列,只用一列的一部分就可创建索引。创建索引时,使用col_name(length)语法,对前缀编制索引。前缀包括每列值的前length个字符。BLOB和TEXT列也可以编制索引,但是必须给出前缀长度。

    此处展示的语句用于创建一个索引,索引使用列名称的前10个字符。

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

    因为多数名称的前10个字符通常不同,所以此索引不会比使用列的全名创建的索引速度慢很多。另外,使用列的一部分创建索引可以使索引文件大大减小,从而节省了大量的磁盘空间,有可能提高INSERT操作的速度。

    前缀最长为255字节。对于MyISAM和InnoDB表,前缀最长为1000字节。注意前缀的限长以字节计,而CREATE INDEX语句中的前缀长度指的是字符的数目。对于使用多字节字符集的列,在指定列的前缀长度时,要考虑这一点。

    在MySQL 5.1中:

    ·         只有当您正在使用MyISAM, InnoDB或BDB表类型时,您可以向有NULL值的列中添加索引。

    ·         只有当您正在使用MyISAM, BDB或InnoDB表类型时,您可以向BLOB或TEXT列中添加索引。

    一个index_col_name规约可以以ASC或DESC为结尾。这些关键词将来可以扩展,用于指定递增或递减索引值存储。目前,这些关键词被分析,但是被忽略;索引值均以递增顺序存储。

    部分储存引擎允许在创建索引时指定索引类型。index_type指定语句的语法是USING type_name。不同的储存引擎所支持的type_name值已显示在下表中。如果列有多个索引类型,当没有指定index_type时,第一个类型是默认值。

    存储引擎

    允许的索引类型

    MyISAM

    BTREE

    InnoDB

    BTREE

    MEMORY/HEAP

    HASH, BTREE

    示例:

    CREATE TABLE lookup (id INT) ENGINE = MEMORY;
    CREATE INDEX id_index USING BTREE ON lookup (id);

    TYPE type_name可以作为USING type_name的同义词,用于指定索引类型。但是,USING是首选的格式。另外,在索引规约语法中,位于索引类型前面的索引名称不能使用TYPE。这是因为,与USING不同,TYPE不是保留词,因此会被认为是一个索引名称。

    如果您指定的索引类型在给定的储存引擎中不合法,但是有其它的索引类型适合引擎使用,并且不会影响查询功能,则引擎应使用此类型。

    要了解更多有关MySQL如何使用索引的信息,请参见7.4.5节,“MySQL如何使用索引”

    FULLTEXT索引只能对CHAR, VARCHAR和TEXT列编制索引,并且只能在MyISAM表中编制。请参见12.7节,“全文搜索功能”

    SPATIAL索引只能对空间列编制索引,并且只能在MyISAM表中编制。空间列类型在第19章:MySQL中的空间扩展中进行了描述。

    13.1.5. CREATE TABLE语法

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

    或:

    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权限。

    允许的表名称的规则列于9.2节,“数据库、表、索引、列和别名”中。默认的情况是,表被创建到当前的数据库中。如果表已存在,或者如果没有当前数据库,或者如果数据库不存在,则会出现错误。

    表名称被指定为db_name.tbl_name,以便在特定的数据库中创建表。不论是否有当前数据库,都可以通过这种方式创建表。如果您使用加引号的识别名,则应对数据库和表名称分别加引号。例如,`mydb`.`mytbl`是合法的,但是`mydb.mytbl`不合法。

    在创建表格时,您可以使用TEMPORARY关键词。只有在当前连接情况下,TEMPORARY表才是可见的。当连接关闭时,TEMPORARY表被自动取消。这意味着两个不同的连接可以使用相同的临时表名称,同时两个临时表不会互相冲突,也不与原有的同名的非临时表冲突。(原有的表被隐藏,直到临时表被取消时为止。)您必须拥有CREATE TEMPORARY TABLES权限,才能创建临时表。

    如果表已存在,则使用关键词IF NOT EXISTS可以防止发生错误。注意,原有表的结构与CREATE TABLE语句中表示的表的结构是否相同,这一点没有验证。注释:如果您在CREATE TABLE...SELECT语句中使用IF NOT EXISTS,则不论表是否已存在,由SELECT部分选择的记录都会被插入。

    MySQL通过数据库目录中的.frm表格式(定义)文件表示每个表。表的存储引擎也可能会创建其它文件。对于MyISAM表,存储引擎可以创建数据和索引文件。因此,对于每个MyISAM表tbl_name,有三个磁盘文件:

    文件

    作用

    tbl_name.frm

    表格式(定义)文件

    tbl_name.MYD

    数据文件

    tbl_name.MYI

    索引文件

    用于表示表的由存储引擎创建的文件在第15章:存储引擎和表类型中描述。

    要了解有关各种列类型的性质的一般说明,请参见第11章:列类型。要了解有关空间列类型的说明,请参见第19章:MySQL中的空间扩展

    ·         如果没有指定是NULL或是NOT NULL,则列在创建时假定指定为NULL。

    ·         一个整数列可以拥有一个附加属性AUTO_INCREMENT。当您向一个已编入索引的AUTO_INCREMENT列中插入一个NULL值(建议)或0时,此列被设置为下一个序列的值。通常情况下为value+1,此处value是当前在表中的列的最大值。AUTO_INCREMENT序列从1开始。这样的列必须被定义为一种整数类型,请参见11.1.1节,“数值类型概述”中的叙述。(值1.0不是整数)。请参见25.2.3.36节,“mysql_insert_id()”

    为--sql-mode服务器选项或sql_mode系统变量指定NO_AUTO_VALUE_ON_ZERO特征位,这样可以把0存储到AUTO_INCREMENT列中,同时不生成一个新的序列值。请参见5.3.1节,“mysqld命令行选项”

    注释:有时候,每个表只有一个AUTO_INCREMENT列,此列必须编制索引,不能有DEFAULT值。一个AUTO_INCREMENT列只有在只包含正数的情况下,才能运行正常。插入一个负数会被认为是插入了一个非常大的正数。这样做是为了避免当数字由正数转为负数时出现精度问题,同时也为了确保AUTO_INCREMENT列中不会包含0。

    对于MyISAM和BDB表,您可以在一个多列关键字中指定一个AUTO_INCREMENT次级列。请参见3.6.9节,“使用AUTO_INCREMENT”

    为了让MySQL与部分ODBC应用软件相兼容,您可以使用以下查询方法找到最后一个插入行的AUTO_INCREMENT值:

    SELECT * FROM tbl_name WHERE auto_col IS NULL

    ·         字符列的定义可以包括一个CHARACTER SET属性,用来指定字符集,也可以指定列的整序。要了解详细情况,请参见第10章:字符集支持。CHARSET是CHARACTER SET的同义词。

    ·                CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);

    MySQL 5.1理解,在字符列定义中的长度规约以字符为单位。(有些早期版本以字节为单位。)

    ·         DEFAULT子句用于为列指定一个默认值。默认值必须为一个常数,不能为一个函数或一个表达式,有一种情况例外。例如,一个日期列的默认值不能被设置为一个函数,如NOW()或CURRENT_DATE。不过,有一种例外,您可以对TIMESTAMP列指定CURRENT_TIMESTAMP为默认值。请参见11.3.1.1节,“MySQL 4.1中的TIMESTAMP属性”

    BLOB和TEXT列不能被赋予默认值。

    如果在列定义中没有明确的DEFAULT值,则MySQL按照如下规则确定默认值:

    如果列可以使用NULL作为值,则使用DEFAULT NULL子句对列进行定义。(在MySQL的早期版本中也如此。)

    如果列不能使用NULL作为值,则MySQL对列进行定义时不使用DEFAULT子句。输入数据时,如果INSERT或REPLACE语句不包括列的值,则MySQL依据当时的有效的SQL模式操作列:

    o        如果严格模式没有被启用,则MySQL会根据列数据类型,把列设置为明确的默认值。

    o        如果严格模式已被启用,则事务表会出现错误,语句被回滚。对于非事务表,会出现错误,不过,如果错误出现在一个多行语句中的第二行或后续行,则以前的各行将被插入。

    假设表t按下面的方法进行定义:

    CREATE TABLE t (i INT NOT NULL);

    在这种情况下,i没有明确的默认值,所以在严格模式中,每个后续语句都会产生一个错误,并且没有行被插入。当未使用严格模式时,只有第三个语句产生错误;明确的默认值被插入到前两个语句中,但是第三个语句会出现错误,因为DEFAULT(i)不会产生一个值:

    INSERT INTO t VALUES();
    INSERT INTO t VALUES(DEFAULT);
    INSERT INTO t VALUES(DEFAULT(i));

    5.3.2节,“SQL服务器模式”

    对于一个给定的表,您可以使用SHOW CREATE TABLE语句来查看那些列有明确的DEFAULT子句。

    ·         对于列的评注可以使用COMMENT选项来进行指定。评注通过SHOW CREATE TABLE和SHOW FULL COLUMNS语句显示。

    ·         属性SERIAL可以用作BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的别名。

    ·         KEY通常是INDEX同义词。如果关键字属性PRIMARY KEY在列定义中已给定,则PRIMARY KEY也可以只指定为KEY。这么做的目的是与其它数据库系统兼容。

    ·         在UNIQUE索引中,所有的值必须互不相同。如果您在添加新行时使用的关键字与原有行的关键字相同,则会出现错误。例外情况是,如果索引中的一个列允许包含NULL值,则此列可以包含多个NULL值。此例外情况不适用于BDB表。在BDB中,带索引的列只允许一个单一NULL。

    ·         PRIMARY KEY是一个唯一KEY,此时,所有的关键字列必须定义为NOT NULL。如果这些列没有被明确地定义为NOT NULL,MySQL应隐含地定义这些列。一个表只有一个PRIMARY KEY。如果您没有PRIMARY KEY并且一个应用程序要求在表中使用PRIMARY KEY,则MySQL返回第一个UNIQUE索引,此索引没有作为PRIMARY KEY的NULL列。

    ·         在已创建的表中,PRIMARY KEY的位置最靠前,然后是所有的UNIQUE索引,然后是非唯一索引。这可以帮助MySQL优化程序选择优先使用哪个索引,并且更快速的检测出重复的UNIQUE关键字。

    ·         PRIMARY KEY可以是一个多列索引。但是,在列规约中使用PRIMARY KEY关键字属性无法创建多列索引。这么做只能把一个列标记为主列。您必须使用一个单独的PRIMARY KEY(index_col_name, ...)子句。

    ·         如果PRIMARY KEY或UNIQUE索引只包括一个列,并且此列为整数类型,则您也可以在SELECT语句中把此列作为_rowid引用。

    ·         在MySQL中,PRIMARY KEY的名称为PRIMARY。对于其它索引,如果您没有赋予名称,则索引被赋予的名称与第一个已编入索引的列的名称相同,并自选添加后缀(_2, _3,...),使名称为唯一名称。您可以使用SHOW INDEX FROM tbl_name来查看表的索引名称。请参见13.5.4.11节,“SHOW INDEX语法”

    ·         部分存储引擎允许您在创建索引时指定索引类型。index_type指示语句的语法是USING type_name。

    示例:

    CREATE TABLE lookup
      (id INT, INDEX USING BTREE (id))
      ENGINE = MEMORY;

    要了解有关USING的详细说明,请参见13.1.4节,“CREATE INDEX语法”

    要了解有关MySQL如何使用索引的更多信息,请参见7.4.5节,“MySQL如何使用索引”

    ·         在MySQL 5.1中,只有MyISAM,InnoDB, BDB和MEMORY存储引擎支持在含有NULL值的列中编索引。在其它情况下,您必须定义已编索引的列为NOT NULL,否则会出现错误。

    ·         在一个索引规约中使用col_name(length)语法,您可以创建一个索引,此索引只使用一个CHAR或VARCHAR列的第一个length字符。只对列值的前缀编制索引可以使索引文件大大减小。请参见7.4.3节,“列索引”

    MyISAM和InnoDB存储引擎也支持对BLOB和TEXT列编索引。当对BLOB或TEXT列编索引时,您必须为索引指定一个前缀长度。例如:

    CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));

    对于MyISAM和InnoDB表,前缀最长可以为1000字节,对于其它表格类型,最长可以为255字节。注意前缀长度限值以字节为单位,而在CREATE TABLE语句中的前缀长度用字符数目来表述。当为一个使用多字节字符集的列指定前缀长度时,一定要考虑到这一点。

    ·         一个index_col_name规约可以以ASC或DESC结尾。这些关键词可以在将来进行扩展,用于指定升序或降序的索引值存储。当前,这些关键词被分析但是被忽略;索引值均以升序储存。

    ·         当您在SELECT中的TEXT列或BLOB列中使用ORDER BY或GROUP BY时,服务器只使用初始的字节数目对值进行分类。字节数目由max_sort_length系统变量进行指示。请参见11.4.3节,“BLOB和TEXT类型

    ·         您可以创建特殊的FULLTEXT索引,用于全文搜索。只有MyISAM表类型支持FULLTEXT索引。FULLTEXT索引只可以从CHAR, VARCHAR和TEXT列中创建。整个列都会被编入索引;不支持对部分列编索引。如果已指定,前缀长度会被忽略。要了解运行的详细说明,请参见12.7节,“全文搜索功能”

    ·         您可以为空间列类型创建SPATIAL索引。只有MyISAM表支持空间类型,已编索引的列必须声明为NOT NULL。请参见第19章:MySQL中的空间扩展

    ·         InnoDB表支持对外键限制条件进行检查。请参见15.2节,“InnoDB存储引擎”。注意,在InnoDB中,FOREIGN KEY语法比本节开始时介绍的CREATE TABLE语句的语法更严格:被引用的表中的列必须有明确的命名。InnoDB支持外键的ON DELETE和ON UPDATE两种操作。有关精确语法的说明,请参见15.2.6.4节,“FOREIGN KEY约束”

    对于其它存储引擎,MySQL服务器对CREATE TABLE语句中的FOREIGN KEY和REFERENCES语法进行分析,但不采取进一步的行动。所有的存储引擎均对CHECK子句进行分析,但是忽略CHECK子句。请参见1.8.5.5节,“外键”

    ·         对于MyISAM表,每个NULL列要多占用一位,进位到距离最近的字节。最大记录长度(以字节为单位)按照如下方法计算:

    ·                row length = 1
    ·                             + (sum of column lengths)
    ·                             + (number of NULL columns + delete_flag + 7)/8
    ·                             + (number of variable-length columns)

    对于采用静态记录格式的表,delete_flag为1。静态表在行记录中使用一位用作位标记。位标记指示该行是否已被删除。对于动态表,delete_flag为0,因为在动态行标题中已存储了位标记。

    这些计算方法不适用于InnoDB表。对于InnoDB表,NULL列的存储量与NOT NULL列的存储量没有区别。

    ENGINE和TYPE选项用于为表指定存储引擎。ENGINE是首选的选项名称。

    ENGINE和TYPE选项采用以下值:

    存储引擎

    说明

    ARCHIVE

    档案存储引擎。请参见15.8节,“ARCHIVE存储引擎”

    BDB

    带页面锁定的事务安全表。也称为BerkeleyDB。请参见15.5节,“BDB (BerkeleyDB)存储引擎”

    CSV

    值之间用逗号隔开的表。请参见15.9节,“CSV存储引擎

    EXAMPLE

    示例引擎。请参见15.6节,“EXAMPLE存储引擎”

    FEDERATED

    可以访问远程表的存储引擎。请参见15.7节,“FEDERATED存储引擎”

    HEAP

    15.4节,“MEMORY (HEAP)存储引擎”

    (OBSOLETE) ISAM

    在MySQL 5.1中没有此引擎。如果您要从以前的版本升级到MySQL 5.1,您应该在进行升级前把原有的ISAM表转换为MyISAM表。请参见第15章:存储引擎和表类型

    InnoDB

    带行锁定和外键的事务安全表。请参见15.2节,“InnoDB存储引擎”

    MEMORY

    本表类型的数据只保存在存储器里。(在早期MySQL版本中被称为HEAP。)

    MERGE

    MyISAM表的集合,作为一个表使用。也称为MRG_MyISAM。请参见15.3节,“MERGE存储引擎”

    MyISAM

    二进制轻便式存储引擎,此引擎是MySQL所用的默认存储引擎。请参见15.1节,“MyISAM存储引擎”

    NDBCLUSTER

    成簇表,容错表,以存储器为基础的表。也称为NDB。请参见第17章:MySQL簇

    要了解有关MySQL存储引擎的更多信息,请参见第15章:存储引擎和表类型

    如果被指定的存储引擎无法利用,则MySQL使用MyISAM代替。例如,一个表定义包括ENGINE=BDB选项,但是MySQL服务器不支持BDB表,则表被创建为MyISAM表。这样,如果您在主机上有事务表,但在从属机上创建的是非交互式表(以加快速度)时,可以进行复制设置。在MySQL 5.1中,如果没有遵守存储引擎规约,则会出现警告。

    其它表选项用于优化表的性质。在多数情况下,您不必指定表选项。这些选项适用于所有存储引擎,另有说明除外:

    ·         AUTO_INCREMENT

    表的初始AUTO_INCREMENT值。在MySQL 5.1中,本选项只适用于MyISAM和MEMORY表。InnoDB也支持本选项。如果引擎不支持AUTO_INCREMENT表选项,则要设置引擎的第一个auto-increment值,需插入一个“假”行。该行的值比创建表后的值小一,然后删除该假行。

    对于在CREATE TABLE语句中支持AUTO_INCREMENT表选项的引擎,您也可以使用ALTER TABLE tbl_name AUTO_INCREMENT = n来重新设置AUTO_INCREMENT值。

    ·         AVG_ROW_LENGTH

    表中平均行长度的近似值。只需要对含尺寸可变的记录的大型表进行此项设置。

    当创建一个MyISAM表时,MySQL使用MAX_ROWS和AVG_ROW_LENGTH选项的乘积来确定得出的表有多大。如果有一个选项未指定,则表的最大尺寸为65,536TB数据。(如果操作系统不支持这么大的文件,则表的尺寸被限定在操作系统的限值处。)如果您想缩小指针尺寸使索引更小,速度更快,并且您不需要大文件,则您可以通过设置myisam_data_pointer_size系统变量来减少默认指针的尺寸。(见5.3.3节,“服务器系统变量”。)如果您希望所有的表可以扩大,超过默认限值,并且愿意让表稍微慢点,并稍微大点,则您可以通过设置此变量增加默认指针的尺寸。

    ·         [DEFAULT] CHARACTER SET

    用于为表指定一个默认字符集。CHARSET是CHARACTER SET的同义词。

    对于CHARACTER SET.

    ·         COLLATE

    用于为表指定一个默认整序。

    ·         CHECKSUM

    如果您希望MySQL随时对所有行进行实时检验求和(也就是,表变更后,MySQL自动更新检验求和),则应把此项设置为1。这样做,表的更新速度会略微慢些,但是更容易寻找到受损的表。CHECKSUM TABLE语句用于报告检验求和(仅限于MyISAM)。

    ·         COMMENT

    表的注释,最长60个字符。

    ·         CONNECTION

    FEDERATED表的连接字符串。( 注释:较早版本的MySQL使用COMMENT选项用于连接字符串。

    ·         MAX_ROWS

    您打算储存在表中的行数目的最大值。这不是一个硬性限值,而更像一个指示语句,指示出表必须能存储至少这么多行。

    ·         MIN_ROWS

    您打算存储在表中的行数目的最小值。

    ·         PACK_KEYS

    如果您希望索引更小,则把此选项设置为1。这样做通常使更新速度变慢,同时阅读速度加快。把选项设置为0可以取消所有的关键字压缩。把此选项设置为DEFAULT时,存储引擎只压缩长的CHAR或VARCHAR列(仅限于MyISAM)。

    如果您不使用PACK_KEYS,则默认操作是只压缩字符串,但不压缩数字。如果您使用PACK_KEYS=1,则对数字也进行压缩。

    在对二进制数字关键字进行压缩时,MySQL采用前缀压缩:

    o        每个关键字需要一个额外的字节来指示前一个关键字中有多少字节与下一个关键字相同。

    o        指向行的指针以高位字节优先的顺序存储在关键字的后面,用于改进压缩效果。

    这意味着,如果两个连续行中有许多相同的关键字,则后续的“相同”的关键字通常只占用两个字节(包括指向行的指针)。与此相比,常规情况下,后续的关键字占用storage_size_for_key + pointer_size(指针尺寸通常为4)。但是,只有在许多数字相同的情况下,前缀压缩才有好处。如果所有的关键字完全不同,并且关键字不能含有NULL值,则每个关键字要多使用一个字节。(在这种情况中,储存压缩后的关键字的长度的字节与用于标记关键字是否为NULL的字节是同一字节。)

    ·         PASSWORD

    使用密码对.frm文件加密。在标准MySQL版本中,本选项不起任何作用。

    ·         DELAY_KEY_WRITE

    如果您想要延迟对关键字的更新,等到表关闭后再更新,则把此项设置为1(仅限于MyISAM)。

    ·         ROW_FORMAT

    定义各行应如何储存。当前,此选项只适用于MyISAM表。对于静态行或长度可变行,此选项值可以为FIXED或DYNAMIC。myisampack用于把类型设置为COMPRESSED。请参见15.1.3节,“MyISAM表的存储格式”

    在默认情况下,InnoDB记录以压缩格式存储(ROW_FORMAT=COMPACT)。通过指定ROW_FORMAT=REDUNDANT,仍然可以申请用于较早版本的MySQL中的非压缩格式。

    ·         RAID_TYPE

    在MySQL 5.0中,RAID支持被删除了。要了解有关RAID的说明,请参见http://dev.mysql.com/doc/refman/4.1/en/create-table.html

    ·         UNION

    当您想要把一组相同的表当作一个表使用时,采用UNION。UNION仅适用于MERGE表。请参见15.3节,“MERGE存储引擎”

    对于您映射到一个MERGE表上的表,您必须拥有SELECT, UPDATE和DELETE权限。(注释:以前,所有被使用的表必须位于同一个数据库中,并作为MERGE表。这些限制不再适用。)

    ·         INSERT_METHOD

    如果您希望在MERGE表中插入数据,您必须用INSERT_METHOD指定应插入行的表。INSERT_METHOD选项仅用于MERGE表。使用FIRST或LAST把行插入到第一个或最后一个表中;或者使用NO,阻止插入行。请参见15.3节,“MERGE存储引擎”

    ·         DATA DIRECTORY, INDEX DIRECTORY

    通过使用DATA DIRECTORY='directory'或INDEX DIRECTORY='directory',您可以指定MyISAM存储引擎放置表格数据文件和索引文件的位置。注意,目录应是通向目录的完整路径(不是相对路径)。

    仅当您没有使用--skip-symbolic-links选项时,DATA DIRECTORY, INDEX DIRECTORY才能使用。操作系统必须有一个正在工作的、线程安全的realpath()调用。要了解全面信息,请参见7.6.1.2节,“在Unix平台上使用表的符号链接”。

    ·         对于用CREATE TABLE创建的表,可以使用partition_options控制分区。如果使用了partition_options,则其中必须包含至少一个PARTITION BY子句。本子句包含用于确定分区的函数;该函数会返回一个整值,范围从1到num。此处num为分区的数目。此函数中可以使用的选项显示在下面的清单中。 要点:在本节开始时介绍的用于partition_options的语法中显示的选项,并不是都能用于所有分区类型。要了解各种类型具体的信息 ,请参见以下各类型的清单。要了解有关在MySQL中的分区的操作和使用情况的全面说明,以及要了解表创建的示例和与MySQL分区有关的其它命令,请参见第18章:分区

    o        HASH(expr):用于混编一个或多个列,创建一个关键字,用于放置行,并确定行的位置。expr是一个表达式,使用一个或多个表中的列。该表达式可以是任何能够生成单一整值的合法的MySQL表达式(包括MySQL函数)。例如,这些都是有效的CREATE TABLE语句,语句中使用了PARTITION BY HASH:

    o                     CREATE TABLE t1 (col1 INT, col2 CHAR(5)) 
    o                         PARTITION BY HASH(col1);
    o                      
    o                     CREATE TABLE t1 (col1 INT, col2 CHAR(5))
    o                         PARTITION BY HASH( ORD(col2) );
    o                      
    o                     CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATETIME)
    o                         PARTITION BY HASH ( YEAR(col3) );

    VALUES LESS THAN或VALUES IN子句不能和PARTITION BY HASH一起使用。

    PARTITION BY HASH使用expr被分区数目所除后的余数(也就是模数)。要了解示例和其它信息,请参见18.2.3节,“HASH分区”

    LENEAR关键词需要一种不同的算法。在这种情况下,通过一次或多次逻辑AND运算得出的结果,计算出存储记录的分区的数目。要了解线形混编的讨论和示例,请参见18.2.3.1节,“LINEAR HASH分区”

    o        KEY(column_list):与HASH近似,除了有一点不一样,即MySQL提供了混编函数,以保证均匀的数据分布。column_list自变量只是各列的一个清单。本示例显示了由关键字进行分区的一个简单的表,分为4个分区:

    o                     CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
    o                         PARTITION BY KEY(col3)
    o                         PARTITIONS 4;

    采用LINEAR关键词,您可以对由关键字分区的表进行线形分区。这与由HASH进行分区的表格有同样的效果;也就是说,使用&操作符查找分区数目,而不是使用模数(详细说明见18.2.3.1节,“LINEAR HASH分区”18.2.4节,“KEY分区”)。本示例采用了关键字线形分区,用来在5个分区之间分配数据:

    CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)
        PARTITION BY LINEAR KEY(col3)
        PARTITIONS 5;

    VALUES LESS THAN或VALUES IN子句不能和PARTITION BY KEY一起使用。

    o        RANGE:在此情况下,expr使用一套VALUES LESS THAN操作符显示了某一范围内的值。当使用范围分区时,您必须使用VALUES LESS THAN定义至少一个分区。VALUES IN不能和范围分区一起使用。

    VALUES LESS THAN可以与一个文字值同时使用,或者与一个可以求算单一值的表达式同时使用。

    举例说明,假设您有一个表,您希望采用以下方法对包含年份值的一列进行分区:

    分区编号:

    年份范围:

    0

    1990以前

    1

    1991 - 1994

    2

    1995 - 1998

    3

    1999 - 2002

    4

    2003 - 2005

    5

    2006年以后

    采用这种分区方法的表可以通过如下CREATE TABLE语句实现:

    CREATE TABLE t1 (
        year_col INT, 
        some_data INT 
    ) 
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2002),
        PARTITION p4 VALUES LESS THAN (2006),
        PARTITION p5 VALUES LESS THAN MAXVALUE
    );

    PARTITION ... VALUES LESS THAN ...语句按顺序执行。VALUES LESS THAN MAXVALUE的作用是指定大于最大值的“其余”的值。

    注意,VALUES LESS THAN子句按顺序执行,执行方式类似于switch ... case语段的一部分(许多编程语言,如C, Java和PHP也如此)。也就是说,子句必须按照这样一种方法排列,每一个后续的VALUES LESS THAN中指定的上限值大于前一个VALUES LESS THAN中指定的上限值,并在清单的最后加一个参照性的MAXVALUE。

    VALUES IN与一系列的值同时使用。举例说明,您可以创建如下的分区方法:

    CREATE TABLE client_firms (
        id INT,
        name VARCHAR(35)
    )
    PARTITION BY RANGE (id) (
        PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21),
        PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22),
        PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23),
        PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)
    );

    当前,与VALUES IN...同时使用的值必须只包含整数值。

    (因为此表只使用VALUES IN表达式进行分区,您也可以用PARTITION BY LIST代替,而不是使用PARTITION BY RANGE。请参见下一条。)

    在使用VALUES LESS THAN或VALUES IN情况下,每个分区使用PARTITION name定义,此处name是分区的标识名,后面接VALUES...子句。

    o        LIST(expr):当根据含有一系列限定性值(例如州代码或国家代码)的列进行分区时使用。在这种情况下,所有与特定的州或国家有关的记录都被分配到一个单一分区中,或者可以预留出一个分区,用于一系列特定的州或国家。LIST(expr)与RANGE类似,除了一点以外,即只有VALUES IN可以被用于为每个分区指定值。

    当使用清单分区时,您必须使用VALUES IN定义至少一个分区。VALUES LESS THAN不能与PARTITION BY LIST一起使用。

    o        分区数目可以使用PARTITION num子句,自选进行指定,此处,num是分区的数目。如果本子句和其它PARTITION子句同时使用,则num必须与使用PARTITION子句说明的分区的总数相等。

    注释:不论您在创建一个由RANGE或LIST进行分区的表时是否使用了PARTITIONS子句,您必须在表定义中包括至少一个PARTITION VALUES(见后)。

    o        一个分区可以自选分隔成多个子分区。使用自选的SUBPARTITION BY子句可以指示。子分区可以由HASH或KEY进行分隔。两种方法建立的子分区均为LINEAR。分隔子分区时的操作方式与以前描述的分区类型的操作方式一样。(无法由LIST或RANGE进行子分区分隔。)

    使用SUBPARTITIONS关键词,后面接一个整值,可以对子分区的数目进行指示。

    ·         使用一个partition_definition子句可以对每个分区分别进行定义。下面是组成这个子句的各个部分:

    o        PARTITION partition_name:用于为分区指定一个逻辑名称。

    o        VALUE子句:对于范围分区,每个分区必须包括一个VALUES LESS THAN子句;对于清单分区,您必须为每个分区指定一个VALUES IN子句。本子句用于确定哪些行将被存储到此分区中。要了解语法示例,请参见第18章:分区中对分区类型的讨论。

    o        自选的COMMENT子句可以用于描述分区。注释必须加单引号。举例说明:

    o                     COMMENT = 'Data for the years previous to 1999'

    o        DATA DIRECTORY和INDEX DIRECTORY可以被用于指示本分区的数据和索引各自的存储位置的目录。data_dirindex_dir都必须是绝对系统路径。例如:

    o                     CREATE TABLE th (id INT, name VARCHAR(30), adate DATE)
    o                     PARTITION BY LIST(YEAR(adate))
    o                     (
    o                         PARTITION p1999 VALUES IN (1995, 1999, 2003) DATA DIRECTORY = '/var/appdata/95/data' INDEX DIRECTORY = '/var/appdata/95/idx',
    o                         PARTITION p2000 VALUES IN (1996, 2000, 2004) DATA DIRECTORY = '/var/appdata/96/data' INDEX DIRECTORY = '/var/appdata/96/idx',
    o                         PARTITION p2001 VALUES IN (1997, 2001, 2005) DATA DIRECTORY = '/var/appdata/97/data' INDEX DIRECTORY = '/var/appdata/97/idx',
    o                         PARTITION p2000 VALUES IN (1998, 2002, 2006) DATA DIRECTORY = '/var/appdata/98/data' INDEX DIRECTORY = '/var/appdata/98/idx'
    );

    DATA DIRECTORY和INDEX DIRECTORY的操作方法与CREATE TABLE语句中的table_option子句的操作方法一样。此table_option子句用于位于MyISAM表管理程序下的各表。

    可以为每个分区指定一个数据目录和一个索引目录。如果不指定,则数据和索引被存储在默认的MySQL数据目录中。

    o        MAX_ROWS和MIN_ROWS分别用于将被存储在分区中的行数目最大值和行数目最小值。max_number_of_rowsmin_number_of_rows的值必须为正整数。和具有同样名称的桌面选项一样,max_number_of_rowsmin_number_of_rows只作为对服务器的“建议”值,并不是硬性限值。

    o        自选的TABLESPACE子句可以用于为分区指定一个桌面空间。仅用于MySQL Cluster。

    o        自选的[STORAGE] ENGINE子句可以把本分区中表的类型改为指定的类型。表的类型可以是本MySQL服务器支持的所有类型。STORAGE关键字和等号(=)均为自选项。如果没有使用此选项设置分区存储引擎,则适用于整个表的引擎可以用于此分区。

    注释:分区管理程序对于PARTITION和SUBPARTITION均接受[STORAGE] ENGINE选项。目前,此子句的使用方式仅限于对所有的分区或子分区设置同一个存储引擎,如果试图在同一个表内对不同的分区或子分区设置不同的存储引擎,则会出现错误ERROR 1469 (HY000):在本版本的MySQL中,不允许在各分区中混用管理程序。我们打算在将来的MySQL 5.1版本中加入这种对分区的限定。

    o        NODEGROUP选项可以用于使本分区可以作为节点组的一部分,节点组使用node_group_id识别。本选项仅适用于MySQL Cluster。

    o        分区定义可以自选地包含一个或多个subpartition_definition子句。每个这种子句至少包括SUBPARTITION name,此处,name是子分区的识别名称。除了用SUBPARTITION代替PARTITION关键词外,用于子分区定义的语法与用于分区定义的语法一样。

    子分区必须由HASH或KEY完成,并且只能对RANGE或LIST分区进行子分区。请参见18.2.5节,“子分区”

    ·         分区可以修改、合并、添加到表中,或从表中删去。要了解有关完成这些任务的MySQL命令的基本说明,请参见13.1.2节,“ALTER TABLE语法”。要了解详细的说明和示例,请参见18.3节,“分区管理”

    您可以在CREATE TABLE语句的末尾添加一个SELECT语句,在一个表的基础上创建表。

    CREATE TABLE new_tbl SELECT * FROM orig_tbl;

    MySQL会对SELECT中的所有项创建新列。举例说明:

    mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
        ->        PRIMARY KEY (a), KEY(b))
        ->        TYPE=MyISAM SELECT b,c FROM test2;

    本语句用于创建含三个列(a, b, c)的MyISAM表。注意,用SELECT语句创建的列附在表的右侧,而不是覆盖在表上。参考以下示例:

    mysql> SELECT * FROM foo;
    +---+
    | n |
    +---+
    | 1 |
    +---+
     
    mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
    Query OK, 1 row affected (0.02 sec)
    Records: 1  Duplicates: 0  Warnings: 0
     
    mysql> SELECT * FROM bar;
    +------+---+
    | m    | n |
    +------+---+
    | NULL | 1 |
    +------+---+
    1 row in set (0.00 sec)

    对应于表foo中的每一行,在表bar中插入一行,含有表foo中的值以及新列中的默认值。

    在由CREATE TABLE...SELECT生成的表中,只在CREATE TABLE部分中命名的列首先出现。在两个部分中都命名的列和只在SELECT部分中命名的列随后出现。也可以通过指定CREATE TABLE部分中的列覆盖SELECT列中的数据类型。

    如果在把数据复制到表中时出现错误,则表会自动被取消,不会被创建。

    CREATE TABLE...SELECT不会自动创建任何索引。索引需要专门创建,以便使语句的灵活性更强。如果您希望为已创建的表建立索引,您应在SELECT语句前指定索引。

    mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

    列的类型会发生部分转化。例如,AUTO_INCREAMENT属性不会被保留,VARCHAR列会变成CHAR列。

    当使用CREATE...SELECT创建表时,在查询时一定要对功能调用和表达式起别名。如果不起别名,则CREATE语句会出现错误或者生成不符合需要的列名称。

    CREATE TABLE artists_and_works
    SELECT artist.name, COUNT(work.artist_id) AS number_of_works
    FROM artist LEFT JOIN work ON artist.id = work.artist_id
    GROUP BY artist.id;

    您也可以明确地为一个已生成的列指定类型:

    CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;

    根据其它表的定义(包括在原表中定义的所有的列属性和索引),使用LIKE创建一个空表:

    CREATE TABLE new_tbl LIKE orig_tbl;

    CREATE TABLE...LIKE不会复制对原表或外键定义指定的DATA DIRECTORY或INDEX DIRECTORY表选项。

    您可以在SELECT前增加IGNORE或REPLACE,指示如何对复制唯一关键字值的记录进行操纵。使用IGNORE后,如果新记录复制了原有的唯一关键字值的记录,则新记录被丢弃。使用REPLACE后,新记录替换具有相同的唯一关键字值的记录。如果没有指定IGNORE或REPLACE,则出现多重唯一关键字值时会导致发生错误。

    为了确保更新日志/二进位日志可以被用于再次创建原表,MySQL不允许在CREATE TABLE...SELECT过程中进行联合插入。

    13.1.5.1. 沉寂的列规格变更

    在有些情况下,较早版本的MySQL会静默地更改在CREATE TABLE或ALTER TABLE语句中给定的列规约。在MySQL 5.1中不会进行这类变更。如果使用指定的数据类型无法创建列,则会出现错误。

    13.1.6. DROP DATABASE语法

    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

    DROP DATABASE用于取消数据库中的所用表格和取消数据库。使用此语句时要非常小心!如果要使用DROP DATABASE,您需要获得数据库DROP权限。

    IF EXISTS用于防止当数据库不存在时发生错误。

    也可以使用DROP SCHEMA。

    如果您对一个带有符号链接的数据库使用DROP DATABASE,则链接和原数据库都被取消。

    DROP DATABASE会返回已被取消的表的数目。此数目相当于被取消的.frm文件的数目。

    在正常操作中MySQL自身会创建出一些文件和目录。DROP DATABASE语句会从给定的数据库目录中取消这些文件和目录:

    ·         所有带这些扩展名的文件:

    .BAK

    .DAT

    .HSH

     

    .MRG

    .MYD

    .ISD

     

    .MYI

    .db

    .frm

     

    ·         名称中包含两位16进制数00-ff的所有子目录。这些子目录用于RAID表。(当对RAID表的支持被取消时,在MySQL 5.0中,这些目录不会被取消。您应该在升级到MySQL 5.0或更新的版本前转化原有的RAID表,并人工取消这些目录。请参见MySQL 5.0参考手册中有关从较早版本升级到MySQL 5.0的章节。MySQL 5.0参考手册可以从MySQL网站中获取。)

    ·         db.opt文件

    如果在MySQL取消了上述这些文件之后,在数据库目录中仍保留有其它文件和目录,则数据库目录不能被取消。在这种情况下,您必须人工取消所有保留下的文件或目录,并再次发送DROP DATABASE语句。

    您还可以使用mysqladmin来取消文件。请参见8.5节,“mysqladmin:用于管理MySQL服务器的客户端”

    13.1.7. DROP INDEX语法

    DROP INDEX index_name ON tbl_name

    DROP INDEX用于从表tbl_name中取消名称为index_name的索引。本语句被映射到一个ALTER TABLE语句中,用于取消索引。请参见13.1.2节,“ALTER TABLE语法”

    13.1.8. 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。请参见13.5.4.22节,“SHOW WARNINGS语法”

    RESTRICT和CASCADE可以使分区更容易。目前,RESTRICT和CASCADE不起作用。

    注释:除非您使用TEMPORARY关键词,DROP TABLE会自动提交当前的有效的事务。

    TEMPORARY关键词具有以下作用:

    ·         语句只取消TEMPORARY表。

    ·         语句不会终止正在进行中的事务。

    ·         不会查验存取权。(TEMPORARY表仅对于创建该表的客户端是可见的,所以查验是不必要的。)

    使用TEMPORARY是确保您不会意外取消一个非TEMPORARY表的良好方法。

    13.1.9. RENAME TABLE语法

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

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

    重命名操作自动进行,这意味着当重命名正在运行时,其它线程不能读取任何表。例如,如果您有一个原有的表old_table,您可以创建另一个具有相同结构的空表new_table,然后用此空表替换原有的表:

    CREATE TABLE new_table (...);
    RENAME TABLE old_table TO backup_table, new_table TO old_table;

    如果此语句用于对多个表进行重命名,则重命名操作从左至右进行。如果您想要交换两个表的名称,您可以这样做(假设不存在名称为tmp_table的表):

    RENAME TABLE old_table TO tmp_table,
                 new_table TO old_table,
                 tmp_table TO new_table;

    只要两个数据库位于同一文件系统中,您还可以对表进行重命名,把表从一个数据库中移动到另一个数据库中:

    RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

    当您执行RENAME时,您不能有被锁定的表,也不能有处于活性状态的事务。您还必须拥有原表的ALTER和DROP权限,以及新表的CREATE和INSERT权限。

    如果MySQL对多个表进行重命名时遇到了错误,MySQL会对所有已被重命名的表进行反向重命名,返回到原来的状态。

    只要您不尝试通过重命名把视图加入另一个数据库中,则RENAME TABLE也可以用于视图。

    展开全文
  • 【单选题】下列关于Python的说法,错误的是()。【多选题】使用积分表求不定积分常见的类型有哪些?【简答题】请举例说明分数的意义。【简答题】代码的人工审查要审查哪些主要内容?为什么需要对代码进行人工审查?(10分)...

    【单选题】下列关于Python的说法,错误的是()。

    【多选题】使用积分表求不定积分常见的类型有哪些?

    【简答题】请举例说明分数的意义。

    【简答题】代码的人工审查要审查哪些主要内容?为什么需要对代码进行人工审查?(10分) (10.0分)

    【填空题】Python可以在多种平台运行,这体现了Python语言的 特性。

    【判断题】变压器运行时将产生损耗,变压器的损耗分为铜耗和铁耗两类。每一类又包括基本损耗和杂散损耗。

    【简答题】简述IPython的特点。

    【多选题】变压器按用途分可分为下列哪几类?

    【判断题】Python可以开发Web呈连续,也可以管理操作系统。

    【填空题】Python源代码被解释器转换后的格式为 。

    【判断题】变压器的一次侧绕组接在电源上,二次侧绕组开路,此运行状态称为空载运行。

    【简答题】为以下程序段设计测试用例,要求分别满足语句覆盖,条件覆盖覆盖。(20分;语句5分,条件覆盖15分) if(x>=80&&y>=80) t=1; else if(x+y>=140&&(x>=90||y>=90)) t=2; else t=3; (20.0分)

    【简答题】简述Python的特点。

    【其它】编写一个Python程序,输出如下图形效果。 ++++++++++ + + ++++++++++

    【多选题】下列领域中,使用Python可以实现的是()。

    【判断题】代码print(3,4)是Python2.X的输出格式。

    【单选题】下列哪句话属于基本句型: 主语 + 及物动词 + 宾语 ( S + Vt+ O )

    【判断题】一次侧电流种增加了一个负载分量,以平衡二次侧电流的作用。

    【单选题】【 例 3】( 浙江省 2017 年高职考试题 ) 依次填入横线处的语句 , 衔接最恰当的一项是 对我们影响最大的书 , 往往是我们年轻时读的某一本书 , 它的力量多半不源于它自身 , 而源于它介入我们生活的那个时机。 。 1那是一个最容易受影响的年龄 , 我们好歹要崇拜一个什么人 , 如果没有 , 就崇拜一本什么书 2当然 , 同时它也是一个征兆 , 我们早期着迷的书 , 大致显示了我们的精神类型 , 预示了我们后来 精神生活的走向 3但我们不必惭愧 , 事实上 , 那是我们的精神初恋 , 而初恋对象不过是把我们引入精神世界的 个诱因罢了 4后来重读这本书 , 我们很可能会对它失望 , 并且诧异当初它何以使自己如此心醉神速

    【单选题】w我

    【简答题】【留言板 】【提交代码文件、数据库文件及录像】 (1) 数据库信息如下图所示。 (2) 实现PHP页面中对数据库进行增删查的操作,效果如视频 “BBS.wmv”。

    【简答题】请将下列程序补充完整,并将源代码和运行结果截图提交。 要求:从键盘输入任意实数,请输出其绝对值。 注意:完善源代码文档信息,并为程序添加必要的注释。 /* 文件名称:fabs.c * 作 者:张三 * 完成日期:2018年04月27日 * 版 本 号:v1.0 * 问题描述:从键盘输入任意一个实数,输出其绝对值。 * 输入描述:任意实数 * 输出结果:该实数的绝对值 * 算法设计: */ #include int main() { double x; //定义变量 scanf("%lf", &x); //输入实数 /***********请在下方将程序补充完整**********/ printf("%lf ", x); //输出绝对值 return 0; }

    【判断题】变压强的原、副边绕组都具有漏阻抗,负载电流流过漏阻抗,在变压器内部就引起电压降落,二次侧端电压随负载的变化而变化。

    【单选题】在下面所列举中的逻辑测试覆盖中,测试覆盖最强的是___ (5.0分)

    【单选题】【 例 1】 ( 浙江省 2015 年高职考试题 ) 根据语境在横线上依次填入的四个字 , 正确的一项是 “唐以前的诗是 1 出来的 , 唐诗是2出来的 , 宋诗是3出来的 , 宋以后的诗是 4 出来的。”这几句话 , 言简意腻 , 可谓是一部简明的中国诗歌史 , 这是讲唐代以前是中国诗歌的发期 , 自然天籁 , 朴抽浑成 ; 唐代是中国诗歌的黄金期 , 直抒胸臆 , 而又各具面目 , 宋代是中国诗歌的转整期 , 思辨机趣 , 融情入理 ; 宋代以后则是中国诗歌的繁盛期 , 流派繁多 , 然而缺乏原创。

    【单选题】关于白盒测试与黑盒测试的最主要区别,正确的是___ (5.0分)

    【判断题】Python3.X版本的代码完全兼容Python2.X。

    【简答题】用 Python2 语言完成实训任务中的任务 2 和任务 3 。 编写程序,将两个整数 a 和 b 合并成一个整数放到 c 里面,并打印出来。

    【简答题】有函数f(x,y,z),其中x∈[1900,2100],y∈[1,12],z∈[1,31]的。请写出该函数采用一般边界值分析法设计的测试用例?测试用例分别是什么?(10分) (10.0分)

    【单选题】有一组测试用例使得程序中每一个被测试判定的真假分支覆盖至少被执行一次,它满足的覆盖标准是___ (5.0分)

    【判断题】变压器的一次侧绕组接在电源上,二次测绕阻开路,此运行状态称为空载运行。

    【简答题】简述Python2.X和Python3.X的区别。

    【单选题】下列哪一句诗,不出自陶渊明的作品?()

    【单选题】软件缺陷修复的代价最高的阶段为__ (5.0分)

    【填空题】时间常数τ是表征________的常数。

    【单选题】根据波士顿矩阵分析,相对市场占有率高,市场成长率低的产品属于( )

    【单选题】【 例 2】( 浙江省 2016 年高职考试题 ) 在下列语段的空缺处 , 填入的内容最恰当的一项是( ) “ 江山万里一一张大千艺术展”今日与观众见面。展厅里 , 一幅 《 江山万里图 》 静静地面对着来来 往往的人流 。 “ ” , 其开阔的画面及意境 , 向人们展示着笔墨点染间的艺术魅力 , 也仿佛在诉说着画家眷恋故土的情怀。

    【简答题】什么是遗传密码的摆动性?

    【多选题】走查特点 (10.0分)

    【单选题】数字消息的特点是()。

    【多选题】下面那些是黑盒测试用例设计方法? (10.0分)

    【多选题】审查的特点 (10.0分)

    【简答题】遗传密码的基本特征?

    【判断题】社会责任是指企业等组织向社会做出的无偿服务和贡献。

    【填空题】《春晓》 春眠不觉晓,处处闻( )。 夜来( )声,花落知多少。

    【单选题】___ 属于黑盒测试的方法? (5.0分)

    【单选题】下列关于IPython的说法,错误的是()。

    【填空题】Python3.X默认使用的编码是 。

    【简答题】简述Python程序的执行原理。

    【填空题】电路从一种稳态到________所经历的过程称为暂态过程。

    展开全文
  • SQL命令和常用语句大全

    千次阅读 2016-05-22 21:41:32
    学习SQL应知道的动态SQL语句基本语法 1 、普通SQL语句可以用Exec执行 9Kp=A ' CdaFr1 eg: Select * from tableName Wsc+A: Exec('select * from tableName') #Btn( Exec sp_executesql N'select * from ...

    学习SQL应知道的动态SQL语句基本语法

    1 、普通SQL语句可以用Exec执行 9Kp=A  
    ' CdaFr1  
    eg: Select * from tableName Wsc+A:<" 
    Exec('select * from tableName') #Btn(  
    Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N %BfplhE1a  
    AN&)OIDc  
    2、字段名,表名,数据库名之类作为变量时,必须用动态SQL H2k3./


    Ip  
    :=r|8#8a  
    eg: }"|M#
     MB  
    declare @fname varchar(20)
    WH$1[Gv7  
    set @fname = 'FiledName' @#D[C;VvrE  
    Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 J!_C^,7#  
    Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 \Adve]kD$5  
    w/r‑;'
    \>  
    当然将字符串改成变量的形式也可 :? Gf%y  
    declare @fname varchar(20) r~j >XK3  
    set @fname = 'FiledName' --设置字段名 !
    i9mD!G  
    w( IfnsP  
    declare @s varchar(1000) 7A _?mu  
    set @s = 'select ' + @fname + ' from tableName' ezCY_T9m‑  
    Exec(@s) -- 成功 ‑W=Q!_X$  
    exec sp_executesql @s -- 此句会报错 vOwTKUb  
    By4-}_T+A  
    2#sv-v6oH  
    declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) "A^
    !?U
    OE  
    set @s = 'select ' + @fname + ' from tableName' (/Hv6n3Z&  
    Exec(@s) -- 成功 ix9 ­Hh{  
    exec sp_executesql @s -- 此句正确 ]7UXt*w  

    LBf0at0  
    3、输出参数 "kz/7 E\/A  
    % +>n<O  
    declare @num int, - ]n;kS1S  
    @sqls nvarchar(4000) EIA]sr  
    set @sqls='select count(*) from tableName' qh ­C‑5@Do  
    exec(@sqls) A;vBk­AD  
    --如何将exec执行结果放入变量中? f$9`I=j">  

    ~p.M^M`7E  
    declare @num int, 3^={\CUh  
    @sqls nvarchar(4000) cI)<Js‑w4P  
    set @sqls='select @a=count(*) from tableName ' 2 c],:zB;%  
    exec sp_executesql @sqls,N'@a int output',@num output *JA z
    ^&/  
    select @num j3SSiM  
    Ft*Ow%Djzm  
    此外,如果想要在SQL语句 字符串中使用 单引号 '' 可以 使用 ''''

     

    --语 句 功 能
    --数据操作
    SELECT --从数据库表中检索数据行和列
    INSERT --向数据库表添加新数据行
    DELETE --从数据库表中删除数据行
    UPDATE --更新数据库表中的数据
    --数据定义
    CREATE TABLE --创建一个数据库表
    DROP TABLE --从数据库中删除表
    ALTER TABLE --修改数据库表结构
    CREATE VIEW --创建一个视图
    DROP VIEW --从数据库中删除视图
    CREATE INDEX --为数据库表创建一个索引
    DROP INDEX --从数据库中删除索引
    CREATE PROCEDURE --创建一个存储过程


    DROP PROCEDURE --从数据库中删除存储过程
    CREATE TRIGGER --创建一个触发器
    DROP TRIGGER --从数据库中删除触发器
    CREATE SCHEMA --向数据库添加一个新模式
    DROP SCHEMA --从数据库中删除一个模式
    CREATE DOMAIN --创建一个数据值域
    ALTER DOMAIN --改变域定义
    DROP DOMAIN --从数据库中删除一个域
    --数据控制
    GRANT --授予用户访问权限
    DENY --拒绝用户访问
    REVOKE --解除用户访问权限
    --事务控制
    COMMIT --结束当前事务
    ROLLBACK --中止当前事务
    SET TRANSACTION --定义当前事务数据访问特征
    --程序化SQL
    DECLARE --为查询设定游标
    EXPLAN --为查询描述数据访问计划
    OPEN --检索查询结果打开一个游标
    FETCH --检索一行查询结果
    CLOSE --关闭游标
    PREPARE --为动态执行准备SQL 语句
    EXECUTE --动态地执行SQL 语句
    DESCRIBE --描述准备好的查询 
    ---局部变量
    declare @id char(10)
    --set @id = '10010001'
    select @id = '10010001' 

    ---全局变量
    ---必须以@@开头

    --IF ELSE
    declare @x int @y int @z int
    select @x = 1 @y = 2 @z=3
    if @x > @y
    print 'x > y' --打印字符串'x > y'
    else if @y > @z
    print 'y > z'
    else print 'z > y'

    --CASE
    use pangu
    update employee
    set e_wage =
    case
    when job_level = ’1’ then e_wage*1.08
    when job_level = ’2’ then e_wage*1.07
    when job_level = ’3’ then e_wage*1.06
    else e_wage*1.05
    end

    --WHILE CONTINUE BREAK
    declare @x int @y int @c int
    select @x = 1 @y=1
    while @x < 3
    begin
    print @x --打印变量x 的值
    while @y < 3
    begin
    select @c = 100*@x + @y
    print @c --打印变量c 的值
    select @y = @y + 1
    end
    select @x = @x + 1
    select @y = 1
    end

    --WAITFOR
    --例 等待1 小时2 分零3 秒后才执行SELECT 语句
    waitfor delay ’01:02:03’
    select * from employee
    --例 等到晚上11 点零8 分后才执行SELECT 语句
    waitfor time ’23:08:00’
    select * from employee

    ***SELECT***

    select *(列名) from table_name(表名) where column_name operator value
    ex:(宿主)
    select * from stock_information where stockid = str(nid)
    stockname = 'str_name' 
    stockname like '% find this %' 
    stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
    stockname like '[^F-M]%' --------- (^排除指定范围)
    --------- 只能在使用like关键字的where子句中使用通配符)
    or stockpath = 'stock_path'
    or stocknumber < 1000
    and stockindex = 24
    not stock*** = 'man'
    stocknumber between 20 and 100
    stocknumber in(10,20,30)
    order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
    order by 1,2 --------- by列号
    stockname = (select stockname from stock_information where stockid = 4)
    --------- 子查询
    --------- 除非能确保内层select只返回一个行的值,
    --------- 否则应在外层where子句中用一个in限定符
    select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
    select stocknumber ,"stocknumber + 10" = stocknumber + 10 fromtable_name
    select stockname , "stocknumber" = count(*) from table_name group bystockname
    --------- group by 将表按行分组,指定列中有相同的值
    having count(*) = 2 --------- having选定指定的组

    select * 
    from table1, table2 
    where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
    table1.id =* table2.id -------- 右外部连接 

    select stockname from table1
    union [all] ----- union合并查询结果集,all-保留重复行
    select stockname from table2

    ***insert***

    insert into table_name (Stock_name,Stock_number) value("xxx","xxxx")
    value (select Stockname , Stocknumber from Stock_table2)---value为select语句

    ***update***

    update table_name set Stockname = "xxx" [where Stockid = 3]
    Stockname = default
    Stockname = null
    Stocknumber = Stockname + 4

    ***delete***

    delete from table_name where Stockid = 3
    truncate table_name ----------- 删除表中所有行,仍保持表的完整性
    drop table table_name --------------- 完全删除表

    ***alter table*** --- 修改数据库表结构

    alter table database.owner.table_name add column_name char(2) null .....
    sp_help table_name ---- 显示表已有特征
    create table table_name (name char(20), age smallint, lname varchar(30))
    insert into table_name select ......... ----- 实现删除列的方法(创建新表)
    alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束

    ***function(/*常用函数*/)***


    ----统计函数----
    AVG --求平均值
    COUNT --统计数目
    MAX --求最大值
    MIN --求最小值
    SUM --求和

    --AVG
    use pangu
    select avg(e_wage) as dept_avgWage
    from employee
    group by dept_id
    --MAX
    --求工资最高的员工姓名
    use pangu
    select e_name
    from employee
    where e_wage =
    (select max(e_wage)
    from employee)

    --STDEV()
    --STDEV()函数返回表达式中所有数据的标准差


    --STDEVP()
    --STDEVP()函数返回总体标准差


    --VAR()
    --VAR()函数返回表达式中所有值的统计变异数


    --VARP()
    --VARP()函数返回总体变异数


    ----算术函数----


    /***三角函数***/
    SIN(float_expression) --返回以弧度表示的角的正弦
    COS(float_expression) --返回以弧度表示的角的余弦
    TAN(float_expression) --返回以弧度表示的角的正切
    COT(float_expression) --返回以弧度表示的角的余切
    /***反三角函数***/
    ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
    ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
    ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
    ATAN2(float_expression1,float_expression2) 
    --返回正切是float_expression1/float_expres-sion2的以弧度表示的角
    DEGREES(numeric_expression)
    --把弧度转换为角度返回与表达式相同的数据类型可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    EXP(float_expression) --返回表达式的指数值
    LOG(float_expression) --返回表达式的自然对数值
    LOG10(float_expression)--返回表达式的以10 为底的对数值
    SQRT(float_expression) --返回表达式的平方根
    /***取近似值函数***/
    CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
    --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型
    ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
    --与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型
    PI() --返回值为π 即3.1415926535897936
    RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数

    ----字符串函数----
    ASCII() --函数返回字符表达式最左端字符的ASCII 码值
    CHAR() --函数用于将ASCII 码转换为字符
    --如果没有输入0 ~255 之间的ASCII码值CHAR 函数会返回一个NULL 值
    LOWER() --函数把字符串全部转换为小写
    UPPER() --函数把字符串全部转换为大写
    STR() --函数把数值型数据转换为字符型数据
    LTRIM() --函数把字符串头部的空格去掉
    RTRIM() --函数把字符串尾部的空格去掉
    LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
    CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
    SOUNDEX() --函数返回一个四位字符码 
    --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值 
    DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
    --0 两个SOUNDEX 函数返回值的第一个字符不同
    --1 两个SOUNDEX 函数返回值的第一个字符相同
    --2 两个SOUNDEX 函数返回值的第一二个字符相同
    --3 两个SOUNDEX 函数返回值的第一二三个字符相同
    --4 两个SOUNDEX 函数返回值完全相同

    QUOTENAME() --函数返回被特定字符括起来的字符串
    /*select quotename('abc', '{') quotename('abc')
    运行结果如下
    ----------------------------------{
    {abc} [abc]*/


    REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
    /*select replicate('abc', 3) replicate( 'abc', -2)
    运行结果如下
    ----------- -----------
    abcabcabc NULL*/


    REVERSE() --函数将指定的字符串的字符排列顺序颠倒
    REPLACE() --函数返回被替换了指定子串的字符串
    /*select replace('abc123g', '123', 'def')
    运行结果如下
    ----------- -----------
    abcdefg*/


    SPACE() --函数返回一个有指定长度的空白字符串
    STUFF() --函数用另一子串替换字符串指定位置长度的子串


    ----数据类型转换函数----
    CAST() 函数语法如下
    CAST() (<expression> AS <data_ type>[ length ])
    CONVERT() 函数语法如下
    CONVERT() (<data_ type>[ length ], <expression> [, style])

    select cast(100+99 as char) convert(varchar(12), getdate())
    运行结果如下
    ------------------------------ ------------
    199 Jan 15 2000

    ----日期函数----
    DAY() --函数返回date_expression 中的日期值
    MONTH() --函数返回date_expression 中的月份值
    YEAR() --函数返回date_expression 中的年份值
    DATEADD(<datepart> ,<number> ,<date>) 
    --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
    DATEDIFF(<datepart> ,<number> ,<date>)
    --函数返回两个指定日期在datepart方面的不同之处
    DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
    DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
    GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间


    ----系统函数----
    APP_NAME() --函数返回当前执行的应用程序的名称
    COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值
    COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值
    COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名
    DATALENGTH() --函数返回数据表达式的数据的实际长度
    DB_ID(['database_name']) --函数返回数据库的编号
    DB_NAME(database_id) --函数返回数据库的名称
    HOST_ID() --函数返回服务器端计算机的名称
    HOST_NAME() --函数返回服务器端计算机的名称
    IDENTITY(<data_type>[, seed increment]) [AS column_name])
    --IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
    /*select identity(int, 1, 1) as column_name
    into newtable
    from oldtable*/
    ISDATE() --函数判断所给定的表达式是否为合理日期
    ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
    ISNUMERIC() --函数判断所给定的表达式是否为合理的数值
    NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值
    NULLIF(<expression1>, <expression2>)
    --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值

    sql中的保留字

    action add aggregate all 
    alter after and as 
    asc avg avg_row_length auto_increment 
    between bigint bit binary 
    blob bool both by 
    cascade case char character 
    change check checksum column 
    columns comment constraint create 
    cross current_date current_time current_timestamp 
    data database databases date 
    datetime day day_hour day_minute 
    day_second dayofmonth dayofweek dayofyear 
    dec decimal default delayed 
    delay_key_write delete desc describe 
    distinct distinctrow double drop 
    end else escape escaped 
    enclosed enum explain exists 
    fields file first float 
    float4 float8 flush foreign 
    from for full function 
    global grant grants group 
    having heap high_priority hour 
    hour_minute hour_second hosts identified 
    ignore in index infile 
    inner insert insert_id int 
    integer interval int1 int2 
    int3 int4 int8 into 
    if is isam join 
    key keys kill last_insert_id 
    leading left length like 
    lines limit load local 
    lock logs long longblob 
    longtext low_priority max max_rows 
    match mediumblob mediumtext mediumint 
    middleint min_rows minute minute_second 
    modify month monthname myisam 
    natural numeric no not 
    null on optimize option 
    optionally or order outer 
    outfile pack_keys partial password 
    precision primary procedure process 
    processlist privileges read real 
    references reload regexp rename 
    replace restrict returns revoke 
    rlike row rows second 
    select set show shutdown 
    smallint soname sql_big_tables sql_big_selects 
    sql_low_priority_updates sql_log_off sql_log_update sql_select_limit 
    sql_small_result sql_big_result sql_warnings straight_join 
    starting status string table 
    tables temporary terminated text 
    then time timestamp tinyblob 
    tinytext tinyint trailing to 
    type use using unique 
    unlock unsigned update usage 
    values varchar variables varying 
    varbinary with write when 
    where year year_month zerofill

    常用SQL命令和ASP编程

    在进行数据库操作时,无非就是添加、删除、修改,这得设计到一些常用的SQL语句,如下: 
    SQL常用命令使用方法:

    (1) 数据记录筛选:

    sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

    sql="select * from 数据表 where 字段名 like %字段值% order by 字段名 [desc]"

    sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"

    sql="select * from 数据表 where 字段名 in (值1,值2,值3)"

    sql="select * from 数据表 where 字段名 between 值1 and 值2"

    (2) 更新数据记录:

    sql="update 数据表 set 字段名=字段值 where 条件表达式"

    sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

    (3) 删除数据记录:


    sql="delete from 数据表 where 条件表达式"

    sql="delete from 数据表" (将数据表所有记录删除)

    (4) 添加数据记录:

    sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"

    sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

    (5) 数据记录统计函数:

    AVG(字段名) 得出一个表格栏平均值
    COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
    MAX(字段名) 取得一个表格栏最大的值
    MIN(字段名) 取得一个表格栏最小的值
    SUM(字段名) 把数据栏的值相加

    引用以上函数的方法:

    sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
    set rs=conn.excute(sql)

    用 rs("别名") 获取统的计值,其它函数运用同上。

    (6) 数据表的建立和删除:

    CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

    例:CREATE TABLEtab01(name varchar(50),datetime default now())

    DROP TABLE 数据表名称 (永久性删除一个数据表)


    在ASP编程时,下面这些语句是必须知道的:

    1.连接数据库

    a. ASP与Access数据库连接:
    <%@ language=VBs cript%>
    <%
    dim conn,mdbfile
    mdbfile=server.mappath("数据库名称.mdb")
    set conn=server.createobject("adodb.connection")
    conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile
    %>

    b. ASP与SQL数据库连接:

    <%@ language=VBs cript%>
    <%
    dim conn
    set conn=server.createobject("ADODB.connection")
    con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
    %>

    建立记录集对象:

    set rs=server.createobject("adodb.recordset")
    rs.open SQL语句,conn,3,2

    2. 记录集对象的方法:

    rs.movenext 将记录指针从当前的位置向下移一行
    rs.moveprevious 将记录指针从当前的位置向上移一行
    rs.movefirst 将记录指针移到数据表第一行
    rs.movelast 将记录指针移到数据表最后一行
    rs.absoluteposition=N 将记录指针移到数据表第N行
    rs.absolutepage=N 将记录指针移到第N页的第一行
    rs.pagesize=N 设置每页为N条记录
    rs.pagecount 根据 pagesize 的设置返回总页数
    rs.recordcount 返回记录总数
    rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
    rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
    rs.delete 删除当前记录,但记录指针不会向下移动
    rs.addnew 添加记录到数据表末端
    rs.update 更新数据表记录

    附:

    常数 常数值 说明

    --------------------------------
    adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
    adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
    adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
    adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。

    MSSQL经典语句

    1.按姓氏笔画排序:Select * From TableName Order ByCustomerName Collate Chinese_PRC_Stroke_ci_as

    2.数据库加密:select encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同

    3.取回表中字段:declare @list varchar(1000),@sql nvarchar(1000) 
    select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
    set@sql='select '+right(@list,len(@list)-1)+' from 表A' 
    exec(@sql)

    4.查看硬盘分区:EXEC master..xp_fixeddrives

    5.比较A,B表是否相等:if (select checksum_agg(binary_checksum(*)) from A)
    =
    (select checksum_agg(binary_checksum(*)) from B)
    print '相等'
    else
    print '不相等'

    6.杀掉所有的事件探察器进程:DECLARE hcforeach CURSOR GLOBALFOR SELECT 'kill '+RTRIM(spid)FROMmaster.dbo.sysprocesses
    WHEREprogram_name IN('SQL profiler',N'SQL 事件探查器')
    EXECsp_msforeach_worker '?'

    7.记录搜索:开头到N条记录
    Select Top N * From 表
    -------------------------------
    N到M条记录(要有主索引ID)Select TopM-N * From 表 Where ID in (Select TopM ID From 表) Order by ID Desc
    ----------------------------------
    N到结尾记录
    Select Top N * From 表 Order by ID Desc

    8.如何修改数据库的名称:sp_renamedb 'old_name', 'new_name'

    9:获取当前数据库中的所有用户表select Name from sysobjects wherextype='u' and status>=0

    10:获取某一个表的所有字段select name from syscolumns whereid=object_id('表名')

    11:查看与某一个表相关的视图、存储过程、函数select a.* from sysobjects a, syscomments b where a.id =b.id and b.text like '%表名%'

    12:查看当前数据库中所有存储过程select name as 存储过程名称 from sysobjects wherextype='P'

    13:查询用户创建的所有数据库select * from master..sysdatabases D where sidnot in(select sid from master..syslogins where name='sa')
    或者
    select dbid, name AS DB_NAME from master..sysdatabases where sid<> 0x01

    14:查询某一个表的字段和数据类型select column_name,data_type frominformation_schema.columns
    where table_name = '表名'

    [n].[标题]:Select * From TableName Order ByCustomerName

    [n].[标题]:Select * From TableName Order ByCustomerName

    from:http://tb.blog.csdn.net/TrackBack.aspx?PostId=585515

    触发器-MSSQL常用操作

    发表人:kendy517 | 发表时间: 2007年二月09日, 09:18

    不再新开文章.

    这里只打算讲解四部分了,也就最简单、最常用的四部分。

    1、触发器。

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
    常见的触发器有三种:分别应用于Insert, Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)

    我为什么要使用触发器?比如,这么两个表:

    Create Table Student( --学生表
    StudentID int primary key, --学号
    ....
    )

    Create Table BorrowRecord( --学生借书记录表
    BorrowRecord int identity(1,1), --流水号 
    StudentID int , --学号
    BorrowDate datetime, --借出时间
    ReturnDAte Datetime, --归还时间
    ...
    )

    用到的功能有:
    1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
    2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
    等等。

    这时候可以用到触发器。对于1,创建一个Update触发器:

    Create Trigger truStudent
    On Student
    for Update
    As
    if Update(StudentID)
    begin

    Update BorrowRecord 
    Set StudentID=i.StudentID
    From BorrowRecord br , Deleted d ,Inserted i 
    Where br.StudentID=d.StudentID

    end 

    理解触发器里面的两个临时的表:Deleted, Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
    一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

    对于2,创建一个Delete触发器
    Create trigger trdStudent
    On Student
    for Delete
    As
    Delete BorrowRecord 
    From BorrowRecord br , Delted d
    Where br.StudentID=d.StudentID

    从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
    这里我们只讲解最简单的触发器。复杂的容后说明。
    事实上,我不鼓励使用触发器。触发器的初始设计思想,已经被“级联”所替代.

    来自:http://www.innerv.com/blogview.asp?logID=512

     

    MSSQL数据库导出和导入

    SQL Server导出导入数据方法

     

     一、导出导入SQL Server里某个数据库

     

    1.在SQL Server企业管理器里选中要转移的数据库,按鼠标右键,选所有任务->备份数据库。 2.备份 选数据库-完全, 目的 备份到 按添加按钮 文件名 在SQL Server服务器硬盘下输入一个自定义的备份数据库文件名(后缀一般是bak) 重写 选重写现有媒体 最后按确定按钮。 如果生成的备份数据库文件大于1M,要用压缩工具压缩后再到Internet上传输。 3.通过FTP或者remote desktop或者pcanywhere等方法 把第二步生成的备份数据库文件或者其压缩后的文件传到目的SQL Server数据库,如果有压缩要解压。 4.目的SQL Server数据库如果还没有此数据库,先创建一个新的数据库; 然后选中这个新创建的数据库,按鼠标右键,选所有任务->还原数据库 还原->从设备->选择设备->磁盘->添加(找到要导入的备份数据库文件名)->确定 还原备份集->数据库-完全 最后按确定按钮。完全的数据库导入成功了。 (如果在已经存在的SQL Server数据库上还原数据库可能遇到有还有其它人正在使用它而恢复操做失败, 可以去看 ->管理->当前活动->锁/对象->找到数据库下锁的进程号->到查询分析器里用kill 进程号杀掉这些锁, 然后再做还原) 注意:如果在原有的目的SQL Server数据库上从备份文件(*.bak)还原数据库会把已经存在的表、存储过程等数据库对象全部替换成最近这次导入的备份数据库里的内容。如果一定要还原备份文件(*.bak)里部分数据,需要另外建一个新数据库其逻辑名称和数量同备份文件(*.bak)里数据库的逻辑名称和数量一致;新数据库的物理文件名称取得一定要和备份文件(*.bak)里数据库的物理文件不一样才行。

     

    二、导出导入SQL Server里某个表

     

    1.没有防火墙,同一个局域网里或不在同一个局域网里,但通过Internet可以互相访问 在SQL Server企业管理器里选中目的数据库 ,按鼠标右键,选所有任务->导入数据-> 弹出数据转换服务导入/导出向导窗口->下一步-> 选数据源-> 数据源(用于SQL Server的Microfost OLE DB提供程序)-> 服务器(可选择局域网内能访问到的所有SQL Server服务器,或者直接输入IP地址)-> 选择使用windows身份验证还是使用SQL Serve身份验证(输入数据库的用户名和密码)-> 数据库(可选择上面选中SQL Server服务器上所有权限范围内的数据库)->下一步-> 选择目的->目的(用于SQL Server的Microfost OLE DB提供程序)-> 服务器(默认为上一步里选中的导出服务器,也可以选其它局域网内能访问到的所有SQLServer服务器,或者直接输入IP地址)-> 目的数据库(可选择上面选中SQL Server服务器上所有权限范围内的数据库)->下一步-> 制定表复制或查询->选从源数据库复制表和视图(也可以选择用一条查询指定要传输的数据)->下一步-> 选择源表和视图->在要导入的表和视图前面选中源->目的出现同样的表名(可以手工修改成别的表名)-> 转换->列映射和转换里面可以修改源表和目的表之间字段的对应关系,修改目的表字段的类型和长度等, 并可以选择创建目的表,在目的表中增加行,除去并重新创建目的表,启用标志插入等选项->确定->下一步-> 保存、调度和复制包->时间->立即运行(如果要实现隔一段时间自动导出导入数据,选调度DTS包以便以后执行)-> 保存(可以不选)->[ 保存DTS包(如果以后还要转移这批相同的数据,可以把本次导出导入的内容和步骤保存起来, 存到SQL Server即可,保存的时候要输入DTS的包名及详细描述)->下一步-> ]->完成 正在执行包->图形界面显示创建表及插入记录的步骤和状态->完成 2.经过防火墙,不在同一个局域网里 ①、导出表里的数据到文本文件: 在SQL Server企业管理器里选中目的数据库,按鼠标右键,选所有任务->导入数据->弹出数据转换服务导入/导出向导窗口->下一步-> 选数据源-> 数据源(用于SQL Server的Microfost OLE DB提供程序)-> 服务器(可选择局域网内能访问到的所有SQL Server服务器)-> 选择使用windows身份验证还是使用SQL Serve身份验证(输入数据库的用户名和密码)-> 数据库(可选择上面选中SQL Server服务器上所有权限范围内的数据库)->下一步-> 选择目的->目的(文本文件)-> 文件名(在自己的电脑硬盘中生成一个自定义的文本文件)->下一步->制定表复制或查询->选从源数据库复制表和视图(也可以选择用一条查询指定要传输的数据)->下一步-> 选择目的文件格式->源(选择要导出的表)->用默认的带分隔符->选第一行包含有列名称选项->下一步-> 保存、调度和复制包->时间->立即运行(如果要实现隔一段时间自动导出到文本文件,选调度DTS包以便以后执行)-> 保存(可以不选)-> [保存DTS包(保存的时候要输入DTS的包名及详细描述)->下一步->]->完成 正在执行包->图形界面显示表到文本文件的步骤和状态->完成 如果生成的文本文件大于1M,要用压缩工具压缩后再到Internet上传输。 ②、通过FTP或者remote desktop或者pcanywhere等方法把 第①步生成的文本文件或者其压缩后的文件传到目的SQL Server数据库,如果有压缩要解压。 ③、把文本文件导入目的SQL Server数据库 直接把文本文件导入目的SQL Server数据库里跟文本文件同名的新表名时,默认的会把所有字段类型都变成字符串。 所以我们要这样做: 在源SQL Server数据库上先生成创建表的sql语句 在SQL Server查询分析器里->选中源数据库里表名->按右键->在新窗口中编写对象脚本->创建-> 复制下新窗口内创建表名的sql语句 到目标SQL Server数据库上查询分析器里执行创建表名的sql语句,生成空表结构。 (如果已经存在这样的表名,修改建表的sql语句,在表名后面加上导入时间的年月信息,例如table_0113) 调用导入/导出工具->弹出数据转换服务导入/导出向导窗口->下一步-> 选数据源-> 数据源(文本文件)-> 文件名(已传到目的SQL Server数据库下要导入的文本文件,后缀可以不是*.txt, 但是常规文本编辑器能打开的文件,文件类型选全部)->下一步-> 选择文件格式->用默认的带分隔符->选第一行包含有列名称选项->下一步-> 制定列分割符->逗号->下一步-> 选择目的->目的(用于SQL Server的Microfost OLE DB提供程序)-> 服务器(可选择目标局域网内能访问到的所有SQL Server服务器)-> 选择使用windows身份验证还是使用SQL Serve身份验证(输入数据库的用户名和密码)-> 数据库(可选择上面选中SQL Server服务器上所有权限范围内的数据库)->下一步-> 选择源表和视图->修改目的表名为刚才创建的表名->转换(在目的表中追加行) ->下一步-> 保存、调度和复制包-> 时间->立即运行(如果要实现隔一段时间自动把文本文件导入,选调度DTS包以便以后执行)-> 保存(可以不选)-> [保存DTS包(保存的时候要输入DTS的包名及详细描述)->下一步->]->完成 正在执行包->图形界面显示文本文件到表的步骤和状态->完成 如果要更改导入时间的年月信息的表名,例如table_0113到原来的表名, 在企业管理器里把原来的表名改成table_old_0113,table_0113改名成table。 这会对应用程序里频繁访问的表照成一定的中断。 注意:源表上的建的索引和主键约束不能用上面介绍的12方法转移过来,还需要手工来建索引和主键。标志种子和not null的约束可以继承过来。导入视图时会把源视图里所有的真实数据导入成一个新表,而不是视图。

     

     三、SQL Server存储过程或用户定义的函数导出导入

     

     1、导出存储过程或用户定义的函数成*.sql文件 在SQL Server企业管理器里选中源数据库, 存储过程->单选或者多选中要转移的存储过程-> 用户定义的函数->单选或者多选中要转移的函数-> 按鼠标右键,选所有任务->生成SQL脚本->确定->在自己的电脑硬盘中生成一个自定义的*.sql文件-> 保存->正在生成SQL脚本->成功 2、如果目的数据库经过防火墙,不在同一个局域网里, 要通过FTP或者remote desktop或者pcanywhere等方法把第1步生成的*.sql文件传到目的SQL Server数据库服务器上。 3、用查询分析器进入SQL Server目的数据库, 从菜单里选文件->打开->打开查询文件->选中第1步生成的*.sql文件->点执行查询的绿色倒三角型快捷键-> 查询窗口里会出现执行后的消息(有时候可能因为存储过程和用户定义的函数之间有一定的依赖关系,会报一些错。 最好先执行用户定义的函数的*.sql文件,再执行存储过程的*.sql文件)

     

    四、ORACLE数据库里表导入SQL Server数据库

     

     1、在目的SQL Server数据库服务器上安装ORACLEClient软件或者ORACLEODBC Driver. 在$ORACLE_HOMEnetworkadmintnsnames.ora里配置ORACLE数据库的别名(service name)。 具体配置方法可以参考本站文章:客户端连服务器的注意事项 2、在WIN2000或者win2003服务器->管理工具->数据源(ODBC)-> 系统DSN(本机器上NT域用户都可以用)->添加->ORACLE ODBC Driver->完成-> data source name 可以自定义,我一般填ORACLE数据库的sid标志, description里可以填ORACLE数据库详细描述,也可以不填-> datasource service name 填第1步定义的ORACLE数据库别名->OK。 (用户DSN和文件DSN也可以类似配置,但使用的时候有一些限制) 3、SQL Server的导入和导出数据工具里->选数据源-> 数据源(其它(ODBC数据源))-> 选第2步在ODBC里定义的系统DSN source name,用户名密码处填写ORACLE系统的用户名和密码-> 下一步->选择目的,选SQL Server数据库(跟上面第二点讲的一致,就不重复了)。 注意:在ORACLE表和SQL Server表之间'转换'那步很重要,可以改变默认的字段数据类型,如image->text,decimal->int

     

    五、SQL Server数据库里表导入ORACLE数据库

     

     方法一.导出目的选通过ODBC数据源里定义的ORACLE数据库, 注意ORACLE里表名都是大写的. 我一般在ORACLE这边先生成好表结构,再选择SQL SERVER源表往ORACLE目的表里追加数据. 数据传输速度比方法二慢. 方法二.从SQL Server数据库导入数据到ORACLE数据库可以选择用Windows下ORACLE9i企业或者个人版数据库做中转。

    注意:ORACLE通过访问SQL Server的数据库链接时,用select * 的时候字段名是用双引号引起来的。) 

    MySQL数据库导出和导入

    1).MySQLimport的语法介绍: 

      MySQLimport位于MySQL/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件(text file)导入到你指定的数据库和表中。比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表Custermers中: 

      MySQLimportMeet_A_Geek Customers.txt 

      注意:这里Customers.txt是我们要导入数据的文本文件,而Meet_A_Geek是我们要操作的数据库,数据库中的表名是Customers,这里文本文件的数据格式必须与Customers表中的记录格式一致,否则MySQLimport命令将会出错。

      其中表的名字是导入文件的第一个句号(.)前面文件字符串,另外一个例子:MySQLimport Meet_A_Geek Cus.to.mers.txt

      那么我们将把文件中的内容导入到数据库Meet_A_Geek 中的Cus表中。 

      上面的例子中,都只用到两个参数,并没有用到更多的选项,下面介绍MySQLimport的选项 

      2).MySQLimport的常用选项介绍: 

      选项 功能 

      -d or--delete 新数据导入数据表中之前删除数据数据表中的所有信息 
      -f or--force 不管是否遇到错误,MySQLimport将强制继续插入数据 
      -i or--ignore MySQLimport跳过或者忽略那些有相同唯一关键字的行, 导入文件中的数据将被忽略。 
      -l or-lock-tables 数据被插入之前锁住表,这样就防止了,你在更新数据库时,用户的查询和更新受到影响。 
      -r or-replace 这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。 
      --fields-enclosed-by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。 

      --fields-terminated-by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。您可以用此选项指定数据之间的分隔符。

      默认的分隔符是跳格符(Tab) 

      --lines-terminated-by=str 此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下MySQLimport以newline为行分隔符。 

      您可以选择用一个字符串来替代一个单个的字符: 

      一个新行或者一个回车。 

      MySQLimport命令常用的选项还有-v 显示版本(version),-p 提示输入密码(password)等。 

      3).例子:导入一个以逗号为分隔符的文件 

      文件中行的记录格式是这样的: 

      "1","ORD89876", "1 Dozen Roses", "19991226" 

      我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中,我们使用这个命令: 

      bin/MySQLimport–prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt 

      这个命令可能看起来很不爽,不过当你熟悉了之后,这是非常简单的。第一部分,bin/MySQLimport ,告诉操作系统你要运行的命令是MySQL/bin目录下的MySQLimport,选项p是要求输入密码,这样就要求你在改动数据库之前输入密码,操作起来会更安全。 我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的,需要用文件中的数据去更新,因而就用r这个选项,替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表,这样就阻止了用户在我们更新表的时候对表进行查询或者更改的操作。
      批处理是一种非交互式运行MySQL程序的方法,如同您在MySQL中使用的命令一样,你仍然将使用这些命令。 

      为了实现批处理,您重定向一个文件到MySQL程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在MySQL中输入的命令相同的文本。 

      比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾): 

      USEMeet_A_Geek; 
      INSERT INTOCustomers (Customer_ID, Last_Name) VALUES(NULL, "Block"); 
      INSERT INTOCustomers (Customer_ID, Last_Name) VALUES(NULL, "Newton"); 
      INSERT INTOCustomers (Customer_ID, Last_Name) VALUES(NULL, "Simmons"); 

      注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。 

      上面的USE命令选择数据库,INSERT命令插入数据。 

      下面我们要把上面的文件导入到数据库中,导入之前要确认数据库已经在运行,即是MySQLd进程(或者说服务,Windows NT下面称为”服务“,unix下面为”进程“)已经在运行。 

      然后运行下面的命令: 

      bin/MySQL –p< /home/mark/New_Data.sql 

      接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。 

      命令行中使用LOADDATA INFILE 从文件中导入数据到数据库: 

      现在您可能会问自己,"究竟为什么我要输入所有的这些SQL语句到文件中,然后通过程序运行它们呢?” 
    这样看起来好像需要大量的工作。很好,你这样想很可能就对了。但是假如你有从所有这些命令中产生的log记录呢?现在这样就很棒,嗯,大多数数据库都会自动产生数据库中的事件记录的log。而大部分log都包含有用过的原始的SQL命令。因此,如果您不能从您现在的数据库中导出数据到新的MySQL数据库中使用,那么您可以使用log和MySQL的批处理特性,来快速且方便地导入您地数据。当然,这样就省去了打字的麻烦。 

      LOAD DATAINFILE 

      这是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与MySQLimport非常相似,但这个方法可以在MySQL命令行中使用。也就是说您可以在所有使用API的程序中使用这个命令。使用这种方法,您就可以在应用程序中导入您想要导入的数据。 

      使用这个命令之前,MySQLd进程(服务)必须已经在运行。

      启动MySQL命令行:
      bin/MySQL –p

      按提示输入密码,成功进入MySQL命令行之后,输入下面的命令:

      USEMeet_A_Geek; 
      LOAD DATAINFILE "/home/mark/data.sql" INTO TABLE Orders; 

      简单的讲,这样将会把文件data.sql中的内容导入到表Orders中,如MySQLimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令: 
      LOAD DATALOCAL INFILE "C:MyDocsSQL.txt" INTO TABLE Orders; 
      上面的LOCAL参数表示文件是本地的文件,服务器是您所登陆的服务器。 

      这样就省去了使用ftp来上传文件到服务器,MySQL替你完成了. 

      您也可以设置插入语句的优先级,如果您要把它标记为低优先级(LOW_PRIORITY),那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令: 
       LOAD DATALOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders; 

      您也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法: 

      LOAD DATALOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders; 

      上面的句子看起来有点笨拙,但却把关键字放在了让您的剖析器可以理解的地方。 

      下面的一对选项描述了文件的记录格式,这些选项也是在MySQLimport工具中可以用的。他们在这里看起来有点不同。首先,要用到FIELDS关键字,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:

      TERMINATEDBY character 
       ENCLOSED BYcharacter 
       ESCAPED BYcharacter 

      这些关键字与它们的参数跟MySQLimport中的用法是一样的. The 
       TERMINATEDBY 描述字段的分隔符,默认情况下是tab字符(t) 
       ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段。 
       ESCAPED BY 描述的转义字符。默认的是反些杠(backslash: ). 

      下面仍然使用前面的MySQLimport命令的例子,用LOAD DATAINFILE语句把同样的文件导入到数据库中: 

      LOAD DATAINFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDSTERMINATED BY ','   ENCLOSED BY '"'; 

      LOAD DATAINFILE语句中有一个MySQLimport工具中没有特点: 

      LOAD DATAINFILE 可以按指定的列把文件导入到数据库中。 

      当我们要把数据的一部分内容导入的时候,这个特点就很重要。比方说,我们要从Access数据库升级到MySQL数据库的时候,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。 

      这个时候,我们的Access数据库中的数据仍然是可用的,但是因为这些数据的栏目(field)与MySQL中的不再匹配,因此而无法再使用MySQLimport工具。尽管如此,我们仍然可以使用LOAD DATAINFILE,下面的例子显示了如何向指定的栏目(field)中导入数据: 

      LOAD DATAINFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date,Customer_ID); 

      如您所见,我们可以指定需要的栏目(fields)。这些指定的字段依然是以括号括起,由逗号分隔的,如果您遗漏了其中任何一个,MySQL将会提醒您^_^ 

      ImportingData from Microsoft Access (从Access中导入数据,略)

      您可以看到MySQL有很多可以导入数据的方法,然而这些只是数据传输中的一半。另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导出数据。一个重要的原因是用于备份数据库。数据的造价常常是昂贵的,需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地丢失;另外一个原因是,也许您希望导出数据来共享。 在这个信息技术不断成长的世界中,共享数据变得越来越常见。 

      比方说MacmillanUSA维护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之间共享,这样他们就知道哪些书将会很快出版。医院越来越走向采用无纸病历记录,这样这些病历可以随时跟着你。世界变得越来越小,信息也被共享得越来越多。有很多中导出数据得方法,它们都跟导入数据很相似。因为,毕竟,这些都只是一种透视得方式。从数据库导出的数据就是从另一端导入的数据。这里我们并不讨论其他的数据库各种各样的导出数据的方法,您将学会如何用MySQL来实现数据导出。

      使用MySQLdump:
      MySQLdump命令位于MySQL/bin/目录中 

      MySQLdump工具很多方面类似相反作用的工具MySQLimport。它们有一些同样的选项。但MySQLdump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。 

      因此,如果您像装载整个数据库Meet_A_Geek的内容到一个文件中,可以使用下面的命令: 
      bin/MySQLdump –p Meet_A_Geek > MeetAGeek_Dump_File.txt 

      这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件,可以使用下面的命令: 
      bin/MySQLdump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt 

      这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这样的目的,可以使用类似于下面的命令: 
      bin/MySQLdump –p –where="Order_ID > 2000" Meet_A_Geek Orders >Special_Dump.txt 

      MySQLdump工具有大量的选项,部分选项如下表: 

      选项/Option作用/ActionPerformed 

      --add-drop-table
       这个选项将会在每一个表的前面加上DROP TABLEIF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除 

      --add-locks 
       这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作 

      -c or -complete_insert 
       这个选项使得MySQLdump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。 

      --delayed-insert在INSERT命令中加入DELAY选项 
       -F or-flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log. 
       -f or-force 使用这个选项,即使有错误发生,仍然继续导出 
       --full 这个选项把附加信息也加到CREATE TABLE的语句中 
       -l or-lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。 
       -t or-no-create- info 
       这个选项使的MySQLdump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。 

      -d or-no-data 这个选项使的MySQLdump命令不创建INSERT语句。 
       在您只需要DDL语句时,可以使用这个选项。 
       --opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。 
       -q or-quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。 
       -T path or-tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。 

      -w"WHERE Clause" or -where = "Where clause " 
       如前面所讲的,您可以使用这一选项来过筛选将要放到导出文件的数据。 

      假定您需要为一个表单中要用到的帐号建立一个文件,经理要看今年(2004年)所有的订单(Orders),它们并不对DDL感兴趣,并且需要文件有逗号分隔,因为这样就很容易导入到Excel中。 为了完成这个人物,您可以使用下面的句子: 

      bin/MySQLdump–p –where "Order_Date >='2000-01-01'" 
       –tab =/home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders 
       这将会得到您想要的结果。 

      schema:模式The set of statements,expressed in data definition language, that completely describe the structureof a data base. 
       一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。

      SELECT INTOOUTFILE : 

      如果您觉得MySQLdump工具不够酷,就使用SELECT INTOOUTFILE吧, MySQL同样提供一个跟LOAD DATAINFILE命令有相反作用的命令,这就是SELECTINTO OUTFILE 命令,这两个命令有很多的相似之处。首先,它们有所有的选项几乎相同。现在您需要完成前面用MySQLdump完成的功能,可以依照下面的步骤进行操作: 

      1. 确保MySQLd进程(服务)已经在运行 
       2. cd/usr/local/MySQL 
       3.bin/MySQLadmin ping ;// 如果这个句子通不过,可以用这个:MySQLadmin -u root -p ping 
    MySQLadmin ping用于检测MySQLd的状态,is alive说明正在运行,出错则可能需要用户名和密码。 
       4. 启动MySQL 监听程序. 
       5.bin/MySQL –p Meet_A_Geek;// 进入MySQL命令行,并且打开数据库Meet_A_Geek,需要输入密码 
       6. 在命令行中,输入一下命令: 

      SELECT *INTO OUTFILE '/home/mark/Orders.txt' 
       FIELDS 
       TERMINATEDBY = ',' 
       FROM Orders
       WHEREOrder_Date >= '2000-01-01' 

      在你按了Return(回车)之后,文件就创建了。这个句子就像一个规则的SELECT语句,只是把想屏幕的输出重定向到了文件中。这意味这您可以使用JOIN来实现多表的高级查询。这个特点也可以被用作一个报表产生器。 

      比方说,您可以组合这一章中讨论的方法来产生一个非常有趣的查询,试试这个: 

      在MySQL目录建立一个名为Report_G.rpt的文本文件,加入下面的行: 

      USEMeet_A_Geek; 
       INSERT INTOCustomers (Customer_ID, Last_Name, First_Name) 
       VALUES(NULL, "Kinnard", "Vicky"); 
       INSERT INTOCustomers (Customer_ID, Last_Name, First_Name) 
       VALUES(NULL, "Kinnard", "Steven"); 
       INSERT INTOCustomers (Customer_ID, Last_Name, First_Name) 
       VALUES(NULL, "Brown", "Sam"); 
       SELECTLast_Name INTO OUTFILE '/home/mark/Report.rpt' 
       FROMCustomers WHERE Customer_ID > 1; 

      然后确认MySQL进程在运行,并且您在MySQL目录中, 输入下面的命令: 

      bin/MySQL< Report_G.rpt检查您命名作为输出的文件,这个文件将会包含所有您在Customers表中输入的顾客的姓。 如您所见,您可以使用今天学到的导入/导出(import/export)的方法来帮助得到报表。 查看全文

    关于MSSQL数据库的字段

    数据类型是数据的一种属性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQLServer提供了25种数据类型:
      ·Binary[(n)]
      ·Varbinary[(n)]
      ·Char[(n)]
      ·Varchar[(n)]
      ·Nchar[(n)]
      ·Nvarchar[(n)]
      ·Datetime
      ·Smalldatetime
      ·Decimal[(p[,s])]
      ·Numeric[(p[,s])]
      ·Float[(n)]
      ·Real
      ·Int
      ·Smallint
      ·Tinyint
      ·Money
      ·Smallmoney
      ·Bit
      ·Cursor
      ·Sysname
      ·Timestamp
      ·Uniqueidentifier
      ·Text
      ·Image
      ·Ntext
    (1)二进制数据类型

      二进制数据包括Binary、Varbinary和Image
      Binary数据类型既可以是固定长度的(Binary),也可以是变长度的。
      Binary[(n)]是n位固定的二进制数据。其中,n的取值范围是从1到8000。其存储窨的大小是n+4个字节。
      Varbinary[(n)]是n位变长度的二进制数据。其中,n的取值范围是从1到8000。其存储窨的大小是n+4个字节,不是n个字节。
      在Image数据类型中存储的数据是以位字符串存储的,不是由SQLServer解释的,必须由应用程序来解释。例如,应用程序可以使用BMP、TIEF、GIF和JPEG格式把数据存储在Image数据类型中。
    (2)字符数据类型

      字符数据的类型包括Char,Varchar和Text
      字符数据是由任何字母、符号和数字任意组合而成的数据。
      Varchar是变长字符数据,其长度不超过8KB。Char是定长字符数据,其长度最多为8KB。超过8KB的ASCII数据可以使用Text数据类型存储。例如,因为Html文档全部都是ASCII字符,并且在一般情况下长度超过8KB,所以这些文档可以Text数据类型存储在SQLServer中。
    (3)Unicode数据类型

      Unicode数据类型包括Nchar,Nvarchar和Ntext
      在MicrosoftSQLServer中,传统的非Unicode数据类型允许使用由特定字符集定义的字符。在SQLServer安装过程中,允许选择一种字符集。使用Unicode数据类型,列中可以存储任何由Unicode标准定义的字符。在Unicode标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,所战胜的窨是使用非Unicode数据类型所占用的窨大小的两倍。
      在SQLServer中,Unicode数据以Nchar、Nvarchar和Ntext数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar字符类型,这时最多可以存储4000个字符。当列的长度固定不变时,应该使用Nchar字符类型,同样,这时最多可以存储4000个字符。当使用Ntext数据类型时,该列可以存储多于4000个字符。
    (4)日期和时间数据类型

      日期和时间数据类型包括Datetime和Smalldatetime两种类型
      日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/9812:15:00:00:00PM”和“1:28:29:15:01AM8/17/98”。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在MicrosoftSQLServer中,日期和时间数据类型包括Datetime和Smalldatetime两种类型时,所存储的日期范围是从1753年1月1日开始,到9999年12月31日结束(每一个值要求8个存储字节)。使用Smalldatetime数据类型时,所存储的日期范围是1900年1月1日开始,到2079年12月31日结束(每一个值要求4个存储字节)。
      日期的格式可以设定。设置日期格式的命令如下:
      SetDateFormat{format|@format_var|
      其中,format|@format_var是日期的顺序。有效的参数包括MDY、DMY、YMD、YDM、MYD和DYM。在默认情况下,日期格式为MDY。
      例如,当执行SetDateFormatYMD之后,日期的格式为年月日形式;当执行SetDateFormatDMY之后,日期的格式为日月有年形式
    (5)数字数据类型

      数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数
      整数由正整数和负整数组成,例如39、25、0-2和33967。在MicrsoftSQLServer中,整数存储的数据类型是  Int,Smallint和Tinyint。Int数据类型存储数据的范围大于Smallint数据类型存储数据的范围,而Smallint据类型存储数据的范围大于Tinyint数据类型存储数据的范围。使用Int数据狗昔存储数据的范围是从-2147483648到2147483647(每一个值要求4个字节存储空间)。使用Smallint数据类型时,存储数据的范围从-32768到32767(每一个值要求2个字节存储空间)。使用Tinyint数据类型时,存储数据的范围是从0到255(每一个值要求1个字节存储空间)。
      精确小娄数据在SQLServer中的数据类型是Decimal和Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。
      在SQLServer中,近似小数数据的数据类型是Float和Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
    (6)货币数据表示正的或者负的货币数量。

      在MicrosoftSQLServer中,货币数据的数据类型是Money和Smallmoney
      Money数据类型要求8个存储字节,Smallmoney数据类型要求4个存储字节。

    (7)特殊数据类型

      特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即  Timestamp、Bit和Uniqueidentifier。
      Timestamp用于表示SQLServer活动的先后顺序,以二进投影的格式表示。Timestamp数据与插入数据或者日期和时间没有关系。
      Bit由1或者0组成。当表示真或者假、ON或者OFF时,使用Bit数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
      Uniqueidentifier由16字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。
    2.用户定义的数据类型

      用户定义的数据类型基于在MicrosoftSQLServer中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为  postal_code的数据类型,它基于Char数据类型。
      当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。
    (1)创建用户定义的数据类型

      创建用户定义的数据类型可以使用Transact-SQL语句。系统存储过程sp_addtype可以来创建用户定义的数据类型。其语法形式如下:
      sp_addtype{type},[,system_data_bype][,'null_type']
      其中,type是用户定义的数据类型的名称。system_data_type是系统提供的数据类型,例如Decimal、Int、Char  等等。null_type表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOTNULL'或者'NONULL'。
      例子:
      Usecust
      Execsp_addtypessn,'Varchar(11)',"NotNull'
      创建一个用户定义的数据类型ssn,其基于的系统数据类型是变长为11的字符,不允许空。
      例子:
      Usecust
      Execsp_addtypebirthday,datetime,'Null'
      创建一个用户定义的数据类型birthday,其基于的系统数据类型是DateTime,允许空。
      例子:
      Usemaster
      Execsp_addtypetelephone,'varchar(24),'NotNull'
      Eexcsp_addtypefax,'varchar(24)','Null'
      创建两个数据类型,即telephone和fax
    (2)删除用户定义的数据类型

      当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是sp_droptype{'type'}。
      例子:
      Usemaster
      Execsp_droptype'ssn'
      注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。
    SQLSERVER的字段类型说明

    以下为SQLSERVER7.0以上版本的字段类型说明。SQL SERVER6.5的字段类型说明请参考SQL SERVER提供的说明。

      

    字段类型

    描述

    bit

    0或1的整型数字

    int

    从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字

    smallint

    从-2^15(-32,768)到2^15(32,767)的整型数字

    tinyint

    从0到255的整型数字

     

     

    decimal

    从-10^38到10^38-1的定精度与有效位数的数字

    numeric

    decimal的同义词

     

     

    money

    从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十

    smallmoney

    从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十

     

     

    float

    从-1.79E+308到1.79E+308可变精度的数字

    real

    从-3.04E+38到3.04E+38可变精度的数字

     

     

    datetime

    从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒

    smalldatetime

    从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟

     

     

    timestamp

    时间戳,一个数据库宽度的唯一数字

    uniqueidentifier

    全球唯一标识符GUID

     

     

    char

    定长非Unicode的字符型数据,最大长度为8000

    varchar

    变长非Unicode的字符型数据,最大长度为8000

    text

    变长非Unicode的字符型数据,最大长度为2^31-1(2G)

     

     

    nchar

    定长Unicode的字符型数据,最大长度为8000

    nvarchar

    变长Unicode的字符型数据,最大长度为8000

    ntext

    变长Unicode的字符型数据,最大长度为2^31-1(2G)

     

     

    binary

    定长二进制数据,最大长度为8000

    varbinary

    变长二进制数据,最大长度为8000

    image

    变长二进制数据,最大长度为2^31-1(2G)

    [down=upload/images/618fmall2.rar]DOWN LOADTHE FILE[/down]

    天气:大雨,ccdot发表于2006-6-20 14:44:36,阅读了655次,共有个2回复.

    --语 句              功 能
    --数据操作
    SELECT   --从数据库表中检索数据行和列
    INSERT   --向数据库表添加新数据行
    DELETE   --从数据库表中删除数据行
    UPDATE   --更新数据库表中的数据 
    --数据定义 
    CREATE TABLE  --创建一个数据库表
    DROP TABLE   --从数据库中删除表 
    ALTER TABLE   --修改数据库表结构
    CREATE VIEW   --创建一个视图 
    DROP VIEW   --从数据库中删除视图
    CREATE INDEX  --为数据库表创建一个索引
    DROP INDEX   --从数据库中删除索引 
    CREATE PROCEDURE  --创建一个存储过程 
    DROP PROCEDURE  --从数据库中删除存储过程
    CREATE TRIGGER  --创建一个触发器 
    DROP TRIGGER  --从数据库中删除触发器
    CREATE SCHEMA  --向数据库添加一个新模式
    DROP SCHEMA   --从数据库中删除一个模式
    CREATE DOMAIN  --创建一个数据值域
    ALTER DOMAIN  --改变域定义
    DROP DOMAIN   --从数据库中删除一个域
    --数据控制 
    GRANT   --授予用户访问权限
    DENY   --拒绝用户访问 
    REVOKE   --解除用户访问权限
    --事务控制
    COMMIT   --结束当前事务
    ROLLBACK   --中止当前事务 
    SET TRANSACTION  --定义当前事务数据访问特征
    --程序化SQL 
    DECLARE   --为查询设定游标 
    EXPLAN   --为查询描述数据访问计划
    OPEN   --检索查询结果打开一个游标
    FETCH   --检索一行查询结果 
    CLOSE   --关闭游标
    PREPARE   --为动态执行准备SQL 语句 
    EXECUTE   --动态地执行SQL 语句
    DESCRIBE   --描述准备好的查询 
    ---局部变量
    declare @id char(10) 
    --set @id = ’10010001’ 
    select @id = ’10010001’

    ---全局变量 
    ---必须以@@开头

    MSSQL常用汇总

    下列语句部分是Mssql语句,不可以在access中使用。

    SQL分类: 
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) 
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) 
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:
    1、说明:创建数据库
    CREATE DATABASE database-name 
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sqlserver
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack 
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [notnull],..)
    根据已有的表创建新表: 
    A:create tabletab_new like tab_old (使用旧表创建新表)
    B:create tabletab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表droptable tabname 
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键:Alter table tabname add primary key(col) 
    说明:删除主键:Alter table tabname drop primary key(col) 
    8、说明:创建索引:create[unique] index idxname on tabname(col….) 
    删除索引:dropindex idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:createview viewname as select statement 
    删除视图:dropview viewname
    10、说明:几个简单的基本的sql语句
    选择:select* from table1 where 范围
    插入:insertinto table1(field1,field2) values(value1,value2)
    删除:deletefrom table1 where 范围
    更新:updatetable1 set field1=value1 where 范围
    查找:select* from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select* from table1 order by field1,field2 [desc]
    总数:selectcount(*) as totalcount from table1
    求和:selectsum(field1) as sumvalue from table1
    平均:selectavg(field1) as avgvalue from table1
    最大:selectmax(field1) as maxvalue from table1
    最小:selectmin(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符 
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 
    B: EXCEPT 运算符 
    EXCEPT 运算符通过包括所有在TABLE1 中但不在TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
    注:使用运算词的几个查询结果行必须是一致的。 
    12、说明:使用外连接 
    A、left outerjoin: 
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outerjoin: 
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 
    C:full outerjoin: 
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select* into b from a where 1<>1
    法二:selecttop 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..fromb in '"&Server.MapPath(".")&"data.mdb"&"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from awhere a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddatefrom table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息 
    delete from table1 where not exists ( select * from table2 wheretable1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.cinner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒 
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb wheretb.b=ta.b)

    16、说明:包括所有在TableA 中但不在TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a fromtableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group bycol1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U' 

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender

    展开全文
  • SQL常用语句总结

    千次阅读 2012-08-29 09:18:50
    对于由 FOREIGN KEY 约束引用的表,不能使用truncate table,而应使用不带 Where 子句的 Delete 语句。 由于truncate table不记录在日志中,所以它不能激活触发器。 truncate table不能用于参与了索引视图的表...

    ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
    ☆           ☆
    ☆            ☆
    ☆                   sql 宝 典      ☆
    ☆           ☆
    ☆           ☆
    ☆      2012年-8月 修订版     ☆
    ☆           ☆
    ☆     修订人:情谊续写经典     ☆
    ☆           ☆
    ☆    郑重声明:本版本并非国际标准,使用前请查询数据库文档是否支持,转载请注明出处! ☆
    ☆           ☆
    ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

    MS SQL里没有括号时,运算进行的次序将是先乘后除再模后加减

    减号(-)也有两种用途:1.作为负号使用 2.从某一列中减去另一列

    and   or   not 
    如果一个where子句中同时出现这三个操作符
    最先评估not   然后是and  然后是or


    coalesce 哪个不为空用哪个
    coalesce(i.ProductID,d.ProductID)

    @@rowcount
    返回上一条语句影响的行数

    SQL判断某列中是否包含中文字符或者英文字符
      select * from 表名 where 某列 like '%[吖-座]%' 
      select * from 表名 where 某列 like '%[a-z]%'

    --数据操作,中英文对照
    select --从数据库表中检索数据行和列 
    insert --向数据库表添加新数据行 
    delete --从数据库表中删除数据行 
    update --更新数据库表中的数据 
    --数据定义 
    create table --创建一个数据库表 
    drop table --从数据库中删除表 
    alter table --修改数据库表结构 
    create view --创建一个视图 
    drop view --从数据库中删除视图 
    create index --为数据库表创建一个索引 
    drop index --从数据库中删除索引 
    create proceduer --创建一个存储过程 
    drop proceduer --从数据库中删除存储过程 
    create trigger --创建一个触发器 
    drop trigger --从数据库中删除触发器 
    create schema --向数据库添加一个新模式 
    drop schema --从数据库中删除一个模式 
    create domain --创建一个数据值域 
    alter domain --改变域定义 
    drop domain --从数据库中删除一个域 
    --数据控制 
    grant --授予用户访问权限 
    deny --拒绝用户访问 
    revoke --解除用户访问权限 
    --事务控制 
    commit --结束当前事务 
    rollback --中止当前事务 
    set transaction --定义当前事务数据访问特征 
    --程序化SQL 
    declare --为查询设定游标 
    explan --为查询描述数据访问计划 
    open --检索查询结果打开一个游标 
    fetch --检索一行查询结果 
    close --关闭游标 
    prepare --为动态执行准备SQL 语句 
    execute --动态地执行SQL 语句 
    describe --描述准备好的查询


    ------------------SQL中插入数据的技巧 -----------------

    插入少量数据时可以用:
    insert into 表名(列名1,列名2...) values (值1,值2...)

    插入大量数据时可以用:
        insert into 要复制的表名 select * from 源表名
    或:insert into 要复制的表名(列名1,列名2...) select (列名1,列名2...) from 源表名

    insert select 语句要求你遵循如下规则:
      SELECT 语句不能从被插入数据的表中选择行
      INSERT INTO 中的列数必须与SELECT 语句返回的列数相等
      INSERT INTO 中的数据类型要与SELECT 语句返回的数据类型相同

    insert select 语句的另外一个用处对表进行备份:
      select * into 临时表名 from 源表名

     

    ----------SQL中truncate table和delete和drop的区别 ----------

    truncate table在功能上与不带 Where 子句的 Delete 语句相同,二者均删除表中的全部行
    但truncate table比 Delete 速度快,且使用的系统和事务日志资源少。
    Delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
    truncate table通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
    truncate table删除表中的所有行,但表结构及其列、约束、索引等保持不变。
    新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 Delete。
    对于由 FOREIGN KEY 约束引用的表,不能使用truncate table,而应使用不带 Where 子句的 Delete 语句。
    由于truncate table不记录在日志中,所以它不能激活触发器。
    truncate table不能用于参与了索引视图的表。

    truncate,delete,drop的异同点: 
    注意:这里说的delete是指不带where子句的delete语句
     
    相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据 

    不同点: 
    1.truncate和 delete只删除数据不删除表的结构(定义) 
      drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);
      依赖于该表的存储过程/函数将保留,但是变为invalid状态.
     
    2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
      如果有相应的trigger,执行的时候将被触发. 
      truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

    3.delete语句不影响表所占用的extent, 高水线(high w2atermark)保持原位置不动 
       显然drop语句将表所占用的空间全部释放 
       truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage;  
       truncate会将高水线复位(回到最开始).

    4.速度,一般来说: drop> truncate > delete

    5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及

    使用上:
    想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.

    想删除表,当然用drop

    想保留表而将所有数据删除. 如果和事务无关,用truncate即可.

    如果和事务有关,或者想触发trigger,还是用delete.

    如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

    ---------------------------好句收藏--------------------------

    1.UNION 将返回两个查询的结果并去除其中的重复部分
     SELECT NAME FROM SOFTBALL
     UNION
     SELECT NAME FROM FOOTBALL

     distinct (去掉完全重复的记录)
     select distinct * from 表名
     
     with ties (并列显示完全重复的记录)
     select Top 10 with ties * from 表名

    2.UNION ALL 不去掉重复的记录
     SELECT NAME FROM SOFTBALL
     UNION ALL
     SELECT NAME FROM FOOTBALL

    3.INTERSECT 返回两个表中共有的行
     SELECT * FROM FOOTBALL
     INTERSECT
     SELECT * FROM SOFTBALL

    4.MINUS (相减)
    返回的记录是存在于第一个表中但不存在于第二个表中的记录
     SELECT * FROM FOOTBALL
     MINUS
     SELECT * FROM SOFTBALL

    5.in(满足括号里任意一个条件即可)
     SELECT * FROM FRIENDS WHERE STATE IN('CA','CO','LA')

    6.BEWTEEN (满足区间)
     SELECT * FROM PRICE WHERE WHOLESALE BETWEEN 0.25 AND 0.75

    7.连接(||)
    可以将两个字符串连接起来
     SELECT (NAMEa || NAMEb) as 新列名 FROM FRIENDS
    格式化连接
     SELECT (NAMEa || ',' || NAMEb) as 新列名 FROM FRIENDS --在连接的数据中间加上自定义字符串

    8.STARTING WITH (它的作用与like相似,用之前要测试sql解释器是否支持此语法)
     SELECT 列名1,列名2...  FROM 表名 WHERE 列名 STARTING WITH('Ca')

     

    ORDER BY (排序)
    升序:SELECT * FROM 表名 ORDER BY 列名
    降序:SELECT * FROM 表名 ORDER BY 列名 DESC
    技巧:假如你已经知道了你想要进行排序的列是表中的第一列的话,那么你可以用ORDER
    BY 1 来代替输入列的名字

    GROUP BY (分组查询)
     SELECT 列名 FROM 表名 GROUP BY 列名

    HAVING (对你需要进行分组的数据进行限制)
     SELECT 列名1,AVG(列名2) FROM 表名 GROUP BY 列名 HAVING AVG(列名3)>66

    ---表的不等值联合
    不等值联合则是在WHERE 子句中使用除了等号以外的其它比较运算符
    例句:SELECT O.NAME,O.PARTNUM,P.PARTNUM FROM ORDERS as O,PART as P WHERE O.PARTNUM > P.PARTNUM

    ---表的自我联合
     WHERE F.PARTNUM = S.PARTNUM AND F.DESCRIPTION <> S.DESCRIPTION

    ------------------------日期函数--------------------------

    VARIANCE (返回某一列数值的方差)
    例句:SELECT VARIANCE(列名) AS 新列名 FROM 表名  --列必须为int或double等数值类型

    STDDEV (返回某一列数值的标准差)
    例句:SELECT STDDEV(列名) AS 新列名 FROM 表名  --列必须为int或double等数值类型

    ADD_MONTHS (该函数的功能是将给定的日期增加一个月)
    例句:SELECT ADD_MONTHS(ENDDATE,1) AS 新列名 FROM 表名  --ENDDATE为datetime类型
          ADD_MONTHS(ENDDATE,1)可以使用于where条件

    LAST_DAY (可以返回指定月份的最后一天是几号)
    例句:SELECT LAST_DAY(ENDDATE) AS 新列名 FROM 表名

    DISTINCT (得到唯一的结果,就是去掉重复的结果)
    例句:SELECT DISTINCT 列名 FROM 表名

    MONTHS_BETWEEN (得到给定的两个日期中有多少个月)
    例句1:SELECT MONTHS_BETWEEN(ENDDATE,STARTDATE) AS 新列名 FROM 表名
    例句2:SELECT * FROM 表名 WHERE MONTHS_BETWEEN(DATETIME1,DATETIME2)>0

    SYSDATE  (将返回系统的日期和时间)
    例句:SELECT DISTINCT SYSDATE FROM 表名

    ----------------------数学函数--------------------------

    ABS() 函数返回给定数字的绝对值
    CEIL() 返回与给定参数相等或比给定参数在的最小整数
    FLOOR() 返回与给定参数相等或比给定参数在的最大整数
    MOD(A,B) 返回A 与B 相除后的余数
    SIGN()  如果参数的值为负数返回-1 ,如果参数的值为正数返回1 ,如果参数为零返回零
    SQRT() 该函数返回参数的平方根,由于负数是不能开平方的所以不能将该函数应用于负数

    -----------------------字符函数---------------------------

    CHR() 该函数返回与所给数值参数等当的在ASCLL码字符,返回的字符取决于数据库所依赖的字符集
    例句:SELECT CHR(列名) FROM 表名

    CONCAT() 与||符号相同,表示将两个字符串连接起来
    例句:SELECT CONCAT(列名1,列名2) FROM 表名

    INITCAP() 该函数将参数的第一个字母变为大写,此外其它的字母则转换成小写
    例句:SELECT INITCAP(列名) as 新列名 FROM 表名

    LOWER() 将参数全部转换为小写字母
    UPPER() 将参数全部转换为大写字母
    LENGTH() 将返回指定字符串的长度

    ----------------------转换函数----------------------

    TO_CHAR() 将一个数字转换为字符型
    TO_NUMBER() 将一个字符串型数字转换为数值型

    ---其它函数
    GREATEST() 将会返回在字母表中最靠后的字符开头的字符串,函数是返回几个表达式中最大的;
    例句:SELECT GREATEST(‘ALPHA’,’BRAVO’,’FOXTROT’,’DELTA’,’FP’) FROM 表名

    LEAST()    函数是返回几个表达式中最小的!
    例句:SELECT DISTINCT LEAST(34,567,3,45,1090) FROM 表名

    USER() 函数将返回当前使用数据库的用户的名字
    例句:SELECT DISTINCT USER FROM 表名


    -------------------条件语句后用的关键字---------------

    EXISTS
    从子查询中返回的行数至少有一行时,EXIST返回为true。返回为空时,EXIST返回为false。
    例句:
    SELECT NAME FROM ORDERS
    WHERE EXISTS(SELECT * FROM ORDERS WHERE NAME ='MOSTLY HARMLESS')


    ANY/SOME   ANY与SOME具有同样的功能
    ANY与子查询中的每一行与主查询进行比较,并对子查询中的每一行返回一个TRUE值
    区别:
    IN只相当于多个等号的作用,IN不能用于大于或小于的判断。
    而ANY 和SOME 则可以使用其它的比较运算符如大于或小于。
    例句:
    SELECT NAME FROM ORDERS WHERE NAME > ANY
    (SELECT NAME FROM ORDERS WHERE NAME ='JACKS BIKE')


    ALL 关键字的作用在于子查询中的所有结果均满足条件时它才会返回TRUE,ALL常起双重否定的作用。
    例句:
    SELECT NAME FROM ORDERS WHERE NAME <> ALL
    (SELECT NAME FROM ORDERS WHERE NAME ='JACKS BIKE')


    -------------------局部变量和全局变量--------------------

    局部变量必须以“@”开头,而且必须先用DECLARE命令说明后才可使用。
    语法:DECLARE @变量名 变量类型

    局部变量赋值必须使用SELECT或SET命令来设定变量的值
    语法:  SELECT @局部变量=变量值
     SET  @局部变量=变量值

    全局变量不是由用户的程序定义的,它们是在服务器级定应义的。
    只能使用预先说明及定义的变局变量。
    引用全局变量时,必须以“@@”开头。
    局部变量的名称不能与全局变量的名称相同、否则会在应用中出错

     


    ----------------------事务-视图-索引------------------

    事务是一种机制,用以维护数据库的完整性。

    事务有4个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability),也称作事务的ACID属性。

    原子性:事务内的所有工作要么全部完成,要么全部不完成,不存在只有一部分完成的情况。

    一致性:事务内的然后操作都不能违反数据库的然后约束或规则,事务完成时有内部数据结构都必须是正确的。

    隔离性:事务直接是相互隔离的,如果有两个事务对同一个数据库进行操作,比如读取表数据。
            任何一个事务看到的所有内容要么是其他事务完成之前的状态,要么是其他事务完成之后的状态。
            一个事务不可能遇到另一个事务的中间状态。

    持久性:事务完成之后,它对数据库系统的影响是持久的,即使是系统错误,重新启动系统后,该事务的结果依然存在。

    事务的模式

            a、 显示事务

            显示事务就是用户使用T-SQL明确的定义事务的开始(begin transaction)和提交(commit transaction)或回滚事务(rollback transaction)

            b、 自动提交事务

            自动提交事务是一种能够自动执行并能自动回滚事务,这种方式是T-SQL的默认事务方式。
            例如在删除一个表记录的时候,如果这条记录有主外键关系的时候,删除就会受主外键约束的影响,那么这个删除就会取消。

            可以设置事务进入隐式方式:set implicit_transaction on;

            c、 隐式事务

            隐式事务是指当事务提交或回滚后,SQL Server自动开始事务。因此,隐式事务不需要使用begin transaction显示开始,
            只需直接失业提交事务或回滚事务的T-SQL语句即可。

            使用时,需要设置set implicit_transaction on语句,将隐式事务模式打开,下一个语句会启动一个新的事物,再下一个语句又将启动一个新事务。

     

    开始事务: begin    transaction
    提交事务: commit   transaction
    回滚事务: rollback transaction


    创建视图:create view 视图名 as <select语句>
    删除视图:drop view 试图名
    视图定义中的select语句中不能包括下列:
       1.order by子句,除非select语句的选择列有top子句
       2.into关键字
       3.引用临时表或变量

    创建索引:create unique 【clustered | nonclustered】 index 索引名 on 表名(列名) 【with fillfactor=x】
              unique  可选,指定唯一索引
              clustered , nonclustered 可选,指定是聚集索引或非聚集索引
              fillfactor 可选,表示填充因子,指定一个0-100的值,该值指示索引页填满的空间所占的百分比

    删除索引:drop index 表名.索引名


    下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

      动作描述   使用聚集索引     使用非聚集索引

      外键列      应             应
      主键列      应     应
     列经常被分组排序(order by)     应     应
        返回某范围内的数据     应     不应
         小数目的不同值      应     不应
         大数目的不同值     不应     应
          频繁更新的列    不应     应
         频繁修改索引列     不应     应
        一个或极少不同值     不应     不应

     


    -------------------------操作数据库----------------------

    SQL分类:

    DDL类型包括数据库、表的创建,修改,删除,声明—数据定义语言(CREATE,ALTER,DROP,DECLARE)

    DML类型包括数据表中记录的查询,删除,修改,插入—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

    DCL类型包括数据库用户赋权,废除用户访问权限, 提交当前事务,中止当前事务—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:

    1、说明:创建数据库

    CREATE DATABASE db1(db1代表数据库,可自命名)
    on     primary      --默认属于primary主文件组,可省略
    (
     --数据文件的具体描述
     name='MySchool_data',       --主数据文件的逻辑名称
     filename='D:\project\MySchool_data.mdf', --主数据文件的物理名称
     size=5MB,                   --主数据文件的初始大小
     maxsize=100MB,              --主数据文件增长的最大值
     filegrowth=15%              --主数据文件的增长率
    )
    log on
    (
     --日记文件的具体描述,各参数含义同上
     name='MySchool_log',
     filename='D:\project\MySchool_data.ldf',
     size=2MB,
     filegrowth=1MB
    )

    2、说明:删除数据库

    drop database db1(db1代表数据库,可自命名)

    3、说明:备份sql server

    --- 创建 备份数据的 device

    USE master

    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

    --- 开始 备份

    BACKUP DATABASE pubs TO testBack

    4、说明:创建新表

    create table tb1
    (
    Id int not null primary key, --设置为主键
    one int identity(1,1),       --设为标识列
    name varchar not null,      --非空
    phone nvarchar(100),         --可以为空
    ...
    )


    根据已有的表创建新表:

    A:create table tab_new like tab_old (使用旧表创建新表)

    B:create table tab_new as select col1,col2… from tab_old definition only


    5、说明:

    删除新表:drop table tb1
    use  MySchool  --将当前数据库设置为MySchool
    if   exists(select * from MySchool where name='Student') --exist是查询语句,检测某个查询是否存在
    drop table Student

    6、说明:

    增加一个列:Alter table 表名 add 字段名 字段类型 字段说明/约束

    添加带主键及约束的语法:
    alter table  表名
    add constraint  约束名  约束类型  具体的约束说明

    --添加主键约束(将StudentNo作为主键)
    alter table Student
    add constraint PK_stuNo primary key (StudentNo)
    --添加唯一约束(身份证号唯一)
    alter table Student
    add constraint UQ_stuID unique (身份证号列名)
    --添加默认约束(如果地址不填,默认为“地址不详”)
    alter table Student
    add constraint DF_stuAddress default ('地址不详') for Address
    --添加检查约束(要求出生日期在1980年1月1日之后)
    alter table Student
    add constraint CK_stuBornDate check (BornDate >= '1980-01-01')
    --添加外键约束(主表Student和从表Result建立关系,关联列为StudentNo)
    alter table Result
    add constraint FK_stuNo
     foreign key (stuNo) references Student(stuNo)


    删除列的语法:

    你删除的时候会提示你,有默认约束依赖该字段,那么你需要先删除默认约束(错误提示里会有默认约束名),再删除字段:
    ALTER TABLE 表名 DROP CONSTRAINT 默认约束名
    GO
    ALTER TABLE 表名   DROP COLUMN 字段名
    GO

    删除约束:
    alter table Student
    drop constraint 约束名

    例句:
    alter table Student
    add constraint PK_stuNo

    7、说明:

    添加主键:Alter table tabname add primary key(ID)(设置某字段为主键,ID可自由设置,主键数据不可重复)

    说明:

    删除主键:Alter table tabname drop primary key(ID)(删除某字段主键)

    8、说明:

    创建索引:create [unique] index idxname on tabname(col….)

    删除索引:drop index idxname

    注:索引是不可更改的,想更改必须删除重新建。

    9、说明:

    创建视图:create view viewname as select statement

    删除和修改视图
    alter view  yourviewname   as...
    drop view  yourviewname   as...
    加密视图
    alter  view  yourviewname  with encryption as...
    加密了之后连你自己也看不到原代码了


    10、说明:几个简单的基本的sql语句

    选择:select * from table1 where Id=1(Id=1为条件语句,根据自己情况自定义)

    插入:insert into table1(field1,field2) values(value1,value2)

    删除:delete from table1 where 范围

    更新:update table1 set field1=value1 where 范围

    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!

    排序:select * from table1 order by field1,field2 [desc]

    总数:select count * as totalcount from table1

    求和:select sum(field1) as sumvalue from table1

    平均:select avg(field1) as avgvalue from table1

    最大:select max(field1) as maxvalue from table1

    最小:select min(field1) as minvalue from table1

    11、说明:几个高级查询运算词

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。
    当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。
    当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。
    当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

    注:使用运算词的几个查询结果行必须是一致的。

    12、说明:使用外连接

    A、left outer join:

    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    B:right outer join:

    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join:

    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

    法一:select * into b from a where 1<>1 (仅用于SQlServer)

    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件

    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)

    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间

    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)

    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )

    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

    select * from table1 where time between time1 and time2

    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法

    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息

    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒

    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录

    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据

    select top 10 * from tablename order by newid()

    18、说明:随机选择记录

    select newid()

    19、说明:删除重复记录

    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名

    select name from sysobjects where type='U'

    21、说明:列出表里的所有的

    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),
                sum(case vender when 'B' then pcs else 0 end)
    FROM tablename
    group by type

    显示结果:

    type vender pcs

    电脑 A 1

    电脑 A 1

    光盘 B 2

    光盘 A 2

    手机 B 3

    手机 C 3

    23、说明:初始化表table1

    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录

    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)

    对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。
    你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:

    Randomize

    RNumber = Int(Rnd*499) +1

    While Not objRec.EOF

    If objRec("ID") = RNumber THEN

    ... 这里是执行脚本 ...

    end if

    objRec.MoveNext

    Wend

    这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。
    然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。
    假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。
    虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,
    后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?

    采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:

    Randomize

    RNumber = Int(Rnd*499) + 1

    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

    set objRec = ObjConn.Execute(SQL)

    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")

    不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。
    Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。

    再谈随机数

    现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。
    把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。

    为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:

    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3

    假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。
    这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):

    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

    注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

    随机读取若干条记录,测试过

    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)

    Sql server:select top n * from 表名 order by newid()

    mysql select * From 表名 Order By rand() Limit n

    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)

    语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...

    使用SQL语句 用...代替过长的字符串显示

    语法:

    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename

    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

    Conn.Execute说明

    Execute方法

    该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

    1.执行SQL查询语句时,将返回查询得到的记录集。用法为:

    Set 对象变量名=连接对象.Execute("SQL 查询语言")

    Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

    2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:

    连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]

    ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。

    ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法

    这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。

    事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

    BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。
    判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。
    Error集合中的每一个Error对象,代表一个错误信息。

    SQL语句大全精要

    DELETE语句

    DELETE语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。

    语法:DELETE [table.*] FROM table WHERE criteria

    语法:DELETE * FROM table WHERE criteria='查询的字'

    说明:table参数用于指定从其中删除记录的表的名称。

    criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。

    可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。
    不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。

    UPDATE

    有关UPDATE,急!!!!!!!!!!!

    在ORACLE数据库中

    表 A ( ID ,FIRSTNAME,LASTNAME )

    表 B( ID,LASTNAME)

    表 A 中原来ID,FIRSTNAME两个字段的数据是完整的

    表 B中原来ID,LASTNAME两个字段的数据是完整的

    现在要把表 B中的LASTNAME字段的相应的数据填入到A表中LASTNAME相应的位置。两个表中的ID字段是相互关联的。

    update a set a.lastname=(select b.lastname from b where a.id=b.id)

    常用sql语句命令的作用
    1. 查看数据库的版本       

       select @@version

      2. 查看数据库所在机器操作系统参数       

      exec master..xp_msver


      3. 查看数据库启动的参数        

      sp_configure


      4. 查看数据库启动时间        

      select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1

      查看数据库服务器名和实例名

      print 'Server Name...............:' + convert(varchar(30),@@SERVERNAME)        

      print 'Instance..................:' + convert(varchar(30),@@SERVICENAME)  
           
      5. 查看所有数据库名称及大小    

      sp_helpdb

      重命名数据库用的SQL

      sp_renamedb 'old_dbname', 'new_dbname'


      6. 查看所有数据库用户登录信息    

      sp_helplogins

      查看所有数据库用户所属的角色信息       

      sp_helpsrvrolemember

      修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程

      更改某个数据对象的用户属主
     
      sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'

      注意:更改对象名的任一部分都可能破坏脚本和存储过程。

      把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本

      查看某数据库下,对象级用户权限

      sp_helprotect


      7. 查看链接服务器           
     
      sp_helplinkedsrvlogin

      查看远端数据库用户登录信息
     
      sp_helpremotelogin


      8.查看某数据库下某个数据对象的大小

      sp_spaceused @objname

      还可以用sp_toptables过程看最大的N(默认为50)个表

      查看某数据库下某个数据对象的索引信息

      sp_helpindex @objname

      还可以用SP_NChelpindex过程查看更详细的索引情况

      SP_NChelpindex @objname

      clustered索引是把记录按物理顺序排列的,索引占的空间比较少。 

      对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。

      查看某数据库下某个数据对象的的约束信息

      sp_helpconstraint @objname

    9.查看数据库里所有的存储过程和函数


      use @database_name


      sp_stored_procedures


      查看存储过程和函数的源代码


      sp_helptext '@procedure_name'


      查看包含某个字符串@str的数据对象名称


      select distinct object_name(id) from syscomments where text like '%@str%'


      创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数


      解密加密过的存储过程和函数可以用sp_decrypt过程

     

      10.查看数据库里用户和进程的信息

      sp_who

      查看SQL Server数据库里的活动用户和进程的信息

      sp_who 'active'

      查看SQL Server数据库里的锁的情况

      sp_lock

      进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.
     
      spid是进程编号,dbid是数据库编号,objid是数据对象编号

      查看进程正在执行的SQL语句

      dbcc inputbuffer ()

      推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句

      sp_who3

      检查死锁用sp_who_lock过程

      sp_who_lock
                  
      11.查看和收缩数据库日志文件的方法

      查看所有数据库日志文件大小          

      dbcc sqlperf(logspace)

      如果某些日志文件较大,收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M

      backup log @database_name with no_log

      dbcc shrinkfile (@database_name_log, 5)


      12.分析SQL Server SQL 语句的方法:

      set statistics time {on | off}

      set statistics io {on | off}

      图形方式显示查询执行计划

      在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L    或者点击工具栏里的图形

      文本方式显示查询执行计划

      set showplan_all {on | off}

      set showplan_text { on | off }

      set statistics profile { on | off }


      13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法
      先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作

      alter database [@error_database_name] set single_user

      修复出现不一致错误的表

      dbcc checktable('@error_table_name',repair_allow_data_loss)

      或者可惜选择修复出现不一致错误的小型数据库名

      dbcc checkdb('@error_database_name',repair_allow_data_loss)

      alter database [@error_database_name] set multi_user

      CHECKDB 有3个参数:

      repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。

      修复操作可以在用户事务下完成以允许用户回滚所做的更改。

      如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。

      如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。

      修复完成后,请备份数据库。 

      repai*_**st 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。

      这些修复可以很快完成,并且不会有丢失数据的危险。 

      repair_rebuild 执行由 repai*_**st 完成的所有修复,包括需要较长时间的修复(如重建索引)。

      执行这些修复时不会有丢失数据的危险。

    原文地址:http://blog.csdn.net/a125138/article/details/7917919

    展开全文
  • 选择语句+循环语句作业及答案

    千次阅读 2019-04-24 10:15:41
    1.Java中有两种类型的选择结构的控制语句,分别是if语句和________。 2.在Java JDK1.7之前,switch只能支持byte、short、char、int或者其对应的封装类以及Enum类型。在JDK1.7中又加入了________类型。 3.for循环的...
  • java运算符表达式与语句

    千次阅读 2012-10-31 23:05:56
    System.out.println("输入的成绩有错误"); } if((score) && (score>49)){ System.out.println("成绩不及格准备补考吧!"); } } } “短路与”与“短路或” 典型错误举例九 ...
  • SQL语句

    千次阅读 2012-01-06 18:43:50
    SQL语句大全(转载) --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据定义 CREATE ...
  • python 入门题库————python语句和基础数理

    万次阅读 多人点赞 2018-10-25 15:59:07
    python 入门题库python 题库Python使用符号_______表示注释Python不支持的数据类型有查看python版本的命令是在Python中,print(type(16/4))的结果是什么类型的在Python3中,执行下列语句后的显示结果是执行下列语句...
  • sql语句

    千次阅读 2009-07-24 13:44:00
    SQL语句大全--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据--数据定义CREATE TABLE --创建一个数据库...
  • MySQL查询语句大全集锦

    千次阅读 2018-06-05 13:53:51
    1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql&gt; SHOW DATABASES;2:2、创建一个数据库MYSQLDATAmysql&gt; CREATE DATABASE MYSQLDATA;3:选择你所创建的数据库mysql&gt; USE MYSQLDATA; (按...
  • Hive建表语句详解--CREATE TABLE

    万次阅读 多人点赞 2019-01-09 15:05:00
    要为表指定数据库,请在CREATE TABLE语句之前(在Hive 0.6及更高版本中)发出USE database_name语句,或者使用数据库名称(在Hive 0.7及更高版本中使用“ ” )限定表名。关键字“ ”可用于默认数据库。database_...
  • myBatis动态语句详解

    千次阅读 2016-04-14 23:56:39
    mybatis动态语句
  • SQL语句语法

    千次阅读 2009-10-27 20:26:00
    数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. DROP INDEX语法 13.1.8. ...
  • SQL语句大全

    千次阅读 2009-01-01 20:41:00
    SQL语句大全 SQL语句大全 --语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据--数据定义CREATE ...
  • MySQL常用语句大全

    千次阅读 2015-04-27 14:08:44
    SQL查询语句大全集锦 MYSQL查询语句大全集锦 1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:创建一个数据库MYSQLDATA mysql> CREATE DATABASE MYSQLDATA; 3:选择你所创建的...
  • VB.NET Declare语句

    千次阅读 2015-12-20 13:31:03
    本文向大家介绍VB.NET Declare语句,可能好多人还不了解VB.NET Declare语句,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。  要声明一个DLL过程,首先需要在代码窗口的"通用(General)"部分...
  • SQL查询语句大全集锦

    千次阅读 2018-07-15 11:19:00
    SQL查询语句大全集锦 SQL查询语句大全集锦 MYSQL查询语句大全集锦 1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql&gt; SHOW DATABASES; 2:2、创建一个数据库MYSQLDATA ...
  • sql查询语句大全

    千次阅读 2016-07-14 10:36:55
    SQL查询语句大全集锦 一、 简单查询  简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三...
  • oracle常用sql语句

    万次阅读 热门讨论 2016-08-09 08:53:35
    |-DDL-->Data Definition Language,数据定义语言,用于定义数据的结构,如创建、修改或者删除数据库对象,即主要是对表的操作。 |-DCL-->Data Control Language,数据控制语言,用于定义数据库用户的权限,即主要对...
  • 数据库SQL语句的使用

    千次阅读 2018-09-21 09:54:55
    1、创建SQL语句 DDL语句 MySQL命令行参数: Usage: mysql [OPTIONS] [database] //命令方式 -?, --help //显示帮助信息并退出 -I, --help //显示帮助信息并退出 --auto-rehash //自动补全功能,就像linux里面...
  • if-else语句注意事项

    千次阅读 2014-09-29 14:30:27
    流程控制语句几乎是入门常识,而(if...else)语句算得上是最基本最简单的流程控制语句了。但是,其实(if...else)语句的使用有一些技巧和注意事项,有可能对于那些有数年编程经验的开发人员来说,也未必会注意到。...
  • MYSQL查询语句大全集锦

    千次阅读 2015-11-16 18:01:57
    MYSQL查询语句大全集锦  1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2、创建一个数据库MYSQLDATA mysql> CREATE DATABASE MYSQLDATA; 3:选择你所创建的数据库 ...
  • 13. SQL语句语法

    千次阅读 2011-09-05 14:05:17
    13.1. 数据定义语句 13.1.1. ALTER DATABASE语法13.1.2. ALTER TABLE语法13.1.3. CREATE DATABASE语法13.1.4. CREATE INDEX语法13.1.5. CREATE TABLE语法13.1
  • C#学习之语句、表达式和运算符

    千次阅读 2016-10-06 19:44:12
    语句程序所执行的操作以“语句”表达。 常见操作包括声明变量、赋值、调用方法、循环访问集合,以及根据给定条件分支到一个或另一个代码块。 语句在程序中的执行顺序称为“控制流”或“执行流”。 根据程序对运行时...
  • oracle 常用sql语句

    千次阅读 2017-09-24 20:08:21
    |-DDL-->Data Definition Language,数据定义语言,用于定义数据的结构,如创建、修改或者删除数据库对象,即主要是对表的操作。 |-DCL-->Data Control Language,数据控制语言,用于定义数据库用户的权限,即主要对...
  • 常用的SQL语句

    千次阅读 2006-10-19 22:36:00
    OR 查找数据库的表中的相同记录 一、删除数据库中表的某些相同的某些记录delete from tablename where only_Id not in(select min(only_id) from tablename group by sameName)二、选出相同记录的SQL语句 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,246
精华内容 10,098
关键字:

下列语句定义错误的是double