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