Mysql和sqlServer命令比較

http://cool.china.blog.163.com/blog/static/697310642010111202531210mysql

 

  Mysql和sqlServer命令比較sql

按語句功能劃分,依次講解數據庫

目錄
一數據定義    2ide

1 數據庫操做基本命令    2函數

2 CREATE TABLE --建立一個數據庫表    2工具

2.1    PRIMARY KEY 約束(主鍵)區別解析:    2oop

2.1.1 建立primary key    2性能

2.1.2 撤銷 PRIMARY KEY 約束    3ui

2.1.3 建立外健約束    3spa

2.1.4 撤銷外健約束    4

2.2    UNIQUE 約束(惟一的,獨一無二的)區別解析    4

2.2.1 建立UNIQUE約束    4

2.2.2 撤銷 UNIQUE 約束    5

2.3    CHECK 約束    5

2.3.1 建立 CHECK約束    5

2.3.2 撤銷 CHECK約束    6

2.4    DEFAULT 約束(系統默認值)    6

2.4.1 建立DEFAULT約束    6

2.4 .2 撤消DEFAULT約束    7

2.5    索引區別    7

2.6    主鍵自動增長的區別    7

2.7    MySQL支持enum,和set類型,SQL Server不支持    8

2.7.1    枚舉enum    8

2.7.2    集合set    9

2.8    MySQL不支持nchar,nvarchar,ntext類型    10

3    DROP TABLE –刪除一個數據庫表    10

4    顯示庫表    11

5    alter 修改庫表    11

二 數據操做    12

2.1 limit和top    12

2.2 ISNULL()函數    12

2.3 select查詢    12

2.4 insert 插入    12

2.6 update 修改    12

2.7 delete 刪除    13

三 語法定義    13

3.1 註釋符區別    13

3.2 識別符的區別    13

3.3存儲過程的區別(未經驗證,從網上找的)    13

3.4字符串鏈接    14

四 函數和數據類型的區別    14

4.1 Date 函數    14

五性能比較    15
一數據定義
1 數據庫操做基本命令

Mysql:

create database name; 建立數據庫

use databasename; 選擇數據庫

drop database name 直接刪除數據庫,不提醒 –


2 CREATE TABLE --建立一個數據庫表
PRIMARY KEY 約束(主鍵)區別解析:
2.1.1 建立primary key

Mysql:    

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)


2.1.2撤銷 PRIMARY KEY 約束

MySQL:

ALTER TABLE Persons DROP PRIMARY KEY

SQL Server

ALTER TABLE Persons DROP CONSTRAINT pk_PersonID


2.1.3 建立外健約束

MySQL:

CREATE TABLE Orders

(

O_Id  int NOT NULL,

OrderNo int NOT NULL,

Id_P int,

PRIMARY KEY (O_Id),

FOREIGN  KEY (Id_P)  REFERENCES  Persons(Id_P)    //寫在最後

)

 

SQL Server

CREATE TABLE Orders

(

O_Id  int  NOT NULL  PRIMARY KEY,

OrderNo  int NOT NULL,

Id_P  int  FOREIGN KEY REFERENCES Persons(Id_P)    //順序不一樣

)

若是在 "Orders" 表已存在的狀況下爲 "Id_P" 列建立 FOREIGN KEY 約束,請使用下面的 SQL:

MySQL / SQL Server

ALTER  TABLE  Orders ADD  FOREIGN KEY  (Id_P) REFERENCES  Persons(Id_P)


2.1.4 撤銷外健約束

MySQL:

ALTER TABLE Orders DROP  FOREIGN KEY f k_PerOrders

SQL Server

ALTER TABLE Orders DROP CONSTRAINT  fk_PerOrders


UNIQUE 約束(惟一的,獨一無二的)區別解析

UNIQUE 約束惟一標識數據庫表中的每條記錄。

UNIQUE 和 PRIMARY KEY 約束均爲列或列集合提供了惟一性的保證。

PRIMARY KEY 擁有自動定義的 UNIQUE 約束。

請注意,每一個表能夠有多個 UNIQUE 約束,可是每一個表只能有一個 PRIMARY KEY 約束。


2.2.1 建立UNIQUE約束

MySQL:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

UNIQUE (Id_P)                 //寫在最後

)

SQL Server

CREATE TABLE Persons

(

Id_P int NOT NULL UNIQUE,        //緊跟列後

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)


2.2.2 撤銷 UNIQUE 約束

MySQL:

ALTER TABLE Persons DROP INDEX  uc_PersonID

SQL Server

ALTER TABLE Persons DROP CONSTRAINT uc_PersonID


CHECK 約束

CHECK 約束用於限制列中的值的範圍。

若是對單個列定義 CHECK 約束,那麼該列只容許特定的值。

若是對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。


2.3.1 建立 CHECK約束

下面的 SQL 在 "Persons" 表建立時爲 "Id_P" 列建立 CHECK 約束。CHECK 約束規定 "Id_P" 列必須只包含大於 0 的整數。

My SQL:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

CHECK (Id_P>0)                       //寫在最後

)

 

SQL Server

CREATE TABLE Persons

(

Id_P int NOT NULL CHECK (Id_P>0),    //緊跟列後

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

若是須要命名 CHECK 約束,以及爲多個列定義 CHECK 約束,請使用下面的 SQL 語法:

MySQL / SQL Server:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') //多個條件

)

若是在表已存在的狀況下爲 "Id_P" 列建立 CHECK 約束,請使用下面的 SQL:

MySQL / SQL Server:

ALTER TABLE Persons ADD CHECK (Id_P>0)


2.3.2 撤銷 CHECK約束

Sqlserver:

ALTER  TABLE  Persons  DROP CONSTRAINT chk_Person

Mysql我沒有找到怎麼刪除。


DEFAULT 約束(系統默認值)

DEFAULT 約束用於向列中插入默認值。

若是沒有規定其餘的值,那麼會將默認值添加到全部的新紀錄。


2.4.1 建立DEFAULT約束

下面的 SQL 在 "Persons" 表建立時爲 "City" 列建立 DEFAULT 約束:

My SQL / SQL Server:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255) DEFAULT 'Sandnes'     //緊跟列後,默認值字符串Sandnes

)

 

經過使用相似 GETDATE() 這樣的函數,DEFAULT 約束也能夠用於插入系統值:

CREATE TABLE Orders

(

Id_O int NOT NULL,

OrderNo int NOT NULL,

Id_P int,

OrderDate date DEFAULT GETDATE()   //緊跟列後,函數

)

 

若是在表已存在的狀況下爲 "City" 列建立 DEFAULT 約束,請使用下面的 SQL:

 

MySQL:

ALTER  TABLE  Persons  ALTER  City  SET  DEFAULT  'SANDNES'

 

SQL Server:

ALTER  TABLE  Persons  ALTER  COLUMN  City  SET  DEFAULT  'SANDNES'


2.4 .2 撤消DEFAULT約束

MySQL:

ALTER  TABLE  Persons  ALTER  City  DROP  DEFAULT

 

SQL Server:

ALTER  TABLE  Persons  ALTER  COLUMN  City  DROP  DEFAULT


索引區別

CREATE INDEX 語句

CREATE INDEX 語句用於在表中建立索引。

在不讀取整個表的狀況下,索引使數據庫應用程序能夠更快地查找數據。

在表上建立一個簡單的索引。容許使用重複的值:

CREATE INDEX index_name ON table_name (column_name) //"column_name" 規定須要索引的列。

在表上建立一個惟一的索引。惟一的索引意味着兩個行不能擁有相同的索引值。

CREATE UNIQUE INDEX index_name ON table_name (column_name)

Mysql和SqlServer的建立索引都是一致的,可是在刪除索引方面卻有區別:

SqlServer: DROP INDEX table_name.index_name

Mysql: ALTER TABLE table_name DROP INDEX index_name


主鍵自動增長的區別

mySql的主鍵自動增長是用auto_increment字段,sqlServer的自動增長則是identity字段.

Auto-increment 會在新紀錄插入表中時生成一個惟一的數字。

咱們一般但願在每次插入新紀錄時,自動地建立主鍵字段的值。

咱們能夠在表中建立一個 auto-increment 字段。

用於 MySQL 的語法

下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義爲 auto-increment 主鍵:

CREATE TABLE Persons

(

P_Id int NOT NULL AUTO_INCREMENT,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

PRIMARY KEY (P_Id)

)

MySQL 使用 AUTO_INCREMENT 關鍵字來執行 auto-increment 任務。

默認地,AUTO_INCREMENT 的開始值是 1,每條新紀錄遞增 1。

要讓 AUTO_INCREMENT 序列以其餘的值起始,請使用下列 SQL 語法:

ALTER TABLE Persons AUTO_INCREMENT=100

 

用於 SQL Server 的語法

下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義爲 auto-increment 主鍵:

CREATE TABLE Persons

(

P_Id int PRIMARY KEY IDENTITY,或則是寫成P_id int primary key identity (1,1),

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

MS SQL 使用 IDENTITY 關鍵字來執行 auto-increment 任務。

默認地,IDENTITY 的開始值是 1,每條新紀錄遞增 1。

要規定 "P_Id" 列以 20 起始且遞增 10,請把 identity 改成 IDENTITY(20,10)


MySQL支持enum,和set類型,SQL Server不支持
枚舉enum

ENUM是一個字符串對象,其值來自表建立時在列規定中顯式枚舉的一列值.

枚舉最多能夠有65,535個元素。

枚舉的簡單用法舉例:

mysql> create table meijut (f1 enum('1','2','3','4','5','6'));

mysql> desc meijut;

+-------+-------------------------------+------+-----+---------+-------+

| Field | Type                          | Null | Key | Default | Extra |

+-------+-------------------------------+------+-----+---------+-------+

| f1    | enum('1','2','3','4','5','6') | YES  |     | NULL    |       |

+-------+-------------------------------+------+-----+---------+-------+

mysql> insert into meijut values(8);

mysql> select * from meijut

   -> ;

+------+

| f1   |

+------+

|      |

+------+

這個狀況說明若是你將一個非法值插入ENUM(也就是說,容許的值列以外的字符串),將插入空字符串以做爲特殊錯誤值。該字符串與「普通」空字符串不一樣,該字符串有數值值0。

mysql> insert into meijut values('3');

mysql> insert into meijut values(3);

mysql> insert into meijut values('4');

mysql> insert into meijut values('5');

mysql> select * from meijut;

+------+

| f1   |

+------+

|      |

| 3    |

| 3    |

| 4    |

| 5    |

+------+  

改表

 

mysql> alter table meiju modify f1 enum("a","b","c","d","e","f");

能夠自動將記錄當序號匹配成新的字段值

mysql> select * from meijut;

+------+

| f1   |

+------+

|      |

| c    |

| c    |

| d    |

| e    |

+------+  


集合set

mysql> create table jihe(f1 set('f','m'));

mysql> insert into jihe values('f');

能夠按照序號輸入 注意序號爲 1 2 4 8 16 32 ....

mysql> insert into jihe values('3');

mysql> select * from jihe;

+------+

| f1   |

+------+

| f    |

| f,m  |

+------+

其餘字母不能插入

mysql> insert into jihe values("q");

ERROR 1265 (01000): Data truncated for column 'f1' at row 1

插入空

mysql> insert into jihe values("0");

Query OK, 1 row affected (0.11 sec)

超出序號之和不能插入

mysql> insert into jihe values("4");

ERROR 1265 (01000): Data truncated for column 'f1' at row 1

集合 和 枚舉的區別

1 集合能夠有64個值 枚舉有65535個

2 集合的序號是 1 2 4 8 16 枚舉是 1 2 3 4 5 6

3 集合一個字段值能夠有好幾個值

+-------+

| f1    |

+-------+

| f,m   |

+-------+


MySQL不支持nchar,nvarchar,ntext類型
DROP TABLE –刪除一個數據庫表

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;/顯示一個表的表結構

   mysql> desc meijut;

+-------+-------------------------------+------+-----+---------+-------+

| Field | Type                          | Null | Key | Default | Extra |

+-------+-------------------------------+------+-----+---------+-------+

| f1    | enum('a','b','c','d','e','f') | YES  |     | NULL    |       |

| f2    | int(11)                       | YES  |     | 0       |       |

| f3    | text                          | YES  |     | NULL    |       |

+-------+-------------------------------+------+-----+---------+-------+

       Show create table tablename;//顯示一個表的詳細建立信息

mysql> show create table meijut;

+--------+-------------------------------------------

-----------------------------------------------------

---+

| Table  | Create Table

 

  |

+--------+-------------------------------------------

-----------------------------------------------------

---+

| meijut | CREATE TABLE `meijut` (

 `f1` enum('a','b','c','d','e','f') default NULL,

 `f2` int(11) default '0',

 `f3` text

) ENGINE=MyISAM DEFAULT CHARSET=utf8 |


alter 修改庫表

重命名錶: -

mysql > alter table t1 rename t2;

添加一列

mysql> alter table meijut add column f2 int default 0 ;

修改一列

mysql> alter table meijut modify f2 text;


二 數據操做
2.1 limit和top

SQL SERVER : select   top   8   *   from   table1

MYSQL: select   *   from   table1   limit   5或則是 limit 0,5;

注意,在MySQL中的limit不能放在子查詢內,limit不一樣與top,它能夠規定範圍 limit a,b——範圍a-b


2.2  ISNULL()函數

SqlServer:

select * from test where isnull(no,0)=0;

MySQL

MySQL 能夠使用 ISNULL() 函數。不過它的工做方式與微軟的 ISNULL() 函數有點不一樣。

在 MySQL 中,咱們能夠使用 IFNULL() 函數,就像這樣:

mysql> select * from test where ifnull(no,0)=0;

+----+------+

| id | no   |

+----+------+

|  3 | NULL |

+----+------+

1 row in set (0.03 sec)


2.3 select查詢

SELECT * FROM tablename


2.4 insert 插入

INSERT INTO table(col1,col2) values(value1,value2);

MySQL支持insert into table1 set t1 = ‘’, t2=‘’,可是MSSQL不支持這樣寫


2.6update 修改

Update  tablename set  col=」value」;


2.7 delete 刪除

Delete from tablename;


三 語法定義
3.1 註釋符區別

SqlServer的註釋符爲--和/**/

MySql的註釋符爲--和/**/和#


3.2 識別符的區別

MS SQL識別符是[],[type]表示他區別於關鍵字,可是MySQL倒是 `,也就是按鍵1左邊的那個符號


3.3存儲過程的區別(未經驗證,從網上找的)

mysql的存儲過程當中變量的定義去掉@;

 

SQLServer存儲過程的AS在MySql中須要用begin .....end替換

 

Mysql的Execute對應SqlServer的exec;

 

    (注意:必須想下面這樣調用)

    Set @cnt=’select * from 表名’;

    Prepare str from @cnt;

    Execute str;

 

MySql存儲過程調用其餘存儲過程用call

 

Call 函數名(即SQLServer的存儲過程名)(’參數1’,’參數2’,……)

 

select @a=count(*) from VW_Action 在mySql中修改成:select count(*) from VW_Action into @a;

 

MySQL視圖的FROM子句不容許存在子查詢,所以對於SQL Server中FROM子句帶有子查詢的視圖,須要手工進行遷移。可經過消除FROM子句中的子查詢,或將FROM子句中的子查詢重構爲一個新的視圖來進行遷移。

 

)MySql存儲過程當中沒有return函數,在MySql中能夠用循環和out參數代替

 

    If EXISTS(SELECT * FROM T_Chance WHERE FCustID=CostomerID)  return 0

改寫爲:

(在參數中定義一個out變量:out temp varchar(100);)

    BEGIN

        Loop1:loop

    SELECT count(*) FROM T_Chance WHERE FCustID=CostomerID int @cnt

    If @cnt>0 then

    begin

        set temp=0;

        leave loop1;

    end;

    end if

    end loop loop1;

 

mysql的uuid()對應sql的GUID();

 

MySql的out對應SQLServer的output,且mysql 的out要放在變量的前面,SQLServer的output放在變量後面:

 

MySql out,in,inout的區別——

MySQL 存儲過程 「in」 參數:跟 C 語言的函數參數的值傳遞相似, MySQL 存儲過程內部可能會修改此參數,但對 in 類型參數的修改,對調用者(caller)來講是不可見的(not visible)。

MySQL 存儲過程 「out」 參數:從存儲過程內部傳值給調用者。在存儲過程內部,該參數初始值爲 null,不管調用者是否給存儲過程參數設置值。

MySQL 存儲過程 inout 參數跟 out 相似,均可以從存儲過程內部傳值給調用者。不一樣的是:調用者還能夠經過 inout 參數傳遞值給存儲過程。


3.4字符串鏈接 

SQLServer: Temp=’select * from ’+’tablename’+…+…

    MySql:Temp=concat(’select * from’, ’tablecname’,…,…)


四 函數和數據類型的區別
4.1 Date 函數

MySQL Date 函數

NOW() 返回當前的日期和時間

CURDATE() 返回當前的日期

CURTIME() 返回當前的時間

DATE() 提取日期或日期/時間表達式的日期部分

EXTRACT() 返回日期/時間按的單獨部分

DATE_ADD() 給日期添加指定的時間間隔

DATE_SUB() 從日期減去指定的時間間隔

DATEDIFF() 返回兩個日期之間的天數

DATE_FORMAT() 用不一樣的格式顯示日期/時間

 

SQL Server Date 函數

GETDATE() 返回當前日期和時間

DATEPART() 返回日期/時間的單獨部分

DATEADD() 在日期中添加或減去指定的時間間隔

DATEDIFF() 返回兩個日期之間的時間

CONVERT() 用不一樣的格式顯示日期/時間

 

SQL Date 數據類型

MySQL 使用下列數據類型在數據庫中存儲日期或日期/時間值:

DATE - 格式 YYYY-MM-DD

DATETIME - 格式: YYYY-MM-DD HH:MM:SS

TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS

YEAR - 格式 YYYY 或 YY

 

SQL Server 使用下列數據類型在數據庫中存儲日期或日期/時間值:

DATE - 格式 YYYY-MM-DD

DATETIME - 格式: YYYY-MM-DD HH:MM:SS

SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS

TIMESTAMP - 格式: 惟一的數字


五性能比較

(1)一個很表面的區別就是MySQL的安裝特別簡單,並且文件大小才110M(非安裝版),相比微軟這個龐然大物,安裝進度來講簡直就是.....

(2)MySQL的管理工具備幾個比較好的,MySQL_front,和官方那個套件,不過都沒有SSMS的使用方便,這是MySQL很大的一個缺點。

(3)MySQL的存儲過程只是出如今最新的版本中,穩定性和性能可能不如MS SQL。

(4)一樣的負載壓力,MySQL要消耗更少的CPU和內存,MS SQL的確是很耗資源。

相關文章
相關標籤/搜索