1. 程式人生 > >SqlServer 與 MySQL 基本操作語句對比

SqlServer 與 MySQL 基本操作語句對比

繼上篇 MySQL 基本操作語句 後,個人測試和補充了 SqlServer 與 MySQL 的 基本操作語句對比,主要是對比SQL命令的一些差異,不作更多說明。

(由於mysql 沒有系統學習過,歡迎大俠們拍磚~~O(∩_∩)O~)

 SqlServer版本:SqlServer 2008

MySQL版本: MySQL 5.5

執行符號:

MySQL :分號';'

SqlServer :字元'GO'

自增列:MySQL必須要索引,不能設定增量;

預設值:MySQL預設值不用加括號;SqlServer可加或不加;

--MySQL

CREATE TABLE tabName( 

ID INTPRIMARY

KEY AUTO_INCREMENT,

Value INTDEFAULT 12

) AUTO_INCREMENT= 100ENGINE=MyISAM DEFAULTCHARSET=utf8; 

--SqlServer

CREATE TABLE tabName(

ID INTIDENTITY(100,1)PRIMARYKEY,

Value INTDEFAULT(12)

)

查看錶結構定義:

--SqlServer 

EXEC sp_help'tabName' 

--MySQL

DESC tabName

更改表名:

--SqlServer 

EXEC sys.sp_rename@objname=

N'tabName',@newname= 'newTabName'

--MySQL

ALTER TABLE tabName RENAME newTabName

更改欄位型別:

--SqlServer

ALTER TABLE[dbo].[tabName]ALTERCOLUMN [ID] BIGINT

--MySQL

ALTER TABLE tabName MODIFY IDBIGINT

更改欄位名:

--SqlServer

EXEC sys.sp_rename@objname=N'tabName.ID',@newname='IewID',@objtype='column'

--MySQL

ALTER TABLE tabName CHANGE IDIewIDBIGINT

新增欄位:(一樣)

--SqlServer

ALTER TABLE[dbo].[tabName]ADDNAME NVARCHAR(200)NULL

--MySQL

ALTER TABLE tabName ADD NAMENVARCHAR(200)NULL

刪除欄位:

--SqlServer

ALTER TABLE[dbo].[tabName]DROPCOLUMN NAME

--MySQL

ALTER TABLE tabName DROP NAME

新增主鍵/外來鍵或約束:

--SqlServer

ALTER TABLE[dbo].[tabName]ADDCONSTRAINT pk_tabNamePRIMARYKEY (id); 

--MySQL

ALTER TABLEtabNameADD CONSTRAINT pk_tabNamePRIMARYKEYtabName(id);  

ALTER TABLEsubTabNameADD CONSTRAINT fk_subTabName_tabNameFOREIGNKEYsubTabName(fid)REFERENCEStabName(id);

刪除主鍵/外來鍵或約束:

--SqlServer(統一語法)

ALTER TABLE[dbo].[tabName]DROPCONSTRAINT pk_tabName

--MySQL

ALTER TABLEtabNameDROP CONSTRAINT constaintName

ALTER TABLEtabNameDROP PRIMARY KEY pk_tabName 

ALTER TABLE subTabName DROP FOREIGNKEYfk_subTabName_tabName 

刪除表:

--SqlServer

DROP TABLEtabName,TabName2;

--MySQL

DROP TABLE IF EXISTS tabName,TabName2;

#######################################################################################

建立檢視:

--MySQL

CREATE ORREPLACEVIEW VtabName

AS

SELECT *FROMtabName

WITH CHECK OPTION;

--SqlServer

CREATE VIEWVtabName

AS

SELECT *FROMtabName

WITH CHECK OPTION;

檢視結構和定義:

--MySQL

DESC VtabName; 

SHOW CREATEVIEWVtabName; 

SHOW TABLE STATUS LIKE 'VtabName';

--SqlServer

sp_help VtabName

sp_helptext VtabName

刪除檢視:

--MySQL

DROP VIEWtabName;

DROP VIEW IF EXISTS tabName;

--SqlServer

DROP VIEWtabName;

#######################################################################################

建立索引:

--MySQL

CREATE TABLEtabName(id INT NOTNULL,KEYindName(id));

ALTER TABLEtabNameADD INDEX indName(Value);

CREATE UNIQUE INDEX indName ONtabName(Value);

--SqlServer

CREATE TABLE tabName(IDINTIDENTITY(100,1)CONSTRAINTPK_tabNamePRIMARYKEY)

CREATE UNIQUE INDEX indName ONtabName(Value);

重建索引:

--MySQL

REPAIR TABLE tabName QUICK;

--SqlServer

DBCC DBREINDEX('dbo.tabName','',100)

ALTER INDEXindNameON tabName REBUILD;

ALTER INDEX ALL ON tabNameREORGANIZE;

刪除索引:

--MySQL

ALTER TABLEtabNameDROP INDEX indName;

ALTER TABLEtabNameDROP PRIMARY KEY pk_tabName;

ALTER TABLEsubTabNameDROP FOREIGN KEY fk_subTabName_tabName;

DROP INDEX indName ON tabName;

--SqlServer

DROP INDEX indName ON tabName;

ALTER TABLE tabName DROP CONSTRAINTPK_tabName

檢視索引:

--MySQL

SHOW INDEX FROM tabName;

--SqlServer

SELECT *FROMsys.indexesWHEREobject_id= OBJECT_ID('tabName')

SELECT * FROM sys.sysindexesWHEREid = OBJECT_ID('tabName')

#######################################################################################

檢視儲存過程/函式定義:

--MySQL

SHOW CREATE{PROCEDURE | FUNCTION }name;  

SHOW {PROCEDURE| FUNCTION } STATUS[ LIKE 'pattern']; 

SELECT * FROM information_schema.RoutinesWHEREROUTINE_NAME='name'; 

--SqlServer

exec sp_helpf_getdate

exec sp_helptextf_getdate

SELECT * FROM information_schema.RoutinesWHEREROUTINE_NAME='name'; 

儲存過程:

--MySQL

DELIMITER // 

CREATE PROCEDUREsp_name(INparam1 INT,OUTparam2INT)  

BEGIN 

  {sql_statement} 

END// 

DELIMITER ; 

CALL sp_name();  

DROP PROCEDUREIFEXISTS sp_name;

--SqlServer

CREATE PROCEDUREsp_name(@param1INT,@param2INTOUTPUT)

AS

BEGIN 

  {sql_statement}

END

GO

EXEC sp_name();  

DROP PROCEDUREsp_name;

函式:

--MySQL

DELIMITER // 

CREATE FUNCTIONfn_name() 

RETURNS Decimal(10,2) 

RETURN 3.14; 

// 

DELIMITER ; 

SELECT fn_name(); 

DROP PROCEDUREIFEXISTS fn_name; 

--SqlServer

CREATE FUNCTIONdbo.fn_name() 

RETURNS Decimal(10,2)

AS

BEGIN

RETURN 3.14

END

GO

SELECT dbo.fn_name(); 

DROP FUNCTIONdbo.fn_name;

觸發器:

--MySQL

DELIMITER // 

CREATE TRIGGERtr_name 

{ AFTER|BEFORE } { INSERT| UPDATE | DELETE} 

ON tabName 

FOR EACHROW  

BEGIN 

  {sql_statement;}

END 

DELIMITER ; 

DROP TRIGGER IF EXISTS tr_name; 

--SqlServer

CREATE TRIGGERdbo.tr_name

ON [dbo].[tabName]

{ FOR|AFTER | INSTEAD OF}{ INSERT | UPDATE| DELETE }

AS

BEGIN

  {sql_statement;}

END

GO

DROP TRIGGER dbo.tr_name

#######################################################################################

迴圈語句:

--MySQL1100之和)

WHILE 迴圈:

DELIMITER //

CREATE PROCEDURETESTPRO()

BEGIN

DECLARE I,K INTDEFAULT 0 ;

WHILE I<= 100DO

SET K=I + K;

SET I=I + 1;

END WHILE;

SELECT K;

END;//

DELIMITER ;

REPEAT UNTIL 迴圈:

DELIMITER //

CREATE PROCEDURETESTPRO()

BEGIN

DECLARE I,K INTDEFAULT 0 ;

REPEAT

SET K=I + K;

SET I=I + 1;

UNTIL I>100

END REPEAT;

SELECT K;

END;//

DELIMITER ;

LOOP 迴圈:

DELIMITER //

CREATE PROCEDURETESTPRO()

BEGIN

DECLARE I,K INTDEFAULT 0 ;

LABEL: LOOP

SET K=I + K;

SET I=I + 1;

IF I>100THEN

LEAVE LABEL;

END IF;

END LOOP;

SELECT K;

END;//

DELIMITER ;

CALL TESTPRO();

DROP PROCEDUREIFEXISTS TESTPRO;

--SqlServer

DECLARE @I INT = 1

DECLARE @K INT = 0

WHILE @I<= 100

BEGIN

    SET @K = @K + @I

    SET @I = @I + 1

END

SELECT @K

遊標:

--MySQL(引數名稱不能與列明一樣)

DELIMITER //

CREATE PROCEDURETESTPRO()

BEGIN

DECLARE FName varchar(50);

DECLARE LName varchar(50);

DECLARE IsDone BOOLEAN DEFAULTFALSE;

DECLARE cursor_name CURSOR FOR SELECT FirstName,LastNameFROMPerson;

DECLARE CONTINUE HANDLER FOR NOT FOUNDSETIsDone = TRUE;

OPEN cursor_name;

LABEL: LOOP

    FETCH cursor_name INTO FName,LName;

    IF IsDoneTHEN

    LEAVE LABEL;

    END IF;

    SELECT CONCAT('Contact Name:',FName,LName)ASName;

END LOOP;

CLOSE cursor_name;

END;//

DELIMITER ;

--SqlServer

DECLARE @LastName varchar(50),@FirstNamevarchar(50);

DECLARE contact_cursor CURSOR FOR SELECT LastName,FirstNameFROM Person

OPEN contact_cursor;

FETCH NEXTFROMcontact_cursorINTO@LastName,@FirstName;

WHILE @@FETCH_STATUS = 0

BEGIN

    SELECT 'Contact Name: ' + @FirstName + ' '+@LastName

    FETCH NEXT FROM contact_cursorINTO@LastName,@FirstName;

END

CLOSE contact_cursor;

DEALLOCATE contact_cursor;

GO

#######################################################################################

檢視賬戶資訊:

--MySQL

select Host,User,Passwordfrommysql.user;

show grantsfor'username'@'localhost';

--SqlServer

select *fromsys.syslogins

select * from sys.sysuserswhereissqluser = 1

新增賬戶:

--MySQL(insertinto mysql.user 預設禁止,去掉my.init\sql-mode\STRICT_TRANS_TABLES)

CREATE USER 'username'@'localhost'IDENTIFIEDBY'password'; 

INSERT INTOmysql.user(Host,User,Password) 

VALUES ('localhost','username',PASSWORD('password'));

--SqlServer

USE [master]

GO

CREATE LOGIN[username]WITH PASSWORD=N'password',CHECK_POLICY=OFF

GO

USE [YourDatabase]

GO

CREATE USER [username] FORLOGIN[username]

GO

更改密碼:

--MySQL

mysqladmin -uusername -p123456 password 654321

set password=password("kk");

set passwordfor'username'@'localhost'=password('123456');

update mysql.usersetPassword = PASSWORD('123456')WHEREuser='username';

flush privileges;

--SqlServer

ALTER LOGIN[username]WITH PASSWORD=N'123456'

sp_password @new = '123456',@loginame='username'--,@old = 'old_password'

--MySQL

GRANT SELECTon*.* to 'username'@'localhost'identifiedby 'password';

REVOKE allprivileges,grant option FROM'username'@'localhost';

--SqlServer

USE [master]

GRANT CONNECTSQLTO [username]

REVOKE CONNECTSQLTO [username]

EXEC master..sp_addsrvrolemember@loginame=N'username',@rolename= N'sysadmin'

EXEC master..sp_dropsrvrolemember@loginame=N'username' ,@rolename=N'sysadmin' 

GO

USE [YourDatabase]

GRANT INSERT,UPDATE,DELETE,SELECTON[dbo].[TestTab]TO[username]

REVOKE INSERT,UPDATE,DELETE,SELECTON[dbo].[TestTab]TO[username]

EXEC sp_addrolememberN'db_owner',N'username'

EXEC sp_droprolememberN'db_owner',N'username'

GO

刪除賬戶:

--MySQL

DROP user 'username'@'localhost'; 

DELETE FROMmysql.userWHEREuser='username';

--SqlServer

USE [master]

GO

DROP LOGIN[TUser]

sp_droplogin @loginame = 'username'

GO

USE [YourDatabase]

GO

DROP USER [TUser]

sp_dropuser @name_in_db = 'username'

GO