首頁  >  文章  >  資料庫  >  mysql與sql server的語法有什麼差別

mysql與sql server的語法有什麼差別

WBOY
WBOY原創
2022-08-25 17:12:0513679瀏覽

mysql與“sql server”的語法區別:1、mysql支援enum和set類型,而“sql server”不支援;2、mysql的遞增語句是“AUTO_INCREMENT”,而“sql server”的是identity;3、“sql server”預設到處表建立語句的預設值表示是“((0))”,而mysql裡不允許帶兩個括號。

mysql與sql server的語法有什麼差別

本教學操作環境: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视频教程

以上是mysql與sql server的語法有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn