mysql与sql server的语法有哪些区别

60次阅读
没有评论

共计 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字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)