>데이터 베이스 >MySQL 튜토리얼 >mysql과 sql server 구문의 차이점은 무엇입니까?

mysql과 sql server 구문의 차이점은 무엇입니까?

WBOY
WBOY원래의
2022-08-25 17:12:0513924검색

mysql과 "sql server"의 구문 차이: 1. Mysql은 enum 및 set 유형을 지원하지만 "sql server"는 지원하지 않습니다. 2. Mysql의 증분 문은 "AUTO_INCREMENT"인 반면 "sql server"는 ID를 사용합니다. 테이블 생성문에 대한 "sql server"의 기본값은 "((0))"이며, mysql에서는 괄호 2개를 사용할 수 없다.

mysql과 sql server 구문의 차이점은 무엇입니까?

이 튜토리얼의 운영 환경: windows10 시스템, mysql8.0.22 버전, Dell G3 컴퓨터.

mysql과 sql server 구문의 차이점은 무엇인가요?

자세한 소개:

MySQL을 먼저 배우고 그다음에 SQLServer를 배우는 많은 초보자들에게 가장 불편한 점은 둘 사이의 구문입니다. 예를 들어 SQL Server에는 수정 및 변경과 같은 키워드가 없거나 MySQL의 각 문은 ;로 끝나는 반면 SQLServer에서는 go는 배치 문의 끝 등을 나타냅니다...
;结尾,而SQLServer却是使用go这一关键字表示一段批处理语句的结束等等…

本文正是在这种情况下出现,希望帮助同时学习这俩们SQL语言的人了解这俩种数据库的语法异别

基础语法

  • 注释:在俩种数据库中注释的语法是一致的,示例:

# 单行注释-- 单行注释(注意是杠杠空格)/* 
多行注释
*/
  • 语句结尾:

    在MySQL中必须使用;分隔每条语句并作为语句结尾,当有多条语句一起执行时如果语句间没有使用分号分隔会报错

    示例:

use Student; -- 同时运行俩条语句时不用;分隔语句会报错select * from SC;

而在SQLServer中分号是可选的,你可以选择加也可以选择不加,同时SQLServer中提供了go关键字,作为批处理语句的结尾,建议写SQLServer时使用go

이 글은 두 SQL 언어를 모두 배우는 사람들이 이 두 가지 구문을 이해하는 데 도움이 되기를 바라면서 이러한 상황에서 나타납니다. 두 데이터베이스 차이점
  • 기본 구문

참고: 두 데이터베이스의 주석 구문은 동일합니다. 예:

mysql과 sql server 구문의 차이점은 무엇입니까?

use Student-- 假设SC数据表在Student库下,此时如果不写go会报错goselect * from SC

mysql과 sql server 구문의 차이점은 무엇입니까?

문 끝:

MySQL에서는 ;를 이용하여 각 문장을 구분하고 문장의 끝 역할을 해야 합니다. 여러 문장을 함께 실행할 때 세미콜론으로 문장을 구분하지 않으면 오류가 발생합니다

예:
  • Student.dbo.SC -- 或者:
    Student..SC
    SQL Server에서는 세미콜론을 추가할지 여부를 선택할 수 있습니다. 동시에 SQL Server에서는 배치 문의 끝으로 go 키워드를 제공합니다. SQL Server를 작성할 때 go를 사용하여 종료하는 것이 좋습니다. 그러면 이전 문을 실행하기 전에 다음 문을 실행해야 할 때 일괄 처리 오류가 보고되지 않습니다. 예:
-- 1. exec 存储过程名 参数1, 参数2....-- 注意:执行存储过程时是不加括号的
-- 2. exec('sql语句'),表示执行该语句
  • 스토리지 엔진:
  • mysql에서 일반적으로 사용되는 스토리지 엔진으로는 InnoDB | MyISAM | MEMORY | MERGE가 있으며 그 중 InnoDB가 가장 많이 사용됩니다

    . 구현 회로도:

  • 그 중 기본 데이터는 하나의 파일만 있고 n개의 보조 데이터 파일(0-n)이 있을 수 있으며 하나 이상의 로그 파일( 하나 이상)
    • 동시에 MySQL은 테이블을 생성할 때 테이블의 스토리지 엔진을 지정할 수 있으며(기본 InnoDB) SQLServer에는 스토리지 엔진이 하나만 있습니다

    MySQL은 작은따옴표와 큰따옴표를 사용할 수 있지만 SQLServer는 작은따옴표만 지원합니다
    • 대소문자를 엄격히 구분하지 않습니다
    • 특정 테이블 찾기

      mysql: 라이브러리 이름.테이블 이름, 예: Student.SC

      SQLServer: 라이브러리 이름.dbo.테이블 이름 또는 라이브러리 이름...테이블 이름

      여기서 dbo는 데이터베이스 소유자(Database Owner)입니다. 즉, 데이터베이스에 액세스할 수 있는 권한이 있는 사용자는 이 데이터베이스에 대한 모든 권한을 가지며 액세스를 제공할 수 있는 유일한 사용자입니다. 다른 사용자에게 권한 및 기능

      예:

    -- print自带换行
    print 'hello'
  • SQL Server의 Exec 키워드:

    -- 直接创建即可CREATE DATABASE [IF NOT EXISTS] 数据库名 
    [character set 字符集名];

    SQL Server 고급 구문에서 제공 일련의 sp 명령

    SQL Server의 시스템 데이터베이스 :
  • master: 시스템의 모든 시스템 수준 정보를 기록합니다.

    model: 템플릿 데이터베이스
  • msdb: 계획 정보, 백업 및 복구 관련 정보, SQLServer 에이전트 예약 경보 및 작업 예약 및 기타 정보 저장

    tempdb: 임시 데이터베이스 모든 임시 테이블, 임시 저장 프로시저 및 기타 모든 임시 작업을 위한 저장 공간을 제공하는 🎜🎜resource: 모든 시스템 개체를 포함하지만 사용자는 포함하지 않는 숨겨진 읽기 전용 데이터베이스 데이터 또는 사용자 원본 데이터🎜🎜🎜🎜mysql의 시스템 데이터베이스: 🎜🎜information_schema: 데이터베이스 메타데이터에 액세스하는 방법을 제공합니다. (메타데이터는 데이터베이스 또는 테이블 이름, 열 데이터 유형 또는 액세스 권한과 같은 데이터에 관한 데이터입니다. 이 정보를 설명하기 위해 때때로 사용되는 다른 용어로는 "데이터 사전" 및 "시스템 카탈로그"가 있습니다.) 데이터베이스 이름, 데이터베이스 테이블, 테이블 열 데이터 유형 및 액세스 권한 등 MySQL 서버 🎜🎜INFORMATION_SCHEMA에는 여러 개의 읽기 전용 테이블이 있습니다. 기본 테이블이 아닌 뷰입니다. 🎜🎜mysql: 데이터베이스 사용자, 권한 설정, 키워드 등 mysql이 사용해야 하는 제어 및 관리 정보를 저장하는 코어 데이터베이스(SQL Server의 마스터 테이블과 유사) , 루트 사용자 수정과 같은 비밀번호는 이 데이터베이스를 사용해야 합니다🎜🎜performance_schema;🎜🎜sys;🎜🎜🎜🎜로드 압력이 동일하면 MySQL은 메모리와 CPU를 덜 소비합니다🎜🎜🎜🎜print 문 인쇄도 SQL Server에서는 제공되지만 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으로 문의하세요.