Mysql常见语句/问题总结

一,mysql 数据相关。

   1. 查询数据

       select * from 表名 where 字段名1=? and 字段名2=?

       查询时间最近的数据  select * from 表名 where 时间字段名=(select MAX(时间字段名) from 表名 where 字段名=?)

   2.删除数据

      delete from 表名 where 字段名=?

      删除多条数据  delete from 表名 where 字段名=? or 字段名=? 或者 delete from 表名 where 字段名 in(?,?)

   3. 增加数据

       insert into 表名(字段名1,字段名2) values (?,?)

   4 .更新数据

      update 表名set 字段名1=? where 字段名2=?

      更新时间字段  update 表名set 时间字段名=cast('2020-08-21' as datetime) where 字段名=?

二,mysql 表相关

   1. 创建表

DROP TABLE IF EXISTS `table_name`;
CREATE TABLE `table_name`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `amount` decimal (16,2) DEFAULT NULL COMMENT '金额',
  `date` date  DEFAULT NULL  COMMENT '日期',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '测试表' ROW_FORMAT = Dynamic;

      2. 修改字段默认值

      alter table 表名 alter column 字段名 drop default;       (若本身存在默认值,则先删除)
      alter table 表名 alter column 字段名 set default 默认值;  (若本身不存在则可以直接设定)

   3. 修改表名,表的注释

      修改表名:alter table 旧表名 rename to 新表名;

      修改注释:alter table 表名 comment '修改后的表的注释'

   4. 修改字段的注释
      alter table 表名 modify column 字段名 int comment '修改后的字段注释'
      alter table 表名 modify column 字段名 varchar(128) comment '修改后的字段注释' (注意:字段名和字段类型照写就行)

  5. 修改字段类型
      alter table 表名 modify column 字段名 varchar(50);

   6. 修改字段的名称
      alter table 表名 change 旧字段名 新字段名 新数据类型  (如果数据类型不修改  新的数据类型和原来保持一致即可)

   7.  删除一个字段:
    alter table 表名 drop 字段名;

   8.  清空表
    truncate table 表名;
    delete * from 表名;
        (1) truncate 是整体删除 (速度较快),delete是逐条删除 (速度较慢)
        (2) truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete高的原因
        (3) truncate 不激活trigger (触发器),但是会重置Identity (标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的 ID数。而 delete 删除以后,identity 依旧是接着被删除的最近的那一条记录ID加1后进行记录。如果只需删除表中的部分记录,只能使用 DELETE语句配合 where条件

   9. 添加索引
      (1) 添加PRIMARY KEY(主键索引):
        ALTER TABLE 表名 ADD PRIMARY KEY ( 字段名)

      (2) 添加UNIQUE(唯一索引) :
        ALTER TABLE 表名 ADD UNIQUE ( 字段名)

      (3) 添加INDEX(普通索引) :
         ALTER TABLE 表名 ADD INDEX 索引名( 字段名 )

      (4) 添加FULLTEXT(全文索引) :
         ALTER TABLE 表名 ADD FULLTEXT ( 字段名)

      (5) 添加多列索引:
        ALTER TABLE 表名 ADD INDEX 索引名( 字段名1, 字段名2, 字段名3)

   10. 删除索引
      PRIMARY  KEY(主键索引)       ALTER  TABLE 表名  DROP PRIMARY KEY 
      INDEX(普通索引)或UNIQUE(唯一索引)     ALTER  TABLE  表名  DROP INDEX 索引名    或者    DROP INDEX 索引名 ON 表名

11. 添加 删除主键

        删除主键     alter table 表名  drop primary key;
        增加主键     alter table 表名  add primary key(字段名);
   注:在增加主键之前,必须先把重复的字段名删除掉。

三. 常见问题

   1. 需求,查询出来表中一个或者多个字段 都不重复的数据。

      例如:user表  查询出来 name  age  sex三个字段不完全一样的数据。

idnameagesex
1张三10
2李四11
3王五12
4张三10
5张三12
6王五12

 

select * from user where id not in (select id from user group by  name,age,sex);

这样查询出来为空,正确查询

(1),利用中间表   select * from user where id not in (select id form  (select id from user group by  name,age,sex) na);

(2), 修改查询语句   select id,count(id) as countid from user group by  name,age,sex having countid >1;

2. order by 排序问题,

 当一般排序无法满足需求时,需要我们自定义排序。利用field(字段名称,数据1,数据2,数据3)

 value与数据1、数据2、数据3比较,返回1、2、3,如遇到null或者不在列表中的数据则返回0.

select * from 表名 order by field(字段名称,数据1,数据2,数据3);

正序排序时,如果有字段为空,默认空的字段排在前面,如果需要空的数据排在后面,需要加上:字段 is NULL,字段(select * from 表名 order by 字段 is NULL,字段)

如果想按照A1,A2......A10,A11....A21这样的顺序排序

   

ORDER BY 字段名 REGEXP '^[A-Z]{2}' ASC, 
      IF(字段名 REGEXP '^[A-Z]{2}', LEFT(字段名, 2), LEFT(字段名, 1)), 
      CAST(IF(字段名 REGEXP '^[A-Z]{2}', RIGHT(字段名, LENGTH(字段名) - 2), RIGHT(字段名, LENGTH(字段名) - 1)) AS SIGNED) 

 

或者

ORDER BY   
     CASE WHEN 字段名 REGEXP '^[A-Z]{2}' 
      THEN 1 
      ELSE 0 
     END ASC, 
     CASE WHEN 字段名 REGEXP '^[A-Z]{2}' 
      THEN LEFT(字段名, 2) 
      ELSE LEFT(字段名, 1) 
     END ASC, 
     CASE WHEN 字段名 REGEXP '^[A-Z]{2}' 
      THEN CAST(RIGHT(字段名, LENGTH(字段名) - 2) AS SIGNED) 
      ELSE CAST(RIGHT(字段名, LENGTH(字段名) - 1) AS SIGNED) 
     END ASC 

3. datetime精确到天时间查询问题

   (1) select * from table where company_id=? and to_days(create_time)>=to_days(?) and to_days(create_time)<=to_days(?)

当create_time字段有索引时会导致索引失效

优化:select * from table where company_id=? and create_time>=? and create_time<=DATE_FORMAT(DATE_ADD(?,INTERVAL 1 DAY),'%Y-%m-%d')

 (2)如果有统计的需求,精确到日时,可以使用cast() 函数或者 date_format()

SELECT cast(`create_time` AS date) as date ,COUNT(*) FROM  table GROUP BY cast(`create_time` AS date) ORDER BY date DESC 

或者:SELECT  date_format(`create_time`,'%Y-%m-%d') as date ,COUNT(*) FROM table GROUP BY date_format(`create_time`,'%Y-%m-%d') ORDER BY date DESC 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值