MySQL SQL模板语句

一、建表

create table promotion_price(
id int unsigned not null auto_increment,
promotion_name varchar(128) not null comment '优惠活动名称',
template_id bigint unsigned NOT NULL comment '优惠活动模版id',
product_code varchar(128) NOT NULL comment '优惠产品编码',
channel_code varchar(256) default null comment '渠道编码列表,null表示全部渠道',
group_code varchar(50) NOT NULL comment '分群编码',
category_id int unsigned default null comment '特殊判断:优惠分类表id',
priority int unsigned NOT NULL DEFAULT '0' COMMENT '优惠优先级',
start_time datetime NOT NULL COMMENT '优惠开始时间',
end_time datetime NOT NULL COMMENT '优惠结束时间',
description varchar(512) default null comment '活动描述',
approval_status tinyint not null default 1 comment '审批状态 1:待提交 10:审批中  20:审批完成  30:已驳回',
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
INDEX idx_name (name),
UNIQUE KEY idx_email (email),
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='价格优惠表'

  如:

CREATE TABLE aibox_deduct_detail (
  id bigint unsigned NOT NULL AUTO_INCREMENT,
  should_deduct_date date DEFAULT NULL COMMENT '应该代扣日期',
  contract_id varchar(128) NOT NULL COMMENT '签约id',
  user_id bigint unsigned NOT NULL COMMENT '小米id',
  trigger_deduct_time bigint unsigned NOT NULL DEFAULT '0' COMMENT '发起代扣时间',
  request_deduct_time bigint unsigned NOT NULL DEFAULT '0' COMMENT '请求代扣时间',
  order_id varchar(128) NOT NULL DEFAULT '' COMMENT '订单id',
  deduct_succ tinyint(1) NOT NULL DEFAULT 0 COMMENT '代扣是否成功,1:成功,0:失败',
  deduct_fail_reason varchar(255) NOT NULL DEFAULT '' COMMENT '代扣失败原因',
  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`) USING BTREE,
  INDEX idx_contract_id (contract_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代扣详细信息表';

 

  整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使正数的上限提高一倍。例如TINYINT UNSIGNED可以存储的范围是0~255,而TINYINT的存储范围是-128~127。

  主键用int就足够了,上限为2^31-1 + 2^31 ,约为42亿

 

 field_name varchar(128) not null default '' 的理解:

  当使用insert field_name ,在insert语句中有此字段时,对应插入的值不能为null

  当insert语句中没有指明此字段时,插入行使用默认值

 

时间类型精确到秒的问题:

  datetime 只精确到秒级,毫秒会进行四舍五入

  timestamp 也只精确到秒级,毫秒不会四舍五入,只保留秒

  要精确到3位毫秒,使用 datetime(3)、timestamp(3)

 

  新建表时创建索引

  PRIMARY KEY ( `id` ),
  UNIQUE KEY `index_code` ( `code` ),
  INDEX `index_name` ( `name` ) 

 

 

二、DML

  1、查询重复数据:

select a,b from 数据库 group by a,b having count(*)>1 

  2、不存在插入,存在则更新

  INSERT INTO ... ON DUPLICATE KEY UPDATE语句的示例

# column1有唯一索引
insert into table_name(column1,column2)
values(#{value1},#{value2})
ON DUPLICATE KEY UPDATE
column2=values(column2)

  3、根据关联表的字段更新当前表的字段

update table1 t1
left join table2 t2 on t1.column1=t2.column2
set t1.column_x = t2.column_y
where t1.column=xxx
and t2.column=xxx

# 示例:
update cp_video cv left join cp_media cm on cv.media_id=cm.id set cv.cp_media_id=cm.cp_media_id  where cv.media_id>14530

 

 

三、DDL(data definition language)

  创建索引:

    alter table table_name add index index_name(column_name);

    create index index_name on table_name(column_name);

    唯一索引:

      alter table table_name add unique key uk_idx_name(column1,column2);

      CREATE UNIQUE INDEX uk_idx_name ON table_name(column1,column2);

  删除索引:

    alter table table_name drop index|key 索引名;

    drop index 索引名称 on 表名;

  修改字段类型

    alter table table_name modify column 字段名 类型;

  修改字段长度(也可修改字段类型):

    alter table table_name modify column 字段名 类型(长度);

  修改字段名

    alter table table_name change 旧字段名 新字段名 新数据类型(长度);

  增加表字段:

    alter table table_name add column 字段名 类型(长度);

    删除表字段:

    alter table table_name drop column 字段名;

 

 

 

 

 

一个完整的sql语句结构
select 字段或分组函数
from 表名
[where 筛选条件]
[group by 分组列]
[having 分组筛选条件]
[order by 列];
执行过程如下:
(1)执行where字句,对表数据进行过滤。
(2)将符合条件的数据,用group by 进行分组
(3)分组数据通过having字句进行组函数过滤
(4)结果通过order by 字句进行排序
(5)将结果返回给用户

 

 

END.

posted @ 2021-04-08 11:45  杨岂  阅读(65)  评论(0编辑  收藏  举报