SQL (Structured Query Language, ISO/IEC 9075) is the lingua franca of relational databases. Despite vendor-specific extensions, the core grammar — SELECT, INSERT, UPDATE, DELETE, plus the clauses WHERE, JOIN, GROUP BY, HAVING, ORDER BY, and LIMIT — is shared across PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, and Oracle. This builder targets that common subset so the output is portable across the engines you are most likely to use.
The tool is intentionally a string assembler, not a parser. It reads the table name, comma-separated columns, optional WHERE condition, and selected query type, then concatenates them with the appropriate keywords. There is no AST, so the output is exactly what you typed plus the SQL keywords — useful for learning and prototyping, but the responsibility for valid identifiers and quoting rests with you.
Crucial security point: the INSERT template emits VALUES (?) as a parameter placeholder rather than substituting your input directly. That is intentional — anything constructed by string concatenation that includes user-controlled data is a SQL injection risk. In production, parameterize values via your driver (psycopg, mysql2, sqlite3, JDBC, ADO.NET, ORM bindings) so the database receives data as parameters, not as code. The output of this tool is meant to be the skeleton; binding values is your job.
Identifier quoting differs by engine. PostgreSQL and SQLite use double quotes ("users"), MySQL backticks by default (`users`), and SQL Server square brackets ([users]). The output here is unquoted, so if your column or table name contains spaces, reserved words, or mixed case, wrap it in the correct quoting style before running. Reserved words like USER, ORDER, and TIMESTAMP are common gotchas.
Logical execution order is not the same as written order. SQL evaluates FROM first (which establishes the row source), then WHERE (filtering rows), GROUP BY (forming groups), HAVING (filtering groups), SELECT (projecting columns), DISTINCT, ORDER BY, and finally LIMIT/OFFSET. Knowing this order explains why you cannot reference a column alias defined in SELECT inside the WHERE clause but you can in ORDER BY — at WHERE time the alias does not exist yet.
Performance matters more than syntax in real-world queries. Avoid SELECT * because it pulls every column over the wire and prevents index-only scans. Filter early with selective WHERE predicates that use indexed columns. Add covering indexes for the (filter, sort, project) shape your common queries take. Use EXPLAIN (or EXPLAIN ANALYZE in PostgreSQL) to verify the planner is using your indexes and not falling back to sequential scans.
All query construction happens in your browser via plain string concatenation in a React state hook. Nothing is sent to a server, no SQL is executed against a database, and no schema introspection is performed. Closing the tab discards the inputs.