SQLSerer转MySQL问题汇总
1、SQLServer转MySQL时bit类型长度要改为8;
SQL语句中不要中括号;
SQL语句中不要包含"dbo.表名";
导入数据的时候要注意数据库的字符集类型,基本用UTF8最好;
5、建表建库的时候要设置为UTF-8类型;
6、别名的问题
select''count''=count()
改为
selectcount()ASCount
7、REPLACE去掉了
SELECT
REPLACE(
REPLACE(role_name,'''''''',''?),
''
'',
''''
)ASrole_name,
idASkeyForList
FROM
(
SELECT
,ROW_NUMBER()OVER(ORDERBYIdASC)ASRowNumber
FROM
(
SELECT
FROM
mg_organise
WHERE
operate_type<>''DISUSE''
ANDoperate_type<>''Disuse''
)ASdataTableForNew
WHERE
1=1
)ASdataTableForRowNumber
WHERE
RowNumberBETWEEN1
AND10
去掉了replace这一大串,效率太低,而且很难修改为MySQL。
8、分页
ROW_NUMBER()
Row_Number()分页的方式改为Limit
9、窗口函数
OVER(ORDERBYIdASC)ASRowNumber
OVER要改写;
INSERT自增列的处理
在MYSQL中,Insert的自增列要给NULL;
如INSERTINTO表名VALUES(NULL,’123’)
11、删除DELETE
SQLServer:DELETE表名
MySQL:DELETEFROM表名
12、日期比较
MYSQL日期比较(直接比较字符串也可以)
selectfromstudentwhereUNIX_TIMESTAMP(''2012-02-2700:00:00'')UNIX_TIMESTAMP(created_date);
13、DATEADD函数的不同
Mysql的Date_Add函数
date_add(NOW(),interval''-00:00''MINUTE_second);
SQLServer的DateAdd函数
DATEADD(minute,"+(-Convert.ToInt32(this.LowFre.Text)).ToString()+",GETDATE())
GETDATE()->NOW()
ais_basic_info_history有个查询实在太慢,加了个索引:
CREATEINDEXIX_LastTimeONais_basic_info_history(last_time)
字符串拼接
SQLServer:+
MySQL:的字符串拼接不用''+'',而是用Concat函数
ISNULL与STUFF函数
SQLServer MYSQL
ISNULL -> IFNULL
STUFF -> INSERT
多行转单行逗号分割
SQLServer的 FORXMLPATH('''')
->
在MYSQL中只有用GROUPBY实现:
SELECTgroup_concat(id)FROMwg_sea_infoASb
WHEREb.operate_type<>''Disuse''
GROUPBYwg_state
取前几条
SQLServer->Top
MySQL->Limit
UPDATEwg_info
SETwg_content=Concat(''发生了'',
(
SELECT
COUNT()
FROM
wg_sea_info
WHERE
wg_state=''1''
ANDoperate_type<>''Disuse''
)
,''艘海上停留超时''),
wg_value=ISNULL(
(
SELECTSTUFF(
(
SELECT
'',''+cast(b.idASVARCHAR(500))
FROM
wg_sea_infoASb
WHERE
b.wg_state=''1''
ANDb.operate_type<>''Disuse''
ANDa.id=a.idFORXMLPATH('''')
),1,1,'''')ASidslimit0,1
FROM
wg_sea_infoASa
),
''''
),
operate_time=Now(),
operate_type=''Update''
WHERE
wg_tbl_name=''wg_sea_info''
ANDoperate_type<>''Disuse''
创建触发器
MySQL与SQLServer触发事件和触发表的语法顺序调转
MySQL例子:
CREATETRIGGERtri_aAFTERINSERTONa
FOREACHROW
BEGIN
······
END;
SQLServer例子:
CREATETRIGGERtri_aONaFORINSERT
AS
MySQL:创建触发器时必须使用foreachrow这是因为加上这句则触发事件就是行级的,那么对每一行有这个动作都要触发一次事件
MySQL:创建语句完后需区间开始和结束才能开始定义参数等操作,而SQL可用AS连接后定义参数
定义参数
SQLServer
DECLARE@IdVARCHAR(100)
MySQL
DECLAREIdVARCHAR(100);
基本语法
MySQL每个执行语句完毕后需加分号;
例子:DECLAREIdVARCHAR(100);
insertintotab2(tab2_id)values(new.tab1_id);
注释代码
单行注释:--注释行,双横杠后必须空一格
多行注释:/注释代码/
创建游标
MySQL
DECLAREIdVARCHAR(100);
DECLAREcursorCURSORFOR
SELECTidFROMnewWHEREid>0;
DECLARECONTINUEHANDLERFORSQLSTATE''02000''setId=NULL;
OPENcursor;
WHILE(IdisnotNULL)DO
FETCHcursorINTOId;
······内容
ENDWHILE;
CLOSEcursor
说明:MYSQL有数据新增时,新增的数据储存在临时表为new
变量赋值
第一个赋值由查询集合获得的必须在最外层添加括号
SETshipId=(SELECTship_idFROMnewWHEREid=IdLIMIT0,1);
或者
SELECTship_idintoshipIdFROMnewWHEREid=Id
填充字符
MySQL
lpad(str,len,padstr)
字符串padstr对str进行左边填补直至它的长度达到len个字符长度,然后返回str。如果str的长度长于len'',那么它将被截除到len个字符。DROPTABLEIFEXISTStab1;
DROPTRIGGERIFEXISTStri_tab1;--删除触发器
日期转为字符窜任意格式
例子:DATE_FORMAT(‘2014-08-2717:43:30’,''%Y-%m-%d'')--2014-08-27
拓展:%Y:年%c:月%d:日%H:小时%i:分钟%s:秒date_format(now(),''%Y-%c-%d%h:%i:%s'')
新增数据和更新语句注意事项
MYSQL新增一条数据时插入的数据由查询语句获取其它表信息时建议指定插入列
例子:
INSERTINTOais_turnover_time(flight_id,basic_id,ship_id,haven_name,turnover_type,turnover_buoy,ship_registry,state,delay_num,operate_time,operate_type)
SELECT
(SELECTidFROMais_flight_infoWHEREship_id=shipIdORDERBYout_buoyDESCLIMIT0,1)asflight_id,
(SELECTais_history_idFROMio_enclosure_historyWHEREid=ybId)asbasic_id,
shipId,
havenname,
''2'',
IoTime,
(SELECTship_registryFROMshipWHEREship_id=shipIdANDoperate_type<>''Disuse'')asship_registry,
state,
delayNum,
NOW()ASoperate_time,''Add''ASoperate_type
FROMio_enclosure_historyASaWHEREid=ybId;
注意:由查询集返回值必须要as自定名字。如:(SELECTidFROMais_flight_infoWHEREship_id=shipIdLIMIT0,1)asflight_id
如果该表有时间类型必须设置其默认值NULL或1900-01-0100:00:00
更新时条件不可带查询子从句,如:whereid=(selectfromtable)
强制转换值类型
MYSQL比SQLServer限制大些,不能随便填数据类型,只有几个固定参数和字符集转化的能力。
字符集转换:CONVERT(xxxUSINGgb2312)
类型转换和SQLServer一样,就是类型参数有点点不同:
SQL——>CAST(xxxAS类型)
MYSQL——>CONVERT(xxx,类型)
可用的类型
二进制,同带binary前缀的效果:BINARY
字符型,可带参数:CHAR()如:CHAR(100)
日期:DATE
时间:TIME
日期时间型:DATETIME
浮点数:DECIMAL
整数:SIGNED
无符号整数:UNSIGNED
|
|