MySQL与SqlServer的区别
目前最流行的两种后台数据库即为Mysql 和 SQL Server。这两者最基本的相似之处在于数据存储和属于查询系统,你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL(数据库管理标准)。还有,这两种数据库系统都支持二进制关键字和关键索引,这就大大地加快了查询速度。同时,二者也都提供支持XML的各种格式、也都能够在.NET或J2EE下运行正常,同样,都能够利用RAID(独立冗余磁盘阵列)
根本的区别:
- SQL服务器的狭隘的、保守的存储引擎而MySQL服务器的可扩展、开放的存储引擎;
- SQL服务器的引擎是Sybase,而MySQL能够提供更多种的选择,如MyISAM、Heap、InnoDB、Berkeley DB;
- MySQL不完全支持陌生的关键词,所以它比SQL服务器要少一些相关的数据库;
- MySQL也缺乏一些存储程序的功能,比如MyISAM引擎联支持交换功能;
性能方面
MySQL:
纯粹就性能而言,MySQL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM 数据库与磁盘非常地兼容而不占用过多的CPU和内存。MySQL可以运行于Windows系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。你还可以通过使用64位处理器来获取额外的一些性能。因为MySQL在内部里很多时候都使用64位的整数处理。Yahoo!商业网站就使用MySQL 作为后台数据库。
当提及软件的性能,SQL服务器的稳定性要比它的竞争对手强很多。但是,这些特性也要付出代价的。比如,必须增加额外复杂操作,磁盘存储,内存损耗等等。如果你的硬件和软件不能充分支持SQL服务器,我建议你最好选择其他如DBMS数据库,因为这样你会得到更好的结果。
安全方面:
- MySQL和SqlServer都有字节完整的安全机制(缺省IP端口,也可以自己设置),只要遵守这些机制,一般是不会出问题的;
- MySQL有一个用于改变数据的二进制日志。因为它是二进制,这一日志能够快速地从主机上复制数据到客户机上。当服务崩溃时,二进制文件也会完整的保存;
- 在SQL服务器中,你也可以记录SQL的有关查询,但这需要付出很高的代价;
- 在恢复性方面,两款都做的很好。对于MySQL来说,主要体现在MyISAM的配置上。而SqlServer表现的就很稳健,SQL服务器能够时刻监测数据交换点并能够把数据库损坏的过程保存下来;
根据需求来选择
如果说这两种数据库那种更好,只能说要根据实际需求来选择数据库。
- 如果要建立一个.NET服务器体系,这一体系可以从多个不同平台访问数据,参与数据库的管理,那么你可以选用SQL服务器
- 如果要建立一个第三方站点,这一站点可以从一些客户端读取数据,那么MySQL将是最好的选择
- 如果需要海量数据,建议使用SqlServer,MySQL主要是短小精悍,容易上手,操作简单,免费供用的,在应对海量数据时没有SqlServer效果好
- 从成本角度考虑,MySQL肯定是第一选择,抛开5块钱的盗版SqlServer,这个数据库还是很贵的(SQL-Server 2000 是微软公司开发的中型数据库,它的可视化方面做得很好,在安全性等方面功能非常强大,并且有微软的强大技术支持,当然价格比较昂贵,适合应用于中型系统)
sql语句上的变形
数据定义、主键约束
- Mysql定义数据库和主键:
- create database name; 创建数据库
- use databasename; 选择数据库
- drop database name 直接删除数据库
- CREATE TABLE --创建一个数据库表
-
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- LastName varchar(255) NOT NULL,
- FirstName varchar(255),
- Address varchar(255),
- City varchar(255),
- PRIMARY KEY (Id_P) //声明主健写在最后
- )
- SqlServer定义数据库和主键:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL PRIMARY KEY, //声明主健 紧跟列后
- LastName varchar(255) NOT NULL,
- FirstName varchar(255),
- Address varchar(255),
- City varchar(255)
- )
复制代码 当表存在时,给表加、删除主健:
- Mysql 、SqlServer添加:
- ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
- MySQL删除:
- ALTER TABLE Persons DROP PRIMARY KEY
- SQL Server删除:
- ALTER TABLE Persons DROP CONSTRAINT pk_PersonID
复制代码 UNIQUE 约束
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证,每个表可以有多个unique,但只能有一个primary key。
- MySQL添加:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- UNIQUE (Id_P) //写在最后
- )
- MySQL删除:
- ALTER TABLE Persons DROP INDEX uc_PersonID
- SQL Server添加:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL UNIQUE, //紧跟列后
- )
- SQL Server删除:
- ALTER TABLE Persons DROP CONSTRAINT uc_PersonID
复制代码 CHECK 约束
CHECK 约束用于限制列中的值的范围,如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
- My SQL添加:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- CHECK (Id_P>0) //写在最后
- )
- SQL Server 添加:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL CHECK (Id_P>0), //紧跟列后
- )
- MySQL / SQL Server添加多个:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- City varchar(255),
- CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') //多个条件
- )
- MySQL / SQL Server对已有字段进行添加:
- ALTER TABLE Persons ADD CHECK (Id_P>0)
- MySQL / SQL Server删除:
- ALTER TABLE Persons DROP CONSTRAINT chk_Person
复制代码 DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新纪录。
- My SQL / SQL Server添加:
- CREATE TABLE Persons
- (
- Id_P int NOT NULL,
- City varchar(255) DEFAULT 'Sandnes' //紧跟列后,默认值字符串Sandnes
- )
- 通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
- CREATE TABLE Orders
- (
- Id_O int NOT NULL,
- OrderDate date DEFAULT GETDATE() //紧跟列后,函数
- )
- MySQL对已有表进行添加:
- ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
- SQL Server对已有表进行添加:
- ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'SANDNES'
- MySQL删除:
- ALTER TABLE Persons ALTER City DROP DEFAULT
- SQL Server删除:
- ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT
复制代码 索引
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
- Mysql和SqlServer在表上创建一个简单的索引(允许使用重复的值):
- CREATE INDEX index_name ON table_name (column_name) //"column_name" 规定需要索引的列。
- Mysql和SqlServer在表上创建一个唯一的索引(两个行不能拥有相同的索引值):
- CREATE UNIQUE INDEX index_name ON table_name (column_name)
- Mysql删除:
- ALTER TABLE table_name DROP INDEX index_name
- SqlServer删除:
- DROP INDEX table_name.index_name
复制代码 自增主键
我们通常希望在每次插入新纪录时,自动地创建主键字段的值。
mySql的主键自动增加是用auto_increment字段,默认地,AUTO_INCREMENT 的开始值是 1,每条新纪录递增 1
sqlServer的自动增加则是identity字段.
Auto-increment 会在新纪录插入表中时生成一个唯一的数字。
我们可以在表中创建一个 auto-increment 字段。
用于 MySQL 的语法
- MySQL增加:
- CREATE TABLE Persons
- (
- P_Id int NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (P_Id)
- )
- 设置自增的起始值:
- ALTER TABLE Persons AUTO_INCREMENT=100
- SqlServer增加:
- CREATE TABLE Persons
- (
- P_Id int PRIMARY KEY IDENTITY,或则是写成P_id int primary key identity (1,1),
- )
- 要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
复制代码 MySQL支持enum,和set类型,SQL Server不支持
枚举enum
ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值,枚举最多可以有65,535个元素。
- create table meijut (f1 enum('1','2','3','4','5','6'))
- desc meijut
- +-------+-------------------------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+-------------------------------+------+-----+---------+-------+
- | f1 | enum('1','2','3','4','5','6') | YES | | NULL | |
- +-------+-------------------------------+------+-----+---------+-------+
- insert into meijut values('5');
复制代码 集合set
- create table jihe(f1 set('f','m'));
- insert into jihe values('f');
复制代码 删表
Mysql判断一个数据库表是否存在并删除的语句是:
- drop table if exists jihe
复制代码 SqlServer判断一个数据库表是否存在并删除的语句是:
- if exists (select * from sysobjects where name='Sheet1$' and xtype='U') drop table Sheet1$
- jihe数据库名 Sheet1$表名
复制代码 查表
- MySQL:
- Show tables; 显示一个库中的所有表
- Desc table; 显示一个表的表结构
- Show create table tablename; 显示一个表的详细创建信息
- alter table t1 rename t2; 给表重命名
- alter table meijut add column f2 int default 0; 新增一列
- alter table meijut modify f2 text; 修改一列
复制代码 数据的CRUD
limit和top
- SQL Server:
- select top 8 * from table1
- MySQL:
- select * from table1 limit 5
- select * from table1 limit 0,5
复制代码 ISNULL()函数
- SqlServer:
- select * from test where isnull(no,0)=0;
- MySQL 可以使用 ISNULL() 函数
- MySQL:
- select * from test where ifnull(no,0)=0;
复制代码 语法定义
注释符区别
SqlServer:–和 /* */
MySql:–和/**/和#
识别符的区别
SqlServer识别符是[],[type]表示他区别于关键字
MySQL识别符是 `
存储过程
- MySql的存储过程中变量的定义去掉@
- MySql的declare只能用在begin end 的复合语句中,且只能是语句的开头。而SqlServer可以放在里面,也可以放在begin前
- MySql的Execute对应SqlServer的exec
- MySql存储过程调用其他存储过程用call
- SqlServer:select @a=count() from VW_Action MySQL为:select count() from VW_Action into @a
- MySql存储过程中没有return函数,在MySql中可以用循环和out参数代替
- MySql的out对应SQLServer的output,且mysql 的out要放在变量的前面,SQLServer的output放在变量后面
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |