美文网首页
mysql常用语法分享

mysql常用语法分享

作者: nathan水月白 | 来源:发表于2018-11-21 20:26 被阅读0次

    最后更新时间: 2018-11-21 ,本文持续更新,每次调整会更新此处时间。

    写在阅读前:技术文章是具有有效期的,在当下版本的软件可用,不代表未来技术更新迭代后还可以继续使用,比如一个版本的代码在另一个版本里面就不可用了,需要做些改造。使用时请以怀疑谨慎的态度对待一切,这一点是在看任何文章时都需要注意的。

    目录

    • mysql常用语法
      • 数据库操作
        • 查询所有表名
        • 查询所有表和表注释
        • 查询所有表及字段的属性信息(字段名/注释/字段类型/字段约束等)
        • 查询某个表字段的属性信息(字段名/注释/字段类型/字段约束等)
        • 查询数据库空间占用情况
      • DDL
        • 查看建表时的DDL
        • 创建表
        • 修改表注释
        • 修改字段注释
        • 增加列
        • 更改字段类型
        • 修改字段名
        • 索引
      • 表数据操作
        • 删除表数据/清理表空间
      • 函数操作
        • 时间函数
      • 进程,锁 操作
        • 查看进程,查看锁情况
        • kill进程
      • DML
        • 插入语句 insert into
      • 常用场景
        • 查看表中的重复数据

    正文

    mysql常用语法

    这里记录一些常用的sql语法,包括一些使用频率比较高的,方便随时查询使用。

    数据库操作

    查询所有表名
    show tables;
    
    查询所有表和表注释
    select 
        table_name 表名,
        table_comment 表注释
    from information_schema.tables
    where 
        table_schema='数据库名'
    order by table_name
    ;
    
    查询所有表及字段的属性信息(字段名/注释/字段类型/字段约束等)
    select
        a.table_name 表名,
        a.table_comment 表注释,
        b.column_name 字段名,
        b.column_comment 字段注释,
        b.column_type 字段类型,
        b.column_key 约束
    from information_schema.tables a
    left join information_schema.columns b on a.table_name = b.table_name
    where
        a.table_schema = '数据库名'
    order by
        a.table_name
    ;
    
    查询某个表字段的属性信息(字段名/注释/字段类型/字段约束等)

    这一步就是在上面的查询中加入表名的条件,限定到具体的表。同时因为是单个表的,所以上面代码中的information_schema.tables 就有些冗余了,需要删除掉。结果如下:

    select 
        column_name 字段名,
        column_comment 字段说明,
        column_type 字段类型,
        column_key 约束
    from information_schema.columns
    where 
        table_schema='数据库名'
    and table_name='表名' 
    ;
    

    或者用下面的语句,得到表的所有字段属性。

    show full columns from 表名;
    

    可以看出数据库的这些元数据信息都是存放在 information_schema 中,可以通过研究这个表自己发现更多有用的内容。

    查询数据库空间占用情况

    查询所有数据的大小

    select concat(round(sum(DATA_LENGTH/1024/1024), 2),'MB')
    as data from information_schema.tables;
    

    这里是以MB的形式展现,也可以改为其他需要的形式展现。

    查看指定数据库实例的大小,比如说数据库 testdb

    select concat(round(sum(DATA_LENGTH/1024/1024), 2),'MB') as data,
      concat(round(sum(DATA_LENGTH/1024/1024/1024), 2),'GB') as data
    from information_schema.tables where table_schema='testdb';
    

    查看指定数据库的表的大小,比如说数据库 testdb 中的 table1 表

    select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB')as data
    from information_schema.tables where table_schema='testdb'
    and table_name='table1';
    

    查看每个表的空间大小,按照数据量排序

    select
      t.table_name,t.data,t.data1
    from
    (
    select
    a.table_name
    ,round(a.DATA_LENGTH/1024/1024, 2)as data
    ,concat(round(sum(a.DATA_LENGTH/1024/1024), 2),'MB') as data1
    from information_schema.tables a
    where a.table_schema='testdb'
    group by a.table_name
    )t
    order by t.data desc
    ;
    

    DDL

    查看建表时的DDL
    show create table 表名;
    

    表名不需要加单引号,加了会报错。

    创建表

    一种通用示例如下:

    create table if not exists tb1
    (
        id bigint(20) not null auto_increment comment '主键',
        column1 bigint(20) not null default '0' comment '业务字段1',
        is_delete tinyint(1) unsigned not null default '0' comment '是否删除 0:正常 1:已删除',
        create_time timestamp not null default current_timestamp comment '创建时间',
        update_time timestamp not null default current_timestamp on update current_timestamp comment '更新时间',
        PRIMARY KEY (`id`),
        KEY `idx_is_delete` (`is_delete`) USING BTREE COMMENT '是否删除索引',
        KEY `idx_create_time` (`create_time`) USING BTREE COMMENT '创建时间索引',
        KEY `idx_update_time` (`update_time`) USING BTREE COMMENT '更新时间索引'
    )comment  = 'tb1注释'
    ;
    

    注意 id,is_delete,create_time,update_time 这四个字段是必须要加的。具体意义如下:
    id 表的唯一主键,也是自增主键,确定数据的唯一性,同时也能表示一种顺序;
    is_delete 是否删除字段,当删除数据时,将is_delete置为1,达到逻辑删除的效果。这样能完美的保存历史数据;同时当需要查询历史时,也能查看到历史数据;
    create_time 标志着数据的创建时间,是时间上的一个起点;
    update_time 标志着数据的最后更新时间,代表着时间上一个终点;同时还有一个用途,当每一份数据变更都存入数据仓库时,通过update_time便可以描绘出数据的完整生命周期。

    修改表注释
    alter table tb1 comment = '修改后的表注释信息';
    
    修改字段注释
    alter table tb1 modify column1 id int comment '主键ID';
    
    增加列
    alter table testtable add type bigint not null default 0 comment '类型' after id;
    
    
    更改字段类型
    alter table tb1 modify column1 double;
    
    修改字段名
    alter table tb1 change column1 column2 int; 
    

    要指定新字段名及类型

    或者采用下面的方式,同时修改字段类型、类型长度、默认值、注释等,或者修改单一元素,都是可选的。

    alter  table tb1 modify column 字段名 数据类型 类型长度  默认值  注释; 
    alter  table table1 modify  column column1 bigint default '0' comment '测试注释'; 
    

    其中column1 是测试字段.

    索引

    查询表的现有索引

    show index from table1;
    

    增加索引(非唯一索引,只是作为提升查询性能使用)

    alter table testtable add index idx_dt_date (`dt_date`) ;
    ---- 有时上面的无法添加,可使用下面的语句进行增加:
    CREATE INDEX idx_update_time ON testtable (update_time);
    

    也可以在建表时在主键后追加索引,这部分参照上面的建表语句。

    增加主键id,设置自增主键

    alter table tb add primary key(id);
    alter table tb change id id int(10) not null auto_increment=1;
    

    删除自增长的主键id

    需要先删除自增长,再删除主键

    alter table tb change id id int(10);//删除自增长
    alter table tb drop primary key;//删除主建
    

    表数据操作

    删除表数据/清理表空间

    如果是小表,可以下面语句直接操作:

    # truncate table tb1;    -- 清空小表
    

    truncate 是全表清空命令,truncate 和 delete 的细节区别后面会另外文档单独描述。

    如果是大表需要分批删除(具体原因后面会讲到),下面以一个有时间字段dt为逻辑分区的表为例:

    # select distinct dt from tb1; -- 查看分区
    # select count(1) from tb1 where dt >= 201700101 and dt <20180101  ;  -- 查看数据量
    
    -- 下面是大表分阶段删除
    # delete from tb1 where dt >= 20160101 and dt <20170101;
    # delete from tb1 where dt >= 20170101 and dt <20180101;
    # delete from tb1 where dt >= 20180101 ;
    *
    

    表删除数据是需要时间的,不论是truncate还是delete,如果数据很大时,删除操作会造成数据库负载过高,直接卡住,导致其他任务无法进行。所以需要控制下删除的数据量。
    此处以一年的数据为一次删除的量,这个量根据自己的数据库能力去测试选择,具体原则是以能够短时间内(eg: 3秒)迅速执行结束为标准划分,不影响数据库其他操作。

    删除某段时间之前的数据:

    -- 以删除七天之前的数据为例,即删除掉创建时间或者更新时间都不在近7天内的数据
    delete from tb1
    where create_time < date_sub(date_format(${dtparameter},'%Y-%m-%d 00:00:00'),interval 7 day)
    or update_time < date_sub(date_format(${dtparameter},'%Y-%m-%d 00:00:00'),interval 7 day)
    ;
    

    其中 ${dtparameter} 为时间参数,可以通过传参实现动态清理数据。

    函数操作

    时间函数

    时间函数 yyyymmdd格式使用

    select * from table1 where date_format(create_time,'%Y%m%d') >= str_to_date(20170101,'%Y%m%d')
    

    时间减法

    date_sub(date_format('20180101','%Y-%m-%d 00:00:00'),interval 7 day) 
    

    对应的是20180101之前7天内的日期,将20180101换成参数的时候,就可以动态取近7天的数据。

    时间比较

     date_format(dtdate1,'%Y%m%d') <= date_sub(date_format(${dtdate2},'%Y-%m-%d),interval 90 day)
    

    小于90天之前的日期

    进程,锁 操作

    查看进程,查看锁情况
    show processlist;
    

    或者下面的形式查看

    select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx;
    

    锁排查

    SELECT  
          ifnull(trx_id, 'null'),  
        ifnull(trx_state,'null'),  
          ifnull(trx_started,'null'),  
        ifnull(trx_wait_started,'null'),  
        ifnull(trx_weight,'null'),  
        ifnull(trx_mysql_thread_id,'null'),  
        ifnull(trx_query,'null'),  
        ifnull(trx_operation_state,'null'),  
        ifnull(TRX_TABLES_IN_USE,'null'),  
        ifnull(trx_rows_locked,'null'),  
        ifnull(trx_rows_modified,'null'),  
        ifnull(trx_tables_locked,'null')  
    FROM  
        information_schema.innodb_trx;
    
    kill进程
    kill 554297054;  -- 554297054是进程ID
    
    

    DML

    插入语句 insert into

    手动插入数据

    单条插入

    insert into  table1 (id, type,name)
               VALUES
                 (10,1,'测试1');
    

    多条插入

    insert into  table1 (id, type,name)
               VALUES
                 (10,1,'测试1');
                 (11,2,'测试2');
    

    常用场景

    查看表中的重复数据

    下面是个判断重复数据的示例

    这里biz_id,biz_name,type是业务联合主键,三者确定唯一性。
    1.对比总数,检测是否有重复值
    select count(1),count(distinct biz_id,biz_name,type) from table1;
    2.查询具体的重复数据id;
    select  biz_id,biz_name,type,count(1) as cn  
    from table1
    group by biz_id,biz_name,type
    having cn > 1
    3.根据重复数据id 查询重复数据详情,判断重复原因。
    select * from table1
    where biz_id = 1  and biz_name = 2 and type = 1 ;
     ;
    

    到此结束 this is end.

    相关文章

      网友评论

          本文标题:mysql常用语法分享

          本文链接:https://www.haomeiwen.com/subject/ekfhqqtx.html