MySQL命令

MySQL常用命令清单

Posted by Bug1024 on March 7, 2017

创建表

    CREATE TABLE `user_info` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
      `username` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '用户名',
      `real_name` varchar(10) NOT NULL DEFAULT '' COMMENT '真实姓名',
      `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uni_username` (`username`),
      KEY `idx_add_time` (`add_time`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

修改表名

    alter table user_info rename user;

增加字段

    alter table user add column `status` tinyint(2) NOT NULL DEFAULT 0 COMMENT '状态';

修改字段属性

    alter table user modify column `real_name` varchar(50) NOT NULL DEFAULT '' COMMENT '真实姓名';

修改字段名

    alter table user change column add_time create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';

修改索引

    -- 增加索引
    alter table user add index idx_update_time (update_time) ;
    -- 增加唯一索引
    alter table user add unique (column_list) ;
    -- 增加主键
    alter table user add primary key (column_list) ;
    -- 删除索引
    alter table user drop index idx_update_time;
    -- 删除主键
    alter table user drop primary key;

批量插入

    insert into user (username, create_time, status) values(10000, '2017-03-01 12:12:12', 1), (10001, '2017-03-01 12:13:14', 1);

批量更新

    UPDATE user
        SET username = CASE id
            WHEN 1 THEN 3
            WHEN 2 THEN 4
            WHEN 3 THEN 5
            ELSE username
        END,
        status = CASE id
            WHEN 3 THEN 3
            WHEN 4 THEN 4
            ELSE status
        END
    WHERE id IN (1, 2, 3, 4);

批量插入若存在则更新

    insert into user (username, create_time, status) values(10002, '2017-03-01 12:12:12', 1), (10001, '2017-03-01 12:13:14', 2) on duplicate key update status = values(status);

导入导出

    -- 导出某个库
    mysqldump -uroot -proot db_name > db_name.sql
    -- 导出某张表
    mysqldump -uroot -proot db_name table_name > table_name.sql
    -- 导出数据库所有表结构
    mysqldump -uroot -proot db_name  -d --add-drop-table db_name > db.sql
    -- 导入
    mysqldump -uroot -proot < import.sql
    -- 使用source方式导入,source import.sql

强制使用索引

    select username from user force index(idx_update_time) where update_time > '2017-01-01 10:10:11'

join语句

  • INNER JOIN(内连接或等值连接):产生同时符合左表和右表的记录。
  • LEFT JOIN(左连接):左连接从左表产生一套完整的记录,与匹配的记录(右表) ,如果没有匹配,右侧将包含null。
  • RIGHT JOIN(右连接):与LEFT JOIN相反
  • mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL join.

执行顺序

  • FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
  • ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
  • JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
  • WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
  • GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
  • CUBE ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
  • HAVING: 对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。
  • SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
  • DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
  • ORDER BY: 将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10.
  • LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。