中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql與sql server的語法有哪些區別

發布時間:2022-08-25 17:33:59 來源:億速云 閱讀:394 作者:iii 欄目:MySQL數據庫

今天小編給大家分享一下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與sql server的語法區別

詳細介紹:

對于很多先學習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中數據庫的存儲分為邏輯實現與物理實現,示意圖:

mysql與sql server的語法有哪些區別

mysql與sql server的語法有哪些區別

其中主數據文件有且僅有一個,次數據文件可以有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不支持

DQL語句

查詢前幾條記錄:

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');

流程控制結構

IF結構

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

case結構(一致)

都需要使用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的語法有哪些區別”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏尼特左旗| 新晃| 聊城市| 文成县| 巨野县| 新泰市| 兴山县| 张家界市| 上杭县| 定州市| 桃园县| 察隅县| 盐源县| 同江市| 岳普湖县| 云阳县| 集安市| 关岭| 嵊州市| 青海省| 丹东市| 疏勒县| 溧水县| 河源市| 娱乐| 兴城市| 马山县| 九龙县| 那曲县| 葫芦岛市| 鄂州市| 蚌埠市| 台州市| 准格尔旗| 寿阳县| 静海县| 汉阴县| 马关县| 鄱阳县| 广宗县| 商水县|