今天小編給大家分享一下MySQL與sql server的語法有哪些區(qū)別的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
站在用戶的角度思考問題,與客戶深入溝通,找到叢臺網(wǎng)站設(shè)計(jì)與叢臺網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋叢臺地區(qū)。
mysql與“sql server”的語法區(qū)別:1、mysql支持enum和set類型,而“sql server”不支持;2、mysql的遞增語句是“AUTO_INCREMENT”,而“sql server”的是identity;3、“sql server”默認(rèn)到處表創(chuàng)建語句的默認(rèn)值表示是“((0))”,而mysql里不允許帶兩個(gè)括號。
本教程操作環(huán)境:windows10系統(tǒng)、mysql8.0.22版本、Dell G3電腦。
詳細(xì)介紹:
對于很多先學(xué)習(xí)MySQL再學(xué)習(xí)SQLServer的初學(xué)者來說,很難受的一件事情莫過于在這倆者的語法中有一些細(xì)微的細(xì)節(jié)差異讓人無法適應(yīng),例如SQLServer中并沒有modify與change等關(guān)鍵字,又或者M(jìn)ySQL中的每條語句以;
結(jié)尾,而SQLServer卻是使用go
這一關(guān)鍵字表示一段批處理語句的結(jié)束等等…
本文正是在這種情況下出現(xiàn),希望幫助同時(shí)學(xué)習(xí)這倆們SQL語言的人了解這倆種數(shù)據(jù)庫的語法異別
基礎(chǔ)語法
注釋:在倆種數(shù)據(jù)庫中注釋的語法是一致的,示例:
# 單行注釋-- 單行注釋(注意是杠杠空格)/* 多行注釋 */
語句結(jié)尾:
在MySQL中必須使用;
分隔每條語句并作為語句結(jié)尾,當(dāng)有多條語句一起執(zhí)行時(shí)如果語句間沒有使用分號分隔會報(bào)錯(cuò)
示例:
use Student; -- 同時(shí)運(yùn)行倆條語句時(shí)不用;分隔語句會報(bào)錯(cuò)select * from SC;
而在SQLServer中分號是可選的,你可以選擇加也可以選擇不加,同時(shí)SQLServer中提供了go
關(guān)鍵字,作為批處理語句的結(jié)尾,建議寫SQLServer時(shí)使用go
結(jié)束,這樣子在下一段語句需要上一段語句執(zhí)行完才能執(zhí)行的情況下不會報(bào)批處理錯(cuò)誤,示例:
use Student-- 假設(shè)SC數(shù)據(jù)表在Student庫下,此時(shí)如果不寫go會報(bào)錯(cuò)goselect * from SC
存儲引擎:
在mysql中常用的有InnoDB | MyISAM | MEMORY | MERGE等存儲引擎,其中使用最多的是InnoDB
而在SQLServer中數(shù)據(jù)庫的存儲分為邏輯實(shí)現(xiàn)與物理實(shí)現(xiàn),示意圖:
其中主數(shù)據(jù)文件有且僅有一個(gè),次數(shù)據(jù)文件可以有n個(gè)(0-n),日志文件可以有一到多個(gè)(至少有一個(gè))
同時(shí)MySQL在創(chuàng)建表時(shí)可以指定表的存儲引擎(默認(rèn)InnoDB),而SQLServer只有一種存儲引擎
MySQL可以使用單引號與雙引號,而SQLServer只支持單引號
都不嚴(yán)格區(qū)分大小寫
定位某張表
mysql:庫名.表名,示例:Student.SC
SQLServer:庫名.dbo.表名 或者 庫名…表名
其中dbo為數(shù)據(jù)庫所有者(Database Owner),即有權(quán)限訪問數(shù)據(jù)庫的用戶,是唯一的,擁有這個(gè)數(shù)據(jù)庫的全部權(quán)限,并能給其他用戶提供訪問權(quán)限與功能
示例:
Student.dbo.SC -- 或者: Student..SC
SQLServer中的exec關(guān)鍵字:
-- 1. exec 存儲過程名 參數(shù)1, 參數(shù)2....-- 注意:執(zhí)行存儲過程時(shí)是不加括號的 -- 2. exec('sql語句'),表示執(zhí)行該語句
SQLServer高級語法中提供了一系列的sp命令
SQLServer中的系統(tǒng)數(shù)據(jù)庫:
master:記錄系統(tǒng)的所有系統(tǒng)級信息
model:模板數(shù)據(jù)庫
msdb:存儲計(jì)劃信息,備份與恢復(fù)相關(guān)信息,SQLServer代理程序調(diào)度報(bào)警與作業(yè)調(diào)度等信息
tempdb:臨時(shí)數(shù)據(jù)庫,他為所有的臨時(shí)表,臨時(shí)存儲過程以及其他所有臨時(shí)操作提供存儲空間
resource:隱藏的只讀數(shù)據(jù)庫,包含所有系統(tǒng)對象,但不含用戶數(shù)據(jù)或用戶原數(shù)據(jù)
mysql中的系統(tǒng)數(shù)據(jù)庫:
information_schema:提供了訪問數(shù)據(jù)庫元數(shù)據(jù)的方式。(元數(shù)據(jù)是關(guān)于數(shù)據(jù)的數(shù)據(jù),如數(shù)據(jù)庫名或表名,列的數(shù)據(jù)類型,或訪問權(quán)限等。有時(shí)用于表述該信息的其他術(shù)語包括“數(shù)據(jù)詞典”和“系統(tǒng)目錄”) ,即保存著關(guān)于MySQL服務(wù)器所維護(hù)的所有其他數(shù)據(jù)庫的信息,如數(shù)據(jù)庫名,數(shù)據(jù)庫的表,表欄的數(shù)據(jù)類型與訪問權(quán)限等
在INFORMATION_SCHEMA中,有幾張只讀表。它們實(shí)際上是視圖,而不是基本表
mysql:核心數(shù)據(jù)庫(類似于SQLServer的master表),存儲數(shù)據(jù)庫的用戶、權(quán)限設(shè)置、關(guān)鍵字等mysql自己需要使用的控制和管理信息,例如修改root用戶密碼就需要使用這個(gè)數(shù)據(jù)庫
performance_schema;
sys;
在負(fù)載壓力相同時(shí),MySQL消耗的內(nèi)存和CPU更少
在SQLServer中還提供了打印語句print,mysql中沒有,示例:
-- print自帶換行 print 'hello'
MySQL支持enum和set類型,SQLServer不支持
DDL&DML語句
建庫
mysql:
-- 直接創(chuàng)建即可CREATE DATABASE [IF NOT EXISTS] 數(shù)據(jù)庫名 [character set 字符集名];
SQLServer:
/* 除了數(shù)據(jù)庫名字外還需要指定: 主數(shù)據(jù)文件邏輯名(一般與數(shù)據(jù)庫同名),主數(shù)據(jù)物理文件名稱(.mdf) 主數(shù)據(jù)文件初始大小(默認(rèn)5MB),最大容量,增長速度 日志文件邏輯名(一般命名為庫名字_log),日志物理文件名(.ldf) 日志文件初始大小(默認(rèn)1MB),最大容量,增長速度 是否加上次要數(shù)據(jù)文件(.ndf),是否在增加幾個(gè)日志文件.... 并且邏輯文件命名需要與物理文件命名相對應(yīng) 主數(shù)據(jù)文件邏輯默認(rèn)名為數(shù)據(jù)庫名 */-- 示例:CREATE DATABASE 數(shù)據(jù)庫名[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表示后面定義的是數(shù)據(jù)文件 ON PRIMARY表示定義主數(shù)據(jù)文件 LOG ON表示定義日志文件 NAME表示文件邏輯名 FILENAME表示文件物理名 SIZE表示初始大小,至少為模板數(shù)據(jù)庫model的大小(主數(shù)據(jù)文件與日志文件分別是3M與1M) MAXSIZE表示文件最大大小,可以為UNLIMITED(無限制) FILEGROWTH表示文件大小增長速度,默認(rèn)值10%,每次最少增加64kb 默認(rèn)單位都是MB 注意:括號中最后一行無逗號,其他行都需要逗號 */
倆者語法一致,都是use 庫名
mysql:
-- 查看當(dāng)前所有數(shù)據(jù)庫: show databases; -- 查詢某個(gè)數(shù)據(jù)庫的字符集(查詢數(shù)據(jù)庫的創(chuàng)建語句即可實(shí)現(xiàn)): show create database name;
SQLServer:
-- 查看當(dāng)前所有數(shù)據(jù)庫: select name, database_id, create_date from sys.databases go -- SQLServer中的數(shù)據(jù)庫信息存儲在sys.databases中 -- 表示查詢數(shù)據(jù)庫名字,數(shù)據(jù)庫id與創(chuàng)建時(shí)間,固定寫法 -- 查看數(shù)據(jù)庫信息 sp_helpdb 數(shù)據(jù)庫名 go
注意:不管是哪種數(shù)據(jù)庫,修改庫的信息我們都是很少做的
mysql:
-- 對數(shù)據(jù)庫重命名 RENAME DATABASE 數(shù)據(jù)庫舊名 TO 數(shù)據(jù)庫新名; -- 修改數(shù)據(jù)庫的字符集 ALTER DATABASE 數(shù)據(jù)庫名 CHARACTER SET 字符集名;
SQLServer:
-- 對數(shù)據(jù)庫重命名sp_renamedb oldname, newname go-- 待補(bǔ)充
語法:
DROP DATABASE [IF EXISTS] 數(shù)據(jù)庫名;
SQLServer每個(gè)表最多能有1024列,每行最多允許有8060個(gè)字節(jié)
MySQL一個(gè)表的總字段長度不能超過65535
為什么說是基本一致呢,因?yàn)樵赟QLServer建表中,可以通過在表名前面加上db_name.dbo的形式來指定所屬數(shù)據(jù)庫與所有者,而在mysql中我暫時(shí)是沒看到類似語法的
語法:
CRATE TABLE [IF NOT EXISTS] 表名( 列名 列的類型[(長度) 約束], 列名 列的類型[(長度)約束], 列名 列的類型[(長度)約束], ... 列名 列的類型[(長度)約束] ); -- 注: -- 約束是可選項(xiàng),不一定要填寫 -- 最后一列的后面不需要添加逗號,其他每一列都需要添加逗號 -- SQLServer中不能通過這種IF NOT EXISTS的形式判斷是否存在 -- SQLServer中的所有判斷是否存在都只能通過IF EXISTS(查詢語句)的方法實(shí)現(xiàn) -- 檢查表是否存在示例: 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:
-- 查詢數(shù)據(jù)庫中所有表(SQLServer沒有): show tables [from 數(shù)據(jù)庫名; -- 查看表結(jié)構(gòu)(SQLServer沒有) desc 表名; # 查看指定表下的數(shù)據(jù)結(jié)構(gòu) -- 使用database()函數(shù)查看當(dāng)前處于哪個(gè)數(shù)據(jù)庫(SQLServer沒有) select database();
SQLServer:
-- 查詢當(dāng)前數(shù)據(jù)庫內(nèi)所有表,固定寫法 select * from sysobjects where xtype = 'U' -- 查看表結(jié)構(gòu) sp_help 表名; -- 或者: sp_columns 表名; -- 也可以在前面加上exec
mysql:
ALTER TABLE name rename [to] newName;
SQLServer:
exec sys.sp_rename
SQLServer中沒有change與modify語句,因此SQLServer使用倆個(gè)alter
基本一致
SQLServer:
-- 分離數(shù)據(jù)庫 sp_detach_db 數(shù)據(jù)庫名 go -- 附加數(shù)據(jù)庫 exec sp_attach_db [@dbname = ]'數(shù)據(jù)庫名', [@filename1 = ]'包含路徑的文件物理名'[...16] go -- 數(shù)據(jù)庫文件最多可以指定16個(gè)
約束/索引
遞增語句MySQL是AUTO_INCREMENT,SQLServer是identify(10.1),從10開始一次加1
mysql不支持檢查索引(check),SQLServer支持
MySQL中沒有nchar,nvarchar,ntext等類型
SQLServer使用datetime類型作為獲取默認(rèn)值為當(dāng)前時(shí)間的數(shù)據(jù)類型
而MySQL使用timestamp時(shí)間錯(cuò)類型實(shí)現(xiàn)這個(gè)效果
MySQL支持無符號的整數(shù)類型,而SQLServer不支持
查詢前幾條記錄:
SQLServer提供了top關(guān)鍵字
而MySQL使用limit關(guān)鍵字
示例:
select * from Student limit 100;select top 100 * from Student;
mysql 不支持 直接寫full outer join 或者 full join 來表示全外連接但是可以用union聯(lián)合查詢 代替
而SQLServer支持全外連接
其余查詢語法基本一致
MySQL與SQLServer調(diào)用函數(shù)都是使用select調(diào)用函數(shù),示例:
SELECT 函數(shù)名(參數(shù)列表);
MySQL可以使用current_date()函數(shù)獲取當(dāng)前日期,或者使用CURRENT_TIME()函數(shù)只獲取當(dāng)前時(shí)間,或者使用CURRENT_TIMESTAMP()函數(shù)與now()函數(shù)獲取當(dāng)前的完整時(shí)間,示例:
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()方法獲取當(dāng)前時(shí)間日期,示例:
SELECT getdate(); -- 返回值:2021-12-27 01:40:40.907
mysql:
-- 1. ifnull(exp1,exp2); -- 表示當(dāng)exp1為空時(shí)值為exp2,不為空時(shí)值為exp1 -- 2. isnull(exp1); -- 當(dāng)exp1為空時(shí)返回1,不為空時(shí)返回0 -- 3. 同時(shí)在MySQL中還提供了if函數(shù)(與if結(jié)構(gòu)語句不同),示例: if (exp1,exp2,exp3) -- 表示當(dāng)條件表達(dá)式exp1成立時(shí)返回exp2.否則返回exp3 -- 類似于java中的三目表達(dá)式,SQLServer中沒有這個(gè)函數(shù)
SQLServer:
-- 1. isnull(exp1,exp2); -- 表示當(dāng)exp1為空時(shí)值為exp2,不為空時(shí)值為exp1 -- 沒有ifnull()函數(shù) -- 相對來說mysql的ifnull和isnull函數(shù)容易理解一點(diǎn)
mysql:
-- 使用concat()函數(shù),示例:SELECT CONCAT('我','在','學(xué)習(xí)mysql');-- 不能使用+連接字符串!
SQLServer:
-- 1. 使用加號+連接字符串 select 'hello'+'SQL' -- 2. 使用concat()函數(shù),示例: SELECT CONCAT('我','在','學(xué)習(xí)mysql');
mysql需要在if 條件后以及else后添加then再寫語句
并且mysql中的IF結(jié)構(gòu)只能寫在begin end塊中
語法:
-- 語法IF 條件1 THEN 語句1;ELSEIF 條件2 THEN 語句2;...ELSE 語句n;END IF; -- 表示IF結(jié)構(gòu)結(jié)束了-- 注釋:只能用于BEGIN END塊中-- 語句中只有一條時(shí)可以省略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 '沒有改學(xué)生'go
都需要使用then
不需要寫B(tài)egin,只需要寫END,分為倆種形式:
case后可以帶一個(gè)值,在when中通過判斷這個(gè)值的取值來達(dá)到選擇效果(switch-case形式)
也可以不帶值,在when語句中寫條件判斷式(多重IF形式)
語法:
-- 1: case 要判斷的字段或表達(dá)式 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循環(huán)后面需要加上do關(guān)鍵字
同時(shí)在end后面需要寫上循環(huán)類型與循環(huán)表示,例如:WHILE [標(biāo)簽];
SQLServer不用
mysql視圖中的from子句不允許存在子查詢,而SQLServer支持
以上就是“mysql與sql server的語法有哪些區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
名稱欄目:mysql與sqlserver的語法有哪些區(qū)別
文章轉(zhuǎn)載:http://jinyejixie.com/article20/jopsco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、面包屑導(dǎo)航、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、App設(shè)計(jì)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)