MySQL與SQLServer的不一樣之處

目錄mysql

1、環境
2、存儲引擎
3、語法正則表達式

和SQL server語法主要不一樣的地方
  1.1 大小寫敏感性
  1.2 註釋符
  1.3 自增列
  1.4 查看錶的屬性
  1.5 修改表名
  1.6 刪除表
  1.7 修改字段屬性
  1.8 添加、刪除字段和約束
  1.9 建立表模板
數據類型
數據類型屬性
  3.1 unsigned
  3.2 zerofill
操做符
  4.1 安全等於運算符(<=>)
  4.2 正則表達式運算符(regexp或者rlike)
  4.3 鏈接操做符
  4.4 異或運算符XOR
  4.5 MySQL中的轉義sql

1、環境數據庫

SQL Server最適合.net,而MySQL能夠與幾乎全部其餘語言相匹配,尤爲是PHP。還應該提到,SQL Server過去只在Windows上運行,但自從微軟宣佈Linux支持SQL Server以來,狀況發生了變化。不過,Linux版本還不夠成熟,這意味着若是使用SQL Server,咱們建議您繼續在Windows上工做,若是使用MySQL,則切換到Linux。
2、存儲引擎express

MySQL和SQL Server之間另外一個常常被忽略的大區別是它們存儲數據的方式,SQL Server使用微軟開發的單一存儲引擎,而MySQL提供的是多個引擎。這爲MySQL開發人員提供了更大的靈活性,由於他們能夠根據速度、可靠性或其餘維度爲不一樣的表使用不一樣的引擎。一個流行的MySQL存儲引擎是InnoDB,它屬於比較慢的一種,可是保持了可靠性,另外一個是MyISAM。安全


2、語法ide

雖然MySQL和SQL Server都基於SQL,但語法上的差別仍然很突出,值得注意。函數

1. 和SQL Server語法主要不一樣的地方spa

1.1 大小寫敏感性.net

MySQL和SQL Server同樣,對大小寫不敏感。但不一樣的是,在MySQL中對部分對象的引用是大小寫敏感的,如數據庫名、表名,但對字段、索引、函數、存儲過程等的引用不敏感。

 

1.2 註釋符

在MySQL中支持三種註釋方法:如下均可以是行內註釋。

使用#做爲開頭,後面的全是註釋。

使用–做爲註釋開頭,但要注意,MySQL中這種註釋方法和SQLServer等其餘標準數據庫註釋語法稍有不一樣,MySQL要求第二個短線後面必須跟一個空白字符,如空格、製表符等。

使用/**/註釋符。

 

1.3 自增列

MySQL中設置自增列(auto_increment)的列必須是有索引的列,且建立表時要顯式指定的種子值須要在建表語句以後。另外MySQL一張表只能有一個自增列。而SQL Server中能夠有多個自增列。且MySQL中向自增列插入數據時必須使用null來表示插入的是自增列,除非顯式指定插入列表中不包含自增列,而SQL Server向自增列插入數據時能夠且必須無視該列,除非設置顯示插入模式。

-- SQL Server直接使用identity,但必須有非自增列以外的列才能插入,除非顯式開啓手動插入自增列
create table emp1(id int not null identity(1,2),name CHAR(20)); insert into emp1 VALUES('malongshuai'); insert into emp1 values('gaoxiaofang'); select * from emp1; -- MySQL中自增列必須爲索引列,而且只能設置種子值而不能直接設置步長
create table emp1(id int not null primary key AUTO_INCREMENT); create table emp2(id int not null primary key AUTO_INCREMENT) auto_increment=100; insert into emp1 values(null); insert into emp2 values(null);

 

1.4 查看錶的屬性

-- SQL Server使用存儲過程sp_help
exec sp_help emp; -- MySQL使用desc描述或者使用show
mysql> desc emp1;

 

1.5 修改表名

-- SQL Server使用存儲過程sp_rename
EXEC sp_rename emp,emp2 [object]

-- mysql使用alter語句中的rename功能
alter table emp rename [to] emp3;

 

1.6 刪除表

-- SQL Server刪除表,每次只能刪除一張表
if object_id('table_name') is not null drop table table_name; if exists(select object_id('table_name')) drop table table_name; -- MySQL能夠直接判斷,且一次能夠刪除多表
drop table if exists table_name1,table_name2...

 

1.7 修改字段屬性

-- SQL Server只能修改字段屬性(數據類型、空性),不能修改約束類屬性, -- 約束類屬性須要使用"alter table … add constraint"

alter table emp2 alter column id int not null; alter table emp2 add gender char(2); alter table emp2 add CONSTRAINT def_key DEFAULT('') FOR gender; alter table emp2 add constraint pk_key primary key clustered(id); -- mysql修改字段屬性有幾種方法
alter table table_name | ALTER [COLUMN] col_name {SET DEFAULT string | DROP DEFAULT} | CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

 也就是說,change和modify均可以修改列的定義,包括約束類的屬性、字段的位置,且change比modify更多一個重命名列的功能。而alter column則只能設置默認值和刪除默認值。注意,重命名和修改字段時,須要從新定義字段屬性。

 

1.8 添加、刪除字段和約束

-- MySQL中添加、刪除字段和約束的語法

-- 添加字段
| ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (col_name column_definition,...) -- 能夠一次性添加多個字段

-- 刪除字段
| DROP [COLUMN] col_name

-- 添加約束
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,...) [index_option] ... | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,...) [index_option] ... -- 刪除約束
| DROP PRIMARY KEY
| DROP FOREIGN KEY fk_symbol | DROP {INDEX|KEY} index_name | DISABLE KEYS | ENABLE KEYS -- 添加和刪除默認值約束
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

 

1.9 建立表模板

-- SQL Server
select * into table_name1 from table_name2; /*複製表結構和數據*/
select * into table_name1 from table_name2 where 1=0; /*只複製表結構*/
-- MySQL
create table table_name1 like table_name2; /*只複製表結構*/
create tbale table_name1 as select * from table_name2; /*複製表結構和數據*/

 MySQL中複製表結構時不會複製主鍵、索引、自增列等任何屬性,僅僅只是簡單的創建一張表而後插入數據。但SQL Server複製表結構時會複製自增列屬性。

 

2. 數據類型

3. 數據類型屬性

3.1 unsigned
unsigned屬性就是讓數值類型的數據變得無符號化。使用unsigned屬性將會改變數值數據類型的範圍,例如tinyint類型帶符號的範圍是-128到127,而使用unsigned時範圍將變成0到255。同時unsigned也會限制該列不能插入負數值。

create table t(a int unsigned,b int unsigned); insert into t select 1,2; insert into t select -1,-2; --上面的語句中,在執行第二條語句準備插入負數時將會報錯,提示超出範圍。

 

3.2 zerofill
zerofill修飾字段後,不足字段顯示部分將使用0來代替空格填充,啓用zerofill後將自動設置unsigned。

mysql> create table t1(id int(4) zerofill); mysql> select * from t1; +-------+
| id |
+-------+
| 0001 |
| 0002 |
| 0011 |
| 83838 |
+-------+
4 rows in set (0.00 sec)

 zerofill只是修飾顯示結果,不會改變存儲的數據值。

 

4. 操做符

4.1 安全等於運算符(<=>)
這個符號和"=「進行相同的運算,可是它多出的一個功能是能夠和NULL進行比較。
當比較的兩邊都是NULL時返回1而不是NULL,只有一邊是null時返回0而不是null,其他的時候和」="的結果同樣。

mysql> SELECT 1<=>NULL UNION ALL SELECT NULL<=>NULL UNION ALL SELECT 1=0 UNION ALL SELECT 1<=>0; +----------+
| 1<=>NULL |
+----------+
| 0 |
| 1 |
| 0 |
| 0 |
+----------+
4 rows in set

 

4.2 正則表達式運算符(regexp或者rlike)

在SQL Server中沒有正則表達式運算符,而MySQL中有。格式:expression regexp reg_pattern
若expression知足reg_pattern,則返回1,沒法匹配成功則返回0。若expression或reg_pattern任意一方爲null,則返回null。
MySQL實現的是擴展正則表達式。

mysql> SELECT 'basskd' REGEXP '^b','basskd' REGEXP 's.k','basskd' REGEXP NULL,NULL REGEXP '^b'; +----------------------+-----------------------+----------------------+------------------+
| 'basskd' REGEXP '^b' | 'basskd' REGEXP 's.k' | 'basskd' REGEXP NULL | NULL REGEXP '^b' |
+----------------------+-----------------------+----------------------+------------------+
| 1 | 1 | NULL | NULL |
+----------------------+-----------------------+----------------------+------------------+
1 row in set

 

4.3 鏈接操做符
在MySQL中,"+"不算是一種鏈接操做符。可是它的表達式是另有意義的:它會將兩邊的表達式嘗試轉換爲數值型進行數值相加運算,若是轉換失敗的則表示爲0。

mysql> select '12'+'34',12+'34','abc'+12,'a'+'abc'; +-----------+---------+----------+-----------+
| '12'+'34' | 12+'34' | 'abc'+12 | 'a'+'abc' |
+-----------+---------+----------+-----------+
| 46 | 46 | 12 | 0 |
+-----------+---------+----------+-----------+
1 row in set

 要真正實現字符串鏈接,須要使用函數concat。

 

4.4 異或運算符XOR
異或運算符是用於比較兩邊值是否相同的。相同則返回0,不一樣則返回1,若是存在null,則直接返回null。

mysql> select 1 xor 1,0 xor 0,1 xor 0,1 xor null,null xor null; +---------+---------+---------+------------+---------------+
| 1 xor 1 | 0 xor 0 | 1 xor 0 | 1 xor null | null xor null |
+---------+---------+---------+------------+---------------+
| 0 | 0 | 1 | NULL | NULL |
+---------+---------+---------+------------+---------------+
1 row in set

 

XOR運算符能夠鏈接屢次,順序是從前向後依次進行運算。

mysql> select 1 xor 1 xor 0,1 xor 1 xor 1; +---------------+---------------+
| 1 xor 1 xor 0 | 1 xor 1 xor 1 |
+---------------+---------------+
| 0 | 1 |
+---------------+---------------+
1 row in set

 

4.5 MySQL中的轉義
在MySQL中某些符號須要使用反斜槓"「來轉義。包括單引號(’)、雙引號(」)、反斜線()。
另外,若是對象名使用了關鍵字或特殊符號,也須要進行轉義,如列名使用了int關鍵字,表名使用了char關鍵字等。可是此時的轉義符號不是反斜線,而是反引號``或引號。

而在SQL Server中則不須要轉義,有歧義的時候只需使用引號便可。

mysql> INSERT INTO test7 VALUES('\\'),('\\\\'),('\''); mysql> select * from test7; +-----+ | col | +-----+ | \ | | \\ | | ' |
+-----+
3 rows in set

 

對於對象名的轉義,參考show create table table_name的結果便可看到,到處使用了反引號防止歧義。例如:

mysql> show create table test7; +-------+----------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------+
| test7 | CREATE TABLE `test7` ( `col` char(6) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------+
1 row in set
相關文章
相關標籤/搜索