逍遥山人的MySQL使用笔记,持续更新中

表结构

  • 新建表以及添加表和字段的注释

    create table t_user(
    ID INT(11) primary key auto_increment comment '主键',
    NAME VARCHAR(255) comment '姓名',
    CREATE_TIME date comment '创建时间'
    )comment = '用户信息表';
  • 修改字段类型

    alter table tablename modify column column_name varchar(30);
  • 查看表结构

    查看表的字段、字段类型、索引等

    DESC tablename;

    SHOW COLUMNS FROM tablename;

    或包含字符集、字段注释等

    SHOW FULL FIELDS from table_name;
  • 查看表生成的DDL

    注意表名不加单引号

    show create table 表名;
  • 查看分区表的分区情况

    SELECT
    partition_name part,
    partition_expression expr,
    partition_description descr,
    table_rows
    FROM
    information_schema.PARTITIONS
    WHERE
    table_schema = SCHEMA()
    AND table_name = 'table_name';

    分区操作参考:http://blog.csdn.net/youzhouliu/article/details/52757043

注释

  • 修改表/字段的注释

    alter table t_user comment  = '修改后的表注释信息(用户信息表)';
  • 修改字段注释

    alter table t_user modify column id int comment '主键ID';
  • 查看所有表的注释

    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;
  • 查询某表的所有字段的注释

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

    或者

    show full columns from 表名;

索引

  • 创建索引

    • ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引

      ALTER TABLE table_name ADD INDEX index_name (column_list);
      ALTER TABLE table_name ADD UNIQUE (column_list);
      ALTER TABLE table_name ADD PRIMARY KEY (column_list);
    • CREATE INDEX可对表增加普通索引或UNIQUE索引

      CREATE INDEX index_name ON table_name (column_list);
      CREATE UNIQUE INDEX index_name ON table_name (column_list);

      table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义。

      另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

  • 删除索引

    DROP INDEX index_name ON talbe_name
    ALTER TABLE table_name DROP INDEX index_name
    ALTER TABLE table_name DROP PRIMARY KEY

    前两条相同,第三条在主键时用;

  • 查看表的索引

    • 查看表所有索引的具体情况

      SHOW KEYS FROM tablename;
      SHOW INDEX FROM tablename;

      注释:

      Table 表的名称。

      Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。

      Key_name 索引的名称。

      Seq_in_index 索引中的列序列号,从1开始。

      Column_name 列名称。

      Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

      Cardinality 索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

      Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

      Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。

      Null 如果列含有NULL,则含有YES。如果没有,则该列含有NO。

      Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

    • 查看某一个库下某一张表的索引

      SELECT DISTINCT
      lower(index_name) index_name,
      lower(index_type) type
      FROM
      information_schema.statistics
      WHERE
      table_schema = 'employees' AND table_name = 'employees';
    • 查看某一个库下某一张表的某一个索引

      SELECT
      lower(column_name) column_name,
      seq_in_index column_position
      FROM
      information_schema.statistics
      WHERE
      table_schema = 'employees' AND table_name = 'employees' AND index_name = 'primary';

连接

  • 交叉连接(CROSS JOIN)

    使用交叉连接的时候,结果集由第一个表的所有行与第二个表的所有行的结合,表之间不需要关系;

    可用于在统计中构造连续的数据,比如统计每天/周/月的(交易等)数据,为使每天/周/月都有数据,可用交叉连接的方式构造数据;

    使用形式如下:

    SELECT  *
    FROM T1
    CROSS JOIN T2;

日期或时间操作

  • 格式化(date_format)

    定义

    DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。

    语法

    DATE_FORMAT(date,format)

    date 参数是合法的日期。format 规定日期/时间的输出格式。

    可以使用的格式有:

    模式 描述
    %a 缩写星期名
    %b 缩写月名
    %c 月,数值
    %D 带有英文前缀的月中的天
    %d 月的天,数值(00-31)
    %e 月的天,数值(0-31)
    %f 微秒
    %H 小时 (00-23)
    %h 小时 (01-12)
    %I 小时 (01-12)
    %i 分钟,数值(00-59)
    %j 年的天 (001-366)
    %k 小时 (0-23)
    %l 小时 (1-12)
    %M 月名
    %m 月,数值(00-12)
    %p AM 或 PM
    %r 时间,12-小时(hh:mm:ss AM 或 PM)
    %S 秒(00-59)
    %s 秒(00-59)
    %T 时间, 24-小时 (hh:mm:ss)
    %U 周 (00-53) 星期日是一周的第一天
    %u 周 (00-53) 星期一是一周的第一天
    %V 周 (01-53) 星期日是一周的第一天,与 %X 使用
    %v 周 (01-53) 星期一是一周的第一天,与 %x 使用
    %W 星期名
    %w 周的天 (0=星期日, 6=星期六)
    %X 年,其中的星期日是周的第一天,4 位,与 %V 使用
    %x 年,其中的星期一是周的第一天,4 位,与 %v 使用
    %Y 年,4 位
    %y 年,2 位

    示例:

    SELECT date_format(CURDATE(), '%Y-%m-%d %h:%m:%s');
    SELECT date_format(CURDATE(), '%Y/%m/%d');
    SELECT STR_TO_DATE('2016-08-08', '%Y-%m-%d %h:%m:%s');
    SELECT DATE_FORMAT(NOW(),'%Y%m%d');
  • 毫秒数与日期转化

    -- 毫秒数转化为日期
    select FROM_UNIXTIME(1364176514656/1000,'%Y-%m-%d %h:%i:%s') as dt;
    -- 日期转化为毫秒数
    select UNIX_TIMESTAMP('2011-05-31 23:59:59');

正则表达式(regexp)

  • 操作符

    模式 描述
    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置
    $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置
    . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式
    [...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'
    [^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'
    p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"
    * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}
    + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}
    {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o
    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次
  • 实例

    • 匹配连续数字

      SELECT * FROM ofchatlog a WHERE a.`sender` REGEXP 'jf[0-9]{5}' LIMIT 10;
    • 匹配三个字符串(或的关系)

      SELECT *
      FROM ofchatlog a
      WHERE a.sender REGEXP 'xx1|xx2|xx3';
    • 不匹配(包含)

      not regexp 'xxx'

实现开窗函数

类似Oracle和SqlServer的 函数名(列) OVER(选项)

  • 分组排序功能

    类似格式row_number() over(partition by )

    示例1:

    create table heyf_t10 (empid int ,deptid int ,salary decimal(10,2) );
    
    select empid,deptid,salary,rank
    from (
    select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1,
    if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,
    @pdept:=heyf_tmp.deptid
    from (
    select empid,deptid,salary
    from heyf_t10
    order by deptid asc ,salary desc
    ) heyf_tmp ,(select @rownum := 0 , @pdept := null ,@rank := 0) a
    ) result;

    示例2:

    SELECT
    -- rownum 判断@sp_id 是否与当前的sp_id一致,一致加1,否则重置为1
    IF(@sp_id = a.sp_id,@i := @i + 1,@i := 1) rownum
    ,a.*
    -- 设置@sp_id 等于上一个 sp_id
    ,(@sp_id := a.sp_id)
    FROM jf_sp_contact a,(SELECT @i := 0,@sp_id := 0) AS b
    WHERE a.sp_id = 3334

    注意:示例1生效,而示例2无效,原因是该逻辑是针对按规则进行排序的数据进行标识;

过程,作业和触发器

  • 查询作业

    SELECT a.name,b.command
    FROM msdb.dbo.sysjobs a
    INNER JOIN msdb.dbo.sysjobsteps b ON a.job_id = b.job_id
    WHERE b.command LIKE '%P_GZ_HeavyPaste_UpOrder%';
  • 查询过程

    SELECT a.name,b.text
    FROM sys.objects a
    INNER JOIN sys.syscomments b ON a.object_id = b.id
    WHERE a.type = 'P' AND b.text LIKE '%T_SEM_PostSnap%';
  • 查询触发器

    SELECT * FROM sys.objects WHERE TYPE = 'tr';
  • 查询视图

    SELECT * FROM sysobjects WHERE xtype='V';

  • 查看库、表、字段等

    • 查看所有的库

      SHOW DATABASES;

      或者使用系统表,除库名外还能得到数据库配置信息

      SELECT
      lower(schema_name) schema_name
      FROM
      information_schema.schemata
      WHERE
      schema_name NOT IN (
      'mysql',
      'information_schema',
      'test',
      'search',
      'tbsearch',
      'sbtest',
      'dev_ddl'
      );
    • 创建或删除库

      创建库

      -- 按照默认的字符集和排序规则创建数据库
      CREATE DATABASE test1;
      -- 指定字符集和排序规则
      CREATE DATABASE test1 CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
      -- 创建数据库时如果已存在会报错,避免报错可以先判断是否存在
      CCREATE DATABASE IF NOT EXISTS test1;

      删除库

      DROP DATABASE test;
    • 查看某一个库中的所有表

      SELECT
      table_name,
      create_time updated_at,
      table_type,
      ENGINE,
      table_rows num_rows,
      table_comment,
      ceil(data_length / 1024 / 1024) store_capacity
      FROM
      information_schema.TABLES
      WHERE
      table_schema = 'employees' AND table_name NOT LIKE 'tmp#_%' ESCAPE '#';
    • 查看某一个库下某一个表的所有字段

      SELECT
      lower(column_name) column_name,
      ordinal_position position,
      column_default dafault_value,
      substring(is_nullable, 1, 1) nullable,
      column_type data_type,
      column_comment,
      character_maximum_length data_length,
      numeric_precision data_precision,
      numeric_scale data_scale
      FROM
      information_schema.COLUMNS
      WHERE
      table_schema = 'employees' AND table_name = 'employees';
    • 判断库中是否存在包含status的表

      SELECT table_name FROM information_schema.TABLES WHERE table_name LIKE '%status%';
    • 判断库中是否存在包含order的存储过程

      SELECT * FROM information_schema.ROUTINES a WHERE a.SPECIFIC_NAME LIKE '%order%';
    • 查看服务器版本;

      show variables;

优化分析

  • 分析查询语句的执行计划
EXPLAIN
SELECT * FROM tablename LIMIT 10;
  • 表结构优化建议
select column from table_name procedure analyse();
  • 强制使用某索引

    FORCE INDEX(索引名)
  • 查询是否有表被锁

    show OPEN TABLES where In_use > 0;

MySQL日常使用笔记的更多相关文章

  1. Hive Sql的日常使用笔记

    date: 2019-03-22 17:02:37 updated: 2020-04-08 16:00:00 Hive Sql的日常使用笔记 1. distinct 和 group by distin ...

  2. 《高性能MySQL》读书笔记--锁、事务、隔离级别 转

    1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进 ...

  3. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. MySQL日常应用和操作记录

    整理MySQL日常操作. 1.知道一个字段名,怎样查到它在数据库里的哪张表里? USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE ...

  7. mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量

    继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...

  8. mysql颠覆实战笔记(四)--商品系统设计(一):商品主表设计

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  9. mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

随机推荐

  1. 【代码审计】XDCMS 报错注入

    审计的都是之前很老的一些的CMS,把学习的过程分享出来,如果有正在和我一起学习的兄弟们,希望看到文章之后会有所收获 ------------------------------------------ ...

  2. Spring Boot 学习前你应该知道的 Maven 知识

    Maven 是什么? 回答这个问题,我们先来了解下没有Maven,我们是怎么使用开发者工具IDE去开发Java程序的.我之前开发Java程序不多,但是我还是记得,我是从网上下载或从合作方拷贝 jar ...

  3. matplotlib学习(1)

    1.基本学习(1)1.1 代码: import matplotlib.pyplot as plt import numpy as np x=np.linspace(-1,1,50) #从-1到1,共5 ...

  4. Vue父组件主动获取子组件的数据和方法

    Vue父组件主动获取子组件的数据和方法 https://www.jianshu.com/p/bf88fc809131

  5. LeetCode中等题(三)

    题目一: 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m ...

  6. [原]Greenplum failed segment的恢复方法

    当在使用greenplum过程中有不当的操作时,可能会出现segment节点宕掉的情况(比如在greenplum运行的过程中停掉其中几台segment节点的服务器),通过下面的方法可以恢复segmen ...

  7. Linux 命令中 find 和 xargs 命令的用法

    find 命令(一) find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作.Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大. ...

  8. Centos 下安装php

    1 从php 官网下载源安装包 http://php.net/downloads.php // 安装php 扩展 2 yum install libxml2 libxml2-devel openssl ...

  9. 概念 - 抖脚(Fidgeting)

    参考 https://cn.nytimes.com/health/20161220/why-fidgeting-is-good-medicine/dual/ https://baike.baidu.c ...

  10. CSS - 表格细线边框

    通过 border-collapse: collapse cellpadding="0", cellspacing= "0" 实现 <!DOCTYPE h ...