mysql

1、创建表(需要 ``)

create table if not exists `tb_topic_examine`(
    `id` nvarchar(50) not null,
    `topic_id` nvarchar(50),
    `person_id` nvarchar(50),
    `person_name` nvarchar(50),
    `sender_id` nvarchar(50),
    `sender_name` nvarchar(50),
    `topic_status` int,
    `content` nvarchar(500),
    `is_through` int COMMENT '0 待审批,1 通过,2  退回,3秘书变更,4 秘书通过,5 撤回,6提交',
    `add_time` nvarchar(50),
    `modify_time` nvarchar(50)    
) COMMENT '议题审核表';

 2、新增字段(在userId字段之后)

#新增参会人员姓名
alter table tb_conference_user add userName nvarchar(50) COMMENT '人员名称' after userId ;
//不为空
alter table tb_topic_file add pngNumberSum int not null default 0 

3、修改某字段类型

ALTER TABLE tb_permission MODIFY COLUMN sorts int

4、修改字段长度

alter table tb_topic_stat modify column case_type varchar(150);

5、插入数据(在某字段最大值基础上加上一个值)

INSERT INTO tb_permission (id, name, nameCode,status, sorts)   
VALUES('qqq2','1111','1112','1',(SELECT max(p.sorts) FROM tb_permission as p)+1)  

错误:You can't specify target table 'tb_permission' for update in FROM clause

原因:不能先select出同一表中的某些值,再update这个表(在同一语句中)。select出的结果再通过中间表select一遍,这样就规避了错误。

UPDATE tb_topic_file 
SET pngNumberSum = (select a.sum from (select SUM(pngNumberSum) as sum from tb_topic_file where topic_id = (select topic_id from tb_topic_file where id = 'cdbdf33f-1b0f-11e9-ad45-54ee75476cc0')) as a )WHERE id = 'cdbdf33f-1b0f-11e9-ad45-54ee75476cc0';

 6、查询一定范围时间内数据

今天  
select * from 表名 where to_days(时间字段名) = to_days(now());  
昨天  
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1  
7天  
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)  
近30天  
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)  
本月  
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )  
上一月  
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1  
#查询本季度数据  
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now());  
#查询上季度数据  
select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));  
#查询本年数据  
select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());

 sql判断语句

  select 
   tvr.topicId,
   tvr.voter,
   tu.name,
   if(tvi.id is null,0,tvi.id) as voteItemId,
   if(tvi.`name` is null,'',tvi.`name`) as voteItemName,
   if(tvr.vote_desc is null,'',tvr.vote_desc) as voteDesc
   from tb_vote_result tvr 
   left join tb_user tu on tvr.voter = tu.id
   left join tb_vote_item tvi on tvr.vote_item_id = tvi.id
   where tvr.topicId = #{_parameter}

索引:

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

创建单个索引:

create index loginName_index on tb_user(loginName);
#或
alter table tb_user add index loginName_index (loginName);

创建联合索引:(多列索引)

create index loginName_name_userLoginNameHY on tb_user (loginName,`name`,userLoginNameHY);
 #或
alter table tb_user add index loginName_name_userLoginNameHY(loginName,`name`,userLoginNameHY);

创建唯一索引:

CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
#或
ALTER table mytable ADD UNIQUE [indexName] (username(length))

显示索引:

Explain SELECT id,name,loginName FROM `tb_user` where loginName = 'XXX'
show index from tb_user;

删除索引:

drop index loginName_name_userLoginNameHY on tb_user;

索引使用总结

索引的三星原则:

  • 索引将查询相关的记录按顺序放在一起则得一星

  • 索引中的数据顺序和查询结果的排序一致则得一星

  • 索引中包含了查询所需要的全部列则得一星

第一个条原则的意思是where条件中查询的顺序和索引是一致的,就是前面说的从左到右使用索引。

索引不是万能的,当数据量巨大时,维护索引本身也是耗费性能的,应该考虑分区分表存储。

limit:

select * from table limit m,n   其中m是指记录开始的index,从0开始,表示第一条记录,n是指从第m+1条开始,取n条。

union:如无必要,一定要用关键字 union all,这样MySQL把数据放到临时表时不会再做唯一性验证

UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,格式如下:

select * from A union all select * from B  //A B数据结构一定要一样
原文地址:https://www.cnblogs.com/lijianda/p/8763395.html