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数据结构一定要一样