SQL機能に関してはPostgreSQLははるかに高度です。
MySQLにはまだない(そしてPostgreSQLにはある)もの:
-
延期可能な制約
-
チェック制約(MySQL8.0。 16 それらを追加しました、MariaDB 10.2にはそれらがあります) -
完全外部結合
MySQLは、いくつかの構文バリエーションを持つ内部結合をサイレントに使用します:
https://rextester.com/ADME43793
-
横方向の結合
-
正規表現はUTF-8では機能しません(MySQL 8.0で修正済み) -
正規表現はreplaceまたはsubstringをサポートしていません(MySQL 8.0で導入) -
テーブル関数(
select * from my_function()
) -
一般的なテーブル式(MySQL 8.0で導入) -
再帰クエリ(MySQL 8.0で導入) -
書き込み可能なCTE
-
ウィンドウ関数(MySQL 8.0で導入) -
関数ベースのインデックス
-
部分インデックス
-
インデックスに追加の列を含める(たとえば、一意のインデックスの場合)
-
複数列の統計
-
トランザクションテーブルの全文検索(MySQL 5.6はこれをサポートしています) -
トランザクションテーブルのGIS機能
-
EXCEPTまたはINTERSECT演算子(MariaDBにはそれらがあります)
-
同じselectステートメントで一時テーブルを2回使用することはできません
-
変更中のテーブル(更新/削除/挿入)を副選択で使用することはできません
-
派生テーブルを使用するビューを作成することはできません(MySQL 8.0以降で可能)create view x as select * from (select * from y);
-
ステートメントレベルの読み取りの一貫性。例:
update foo set x = y, y = x
またはupdate foo set a = b, a = a + 100
-
トランザクションDDL
-
DDLトリガー
-
除外制約
-
キー/値ストア
-
完全なJSONドキュメントのインデックス作成
-
SQL / JSONパス式(Postgres 12以降)
-
範囲タイプ
-
ドメイン
-
配列(配列のインデックスを含む)
-
ユーザー権限を管理するための役割(グループ)(MariaDBにはそれらがあり、MySQL 8.0で導入されました) -
並列クエリ(Postgres 9.6 以降 )
-
並列インデックスの作成(Postgres 11以降)
-
ユーザー定義のデータ型(チェック制約を含む)
-
マテリアライズドビュー
-
カスタムアグリゲート
-
カスタムウィンドウ関数
-
適切な
boolean
データ型
(ゼロ以外の数値に変換できる式を「true」として扱うことはありません 適切なブール型)
Spatial / GIS機能に関しては、PostgresとPostGISの機能もはるかに優れています。これが良い比較です。
「使いやすさ」と呼んでいるものはわかりませんが、「使いやすさ」を定義する、見逃したくない最新のSQL機能(CTE、ウィンドウ関数)がいくつかあります。
さて、PostgreSQLは完璧ではなく、恐ろしいVACUUMプロセスを大量の書き込みデータベースに合わせて調整するのがおそらく最も厄介なことかもしれません。