RDBMS -Feature Comparision
Oracle vs Postgres vs SQLServer vs MySQL vs IBM-DB2 vs Firebird vs H2 HSQLDB vs Derby vs SQLite
This comparison focuses on features that can be used in SQL statements or self-contained SQL scripts that don’t require additional software (e.g. a compiler) to be usable.
Feature | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
---|---|---|---|---|---|---|---|---|---|---|
Queries | ||||||||||
Window functions | Yes | Yes | Yes | No | Yes | No(*) | No | No | No | No |
Common Table Expressions | Yes | Yes | Yes | No | Yes | Yes | No | Yes | No | Yes(*) |
Recursive Queries | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No | Yes(*) |
Row constructor(*) | No | Yes | Yes(*) | Yes | Yes | No | No | Yes | No | No |
Filtered aggregates(*) | No | Yes(*) | No | No | No | No | No | Yes | No | No |
PIVOT Support | Yes | No(*) | Yes | No | No | No | No | No | No | No |
GROUP BY .. ROLLUP | Yes | No | Yes | Yes | Yes | No | No | No | Yes | No |
Temporal queries(*) | Yes | No | No | No | Yes | No | No | No | No | No |
SELECT without table | No | Yes | Yes | No(*) | No | No | Yes | No | No | Yes |
Parallel queries(*) | Yes | No(*) | Yes | No | Yes | No | No | No | No | No |
Aggregates for strings | Yes(*) | Yes | No | Yes | No | No | Yes | Yes | No | Yes |
Tuple comparison | Yes | Yes | No | Yes | Yes | No | (Yes)(*) | Yes | No | No |
Tuple updates | Yes | Yes | No | No | Yes | No | Yes | Yes | No | No |
UPDATE with a join | No | Yes | Yes | Yes | No | No | No | No | No | No |
ANSI date literals(*) | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | No | No |
Query variables(*) | No | No | Yes | Yes | No | No | No | No | No | No |
Regular Expressions | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Comparison based on RegEx(*) | Yes | Yes | No | Yes | No | Yes | Yes | Yes | No | No |
Substring(*) | Yes | Yes | No | No | No | No | No | Yes | No | No |
Replace(*) | Yes | Yes | No | No(*) | No | No | Yes | No | No | No |
Constraints | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Deferred constraints(*) | Yes | Yes | No | No | No | No | No | No | Yes(*) | Yes |
Check constraints | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
Check constraints with sub-query | No | No | No | No | No | Yes | No | No | No | No |
Check constraints using custom functions(*) | Yes | Yes | Yes | No | Yes | Yes | No | No | No | No |
Exclusion constraints(*) | No | Yes | No | No | No | No | No | No | No | No |
Statement based constraint evaluation | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes | Yes |
ON DELETE CASCADE(*) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
ON UPDATE CASCADE(*) | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes |
Indexing | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Partial index(*) | Yes(*) | Yes | Yes | No | No | No | No | No | No | Yes |
Descending Index(*) | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No | Yes |
Index on expression(*) | Yes | Yes | (No)(*) | No | Yes | Yes | No | No | No | No |
Index using a custom function(*) | Yes | Yes | No | No | Yes | No | No | No | No | No |
Index include columns(*) | No | No | Yes | No | Yes | No | No | No | No | No |
Clustered index(*) | Yes(*) | No | Yes | Yes | Yes | No | No | No | No | No |
Duplicate NULL values in unique index(*) | No | Yes | No | Yes(*) | No | No | Yes | Yes | No | Yes |
DML | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Writeable CTEs(*) | No | Yes(*) | Yes(*) | No | No | No | No | No | No | No |
Multi-row INSERTs(*) | No | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes |
TRUNCATE table with FK(*) | Yes(*) | Yes | No | No | No | No | No | No | No | No |
Read consistency during DML operations(*) | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
MERGE support(*) | Yes | (No)(*) | Yes | Yes(*) | Yes | Yes | Yes | Yes | Yes(*) | No |
SELECT .. FOR UPDATE NOWAIT(*) | Yes | Yes | Yes | No | No | No | No | No | No | No |
RETURNING clause | No(*) | Yes | Yes | No | No | Yes | No | No | No | No |
Parallel DML | Yes | No | No | No | No | No | No | No | No | No |
Data Types | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
User defined datatypes(*) | No | Yes | No(*) | No | Yes | No | No | Yes | No | No |
Domains(*) | No | Yes | (Yes)(*) | No | No | Yes | Yes | Yes | No | No |
Distinct types(*) | No | No | No | No | Yes | No | No | No | No | No |
Arrays | No | Yes | No | No | No | Yes | Yes | Yes | No | No |
Enums(*) | No | Yes | No | Yes | No | No | No | No | No | No |
IP address | No | Yes | No | No | No | No | No | No | No | No |
BOOLEAN(*) | No(*) | Yes | No(*) | No(*) | Yes | No | Yes | Yes | Yes | No |
Interval | Yes | Yes | No | No | Yes | No | No | Yes | No | No |
TIME(*) | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No |
DATE(*) | No(*) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No |
TIMESTAMP(*) | Yes | Yes | Yes(*) | Yes(*) | Yes | Yes | Yes | Yes | Yes | No |
Range types(*) | (No)(*) | Yes | No | No | No | No | No | No | No | No |
DDL | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Transactional DDL(*) | No | Yes | Yes | No | Yes | Yes | No | No | No | Yes |
Computed columns(*) | Yes | No | Yes | No | Yes | Yes | Yes | Yes | No | No |
Functions as column default(*) | Yes | Yes | Yes | No | No | No | Yes | No | No | Yes |
Sequences | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | No |
Auto increment columns(*) | Yes(*) | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes |
Synonms | Yes | No | Yes | No | Yes | No | No | No | Yes | No |
Non-blocking index creation(*) | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No |
Partitioning | Yes | Yes(*) | Yes | Yes | Yes | No | No | No | No | No |
Cascading DROP(*) | Yes | Yes | No | No(*) | Yes | No | Yes | Yes | No | No |
DDL Triggers(*) | Yes | Yes | Yes | No | No | No | No | No | No | No |
TRUNCATE Trigger(*) | No | Yes | No | No | No | No | No | No | No | No |
Custom name for PK constraint(*) | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
ALTER a table used in a view(*) | Yes | No(*) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
Add table column at specific position(*) | No | No | No | Yes | No | No | Yes | Yes | No | No |
Programming | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Stored procedures(*) | Yes | Yes(*) | Yes | Yes | Yes | Yes(*) | No | Yes | No(*) | No |
Table functions(*) | Yes | Yes | Yes | No | Yes | Yes | No | Yes | No | No |
Custom aggregates(*) | Yes | Yes | No(*) | No | No | No | No | No | No | No |
Function overloading(*) | Yes(*) | Yes | No | No | Yes | No | No | No | No | No |
User defined operators(*) | No(*) | Yes | No | No | No | No | No | No | No | No |
Statement level triggers(*) | Yes | Yes | Yes | No | Yes | No | (No)(*) | Yes | Yes | No |
Row level triggers(*) | Yes | Yes | No | Yes | Yes | Yes | (No)(*) | Yes | Yes | Yes |
Before triggers(*) | Yes | Yes | (No)(*) | Yes | Yes | Yes | (No)(*) | Yes | Yes | Yes |
Dynamic SQL in functions(*) | Yes | Yes | No(*) | No | No | No | No | No | No | No |
Dynamic SQL in triggers(*) | Yes | Yes | No | No | No | No | No | No | No | No |
Delete triggers fired by cascading deletes(*) | Yes | Yes | Yes | No | Yes | Yes | No | Yes | Yes | No |
Built-in scheduler | Yes | No | Yes | Yes | Yes | No | No | No | No | No |
Views | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Updateable Views | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | No | No |
WITH CHECK OPTION(*) | No | Yes(*) | Yes | Yes | Yes | Yes | No | No | No | No |
Triggers on views | Yes | Yes | Yes | No | Yes | Yes | No | Yes | No | Yes |
Views with derived tables(*) | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
JOINs and Operators | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
CROSS JOIN | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
FULL OUTER JOIN | Yes | Yes | Yes | No | Yes | Yes | No | Yes | Yes | No |
LATERAL JOIN | No | Yes | Yes(*) | No | Yes | No | No | Yes | No | No |
JOIN … USING (…)(*) | Yes | Yes | No | Yes | No | Yes | No | Yes | Yes | Yes |
INTERSECT | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes | Yes |
EXCEPT | Yes(*) | Yes | Yes | No | Yes | No | Yes | Yes | Yes | Yes |
ORDER BY … NULLS LAST | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No |
IS DISTINCT FROM | No | Yes | No | (No)(*) | No | Yes | No | Yes | No | No |
BETWEEN SYMMETRIC | No | Yes | No | No | No | No | No | Yes | No | No |
OVERLAPS(*) | Yes | Yes | No | No | No | No | No | Yes | No | No(*) |
Other | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Catalogs (“databases”) | No | Yes | Yes | Yes | No | Yes | Yes | Yes | No | Yes |
Schemas | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes | No |
INFORMATION_SCHEMA(*) | No | Yes | Yes | Yes | No | No | Yes | Yes | No | No |
NoSQL Features | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
XML Support(*) | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No |
XPath(*) | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No |
XQuery | No | No | Yes | No | Yes | No | No | No | No | No |
JSON(*) | Yes(*) | Yes | No | No(*) | No | No | No | No | No | No |
Key/Value storage | No | Yes | No | No(*) | No | No | No(*) | No | No | No |
Administration | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
User groups / Roles | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | No |
Point in time recovery | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No |
High Availability | Oracle | Postgres | SQL Server | MySQL | IBM DB2 | Firebird | H2 | HSQLDB | Derby | SQLite |
Multi-master replication | No | No(*) | Yes(*) | Yes | No | No | No | No | No | No |
Replication and standby servers | Yes | Yes | Yes(*) | Yes | Yes | No | No | No | No | No |