[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Sqlite](https://evolu.dev/docs/api-reference/common/Sqlite) › sql

```ts
function sql(
  strings: TemplateStringsArray,
  ...parameters: SqlTemplateParam[]
): SqliteQuery;
```

Defined in: [packages/common/src/Sqlite.ts:492](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Sqlite.ts#L492)

Creates a safe SQL query using a tagged template literal.

Parameters are automatically escaped and bound as SQLite values. Use
`sql.identifier` for column/table names and `sql.raw` for unescaped SQL.

### Example

```ts

const id = 42;
const name = "Alice";
const select = sql`
  select * from users where id = ${id} and name = ${name};
`;
const tableName = "users";
const createTable = sql`
  create table ${sql.identifier(tableName)} (
    "id" text primary key,
    "name" text not null
  );
`;
// Use sql.raw only with trusted SQL fragments.
const orderBy = "created_at desc";
const ordered = sql`select * from users order by ${sql.raw(orderBy)};`;

assertEqual(select, {
  sql: "select * from users where id = ? and name = ?;",
  parameters: [42, "Alice"],
});
assertTrue(createTable.sql.includes('create table "users"'));
assertEqual(ordered.sql, "select * from users order by created_at desc;");
```

## TIP

Use `prettier-plugin-sql-cst` for SQL formatting. Like Prettier for
JavaScript, this plugin formats SQL expressions differently depending on
their length.