semi replication//待定
mysql在5.5.3版本增加了utf8mb4字符集,mb4的含义是most byte 4,即最大4个字节,专门用来兼容4个字节的unicode,utf8mb4是utf8的超集,基本上除了将编码方式改为utf8mb4之外,不需要做其他转换。那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等(utf8的缺点)。
校对会对
show collation;//显示所有可用的校对以及适用的字符集,有的字符集不止一个校对
show character set;//显示所有可用的字符集、描述,以及默认的校对
注意:
1、校对可以对order by的子句检索出来的数据在排序上会有影响,collate 除了可以在order by 子句中使用外,还可以用于 group by、having、聚集函数、别名等
2、如果指定CHARACTER SET 和COLLATE 两者,则使用这些值
3、如果只指定character set ,则使用此字符集及其默认的校对(也就是 show character set 结果中显示的)
4、如果既不指定character set 也不指定 collater 则使用数据库默认
5、在不区分大小写的表上进行区分大小写搜索可以,反之也可以
6、如果觉得需要可以使用 Cast() 或 Convert() 函数,将 串 与字符集进行转换
-- 对一个表以及一个特定的列指定了character set 和 collate
mysql> create table obgestu.obge_table
-> (
-> columns int,
-> column1 varchar(10),
-> column2 varchar(10) character set utf8 collate utf8_general_ci
-> )default character set hebrew collate hebrew_general_ci;
set FOREIGN_KEY_CHECKS=0; //取消外键约束
set FOREIGN_KEY_CHECKS=1; //
如果表与表之间有外键约束,则无法删除或者修改表字段,解决办法是可以通过取消外键约束,将越来的表数据导出到sql语句,然后重新建表,然后将表数据通过sql脚本导入到新表中。
建立新表
一般建立新表的时候,在建表语句之前需要删除旧表,不管旧表存不存在。
DROP TABLE IF EXISTS 'xx旧表';
explain命令
查看sql查询的执行过程
优化表结构辅助分析语句
procedure analyse();//TODO
https://blog.csdn.net/lili625/article/details/80252420
select @rowNum:=@rowNum+1 as row,a.* from teacher a,(select @rowNum:=0)b;//可以显示所有记录
1.timestamp类型的字段必须要有默认值,不能default null
now()=current_timestamp=current_timestamp() curdate()=current_date=current_date()
dayName(date)指定时间的名称 例如星期三, 类似函数monthname
weekofyear(curdate())本周是今年的第几周, 类似的函数dayofyear(date)1-365
quarter(date)本季度是今年的第几季度
hour(time),second(time),minute(time)指定时间的时分秒
extract(unit from date)抽取指定时间的时间单位,unit包括SECOND ,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,YEAR等
coalesce(a,b,c)或者coalesce(a,b) 返回第一个非null的字段
查询今天的数据
select * from table where to_days(column_time_field)=to_days(now())
查询昨天的数据
select * from table where to_days(column_time_field)-to_days(now())<=1
查询近7天的数据
select * from table where date_sub(now(),internal 7 DAY)<=date(CURDATE())
查询本周的数据
select * from table where YEARWEEK(date_format(column_time_field,"%Y-%m-%d"))=YEARWEEK(now())
查询本月的数据
select * from table where date_format(column_time_field,"%Y%m")=date_format(CURDATE(),"%Y%m")
.查询上一个月的数据
select * from table where period_diff(date_format(now(),"%Y%m"),date_format(column_time_field,"%Y%m"))=1
查询本季度的数据
select * from table where QUARIER(column_time_field)=QUARIER(now())
查询上个季度的数据
select * from table where QUARIER(column_time_field)=QUARIER(date_sub(now()) , internal 1 QUARIER)
查询本年度的数据
select * from table where YEAR(column_time_field)=YEAR(now())
查询上个年度的数据
select * from table where YEAR(column_time_field)=YEAR(DATA_SUB(now(), internal 1 YEAR))
此语句语法如下:
INSERT INTO tablename(field1,field2, field3, ...)
VALUES(value1, value2, value3, ...)
ON DUPLICATEKEY UPDATE field1=value1,field2=value2, field3=value3, ...;
当我们数据库表中含有unique key或者primary key,并且我们往往会在 数据库中插入一条已有相同key的数据的时候,此时使用on duplicate key update语句,就会产生如下效果:
如果数据库表中没有此相同key的数据,就会插入,如果有则更新某些字段的数据。
insert ignore into表示:会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过当前插入的这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
replace into的语法如下:
insert into test(title,uid) VALUES ('123465','1001');
REPLACE INTO test(title,uid) VALUES ('1234657','1003');
用法基本上和insert into相同,当有unique key或者primary key的重复旧数据,replace into会删除旧数据,再插入新数据,如果没有则直接插入新数据,注意replace into必须使用在含有primary key或者unique key的表中,并且影响2行
--新建一个test表,三个字段,id,title,uid, id是自增的主键,uid是唯一索引;
insert into test(title,uid) VALUES ('123465','1001');
insert into test(title,uid) VALUES ('123465','1002');
--执行单条插入数据可以看到,执行结果如下:
[SQL]insert into test(title,uid) VALUES ('123465','1001');
受影响的行: 1
时间: 0.175s
--使用 replace into插入数据时:
REPLACE INTO test(title,uid) VALUES ('1234657','1003');
执行结果:
[SQL]REPLACE INTO test(title,uid) VALUES ('1234657','1003');
受影响的行: 1
时间: 0.035s
--当有重复key旧数据存在,使用replace into 语句
REPLACE INTO test(title,uid) VALUES ('1234657','1001');
[SQL]REPLACE INTO test(title,uid) VALUES ('1234657','1001');
受影响的行: 2
时间: 0.140s
如果需要针对某个字段的值针对不同条件设置不同值的时候,使用set 语法,该语法例子如下:
update table_name
set column_name=(
case
when condition1 then value1
when condition2 then value2
end
);
如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。