mysqlとsqlサーバーの構文の違いは何ですか?

WBOY
リリース: 2022-08-25 17:14:54
オリジナル
13750 人が閲覧しました

mysql と "sql server" の構文の違い: 1. Mysql は列挙型と set 型をサポートしますが、"sql server" はサポートしません; 2. Mysql のインクリメント ステートメントは "AUTO_INCREMENT" であるのに対し、"sql server"' s それはアイデンティティです; 3. テーブル作成ステートメントの「sql server」のデフォルト値は「((0))」であり、mysql では 2 つの括弧は許可されません。

mysqlとsqlサーバーの構文の違いは何ですか?

このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。

mysql と SQL サーバーの構文の違いは何ですか

詳細な紹介:

多くの人にとって、最初に MySQL、次に SQLServer 初心者にとって最も不快なことの 1 つは、この 2 つの構文に微妙な違いがあり、適応するのが難しいことです。たとえば、SQL Server には、modify や change などのキーワードがありません。または MySQL のすべてのキーワード ステートメントは;で終わりますが、SQLServer はバッチ ステートメントの終わりを示すためにキーワードgoを使用します。など...

この記事はまさにこの場合、両方の SQL 言語を学習している人がこれら 2 つのデータベースの構文を理解できるようにしたいと考えていますDIFFERENCE

Basic Grammar

  • 注: 2 つのデータベースのコメントの構文は同じです。例:

# 单行注释-- 单行注释(注意是杠杠空格)/* 多行注释 */
ログイン後にコピー
  • ステートメントの終わり:

    MySQL では、;を使用して各ステートメントを区切り、ステートメントの終わりとして機能させる必要があります。複数のステートメントを一緒に実行すると、エラーが発生します。ステートメントがセミコロンで区切られていない場合に報告されます

    例:

use Student; -- 同时运行俩条语句时不用;分隔语句会报错select * from SC;
ログイン後にコピー

SQLServer ではセミコロンはオプションです。追加するかどうかを選択できます。 , SQLServer は、バッチ ステートメントの最後にgoキーワードを提供します。SQL Server を記述するときはgoを使用することをお勧めします。こうすることで、次回の実行時にバッチ エラーが報告されなくなります。ステートメントを実行するには、前のステートメントを実行する必要があります。例:

use Student-- 假设SC数据表在Student库下,此时如果不写go会报错goselect * from SC
ログイン後にコピー
  • ストレージ エンジン:

    mysql で一般的に使用されるストレージ エンジンには、InnoDB | MyISAM | MEMORY などがあります。 | MERGE およびその他のストレージ エンジン (その中で InnoDB が最もよく使用されています)

    SQLServer では、データベース ストレージは論理実装と物理実装に分かれています。概略図:

mysqlとsqlサーバーの構文の違いは何ですか?

mysqlとsqlサーバーの構文の違いは何ですか?

##メイン データ ファイルは 1 つだけあり、n 個のセカンダリ データ ファイル (0 ~ n) が存在する可能性があり、1 つ以上のログ ファイル (少なくとも1)

同時に、MySQL はテーブルの作成時にテーブルのストレージを指定できます。エンジン (デフォルトは InnoDB)、SQLServer にはストレージ エンジンが 1 つだけあります。

    # #MySQL は一重引用符と二重引用符を使用できますが、SQLServer は一重引用符のみをサポートします
  • では大文字と小文字が厳密に区別されません
  • #特定のテーブルを見つける
  • mysql: ライブラリ名.テーブル名、例: Student.SC

    SQLServer :ライブラリ名.dbo.テーブル名またはライブラリ名...テーブル名

    ここで dboはデータベース所有者 (データベース所有者) です。つまり、データベースにアクセスする権限を持つユーザーは、このデータベースに対するすべての権限を持つ唯一のユーザーです。また、アクセス権と機能を他のユーザーに提供できます

    例:

    Student.dbo.SC -- 或者: Student..SC
    ログイン後にコピー
    SQLServer の Exec キーワード:
  • -- 1. exec 存储过程名 参数1, 参数2....-- 注意:执行存储过程时是不加括号的 -- 2. exec('sql语句'),表示执行该语句
    ログイン後にコピー
    SQLServer の高度な構文が提供するシリーズsp コマンドの数
  • SQLServer のシステム データベース:
  • master: システムのすべてのシステム レベルの情報を記録します

    model: テンプレート データベース

    msdb: ストレージ プラン情報、バックアップとリカバリ関連情報、SQLServer エージェントのスケジュール アラームとジョブ スケジュール、およびその他の情報

    tempdb: すべての一時テーブル、一時ストアド プロシージャなどに記憶域スペースを提供する一時データベース。その他の一時的な操作

    リソース: すべてのシステム オブジェクトを含む、非表示の読み取り専用データベース。ただし、ユーザー データやユーザーは含まれません。元のデータ

  • mysql のシステム データベース:
  • information_schema: データベースのメタデータにアクセスする方法を提供します。 (メタデータとは、データベース名やテーブル名、列のデータ型、アクセス許可などのデータに関するデータです。この情報を説明するために使用される他の用語には、「データ ディクショナリ」や「システム カタログ」などがあります)。 MySQL サーバー (データベース名、データベース テーブル、テーブル列のデータ型、アクセス許可など)。

    INFORMATION_SCHEMA には、いくつかの読み取り専用テーブルがあります。これらは実際にはビューであり、基本的なテーブルではありません

    mysql: コア データベース (SQL Server のマスター テーブルに似ています)。mysql が使用する必要がある制御および管理情報 (ユーザー、権限設定、キーワードなど) を保存します。たとえば、root ユーザーのパスワードを変更するには、このデータベースを使用する必要があります。 #負荷圧力が同じ場合、MySQL によって消費されるメモリと CPU が少なくなります

    print ステートメント print は SQLServer でも提供されますが、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サーバーの構文の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!