由于在自己的工作中不断会遇到各个数据库之间的兼容问题,而各个数据库之间虽说大部分SQL语句是可以通用的,但是每个数据库的数据类型还是有一些区别,而且也有自己特有的语法或者函数,这里根据自己曾碰到的各类区别总结一下。


  1. 数据类型

数据类型

Access

SQL Server

Oracle

MySQL

文本

varchar

char,nchar, varchar,nvarchar,text

char,nchar, varchar2,nvarchar2

CHAR,VARCHAR, TEXT[more]

长整型

integer

int

NUMBER(p[,s])

INT,INTEGER

整型

short

smallint,tinyint

NUMBER(p[,s])

TINYINT,SMALLINT, MEDIUMINT

双精度型

double,float

decimal,numeric

BINARY_DOUBLE

单精度型

single,real

float,real

BINARY_FLOAT

FLOAT

字节型

byte

小数

NUMERIC(6,2)

DECIMAL(M,D)

货币

currency,money

money,smallmoney

日期/时间

date,time,datetime

datatime

DATE

DATE,TIME, DATETIME

时间戳

TIMESTAMP

TIMESTAMP

TIMESTAMP

布尔

Boolean,Bit

bit

二进制

Binary

binaryvarbinary,image

BLOB,CLOB,NCLOB, BFILE,RAW(n)

TINYBLOB,BLOB

OLE 对象

OLEObject

备注

text


详细参考

网址

Access

SQL Server

Oracle

MySQL


2应用场景
2.1 Access
Access适合入门级应用,最大能存2G数据,实在不值一提,但由于我的客户太low总把access当excel用,稀里糊涂的往里录入一些零散的数据,然后让我把它导入到其他数据库。
2.2 SQL Server
MS SQL Server主要面向中小企业。其最大的优势就是在于集成了MS公司的各类产品及资源,提供了强大的可视化界面、高度集成的管理开发工具,在快速构建商业智能(BI)方面颇有建树。 MS SQL Server是MS公司在软件集成方案中的重要一环,也为WIN系统在企业级应用中的普及做出了很大贡献。
主要应用在windows生态系统的产品,好处坏处都很分明。好处就是,高度集成化,微软也提供了整套的软件方案,基本上一套win系统装下来就齐活了。因此,不那么缺钱,但很缺IT人才的中小企业,会偏爱 MS SQL Server 。例如,自建ERP系统、商业智能、垂直领域零售商、餐饮、事业单位等等。
2.3 Oracle
Oracle是一个非常典型的关系数据库。因此也变的严谨、安全、高速、稳定,并且变的越来越庞大。
由于其诞生早、结构严谨、高可用、高性能等特点,使其在传统数据库应用中大杀四方,金融、通信、能源、运输、零售、制造等各个行业的大型公司基本都是用了Oracle,早些年的时候,世界500强几乎100%都是Oracle的用户。
主要在传统行业的数据化业务中,比如:银行、金融这样的对可用性、健壮性、安全性、实时性要求极高的业务;零售、物流这样对海量数据存储分析要求很高的业务。此外,高新制造业如芯片厂也基本都离不开Oracle;电商也有很多使用者,如京东(正在投奔Oracle)、阿里巴巴(计划去Oracle化)。而且由于Oracle对复杂计算、统计分析的强大支持,在互联网数据分析、数据挖掘方面的应用也越来越多
2.4 MySQL
MySQL基本是生于互联网,长于互联网。其应用实例也大都集中于互联网方向,MySQL的高并发存取能力并不比大型数据库差,同时价格便宜,安装使用简便快捷,深受广大互联网公司的喜爱。并且由于MySQL的开源特性,针对一些对数据库有特别要求的应用,可以通过修改代码来实现定向优化,例如SNS、LBS等互联网业务


3架构
3.1 SQL Server
数据架构基本是纵向划分,分为:Protocol Layer(协议层), Relational Engine(关系引擎), Storage Engine(存储引擎), SQLOS。SQL执行过程就是逐层解析的过程,其中Relational Engine中的优化器,是基于成本的(CBO),其工作过程跟Oracle是非常相似的。在成本之上也是支持很丰富的HINT,包括:连接提示、查询提示、表提示。
3.2 Oracle
数据文件包括:控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件。这是根据文件功能行进行划分,并且所有文件都是二进制编码后的文件,对数据库算法效率有极大的提高。由于Oracle文件管理的统一性,就可以对SQL执行过程中的解析和优化,指定统一的标准:
RBO(基于规则的优化器)、CBO(基于成本的优化器)
通过优化器的选择,以及无敌的HINT规则,给与了SQL优化极大的自由,对CPU、内存、IO资源进行方方面面的优化。
3.3 MySQL
最大的一个特色,就是自由选择存储引擎。每个表都是一个文件,都可以选择合适的存储引擎。常见的引擎有 InnoDB、 MyISAM、 NDBCluster等。但由于这种开放插件式的存储引擎,比如要求数据库与引擎之间的松耦合关系。从而导致文件的一致性大大降低。在SQL执行优化方面,也就有着一些不可避免的瓶颈。在多表关联、子查询优化、统计函数等方面是软肋,而且只支持极简单的HINT。


4基本SQL语句
1、创建数据库
CREATE DATABASE database-name
2、删除数据库
drop database dbname
3、创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
4、 删除新表
drop table tabname
5、 增加一列
Alter table tabname add column col type
6、删除一列
alter table table_name drop字段名;
7、添加主键
Alter table tabname add primary key(col)
8、创建索引
create [unique] index idxname on tabname(col….)
9、 删除索引
drop index idxname
10、创建视图
create view viewname as select statement
11、 删除视图
drop view viewname
12、几个简单的基本的sql语句
查询:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)  
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ‘%value1%’
排序:select * from table1 order by field1,field2 [desc]
总数:select count(field1) as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalu minvalu from table1
13、使用外连接
A、left outer join:
左外连接(左连接):结果集包括连接表的匹配行,也包括左连接表的所有行。
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连中有记录
几个高级的语句
14、复制表(只复制结构,源表名:a 新表名:b)
Access:
法一:select * into b from a where
法二:select top 0 * into b from a
Sql Server:
     SELECT Id,FirstName,LastName,Weight,Height INTO People FROM Person(NOLOCK) WHERE 1=0
Oracle、MySql:
      CREATE TABLE People AS SELECT Id,FirstName,LastName,Weight,Height FROM Person WHERE 1=0
15、拷贝表(拷贝数据,源表名:a 目标表名:b)
insert into b(a, b, c) select d,e,f from b;
16、跨数据库之间表的拷贝(具体数据使用绝对路径)
Access:
     insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件    
     例子:..from b in ’ “&Server.MapPath(“.”)&”\data.mdb” &”’ where..
SQL Server:
  当表目标表存在时:
insert into 目的数据库..表 select * from 源数据库..表

当目标表不存在时:
select * into 目的数据库..表 from 源数据库..表

如果在不同的SQL之间:
insert into openrowset(‘sqloledb’,’目的服务器名’;’sa’;”,目的数据库.dbo.表)
select *from 源数据库..表