mysql與sqlserver的語法有哪些區(qū)別

今天小編給大家分享一下MySQL與sql server的語法有哪些區(qū)別的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

站在用戶的角度思考問題,與客戶深入溝通,找到叢臺網(wǎng)站設(shè)計與叢臺網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(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里不允許帶兩個括號。

本教程操作環(huán)境:windows10系統(tǒng)、mysql8.0.22版本、Dell G3電腦。

mysql與sql server的語法區(qū)別

詳細(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),希望幫助同時學(xué)習(xí)這倆們SQL語言的人了解這倆種數(shù)據(jù)庫的語法異別

基礎(chǔ)語法

  • 注釋:在倆種數(shù)據(jù)庫中注釋的語法是一致的,示例:

# 單行注釋-- 單行注釋(注意是杠杠空格)/* 
多行注釋
*/
  • 語句結(jié)尾:

    在MySQL中必須使用;分隔每條語句并作為語句結(jié)尾,當(dāng)有多條語句一起執(zhí)行時如果語句間沒有使用分號分隔會報錯

    示例:

use Student; -- 同時運行倆條語句時不用;分隔語句會報錯select * from SC;

而在SQLServer中分號是可選的,你可以選擇加也可以選擇不加,同時SQLServer中提供了go關(guān)鍵字,作為批處理語句的結(jié)尾,建議寫SQLServer時使用go結(jié)束,這樣子在下一段語句需要上一段語句執(zhí)行完才能執(zhí)行的情況下不會報批處理錯誤,示例:

use Student-- 假設(shè)SC數(shù)據(jù)表在Student庫下,此時如果不寫go會報錯goselect * from SC
  • 存儲引擎:

    在mysql中常用的有InnoDB | MyISAM | MEMORY | MERGE等存儲引擎,其中使用最多的是InnoDB

    而在SQLServer中數(shù)據(jù)庫的存儲分為邏輯實現(xiàn)與物理實現(xiàn),示意圖:

mysql與sql server的語法有哪些區(qū)別

mysql與sql server的語法有哪些區(qū)別

其中主數(shù)據(jù)文件有且僅有一個,次數(shù)據(jù)文件可以有n個(0-n),日志文件可以有一到多個(至少有一個)

同時MySQL在創(chuàng)建表時可以指定表的存儲引擎(默認(rèn)InnoDB),而SQLServer只有一種存儲引擎

  • MySQL可以使用單引號與雙引號,而SQLServer只支持單引號

  • 都不嚴(yán)格區(qū)分大小寫

  • 定位某張表

    mysql:庫名.表名,示例:Student.SC

    SQLServer:庫名.dbo.表名 或者 庫名…表名

    其中dbo為數(shù)據(jù)庫所有者(Database Owner),即有權(quán)限訪問數(shù)據(jù)庫的用戶,是唯一的,擁有這個數(shù)據(jù)庫的全部權(quán)限,并能給其他用戶提供訪問權(quán)限與功能

    示例:

Student.dbo.SC -- 或者:
Student..SC
  • SQLServer中的exec關(guān)鍵字:

-- 1. exec 存儲過程名 參數(shù)1, 參數(shù)2....-- 注意:執(zhí)行存儲過程時是不加括號的
-- 2. exec('sql語句'),表示執(zhí)行該語句
  • SQLServer高級語法中提供了一系列的sp命令

  • SQLServer中的系統(tǒng)數(shù)據(jù)庫:

    master:記錄系統(tǒng)的所有系統(tǒng)級信息

    model:模板數(shù)據(jù)庫

    msdb:存儲計劃信息,備份與恢復(fù)相關(guān)信息,SQLServer代理程序調(diào)度報警與作業(yè)調(diào)度等信息

    tempdb:臨時數(shù)據(jù)庫,他為所有的臨時表,臨時存儲過程以及其他所有臨時操作提供存儲空間

    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ù)據(jù)詞典”和“系統(tǒng)目錄”) ,即保存著關(guān)于MySQL服務(wù)器所維護(hù)的所有其他數(shù)據(jù)庫的信息,如數(shù)據(jù)庫名,數(shù)據(jù)庫的表,表欄的數(shù)據(jù)類型與訪問權(quán)限等

    在INFORMATION_SCHEMA中,有幾張只讀表。它們實際上是視圖,而不是基本表

    mysql:核心數(shù)據(jù)庫(類似于SQLServer的master表),存儲數(shù)據(jù)庫的用戶、權(quán)限設(shè)置、關(guān)鍵字等mysql自己需要使用的控制和管理信息,例如修改root用戶密碼就需要使用這個數(shù)據(jù)庫

    performance_schema;

    sys;

  • 在負(fù)載壓力相同時,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),是否在增加幾個日志文件....
	并且邏輯文件命名需要與物理文件命名相對應(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 庫名

查看所有數(shù)據(jù)庫

mysql:

-- 查看當(dāng)前所有數(shù)據(jù)庫:
show databases;
-- 查詢某個數(shù)據(jù)庫的字符集(查詢數(shù)據(jù)庫的創(chuàng)建語句即可實現(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ù)據(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-- 待補充

刪除庫(一致)

語法:

DROP DATABASE [IF EXISTS] 數(shù)據(jù)庫名;

建表

最大容量

SQLServer每個表最多能有1024列,每行最多允許有8060個字節(jié)

MySQL一個表的總字段長度不能超過65535

建表語法(基本一致)

為什么說是基本一致呢,因為在SQLServer建表中,可以通過在表名前面加上db_name.dbo的形式來指定所屬數(shù)據(jù)庫與所有者,而在mysql中我暫時是沒看到類似語法的

語法:

CRATE TABLE [IF NOT EXISTS] 表名(
	列名 列的類型[(長度) 約束],
	列名 列的類型[(長度)約束],
	列名 列的類型[(長度)約束],
	...
	列名 列的類型[(長度)約束]
);
-- 注:
-- 約束是可選項,不一定要填寫
-- 最后一列的后面不需要添加逗號,其他每一列都需要添加逗號
-- SQLServer中不能通過這種IF NOT EXISTS的形式判斷是否存在
-- SQLServer中的所有判斷是否存在都只能通過IF EXISTS(查詢語句)的方法實現(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)前處于哪個數(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使用倆個alter

刪除表

基本一致

分離與附加數(shù)據(jù)庫:

SQLServer:

-- 分離數(shù)據(jù)庫
sp_detach_db 數(shù)據(jù)庫名
go
-- 附加數(shù)據(jù)庫
exec sp_attach_db [@dbname = ]'數(shù)據(jù)庫名',
[@filename1 = ]'包含路徑的文件物理名'[...16]
go
-- 數(shù)據(jù)庫文件最多可以指定16個

約束/索引

  • 遞增語句MySQL是AUTO_INCREMENT,SQLServer是identify(10.1),從10開始一次加1

  • mysql不支持檢查索引(check),SQLServer支持

數(shù)據(jù)類型

  • MySQL中沒有nchar,nvarchar,ntext等類型

  • SQLServer使用datetime類型作為獲取默認(rèn)值為當(dāng)前時間的數(shù)據(jù)類型

    而MySQL使用timestamp時間錯類型實現(xiàn)這個效果

  • MySQL支持無符號的整數(shù)類型,而SQLServer不支持

DQL語句

查詢前幾條記錄:

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支持全外連接

其余查詢語法基本一致

常見函數(shù)

調(diào)用函數(shù)方法

MySQL與SQLServer調(diào)用函數(shù)都是使用select調(diào)用函數(shù),示例:

SELECT 函數(shù)名(參數(shù)列表);

獲取當(dāng)前時間

MySQL可以使用current_date()函數(shù)獲取當(dāng)前日期,或者使用CURRENT_TIME()函數(shù)只獲取當(dāng)前時間,或者使用CURRENT_TIMESTAMP()函數(shù)與now()函數(shù)獲取當(dāng)前的完整時間,示例:

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)前時間日期,示例:

SELECT getdate();
-- 返回值:2021-12-27 01:40:40.907

判空函數(shù)

mysql:

-- 1. ifnull(exp1,exp2);
-- 表示當(dāng)exp1為空時值為exp2,不為空時值為exp1

-- 2. isnull(exp1);
-- 當(dāng)exp1為空時返回1,不為空時返回0

-- 3. 同時在MySQL中還提供了if函數(shù)(與if結(jié)構(gòu)語句不同),示例:
if (exp1,exp2,exp3)
-- 表示當(dāng)條件表達(dá)式exp1成立時返回exp2.否則返回exp3
-- 類似于java中的三目表達(dá)式,SQLServer中沒有這個函數(shù)

SQLServer:

-- 1. isnull(exp1,exp2);
-- 表示當(dāng)exp1為空時值為exp2,不為空時值為exp1
-- 沒有ifnull()函數(shù)
-- 相對來說mysql的ifnull和isnull函數(shù)容易理解一點

字符串連接函數(shù)

mysql:

-- 使用concat()函數(shù),示例:SELECT CONCAT('我','在','學(xué)習(xí)mysql');-- 不能使用+連接字符串!

SQLServer:

-- 1. 使用加號+連接字符串
select 'hello'+'SQL'
-- 2. 使用concat()函數(shù),示例:
SELECT CONCAT('我','在','學(xué)習(xí)mysql');

流程控制結(jié)構(gòu)

IF結(jié)構(gòu)

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塊中-- 語句中只有一條時可以省略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

case結(jié)構(gòu)(一致)

都需要使用then

不需要寫B(tài)egin,只需要寫END,分為倆種形式:

  • case后可以帶一個值,在when中通過判斷這個值的取值來達(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

循環(huán)結(jié)構(gòu)

基本一致

但是在MySQL中在while循環(huán)后面需要加上do關(guān)鍵字

同時在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://muchs.cn/article20/jopsco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷面包屑導(dǎo)航、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、App設(shè)計、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)