目錄
一、環境
二、存儲引擎
三、語法
和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 Server最適合.net,而MySQL可以與幾乎所有其他語言相匹配,尤其是PHP。還應該提到,SQL Server過去只在Windows上運行,但自從微軟宣布Linux支持SQL Server以來,情況發生了變化。不過,Linux版本還不夠成熟,這意味着如果使用SQL Server,我們建議您繼續在Windows上工作,如果使用MySQL,則切換到Linux。
二、存儲引擎
MySQL和SQL Server之間另一個經常被忽略的大區別是它們存儲數據的方式,SQL Server使用微軟開發的單一存儲引擎,而MySQL提供的是多個引擎。這為MySQL開發人員提供了更大的靈活性,因為他們可以根據速度、可靠性或其他維度為不同的表使用不同的引擎。一個流行的MySQL存儲引擎是InnoDB,它屬於比較慢的一種,但是保持了可靠性,另一個是MyISAM。
二、語法
雖然MySQL和SQL Server都基於SQL,但語法上的差異仍然很突出,值得注意。
1. 和SQL Server語法主要不同的地方
1.1 大小寫敏感性
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