Mysql 的数据类型

图片 1

  1. 对整数类型, Mysql
还支持类型名称后面的小括号内指定的显示宽度,例如int(5)
表示宽度小于5位时填满宽度,如果不显示指定宽度默认是int(11),一般配合zerofill使用下面来描述下

-- 创建表t1 有id1和id2字段,指定数值宽度分别为int 和int(5)
CREATE TABLE t1(id1 INT, id2 INT(5));
-- 在里面都插入1
INSERT INTO t1 VALUES(1,1);
-- 查询格式没有异常, 值是 id1=1, id2=1
SELECT * FROM t1;
-- 分别修改id1 和id2字段类型, 加入 zerofill参数
ALTER TABLE t1 MODIFY id1 INT ZEROFILL;
ALTER TABLE t1 MODIFY id2 INT(5) ZEROFILL;
-- 再次查询时   id1=0000000001, id2=00001
SELECT * FROM t1;

  2. 整数类型还有一个属性
auto_increment。产生唯一标识,值一般从1开始,每行增加1. 定义为not null
, 并且定义primary key或unique键如下:

CREATE TABLE a1 (id INT AUTO_INCREMENT NOT NULL,PRIMARY KEY);
CREATE TABLE a1 (id INT AUTO_INCREMENT NOT NULL,PRIMARY KEY(id));
CREATE TABLE a1 (id INT AUTO_INCREMENT NOT NULL,UNIQUE(id));

  3. 对于小数表示, mysql分为浮点数和定点数

  浮点数包括float,double。 定点数decimal
它是以字符串形式存放的,比浮点数精确, 用于倾向等精度高的数据。

  浮点数和定点数都可以加(M,D) 如:float(7,4)   值-999.9999
保存时进行了四舍五入, 如果插入是999.00009
,值结果是999.0001。注意浮点数据后面跟(M,D)是非标准用法。

  定点数deciaml不指定精度时,默认整数为10, 默认小数位为0。

嗯,遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢。哼。

本文出处: 

 

 

如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长)

最近在学习 WITH
RECOMPILE和OPTION(RECOMPILE)在重编译上的区别的时候,无意中发现表值函数和内联表值函数编译生成执行计划的区别
下文中将会对此问题展开讨论。
简单地说就是:同样一句SQL,分别写成内联函数和表值函数,然后执行对Function的查询,发现其执行计划和执行计划缓存是不一样的,
根据某些测试的一些共同规律发现,内联函数的编译很有可能与Parameter
Embedding Optimization 有关
关于Parameter Embedding
Optimization,我在写了一个案例
在发生Parameter Embedding
Optimization做编译优化的时候,跟普通的编译优化机制还是有很大差异的。

select MIN(ID) as id, StructSN ,Date,UserID,StarCount,COUNT(StructSN) as c
from T_Dor_StructStar 
where  Date >= '20160919'
group by StructSN ,Date,UserID,StarCount
having COUNT(StructSN) > 1

 

然后就可以直接删除,基本原理就是,找到重复记录的每一条记录,排除掉重复id最小的记录,删除剩余的重复记录。

概念解释:内联用户定义函数和表值用户定义函数

delete from T_Dor_StructStar
where ID in (
select s.ID  from T_Dor_StructStar s,
(
select MIN(ID) as id, StructSN ,Date,UserID,StarCount,COUNT(StructSN) as c
from T_Dor_StructStar 
where  Date >= '20160919'
group by StructSN ,Date,UserID,StarCount
having COUNT(StructSN) > 1
)a
where
a.Date = s.Date
and a.StructSN = s.StructSN
and a.UserID = s.UserID
and a.StarCount = s.StarCount
and a.id != s.ID
)

  SQL Server中的表值函数分为“内联用户定义函数”和“表值用户定义函数”。

 

 

内联用户定义函数(Inline User-Defined Functions):
  不上MDSN上搬概念了,简单地说,内联函数的特点就是就是返回类型为table,返回的结果是一个查询语句
  如下,dbo.fn_InlineFunction即为内联用户定义函数,当然后面要与表值用户定义函数作比较,就能看出来区别了

create function dbo.fn_InlineFunction
(
    @p_parameter     varchar(500)
)
returns table
as
return
(
    SELECT id,col2
    FROM [dbo].[TestTableValueFunction] 
    where ( col2  = @p_id or @p_id is null)      
)
GO

 

 

表值用户定义函数(Table-Valued User-Defined Functions),
  与内联函数区别在于,表值用户定义函数返回的是一个表变量,在函数体中,通过赋值给这个表变量,然后返回表变量
  如下dbo.fn_TableValuedFunction即为内联用户定义函数,

create function fn_TableValuedFunction
(
    @p_paramter      varchar(500)
)
RETURNS @Result TABLE
(
    id int ,
    value char(5000)
)
as
begin

    insert into @Result
    select id,col2
    from [dbo].[TestTableValueFunction] 
    where ( col2  = @p_id or @p_id is null)   

    return
end

  熟悉sqlserver的同学可能已经知道这两者的区别了,关于内联用户定义函数和表值用户定义函数就先这么简单说一下区别
  虽然内联函数和表值函数在功能上和使用上是有一些差异的,但是有一部分查询,用两种方式都可以实现,也就说两者在功能上有差异也有交集。

 

开始本文主题

发表评论

电子邮件地址不会被公开。 必填项已用*标注