or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

cli.mdindex.mdmigrations-seeds.mdquery-builder.mdschema-builder.mdtransactions-raw.md
tile.json

query-builder.mddocs/

0

# Query Building

1

2

Comprehensive SQL query construction with a fluent chainable interface for SELECT, INSERT, UPDATE, DELETE operations and advanced query features including joins, aggregations, and window functions.

3

4

## Capabilities

5

6

### Core Query Builder

7

8

Creates a query builder instance for a specific table or starts a new query.

9

10

```typescript { .api }

11

/**

12

* Create a query builder for a table

13

* @param tableName - Name of the table to query

14

* @returns QueryBuilder instance for chaining operations

15

*/

16

function knex<TRecord = any, TResult = any>(tableName: string): Knex.QueryBuilder<TRecord, TResult>;

17

18

/**

19

* Create a standalone query builder

20

* @returns QueryBuilder instance

21

*/

22

function queryBuilder(): Knex.QueryBuilder;

23

24

interface QueryBuilder<TRecord = any, TResult = any> extends Promise<TResult> {

25

// Core table methods

26

from<TTable extends TableNames>(tableName: TTable): QueryBuilder<ResolveTableType<TTable>, TResult>;

27

as(alias: string): QueryBuilder<TRecord, TResult>;

28

table(tableName: string): QueryBuilder<TRecord, TResult>;

29

withSchema(schemaName: string): QueryBuilder<TRecord, TResult>;

30

}

31

```

32

33

### Selection Methods

34

35

Build SELECT statements with column specification, aliasing, and distinct operations.

36

37

```typescript { .api }

38

/**

39

* Select specific columns from the query

40

* @param columns - Column names to select

41

* @returns QueryBuilder with selected columns

42

*/

43

select<ColNameUT extends keyof TRecord>(...columns: readonly ColNameUT[]): QueryBuilder<TRecord, Pick<TRecord, ColNameUT>[]>;

44

45

/**

46

* Select columns with aliases and expressions

47

* @param columns - Object mapping aliases to column expressions

48

* @returns QueryBuilder with aliased columns

49

*/

50

select<AliasUT extends string>(columns: Record<AliasUT, string | Raw | QueryBuilder>): QueryBuilder<TRecord, { [K in AliasUT]: any }[]>;

51

52

/**

53

* Add columns to existing selection

54

* @param columns - Additional columns to select

55

* @returns QueryBuilder with added columns

56

*/

57

columns<ColNameUT extends keyof TRecord>(...columns: readonly ColNameUT[]): QueryBuilder<TRecord, TResult>;

58

59

/**

60

* Select distinct values

61

* @param columns - Columns for distinct operation

62

* @returns QueryBuilder with distinct selection

63

*/

64

distinct<ColNameUT extends keyof TRecord>(...columns: readonly ColNameUT[]): QueryBuilder<TRecord, Pick<TRecord, ColNameUT>[]>;

65

66

/**

67

* Select distinct on specific columns (PostgreSQL)

68

* @param columns - Columns for distinct on

69

* @returns QueryBuilder with distinct on

70

*/

71

distinctOn<ColNameUT extends keyof TRecord>(...columns: readonly ColNameUT[]): QueryBuilder<TRecord, TResult>;

72

```

73

74

### Where Clauses

75

76

Comprehensive WHERE clause construction with support for all SQL comparison operators and logical combinations.

77

78

```typescript { .api }

79

/**

80

* Basic where clause

81

* @param columnName - Column to filter on

82

* @param value - Value to compare against

83

* @returns QueryBuilder with where condition

84

*/

85

where<K extends keyof TRecord>(columnName: K, value: DbColumn<TRecord[K]>): QueryBuilder<TRecord, TResult>;

86

87

/**

88

* Where clause with operator

89

* @param columnName - Column to filter on

90

* @param operator - Comparison operator

91

* @param value - Value to compare against

92

* @returns QueryBuilder with where condition

93

*/

94

where<K extends keyof TRecord>(columnName: K, operator: ComparisionOperator, value: DbColumn<TRecord[K]>): QueryBuilder<TRecord, TResult>;

95

96

/**

97

* Where clause with object conditions

98

* @param conditions - Object with column-value pairs

99

* @returns QueryBuilder with multiple where conditions

100

*/

101

where(conditions: Partial<TRecord>): QueryBuilder<TRecord, TResult>;

102

103

/**

104

* Where clause with raw SQL

105

* @param raw - Raw SQL condition

106

* @returns QueryBuilder with raw where condition

107

*/

108

where(raw: Raw): QueryBuilder<TRecord, TResult>;

109

110

/**

111

* AND where clause

112

* @param columnName - Column to filter on

113

* @param value - Value to compare against

114

* @returns QueryBuilder with AND where condition

115

*/

116

andWhere<K extends keyof TRecord>(columnName: K, value: DbColumn<TRecord[K]>): QueryBuilder<TRecord, TResult>;

117

118

/**

119

* OR where clause

120

* @param columnName - Column to filter on

121

* @param value - Value to compare against

122

* @returns QueryBuilder with OR where condition

123

*/

124

orWhere<K extends keyof TRecord>(columnName: K, value: DbColumn<TRecord[K]>): QueryBuilder<TRecord, TResult>;

125

126

/**

127

* WHERE NOT clause

128

* @param columnName - Column to filter on

129

* @param value - Value to compare against

130

* @returns QueryBuilder with WHERE NOT condition

131

*/

132

whereNot<K extends keyof TRecord>(columnName: K, value: DbColumn<TRecord[K]>): QueryBuilder<TRecord, TResult>;

133

134

/**

135

* WHERE IN clause

136

* @param columnName - Column to check

137

* @param values - Array of values to match

138

* @returns QueryBuilder with WHERE IN condition

139

*/

140

whereIn<K extends keyof TRecord>(columnName: K, values: readonly DbColumn<TRecord[K]>[]): QueryBuilder<TRecord, TResult>;

141

142

/**

143

* WHERE NOT IN clause

144

* @param columnName - Column to check

145

* @param values - Array of values to exclude

146

* @returns QueryBuilder with WHERE NOT IN condition

147

*/

148

whereNotIn<K extends keyof TRecord>(columnName: K, values: readonly DbColumn<TRecord[K]>[]): QueryBuilder<TRecord, TResult>;

149

150

/**

151

* WHERE NULL clause

152

* @param columnName - Column to check for null

153

* @returns QueryBuilder with WHERE NULL condition

154

*/

155

whereNull<K extends keyof TRecord>(columnName: K): QueryBuilder<TRecord, TResult>;

156

157

/**

158

* WHERE NOT NULL clause

159

* @param columnName - Column to check for not null

160

* @returns QueryBuilder with WHERE NOT NULL condition

161

*/

162

whereNotNull<K extends keyof TRecord>(columnName: K): QueryBuilder<TRecord, TResult>;

163

164

/**

165

* WHERE BETWEEN clause

166

* @param columnName - Column to check

167

* @param range - Array with min and max values

168

* @returns QueryBuilder with WHERE BETWEEN condition

169

*/

170

whereBetween<K extends keyof TRecord>(columnName: K, range: readonly [DbColumn<TRecord[K]>, DbColumn<TRecord[K]>]): QueryBuilder<TRecord, TResult>;

171

172

/**

173

* WHERE NOT BETWEEN clause

174

* @param columnName - Column to check

175

* @param range - Array with min and max values

176

* @returns QueryBuilder with WHERE NOT BETWEEN condition

177

*/

178

whereNotBetween<K extends keyof TRecord>(columnName: K, range: readonly [DbColumn<TRecord[K]>, DbColumn<TRecord[K]>]): QueryBuilder<TRecord, TResult>;

179

180

/**

181

* WHERE EXISTS clause

182

* @param callback - Subquery callback

183

* @returns QueryBuilder with WHERE EXISTS condition

184

*/

185

whereExists(callback: QueryCallback<any, any>): QueryBuilder<TRecord, TResult>;

186

187

/**

188

* WHERE NOT EXISTS clause

189

* @param callback - Subquery callback

190

* @returns QueryBuilder with WHERE NOT EXISTS condition

191

*/

192

whereNotExists(callback: QueryCallback<any, any>): QueryBuilder<TRecord, TResult>;

193

194

/**

195

* WHERE LIKE clause

196

* @param columnName - Column to check

197

* @param pattern - LIKE pattern

198

* @returns QueryBuilder with WHERE LIKE condition

199

*/

200

whereLike<K extends keyof TRecord>(columnName: K, pattern: string): QueryBuilder<TRecord, TResult>;

201

202

/**

203

* WHERE ILIKE clause (case-insensitive)

204

* @param columnName - Column to check

205

* @param pattern - ILIKE pattern

206

* @returns QueryBuilder with WHERE ILIKE condition

207

*/

208

whereILike<K extends keyof TRecord>(columnName: K, pattern: string): QueryBuilder<TRecord, TResult>;

209

210

/**

211

* Raw WHERE clause

212

* @param sql - Raw SQL condition

213

* @param bindings - Parameter bindings

214

* @returns QueryBuilder with raw WHERE condition

215

*/

216

whereRaw(sql: string, bindings?: RawBinding[]): QueryBuilder<TRecord, TResult>;

217

```

218

219

### Join Operations

220

221

Comprehensive JOIN support for combining tables with various join types and conditions.

222

223

```typescript { .api }

224

/**

225

* Inner join with another table

226

* @param tableName - Table to join

227

* @param leftColumn - Left table column

228

* @param rightColumn - Right table column

229

* @returns QueryBuilder with inner join

230

*/

231

join(tableName: string, leftColumn: string, rightColumn: string): QueryBuilder<TRecord, TResult>;

232

233

/**

234

* Inner join with callback for complex conditions

235

* @param tableName - Table to join

236

* @param callback - Join condition callback

237

* @returns QueryBuilder with inner join

238

*/

239

join(tableName: string, callback: JoinCallback): QueryBuilder<TRecord, TResult>;

240

241

/**

242

* Left outer join

243

* @param tableName - Table to join

244

* @param leftColumn - Left table column

245

* @param rightColumn - Right table column

246

* @returns QueryBuilder with left join

247

*/

248

leftJoin(tableName: string, leftColumn: string, rightColumn: string): QueryBuilder<TRecord, TResult>;

249

250

/**

251

* Right outer join

252

* @param tableName - Table to join

253

* @param leftColumn - Left table column

254

* @param rightColumn - Right table column

255

* @returns QueryBuilder with right join

256

*/

257

rightJoin(tableName: string, leftColumn: string, rightColumn: string): QueryBuilder<TRecord, TResult>;

258

259

/**

260

* Full outer join

261

* @param tableName - Table to join

262

* @param leftColumn - Left table column

263

* @param rightColumn - Right table column

264

* @returns QueryBuilder with full outer join

265

*/

266

fullOuterJoin(tableName: string, leftColumn: string, rightColumn: string): QueryBuilder<TRecord, TResult>;

267

268

/**

269

* Cross join

270

* @param tableName - Table to cross join

271

* @returns QueryBuilder with cross join

272

*/

273

crossJoin(tableName: string): QueryBuilder<TRecord, TResult>;

274

275

/**

276

* Raw join clause

277

* @param sql - Raw SQL join statement

278

* @param bindings - Parameter bindings

279

* @returns QueryBuilder with raw join

280

*/

281

joinRaw(sql: string, bindings?: RawBinding[]): QueryBuilder<TRecord, TResult>;

282

283

interface JoinCallback {

284

(this: JoinClause, join: JoinClause): void;

285

}

286

287

interface JoinClause {

288

on(left: string, operator: string, right: string): JoinClause;

289

on(left: string, right: string): JoinClause;

290

onIn(left: string, values: any[]): JoinClause;

291

onNotIn(left: string, values: any[]): JoinClause;

292

onNull(column: string): JoinClause;

293

onNotNull(column: string): JoinClause;

294

onExists(callback: QueryCallback<any, any>): JoinClause;

295

onNotExists(callback: QueryCallback<any, any>): JoinClause;

296

onBetween(column: string, range: [any, any]): JoinClause;

297

onNotBetween(column: string, range: [any, any]): JoinClause;

298

using(columns: string | readonly string[]): JoinClause;

299

}

300

```

301

302

### Aggregation Functions

303

304

SQL aggregation functions for data analysis and reporting.

305

306

```typescript { .api }

307

/**

308

* Count rows or specific column values

309

* @param column - Column to count (optional, defaults to *)

310

* @returns QueryBuilder with count aggregation

311

*/

312

count<TResult2 = AggregationQueryResult<TResult, Dict<string | number>>>(column?: string): QueryBuilder<TRecord, TResult2>;

313

314

/**

315

* Count distinct values

316

* @param column - Column to count distinct values

317

* @returns QueryBuilder with count distinct aggregation

318

*/

319

countDistinct<TResult2 = AggregationQueryResult<TResult, Dict<string | number>>>(column: string): QueryBuilder<TRecord, TResult2>;

320

321

/**

322

* Sum numeric values

323

* @param column - Column to sum

324

* @returns QueryBuilder with sum aggregation

325

*/

326

sum<TResult2 = AggregationQueryResult<TResult, Dict<string | number>>>(column: string): QueryBuilder<TRecord, TResult2>;

327

328

/**

329

* Sum distinct numeric values

330

* @param column - Column to sum distinct values

331

* @returns QueryBuilder with sum distinct aggregation

332

*/

333

sumDistinct<TResult2 = AggregationQueryResult<TResult, Dict<string | number>>>(column: string): QueryBuilder<TRecord, TResult2>;

334

335

/**

336

* Calculate average of numeric values

337

* @param column - Column to average

338

* @returns QueryBuilder with average aggregation

339

*/

340

avg<TResult2 = AggregationQueryResult<TResult, Dict<string | number>>>(column: string): QueryBuilder<TRecord, TResult2>;

341

342

/**

343

* Calculate average of distinct numeric values

344

* @param column - Column to average distinct values

345

* @returns QueryBuilder with average distinct aggregation

346

*/

347

avgDistinct<TResult2 = AggregationQueryResult<TResult, Dict<string | number>>>(column: string): QueryBuilder<TRecord, TResult2>;

348

349

/**

350

* Find minimum value

351

* @param column - Column to find minimum

352

* @returns QueryBuilder with min aggregation

353

*/

354

min<TResult2 = AggregationQueryResult<TResult, Dict<any>>>(column: string): QueryBuilder<TRecord, TResult2>;

355

356

/**

357

* Find maximum value

358

* @param column - Column to find maximum

359

* @returns QueryBuilder with max aggregation

360

*/

361

max<TResult2 = AggregationQueryResult<TResult, Dict<any>>>(column: string): QueryBuilder<TRecord, TResult2>;

362

```

363

364

### Window Functions

365

366

Advanced SQL window functions for analytical queries.

367

368

```typescript { .api }

369

/**

370

* ROW_NUMBER window function

371

* @returns Window function builder

372

*/

373

rowNumber(): Knex.Ref<string, { [x: string]: string }>;

374

375

/**

376

* RANK window function

377

* @returns Window function builder

378

*/

379

rank(): Knex.Ref<string, { [x: string]: string }>;

380

381

/**

382

* DENSE_RANK window function

383

* @returns Window function builder

384

*/

385

denseRank(): Knex.Ref<string, { [x: string]: string }>;

386

```

387

388

### Data Manipulation

389

390

INSERT, UPDATE, DELETE operations with comprehensive options and return value handling.

391

392

```typescript { .api }

393

/**

394

* Insert data into table

395

* @param data - Data to insert (single record or array)

396

* @param returning - Columns to return after insert

397

* @returns QueryBuilder for insert operation

398

*/

399

insert<TResult2 = number[]>(data: TRecord | readonly TRecord[], returning?: string | readonly string[]): QueryBuilder<TRecord, TResult2>;

400

401

/**

402

* Update existing records

403

* @param data - Data to update

404

* @param returning - Columns to return after update

405

* @returns QueryBuilder for update operation

406

*/

407

update<TResult2 = number>(data: DbRecordArr<TRecord>, returning?: string | readonly string[]): QueryBuilder<TRecord, TResult2>;

408

409

/**

410

* Delete records

411

* @param returning - Columns to return after delete

412

* @returns QueryBuilder for delete operation

413

*/

414

del<TResult2 = number>(returning?: string | readonly string[]): QueryBuilder<TRecord, TResult2>;

415

416

/**

417

* Delete records (alias for del)

418

* @param returning - Columns to return after delete

419

* @returns QueryBuilder for delete operation

420

*/

421

delete<TResult2 = number>(returning?: string | readonly string[]): QueryBuilder<TRecord, TResult2>;

422

423

/**

424

* Truncate table

425

* @returns QueryBuilder for truncate operation

426

*/

427

truncate(): QueryBuilder<TRecord, void>;

428

429

/**

430

* Specify returning columns for DML operations

431

* @param columns - Columns to return

432

* @returns QueryBuilder with returning clause

433

*/

434

returning<T extends string | readonly string[]>(columns: T): QueryBuilder<TRecord, DeferredKeySelection.Resolve<TRecord, T>[]>;

435

436

/**

437

* Upsert operation (insert or update)

438

* @param data - Data to upsert

439

* @param conflictColumns - Columns that define conflicts

440

* @param updateColumns - Columns to update on conflict

441

* @returns QueryBuilder for upsert operation

442

*/

443

upsert(data: TRecord | readonly TRecord[], conflictColumns?: string | readonly string[], updateColumns?: string | readonly string[]): QueryBuilder<TRecord, number>;

444

445

/**

446

* Handle insert conflicts with ON CONFLICT clause

447

* @param columns - Conflict columns

448

* @returns OnConflictQueryBuilder for conflict handling

449

*/

450

onConflict<TResult2 = number>(columns?: string | readonly string[]): OnConflictQueryBuilder<TRecord, TResult2>;

451

```

452

453

### Set Operations

454

455

Combine queries using UNION, INTERSECT, and EXCEPT operations.

456

457

```typescript { .api }

458

/**

459

* Union with another query

460

* @param callback - Query callback or array of callbacks

461

* @param wrap - Whether to wrap in parentheses

462

* @returns QueryBuilder with union

463

*/

464

union(callback: MaybeArray<QueryCallback<any, any> | QueryBuilder | Raw>, wrap?: boolean): QueryBuilder<TRecord, TResult>;

465

466

/**

467

* Union all with another query

468

* @param callback - Query callback or array of callbacks

469

* @param wrap - Whether to wrap in parentheses

470

* @returns QueryBuilder with union all

471

*/

472

unionAll(callback: MaybeArray<QueryCallback<any, any> | QueryBuilder | Raw>, wrap?: boolean): QueryBuilder<TRecord, TResult>;

473

474

/**

475

* Intersect with another query

476

* @param callback - Query callback or array of callbacks

477

* @param wrap - Whether to wrap in parentheses

478

* @returns QueryBuilder with intersect

479

*/

480

intersect(callback: MaybeArray<QueryCallback<any, any> | QueryBuilder | Raw>, wrap?: boolean): QueryBuilder<TRecord, TResult>;

481

482

/**

483

* Except (difference) with another query

484

* @param callback - Query callback or array of callbacks

485

* @param wrap - Whether to wrap in parentheses

486

* @returns QueryBuilder with except

487

*/

488

except(callback: MaybeArray<QueryCallback<any, any> | QueryBuilder | Raw>, wrap?: boolean): QueryBuilder<TRecord, TResult>;

489

```

490

491

### Grouping and Ordering

492

493

GROUP BY, ORDER BY, and HAVING clauses for organizing query results.

494

495

```typescript { .api }

496

/**

497

* Group by columns

498

* @param columns - Columns to group by

499

* @returns QueryBuilder with group by

500

*/

501

groupBy<K extends keyof TRecord>(...columns: readonly K[]): QueryBuilder<TRecord, TResult>;

502

503

/**

504

* Group by with raw SQL

505

* @param sql - Raw SQL for group by

506

* @param bindings - Parameter bindings

507

* @returns QueryBuilder with raw group by

508

*/

509

groupByRaw(sql: string, bindings?: readonly RawBinding[]): QueryBuilder<TRecord, TResult>;

510

511

/**

512

* Order by columns

513

* @param column - Column to order by

514

* @param order - Sort order ('asc' or 'desc')

515

* @returns QueryBuilder with order by

516

*/

517

orderBy<K extends keyof TRecord>(column: K, order?: 'asc' | 'desc'): QueryBuilder<TRecord, TResult>;

518

519

/**

520

* Order by with raw SQL

521

* @param sql - Raw SQL for order by

522

* @param bindings - Parameter bindings

523

* @returns QueryBuilder with raw order by

524

*/

525

orderByRaw(sql: string, bindings?: readonly RawBinding[]): QueryBuilder<TRecord, TResult>;

526

527

/**

528

* Having clause

529

* @param column - Column for having condition

530

* @param operator - Comparison operator

531

* @param value - Value to compare against

532

* @returns QueryBuilder with having condition

533

*/

534

having(column: string, operator: string, value: any): QueryBuilder<TRecord, TResult>;

535

536

/**

537

* Having clause with raw SQL

538

* @param sql - Raw SQL for having

539

* @param bindings - Parameter bindings

540

* @returns QueryBuilder with raw having

541

*/

542

havingRaw(sql: string, bindings?: readonly RawBinding[]): QueryBuilder<TRecord, TResult>;

543

544

/**

545

* OR having clause

546

* @param column - Column for having condition

547

* @param operator - Comparison operator

548

* @param value - Value to compare against

549

* @returns QueryBuilder with OR having condition

550

*/

551

orHaving(column: string, operator: string, value: any): QueryBuilder<TRecord, TResult>;

552

```

553

554

### Limit and Offset

555

556

Control result set size and pagination.

557

558

```typescript { .api }

559

/**

560

* Limit number of results

561

* @param limit - Maximum number of rows to return

562

* @returns QueryBuilder with limit

563

*/

564

limit(limit: number): QueryBuilder<TRecord, TResult>;

565

566

/**

567

* Offset results for pagination

568

* @param offset - Number of rows to skip

569

* @returns QueryBuilder with offset

570

*/

571

offset(offset: number): QueryBuilder<TRecord, TResult>;

572

```

573

574

### Utility Methods

575

576

Helper methods for query execution and result processing.

577

578

```typescript { .api }

579

/**

580

* Get first row from results

581

* @returns QueryBuilder that returns single record

582

*/

583

first<TResult2 = TRecord extends any[] ? TRecord[0] | undefined : TRecord>(): QueryBuilder<TRecord, TResult2>;

584

585

/**

586

* Pluck values from a specific column

587

* @param column - Column to extract values from

588

* @returns QueryBuilder that returns array of column values

589

*/

590

pluck<K extends keyof TRecord>(column: K): QueryBuilder<TRecord, TRecord[K][]>;

591

592

/**

593

* Increment a numeric column

594

* @param column - Column to increment

595

* @param amount - Amount to increment by (default 1)

596

* @returns QueryBuilder for increment operation

597

*/

598

increment<K extends keyof TRecord>(column: K, amount?: number): QueryBuilder<TRecord, number>;

599

600

/**

601

* Decrement a numeric column

602

* @param column - Column to decrement

603

* @param amount - Amount to decrement by (default 1)

604

* @returns QueryBuilder for decrement operation

605

*/

606

decrement<K extends keyof TRecord>(column: K, amount?: number): QueryBuilder<TRecord, number>;

607

608

/**

609

* Modify query with callback function

610

* @param callback - Function to modify query

611

* @param args - Additional arguments for callback

612

* @returns Modified QueryBuilder

613

*/

614

modify<TRecord2 = TRecord, TResult2 = TResult>(callback: QueryCallbackWithArgs<TRecord, TResult>, ...args: any[]): QueryBuilder<TRecord2, TResult2>;

615

616

/**

617

* Clone the query builder

618

* @returns Cloned QueryBuilder instance

619

*/

620

clone(): QueryBuilder<TRecord, TResult>;

621

```

622

623

### Execution and Control

624

625

Methods for query execution, debugging, and performance optimization.

626

627

```typescript { .api }

628

/**

629

* Use specific database connection

630

* @param connection - Database connection to use

631

* @returns QueryBuilder with specific connection

632

*/

633

connection(connection: any): QueryBuilder<TRecord, TResult>;

634

635

/**

636

* Use transaction for query

637

* @param transaction - Transaction instance

638

* @returns QueryBuilder within transaction

639

*/

640

transacting(transaction: Transaction): QueryBuilder<TRecord, TResult>;

641

642

/**

643

* Set query timeout

644

* @param ms - Timeout in milliseconds

645

* @param options - Timeout options

646

* @returns QueryBuilder with timeout

647

*/

648

timeout(ms: number, options?: { cancel?: boolean }): QueryBuilder<TRecord, TResult>;

649

650

/**

651

* Enable/disable debug mode

652

* @param enabled - Whether to enable debugging

653

* @returns QueryBuilder with debug setting

654

*/

655

debug(enabled?: boolean): QueryBuilder<TRecord, TResult>;

656

657

/**

658

* Get SQL query object

659

* @returns SQL object with query and bindings

660

*/

661

toSQL(): Sql;

662

663

/**

664

* Get SQL query string

665

* @returns SQL query as string

666

*/

667

toString(): string;

668

669

/**

670

* Get column information for table

671

* @param column - Specific column (optional)

672

* @returns Promise with column information

673

*/

674

columnInfo(column?: string): Promise<ColumnInfo>;

675

676

/**

677

* Convert to callback-style interface

678

* @param callback - Node.js style callback

679

* @returns void

680

*/

681

asCallback(callback: Function): void;

682

683

/**

684

* Return results as readable stream

685

* @param options - Stream options

686

* @returns Readable stream of results

687

*/

688

stream(options?: Readonly<{ objectMode?: boolean; highWaterMark?: number }>): NodeJS.ReadableStream;

689

690

/**

691

* Pipe results to writable stream

692

* @param writable - Destination stream

693

* @param options - Pipe options

694

* @returns Destination stream

695

*/

696

pipe<T extends NodeJS.WritableStream>(writable: T, options?: { end?: boolean }): T;

697

```

698

699

## Types

700

701

```typescript { .api }

702

type ComparisionOperator = '=' | '>' | '>=' | '<' | '<=' | '<>' | '!=' | 'like' | 'ilike';

703

type QueryCallback<TRecord, TResult> = (this: QueryBuilder<TRecord, TResult>, builder: QueryBuilder<TRecord, TResult>) => void;

704

type QueryCallbackWithArgs<TRecord, TResult> = (this: QueryBuilder<TRecord, TResult>, builder: QueryBuilder<TRecord, TResult>, ...args: any[]) => void;

705

type JoinCallback = (this: JoinClause, join: JoinClause) => void;

706

type DbColumn<T> = T extends string | number | boolean | Date | null | undefined ? T : never;

707

type DbRecordArr<T> = Partial<T>;

708

type Dict<T = any> = { [k: string]: T };

709

type MaybeArray<T> = T | T[];

710

711

interface OnConflictQueryBuilder<TRecord = any, TResult = any> {

712

ignore(): QueryBuilder<TRecord, TResult>;

713

merge(updates?: Partial<TRecord>): QueryBuilder<TRecord, TResult>;

714

update(updates: Partial<TRecord>): QueryBuilder<TRecord, TResult>;

715

}

716

717

interface ColumnInfo {

718

defaultValue: Value;

719

type: string;

720

maxLength: number;

721

nullable: boolean;

722

}

723

724

interface AggregationQueryResult<TResult, TAggregationResult> {

725

[key: string]: TAggregationResult;

726

}

727

```

728

729

**Usage Examples:**

730

731

```javascript

732

const knex = require('knex')({ client: 'sqlite3', connection: ':memory:' });

733

734

// Basic queries

735

const users = await knex('users').select('*').where('active', true);

736

const user = await knex('users').where('id', 1).first();

737

738

// Complex joins

739

const postsWithAuthors = await knex('posts')

740

.join('users', 'posts.user_id', 'users.id')

741

.select('posts.title', 'posts.content', 'users.name as author')

742

.where('posts.published', true);

743

744

// Aggregations

745

const stats = await knex('orders')

746

.select('user_id')

747

.count('* as order_count')

748

.sum('total as revenue')

749

.groupBy('user_id')

750

.having('order_count', '>', 5);

751

752

// Subqueries

753

const recentOrders = await knex('orders')

754

.where('created_at', '>',

755

knex('orders').max('created_at').where('user_id', 1)

756

);

757

758

// Window functions

759

const rankedProducts = await knex('products')

760

.select('*', knex.raw('ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) as rank'))

761

.where(knex.raw('ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC)'), '<=', 3);

762

```