久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

202次閱讀
沒有評論

共計 6875 個字符,預計需要花費 18 分鐘才能閱讀完成。

今天丸趣 TV 小編給大家分享一下 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 中數據庫的存儲分為邏輯實現與物理實現, 示意圖:

其中主數據文件有且僅有一個, 次數據文件可以有 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
-- 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 )
--  檢查字段是否存在示例:
IF EXISTS(select count(*) 
 from dbo.syscolumns
 where id = object_id(table_name)
 and name =  column_name )
--  或者:
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  數據庫名
--  附加數據庫
exec sp_attach_db [@dbname = ] 數據庫名 ,
[@filename1 = ] 包含路徑的文件物理名 [...16]
--  數據庫文件最多可以指定 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 的語法有哪些區別”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計6875字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 蓬莱市| 南丰县| 惠州市| 班戈县| 潜山县| 蒲江县| 洛阳市| 宿松县| 陵川县| 夏河县| 社旗县| 普陀区| 同德县| 郎溪县| 白朗县| 泰和县| 合水县| 黎城县| 桃源县| 留坝县| 凌源市| 通化县| 吉林市| 宾阳县| 贵州省| 阿坝| 南宫市| 额尔古纳市| 瑞安市| 松溪县| 磐安县| 宜兰县| 民乐县| 平塘县| 内黄县| 舟曲县| 汉川市| 宜兰市| 宁陵县| 定西市| 沛县|