Mysql的高级用法和函数

函数

Mysql同步方式

semi replication//待定

 

枚举值用varchar代替的好处

 

字符集问题(utf8,utf8mb4)

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;//可以显示所有记录

 

mysql中的三个时间类型date,datetime,timestamp

1.timestamp类型的字段必须要有默认值,不能default null

 

函数分类:注意mysql是忽视大小写的

时间类的函数

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))

 

关键字

on duplicate key update

此语句语法如下:

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   

insert ignore into表示:会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过当前插入的这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

replace和replace 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 case when then条件选择语句

如果需要针对某个字段的值针对不同条件设置不同值的时候,使用set 语法,该语法例子如下:

update table_name
set column_name=(
case
    when condition1 then value1
    when condition2 then value2
end
);

 

varchar 自动截取机制

如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

你可能感兴趣的:(Mysql的高级用法和函数)