您好,登錄后才能下訂單哦!
今天小編給大家分享一下mysql與sql server的語法有哪些區別的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
mysql與“sql server”的語法區別:1、mysql支持enum和set類型,而“sql server”不支持;2、mysql的遞增語句是“AUTO_INCREMENT”,而“sql server”的是identity;3、“sql server”默認到處表創建語句的默認值表示是“((0))”,而mysql里不允許帶兩個括號。
本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
詳細介紹:
對于很多先學習MySQL再學習SQLServer的初學者來說,很難受的一件事情莫過于在這倆者的語法中有一些細微的細節差異讓人無法適應,例如SQLServer中并沒有modify與change等關鍵字,又或者MySQL中的每條語句以;
結尾,而SQLServer卻是使用go
這一關鍵字表示一段批處理語句的結束等等…
本文正是在這種情況下出現,希望幫助同時學習這倆們SQL語言的人了解這倆種數據庫的語法異別
基礎語法
注釋:在倆種數據庫中注釋的語法是一致的,示例:
# 單行注釋-- 單行注釋(注意是杠杠空格)/* 多行注釋 */
語句結尾:
在MySQL中必須使用;
分隔每條語句并作為語句結尾,當有多條語句一起執行時如果語句間沒有使用分號分隔會報錯
示例:
use Student; -- 同時運行倆條語句時不用;分隔語句會報錯select * from SC;
而在SQLServer中分號是可選的,你可以選擇加也可以選擇不加,同時SQLServer中提供了go
關鍵字,作為批處理語句的結尾,建議寫SQLServer時使用go
結束,這樣子在下一段語句需要上一段語句執行完才能執行的情況下不會報批處理錯誤,示例:
use Student-- 假設SC數據表在Student庫下,此時如果不寫go會報錯goselect * from SC
存儲引擎:
在mysql中常用的有InnoDB | MyISAM | MEMORY | MERGE等存儲引擎,其中使用最多的是InnoDB
而在SQLServer中數據庫的存儲分為邏輯實現與物理實現,示意圖:
其中主數據文件有且僅有一個,次數據文件可以有n個(0-n),日志文件可以有一到多個(至少有一個)
同時MySQL在創建表時可以指定表的存儲引擎(默認InnoDB),而SQLServer只有一種存儲引擎
MySQL可以使用單引號與雙引號,而SQLServer只支持單引號
都不嚴格區分大小寫
定位某張表
mysql:庫名.表名,示例:Student.SC
SQLServer:庫名.dbo.表名 或者 庫名…表名
其中dbo為數據庫所有者(Database Owner),即有權限訪問數據庫的用戶,是唯一的,擁有這個數據庫的全部權限,并能給其他用戶提供訪問權限與功能
示例:
Student.dbo.SC -- 或者: Student..SC
SQLServer中的exec關鍵字:
-- 1. exec 存儲過程名 參數1, 參數2....-- 注意:執行存儲過程時是不加括號的 -- 2. exec('sql語句'),表示執行該語句
SQLServer高級語法中提供了一系列的sp命令
SQLServer中的系統數據庫:
master:記錄系統的所有系統級信息
model:模板數據庫
msdb:存儲計劃信息,備份與恢復相關信息,SQLServer代理程序調度報警與作業調度等信息
tempdb:臨時數據庫,他為所有的臨時表,臨時存儲過程以及其他所有臨時操作提供存儲空間
resource:隱藏的只讀數據庫,包含所有系統對象,但不含用戶數據或用戶原數據
mysql中的系統數據庫:
information_schema:提供了訪問數據庫元數據的方式。(元數據是關于數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等。有時用于表述該信息的其他術語包括“數據詞典”和“系統目錄”) ,即保存著關于MySQL服務器所維護的所有其他數據庫的信息,如數據庫名,數據庫的表,表欄的數據類型與訪問權限等
在INFORMATION_SCHEMA中,有幾張只讀表。它們實際上是視圖,而不是基本表
mysql:核心數據庫(類似于SQLServer的master表),存儲數據庫的用戶、權限設置、關鍵字等mysql自己需要使用的控制和管理信息,例如修改root用戶密碼就需要使用這個數據庫
performance_schema;
sys;
在負載壓力相同時,MySQL消耗的內存和CPU更少
在SQLServer中還提供了打印語句print,mysql中沒有,示例:
-- print自帶換行 print 'hello'
MySQL支持enum和set類型,SQLServer不支持
DDL&DML語句
建庫
mysql:
-- 直接創建即可CREATE DATABASE [IF NOT EXISTS] 數據庫名 [character set 字符集名];
SQLServer:
/* 除了數據庫名字外還需要指定: 主數據文件邏輯名(一般與數據庫同名),主數據物理文件名稱(.mdf) 主數據文件初始大小(默認5MB),最大容量,增長速度 日志文件邏輯名(一般命名為庫名字_log),日志物理文件名(.ldf) 日志文件初始大小(默認1MB),最大容量,增長速度 是否加上次要數據文件(.ndf),是否在增加幾個日志文件.... 并且邏輯文件命名需要與物理文件命名相對應 主數據文件邏輯默認名為數據庫名 */-- 示例:CREATE DATABASE 數據庫名[ON [PRIMARY]( NAME = 'test', FILENAME='D:\test.mdf', [SIZE=10240KB/MB/GB/TB, ] [MAXSIZE = UNLIMITED/20480KB/MB/GB/TB,] [FILEGROWTH = 10%/1024KB/MB/GB/TB])][LOG ON ( NAME='test_log', FILENAME='D:\test_log.ldf', [SIZE=1024KB/MB/GB/TB,] [MAXSIZE = 5120KB/MB/GB/TB/UNLIMITED,] [FILEGROWTH = 1024KB/MB/GB/TB/%])]GO/* 其中: ON表示后面定義的是數據文件 ON PRIMARY表示定義主數據文件 LOG ON表示定義日志文件 NAME表示文件邏輯名 FILENAME表示文件物理名 SIZE表示初始大小,至少為模板數據庫model的大小(主數據文件與日志文件分別是3M與1M) MAXSIZE表示文件最大大小,可以為UNLIMITED(無限制) FILEGROWTH表示文件大小增長速度,默認值10%,每次最少增加64kb 默認單位都是MB 注意:括號中最后一行無逗號,其他行都需要逗號 */
倆者語法一致,都是use 庫名
mysql:
-- 查看當前所有數據庫: show databases; -- 查詢某個數據庫的字符集(查詢數據庫的創建語句即可實現): show create database name;
SQLServer:
-- 查看當前所有數據庫: select name, database_id, create_date from sys.databases go -- SQLServer中的數據庫信息存儲在sys.databases中 -- 表示查詢數據庫名字,數據庫id與創建時間,固定寫法 -- 查看數據庫信息 sp_helpdb 數據庫名 go
注意:不管是哪種數據庫,修改庫的信息我們都是很少做的
mysql:
-- 對數據庫重命名 RENAME DATABASE 數據庫舊名 TO 數據庫新名; -- 修改數據庫的字符集 ALTER DATABASE 數據庫名 CHARACTER SET 字符集名;
SQLServer:
-- 對數據庫重命名sp_renamedb oldname, newname go-- 待補充
語法:
DROP DATABASE [IF EXISTS] 數據庫名;
SQLServer每個表最多能有1024列,每行最多允許有8060個字節
MySQL一個表的總字段長度不能超過65535
為什么說是基本一致呢,因為在SQLServer建表中,可以通過在表名前面加上db_name.dbo的形式來指定所屬數據庫與所有者,而在mysql中我暫時是沒看到類似語法的
語法:
CRATE TABLE [IF NOT EXISTS] 表名( 列名 列的類型[(長度) 約束], 列名 列的類型[(長度)約束], 列名 列的類型[(長度)約束], ... 列名 列的類型[(長度)約束] ); -- 注: -- 約束是可選項,不一定要填寫 -- 最后一列的后面不需要添加逗號,其他每一列都需要添加逗號 -- SQLServer中不能通過這種IF NOT EXISTS的形式判斷是否存在 -- SQLServer中的所有判斷是否存在都只能通過IF EXISTS(查詢語句)的方法實現 -- 檢查表是否存在示例: IF EXISTS(select count(*) from dbo.sysobjects where name = 'table_name') go -- 檢查字段是否存在示例: IF EXISTS(select count(*) from dbo.syscolumns where id = object_id('table_name') and name = 'column_name') go -- 或者: if DB_ID('name') is not null -- 不存在 create TABLE....
mysql:
-- 查詢數據庫中所有表(SQLServer沒有): show tables [from 數據庫名; -- 查看表結構(SQLServer沒有) desc 表名; # 查看指定表下的數據結構 -- 使用database()函數查看當前處于哪個數據庫(SQLServer沒有) select database();
SQLServer:
-- 查詢當前數據庫內所有表,固定寫法 select * from sysobjects where xtype = 'U' -- 查看表結構 sp_help 表名; -- 或者: sp_columns 表名; -- 也可以在前面加上exec
mysql:
ALTER TABLE name rename [to] newName;
SQLServer:
exec sys.sp_rename
SQLServer中沒有change與modify語句,因此SQLServer使用倆個alter
基本一致
SQLServer:
-- 分離數據庫 sp_detach_db 數據庫名 go -- 附加數據庫 exec sp_attach_db [@dbname = ]'數據庫名', [@filename1 = ]'包含路徑的文件物理名'[...16] go -- 數據庫文件最多可以指定16個
約束/索引
遞增語句MySQL是AUTO_INCREMENT,SQLServer是identify(10.1),從10開始一次加1
mysql不支持檢查索引(check),SQLServer支持
MySQL中沒有nchar,nvarchar,ntext等類型
SQLServer使用datetime類型作為獲取默認值為當前時間的數據類型
而MySQL使用timestamp時間錯類型實現這個效果
MySQL支持無符號的整數類型,而SQLServer不支持
查詢前幾條記錄:
SQLServer提供了top關鍵字
而MySQL使用limit關鍵字
示例:
select * from Student limit 100;select top 100 * from Student;
mysql 不支持 直接寫full outer join 或者 full join 來表示全外連接但是可以用union聯合查詢 代替
而SQLServer支持全外連接
其余查詢語法基本一致
MySQL與SQLServer調用函數都是使用select調用函數,示例:
SELECT 函數名(參數列表);
MySQL可以使用current_date()函數獲取當前日期,或者使用CURRENT_TIME()函數只獲取當前時間,或者使用CURRENT_TIMESTAMP()函數與now()函數獲取當前的完整時間,示例:
SELECT CURRENT_DATE(); -- 2021-12-27 SELECT CURRENT_TIME(); -- 01:42:23 SELECT CURRENT_TIMESTAMP(); -- 2021-12-27 01:42:23 SELECT NOW(); -- 2021-12-27 01:42:23
而SQLServer可以使用getdate()方法獲取當前時間日期,示例:
SELECT getdate(); -- 返回值:2021-12-27 01:40:40.907
mysql:
-- 1. ifnull(exp1,exp2); -- 表示當exp1為空時值為exp2,不為空時值為exp1 -- 2. isnull(exp1); -- 當exp1為空時返回1,不為空時返回0 -- 3. 同時在MySQL中還提供了if函數(與if結構語句不同),示例: if (exp1,exp2,exp3) -- 表示當條件表達式exp1成立時返回exp2.否則返回exp3 -- 類似于java中的三目表達式,SQLServer中沒有這個函數
SQLServer:
-- 1. isnull(exp1,exp2); -- 表示當exp1為空時值為exp2,不為空時值為exp1 -- 沒有ifnull()函數 -- 相對來說mysql的ifnull和isnull函數容易理解一點
mysql:
-- 使用concat()函數,示例:SELECT CONCAT('我','在','學習mysql');-- 不能使用+連接字符串!
SQLServer:
-- 1. 使用加號+連接字符串 select 'hello'+'SQL' -- 2. 使用concat()函數,示例: SELECT CONCAT('我','在','學習mysql');
mysql需要在if 條件后以及else后添加then再寫語句
并且mysql中的IF結構只能寫在begin end塊中
語法:
-- 語法IF 條件1 THEN 語句1;ELSEIF 條件2 THEN 語句2;...ELSE 語句n;END IF; -- 表示IF結構結束了-- 注釋:只能用于BEGIN END塊中-- 語句中只有一條時可以省略begin end
而在SQLServer中不需要寫then
語法:
IF (條件1)BEGIN 語句1ENDelseBEGIN 語句2ENDgo-- 示例:IF (EXISTS (select Sno from Student where Sno = '200001')) select Sno from Student where Sno = '200001'ELSE print '沒有改學生'go
都需要使用then
不需要寫Begin,只需要寫END,分為倆種形式:
case后可以帶一個值,在when中通過判斷這個值的取值來達到選擇效果(switch-case形式)
也可以不帶值,在when語句中寫條件判斷式(多重IF形式)
語法:
-- 1: case 要判斷的字段或表達式 when 常量1 then 要顯示的值1或語句1 when 常量2 then 要顯示的值2或語句2 ... else 要顯示的值n或語句n end -- 2: case when 條件1 then 要顯示的值1或語句1 when 條件2 then 要顯示的值2或語句2 ... else 要顯示的值n或語句n end
基本一致
但是在MySQL中在while循環后面需要加上do關鍵字
同時在end后面需要寫上循環類型與循環表示,例如:WHILE [標簽];
SQLServer不用
mysql視圖中的from子句不允許存在子查詢,而SQLServer支持
以上就是“mysql與sql server的語法有哪些區別”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。