zoukankan      html  css  js  c++  java
  • MySQL进阶

    小知识:

    G 放到sql语句后,可以使每个字段打印到单独的行,如:

    mysql> select * from user_msg limit 2 G;

    一、增加删除表字段的ALTER命令:

    ALTER TABLE tbl DROP name;            #删除name字段
    ALTER TABLE tbl ADD name INT FIRST;   #首部添加name字段
    ALTER TABLE tbl DROP name;
    ALTER TABLE tbl ADD name INT AFTER age;  #age的后面添加name字段

    修改字段类型及名称:

    如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

    例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

    ALTER TABLE testalter_tbl MODIFY c CHAR(10);

    使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:

    ALTER TABLE testalter_tbl CHANGE i j BIGINT;
    ALTER TABLE testalter_tbl CHANGE j j INT;

    修改字段默认值:

    ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

    修改表名

    如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。

    尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

    ALTER TABLE testalter_tbl RENAME TO alter_tbl;

    二、MySQL 索引

    索引分单列索引和组合索引。

    单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

    缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。

    因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 建立索引会占用磁盘空间的索引文件。

    普通索引

    创建索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    CREATE INDEX indexName ON mytable(username(length));

    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

    修改表结构

    ALTER mytable ADD INDEX [indexName] ON (username(length))

    创建表的时候直接指定

    CREATE TABLE mytable(  
     
    ID INT NOT NULL,   
     
    username VARCHAR(16) NOT NULL,  
     
    INDEX [indexName] (username(length))  
     
    );

    删除索引的语法

    DROP INDEX [indexName] ON mytable;

    唯一索引:

     UNIQUE关键字修饰。

    三、MySQL 临时表

    使用TEMPORARY修饰表名;

    当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 临时表。

    如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。

    使用 DROP TABLE 命令可以手动删除临时表。

    四、MySQL 复制表(重要)

    SHOW CREATE TABLE tbl G;  #打印创建表tb1的全过程

    //手动复制一遍,改个表名,tb2,就复制了tb1的数据结构;(理解错误。。。mark一下)

    //已经显示出创建tb1的代码过程了,将表明由tb1改为tb2就可以了。。。然后如下复制数据:

    复制数据:

     INSERT INTO tb2 (runoob_id,
                      runoob_title,
                      runoob_author,
                      submission_date)
     SELECT runoob_id,runoob_title,
     runoob_author,submission_date
     FROM tbl;    

    五、MySQL 序列

    CREATE TABLE insect
      (
       id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,   #默认从1开始
       PRIMARY KEY (id),
       name VARCHAR(30) NOT NULL,                       # type of insect
       date DATE NOT NULL,                              # date collected
       origin VARCHAR(30) NOT NULL                      # where collected
    );
    ALTER TABLE insect AUTO_INCREMENT = 100;

    重置序列

    如果你删除了数据表中的多条记录,并希望对剩下数据的AUTO_INCREMENT列进行重新排列,那么你可以通过删除自增的列,然后重新添加来实现。 不过该操作要非常小心,如果在删除的同时又有新记录添加,有可能会出现数据混乱。操作如下所示:

     ALTER TABLE insect DROP id;
     ALTER TABLE insect
     ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
     ADD PRIMARY KEY (id);

    六、MySQL 处理重复数据

    主键不能为空,NOT NULL限制;通过主键的唯一性,在创建表时进行控制;

    CREATE TABLE person_tbl
    (
       first_name CHAR(20) NOT NULL,
       last_name CHAR(20) NOT NULL,
       sex CHAR(10),
       PRIMARY KEY (last_name, first_name)
    );

    插入时控制:

    INSERT IGNORE INTO与INSERT INTO的区别:

    INSERT IGNORE INTO:如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。

    统计重复数据

    以下我们将统计表中 first_name 和 last_name的重复记录数:

    SELECT COUNT(*) as repetitions, last_name, first_name
    FROM person_tbl
    GROUP BY last_name, first_name
    HAVING repetitions > 1;

    过滤重复数据

    如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

    SELECT DISTINCT last_name, first_name            #注意:last_name和first_name作为一个整体使用的DISTINCT。效果同下GROUP BY:
    FROM person_tbl
    ORDER BY last_name;

    你也可以使用 GROUP BY 来读取数据表中不重复的数据:

    SELECT last_name, first_name
    FROM person_tbl
    GROUP BY (last_name, first_name);

    删除重复数据

    如果你想删除数据表中的重复数据,你可以使用以下的SQL语句:

      CREATE TABLE tmp SELECT last_name, first_name, sex   #间接创建表的方法
                       FROM person_tbl;
                       GROUP BY (last_name, first_name);  
      DROP TABLE person_tbl;
      ALTER TABLE tmp RENAME TO person_tbl;

    七、MySQL 导出(入)数据

    为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE 

    SELECT * FROM tb1 INTO OUTFILE '/tem/tutorials.txt';

    你可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:

     SELECT * FROM tb1 INTO OUTFILE '/tmp/tutorials.txt'
              FIELDS TERMINATED BY ',' ENCLOSED BY '"'
              LINES TERMINATED BY '
    ';

    #每项用 , 分割   用 " 包裹   行结束符为:' ' ;

    #注意:

    SELECT ... INTO OUTFILE 语句有以下属性:

    • LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。
    • SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
    • 输出不能是一个已存在的文件。防止文件数据被篡改
    • 需要有一个登陆服务器的账号来检索文件。否则 SELECT ... INTO OUTFILE 不会起任何作用。
    • 在UNIX中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除

    导出SQL格式的数据

    导出SQL格式的数据到指定文件,如下所示:

    mysqldump -u root -p database1 tbl > dump.txt
    password ******

    #以上为从数据库database1的表tb1导出到dump.txt;

    #导出整个数据库,不加tb1即可;

    #备份所有数据库:

    mysqldump -u root -p --all-databases > database_dump.txt
    password ******

    使用 LOAD DATA 导入数据

    MySQL 中提供了LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。

    LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

    如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

       LOAD DATA LOCAL INFILE 'dump.txt' 
       INTO TABLE mytbl (b, c, a);

    #如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。

    mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

     mysqlimport -u root -p --local --columns=b,c,a  --fields-terminated-by=":"  --lines-terminated-by="
    "  database_name dump.txt
    password *****
  • 相关阅读:
    1.1 Introduction中 Apache Kafka™ is a distributed streaming platform. What exactly does that mean?(官网剖析)(博主推荐)
    Android 涂鸦最佳实践
    使用 stvd 编译STM8S 时能看到使用RAM ROM大小的方法
    【四】注入框架RoboGuice使用:(Your First System Service Injection)
    让演示样例代码在手机上换行显示
    归并排序算法
    HDU 1573 X问题 中国剩余定理
    【leetcode】6. ZigZag Conversion
    sdfs
    翻转句子中单词的顺序 C语言
  • 原文地址:https://www.cnblogs.com/Lunais/p/5808611.html
Copyright © 2011-2022 走看看