Sqlserver sql寫法與mysql 不同之處收集

Sqlserver sql寫法與mysql 不同之處收集

 

一. 常用sql語句及常見問題

 

對關鍵字,保留字的寫法不同

sqlserver:  select * from tbName where [key]='test';  關鍵字一般用[ ]括起來即可!

mysql: select * from tbName where `before`='test';  關鍵字一般用 ``括起來,即~這個鍵的下面那個字符

 

當前時間的寫法,取n條記錄

sqlserver:   select top 10 * from tbName where CreateTime<getdate();

mysql: select * from tbName where CreateTime<Now() limit 10;
 

從數據庫定位到表


Sqlserver寫法:庫名.dbo.表名 ;或者:庫名..表名 
 (注:中間使用兩個點)
select password from Info.dbo.users where userName='boss'
或者
select password from Info..users where userName='boss'
mysql寫法:庫名.表名
select password from Info.users where userName='boss'


判斷是否存在某個數據庫,若存在,則刪除


Sqlserver寫法:
IF DB_ID('users') IS NOT NULL
DROP DATABASE users
Mysql寫法:
Drop DATABASE if exists users

拓展:若sqlserver數據庫正在使用中,刪除之前,先要把數據庫變成“單一用戶”,再刪除
ALTER DATABASE users SET SINGLE_USER with ROLLBACK IMMEDIATE IF DB_ID('users') IS NOT NULL DROP DATABASE users

另附:判斷某數據庫中是否存在某張表,若存在,則刪除
Sqlserver寫法:
if exists(select * from sysobjects where name ='Users_test')
drop table Users_test
Mysql寫法:
DROP TABLE IF EXISTS Users_test


主鍵存在,則更新,不存在,則插入


Mysql寫法:    
INSERT into users (userID,userName,password) VALUES (1,’jmj’,’123’) ON DUPLICATE KEY UPDATE  userName='jmj', password=123

Sqlserver沒有mysql這樣的關鍵字,只能組合sql語句來實現操作:
if not exists (select userID from users where userID= 1)insert into users (userID,userName,password) values(1,’jmj’,’123’) else update users set userName= ’jmj’, password=’123’ where userID = 1


符號的使用


mysql對參數可以使用單引號,也可以使用雙引號,對字段名和表明可以使用反引號。
sqlserver只能使用單引號,且不能使用反引號。
Mysql寫法:
Select `password` from Users where userName='boss' or username=”jmj”;
Sqlserver寫法:
Select password from Users where userName='boss' or username=’jmj’;


查詢指定庫中的所有表


mysql 語句
-- 查看系統內所有數據庫
show databases;

select * from information_schema.SCHEMATA;
-- 查詢數據庫內所有表
show tables;

select * from information_schema.`TABLES` where TABLE_SCHEMA='dbname'
-- 顯示錶結構
desc 表名;

sql server語句
-- 查看系統內所有數據庫
SELECT name, database_id, create_date  FROM sys.databases  ;
-- 查詢數據庫內所有表
select * from sysobjects where xtype= 'U'  ;
-- 顯示錶結構
sp_help/sp_columns 表名;


字符串的處理


截取字符串
SQLServer只能使用SUBSTRING關鍵詞來截取字符串。
MySQL可以使用SUBSTRING和SUBSTR截取字符串
取得字符串的長度

SQLServer只能使用Len關鍵詞取得字符串的長度。
MySQL可以使用Length取得字符串的長度。
 

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;
 

註釋符區別


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

 

語法及兼容方面的不同點

mysql支持enum,和set類型,sql server不支持
mysql不支持nchar,nvarchar,ntext類型
mysql的遞增語句是AUTO_INCREMENT,而mssql是identity(1,1)
msms默認到處表創建語句的默認值表示是((0)),而在mysql裏面是不允許帶兩括號的
mysql需要爲表指定存儲類型
mssql識別符是[],[type]表示他區別於關鍵字,但是mysql卻是 `,也就是按鍵1左邊的那個符號
mssql支持getdate()方法獲取當前時間日期,但是mysql裏面可以分日期類型和時間類型,獲取當前日期是cur_date(),當前完整時間是 now()函數
mssql不支持replace into 語句,但是在最新的sql20008裏面,也支持merge語法
mysql支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是mssql不支持這樣寫
mysql支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1)
mssql不支持limit語句,是非常遺憾的,只能用top 取代limt 0,N,row_number() over()函數取代limit N,M
mysql在創建表時要爲每個表指定一個存儲引擎類型,而mssql只支持一種存儲引擎
mysql不支持默認值爲當前時間的datetime類型(mssql很容易做到),在mysql裏面是用timestamp類型
mysql支持無符號型的整數,那麼比不支持無符號型的mssql就能多出一倍的最大數存儲
mysql不支持在mssql裏面使用非常方便的varchar(max)類型,這個類型在mssql裏面既可做一般數據存儲,也可以做blob數據存儲
mysql創建非聚集索引只需要在創建表的時候指定爲key就行,比如:KEY displayorder (fid,displayorder) 在mssql裏面必須要:create unique nonclustered index index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers(username asc,appid asc)
mysql text字段類型不允許有默認值
mysql的一個表的總共字段長度不超過65XXX。
一個很表面的區別是mysql的安裝特簡單,且文件大小才110M(非安裝版),相比微軟這個龐然大物,安裝進度來說簡直就是.....
mysql的管理工具有幾個比較好的,mysql_front,和官方那個套件,不過都沒有SSMS的使用方便,這是mysql很大的一個缺點。
mysql的存儲過程只是出現在最新的版本中,穩定性和性能可能不如mssql。
同樣的負載壓力,mysql要消耗更少的CPU和內存,mssql的確是很耗資源。
mysql支持date,time,year類型,mssql到2008才支持date和time。

 

二. 數據定義部分


數據庫操作基本命令
Mysql:
create database name; 創建數據庫 
use databasename; 選擇數據庫 
drop database name 直接刪除數據庫,不提醒 –
CREATE TABLE --創建一個數據庫表
2.1    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

2.2     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

2.3    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我沒有找到怎麼刪除。

2.4    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

2.5    索引區別
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


2.6    主鍵自動增加的區別
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)

2.7    MySQL支持enum,和set類型,SQL Server不支持
2.7.1    枚舉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    |
+------+  
2.7.2    集合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
集合 和 枚舉的區別
集合可以有64個值 枚舉有65535個
集合的序號是 1 2 4 8 16 枚舉是 1 2 3 4 5 6
集合一個字段值可以有好幾個值
+-------+
| f1    |
+-------+
| f,m   |
+-------+

2.8    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;

 

持續更新中

--- end ---

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章