@vetala/vetala 0.1.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @vetala/vetala might be problematic. Click here for more details.
- package/CONTRIBUTING.md +77 -0
- package/LICENSE +184 -0
- package/README.md +136 -0
- package/THIRD_PARTY_LICENSES.md +17 -0
- package/dist/src/agent.d.ts +30 -0
- package/dist/src/agent.js +216 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/approvals.d.ts +18 -0
- package/dist/src/approvals.js +81 -0
- package/dist/src/approvals.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +87 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +12 -0
- package/dist/src/config.js +183 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context-memory.d.ts +7 -0
- package/dist/src/context-memory.js +96 -0
- package/dist/src/context-memory.js.map +1 -0
- package/dist/src/ink/command-suggestions.d.ts +7 -0
- package/dist/src/ink/command-suggestions.js +179 -0
- package/dist/src/ink/command-suggestions.js.map +1 -0
- package/dist/src/ink/ink-terminal-ui.d.ts +36 -0
- package/dist/src/ink/ink-terminal-ui.js +79 -0
- package/dist/src/ink/ink-terminal-ui.js.map +1 -0
- package/dist/src/ink/repl-app.d.ts +9 -0
- package/dist/src/ink/repl-app.js +789 -0
- package/dist/src/ink/repl-app.js.map +1 -0
- package/dist/src/ink/transcript-cards.d.ts +6 -0
- package/dist/src/ink/transcript-cards.js +24 -0
- package/dist/src/ink/transcript-cards.js.map +1 -0
- package/dist/src/path-policy.d.ts +11 -0
- package/dist/src/path-policy.js +67 -0
- package/dist/src/path-policy.js.map +1 -0
- package/dist/src/process-utils.d.ts +13 -0
- package/dist/src/process-utils.js +52 -0
- package/dist/src/process-utils.js.map +1 -0
- package/dist/src/repl.d.ts +9 -0
- package/dist/src/repl.js +13 -0
- package/dist/src/repl.js.map +1 -0
- package/dist/src/sarvam/client.d.ts +15 -0
- package/dist/src/sarvam/client.js +208 -0
- package/dist/src/sarvam/client.js.map +1 -0
- package/dist/src/sarvam/models.d.ts +2 -0
- package/dist/src/sarvam/models.js +7 -0
- package/dist/src/sarvam/models.js.map +1 -0
- package/dist/src/search-provider.d.ts +6 -0
- package/dist/src/search-provider.js +8 -0
- package/dist/src/search-provider.js.map +1 -0
- package/dist/src/session-store.d.ts +19 -0
- package/dist/src/session-store.js +318 -0
- package/dist/src/session-store.js.map +1 -0
- package/dist/src/skills/runtime.d.ts +26 -0
- package/dist/src/skills/runtime.js +317 -0
- package/dist/src/skills/runtime.js.map +1 -0
- package/dist/src/skills/types.d.ts +25 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/terminal-ui.d.ts +29 -0
- package/dist/src/terminal-ui.js +236 -0
- package/dist/src/terminal-ui.js.map +1 -0
- package/dist/src/tools/filesystem.d.ts +2 -0
- package/dist/src/tools/filesystem.js +622 -0
- package/dist/src/tools/filesystem.js.map +1 -0
- package/dist/src/tools/git.d.ts +2 -0
- package/dist/src/tools/git.js +326 -0
- package/dist/src/tools/git.js.map +1 -0
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.js +21 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/registry.d.ts +15 -0
- package/dist/src/tools/registry.js +59 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/shell.d.ts +2 -0
- package/dist/src/tools/shell.js +97 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/skill.d.ts +3 -0
- package/dist/src/tools/skill.js +130 -0
- package/dist/src/tools/skill.js.map +1 -0
- package/dist/src/tools/web.d.ts +3 -0
- package/dist/src/tools/web.js +144 -0
- package/dist/src/tools/web.js.map +1 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/workspace-trust.d.ts +3 -0
- package/dist/src/workspace-trust.js +31 -0
- package/dist/src/workspace-trust.js.map +1 -0
- package/dist/src/xdg.d.ts +9 -0
- package/dist/src/xdg.js +77 -0
- package/dist/src/xdg.js.map +1 -0
- package/package.json +57 -0
- package/skill/agents-md-generator/SKILL.md +75 -0
- package/skill/agents-md-generator/references/agents_md_template.md +160 -0
- package/skill/agents-md-generator/references/loc_measurement.md +67 -0
- package/skill/agents-md-generator/references/monorepo_detection.md +78 -0
- package/skill/agents-md-generator/references/monorepo_strategy.md +60 -0
- package/skill/agents-md-generator/references/read_only_commands.md +151 -0
- package/skill/agents-md-generator/references/update_strategy.md +160 -0
- package/skill/agents-md-generator/references/working_agreements.md +53 -0
- package/skill/biz-opportunity-scout/SKILL.md +53 -0
- package/skill/biz-opportunity-scout/references/competitive_analysis.md +84 -0
- package/skill/biz-opportunity-scout/references/market_sizing.md +68 -0
- package/skill/biz-opportunity-scout/references/pmf_indicators.md +94 -0
- package/skill/biz-opportunity-scout/references/report_template.md +243 -0
- package/skill/biz-opportunity-scout/references/unit_economics.md +97 -0
- package/skill/code-review/SKILL.md +86 -0
- package/skill/code-review/references/change_analysis.md +116 -0
- package/skill/code-review/references/git_operations.md +115 -0
- package/skill/code-review/references/impact_detection.md +149 -0
- package/skill/code-review/references/output_format.md +137 -0
- package/skill/code-review/references/severity_criteria.md +100 -0
- package/skill/code-security-audit/SKILL.md +123 -0
- package/skill/code-security-audit/references/audit_process.md +277 -0
- package/skill/code-security-audit/references/remediation_patterns.md +599 -0
- package/skill/code-security-audit/references/report_format.md +391 -0
- package/skill/code-security-audit/references/security_domains.md +830 -0
- package/skill/code-security-audit/references/vulnerability_patterns.md +813 -0
- package/skill/composition-patterns/SKILL.md +83 -0
- package/skill/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skill/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skill/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skill/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skill/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skill/composition-patterns/rules/state-context-interface.md +191 -0
- package/skill/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skill/composition-patterns/rules/state-lift-state.md +125 -0
- package/skill/deploy-to-vercel/SKILL.md +293 -0
- package/skill/deploy-to-vercel/resources/deploy-sandbox.sh +301 -0
- package/skill/deploy-to-vercel/resources/deploy.sh +301 -0
- package/skill/doc/SKILL_GUIDELINES.md +138 -0
- package/skill/git-workflow/SKILL.md +94 -0
- package/skill/git-workflow/references/advanced-git.md +632 -0
- package/skill/git-workflow/references/branching-strategies.md +344 -0
- package/skill/git-workflow/references/ci-cd-integration.md +683 -0
- package/skill/git-workflow/references/code-quality-tools.md +351 -0
- package/skill/git-workflow/references/commit-conventions.md +439 -0
- package/skill/git-workflow/references/github-releases.md +288 -0
- package/skill/git-workflow/references/pull-request-workflow.md +773 -0
- package/skill/git-workflow/scripts/verify-git-workflow.sh +263 -0
- package/skill/jetbrains-vmoptions/SKILL.md +51 -0
- package/skill/jetbrains-vmoptions/references/common-options.md +357 -0
- package/skill/jetbrains-vmoptions/references/gc-options.md +350 -0
- package/skill/jetbrains-vmoptions/references/memory-options.md +339 -0
- package/skill/jetbrains-vmoptions/references/prerequisite-check.md +65 -0
- package/skill/kysely-converter/SKILL.md +62 -0
- package/skill/kysely-converter/references/delete.md +323 -0
- package/skill/kysely-converter/references/insert.md +386 -0
- package/skill/kysely-converter/references/operators.md +331 -0
- package/skill/kysely-converter/references/select.md +1000 -0
- package/skill/kysely-converter/references/update.md +349 -0
- package/skill/kysely-converter/references/window_function.md +537 -0
- package/skill/react-best-practices/SKILL.md +131 -0
- package/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skill/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skill/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/skill/react-best-practices/rules/async-dependencies.md +51 -0
- package/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skill/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skill/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skill/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skill/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skill/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/skill/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skill/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skill/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skill/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/skill/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skill/react-best-practices/rules/server-hoist-static-io.md +142 -0
- package/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/skill/react-native-skills/SKILL.md +115 -0
- package/skill/react-native-skills/rules/animation-derived-value.md +53 -0
- package/skill/react-native-skills/rules/animation-gesture-detector-press.md +95 -0
- package/skill/react-native-skills/rules/animation-gpu-properties.md +65 -0
- package/skill/react-native-skills/rules/design-system-compound-components.md +66 -0
- package/skill/react-native-skills/rules/fonts-config-plugin.md +71 -0
- package/skill/react-native-skills/rules/imports-design-system-folder.md +68 -0
- package/skill/react-native-skills/rules/js-hoist-intl.md +61 -0
- package/skill/react-native-skills/rules/list-performance-callbacks.md +44 -0
- package/skill/react-native-skills/rules/list-performance-function-references.md +132 -0
- package/skill/react-native-skills/rules/list-performance-images.md +53 -0
- package/skill/react-native-skills/rules/list-performance-inline-objects.md +97 -0
- package/skill/react-native-skills/rules/list-performance-item-expensive.md +94 -0
- package/skill/react-native-skills/rules/list-performance-item-memo.md +82 -0
- package/skill/react-native-skills/rules/list-performance-item-types.md +104 -0
- package/skill/react-native-skills/rules/list-performance-virtualize.md +67 -0
- package/skill/react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
- package/skill/react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
- package/skill/react-native-skills/rules/navigation-native-navigators.md +188 -0
- package/skill/react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
- package/skill/react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
- package/skill/react-native-skills/rules/react-state-dispatcher.md +91 -0
- package/skill/react-native-skills/rules/react-state-fallback.md +56 -0
- package/skill/react-native-skills/rules/react-state-minimize.md +65 -0
- package/skill/react-native-skills/rules/rendering-no-falsy-and.md +74 -0
- package/skill/react-native-skills/rules/rendering-text-in-text-component.md +36 -0
- package/skill/react-native-skills/rules/scroll-position-no-state.md +82 -0
- package/skill/react-native-skills/rules/state-ground-truth.md +80 -0
- package/skill/react-native-skills/rules/ui-expo-image.md +66 -0
- package/skill/react-native-skills/rules/ui-image-gallery.md +104 -0
- package/skill/react-native-skills/rules/ui-measure-views.md +78 -0
- package/skill/react-native-skills/rules/ui-menus.md +174 -0
- package/skill/react-native-skills/rules/ui-native-modals.md +77 -0
- package/skill/react-native-skills/rules/ui-pressable.md +61 -0
- package/skill/react-native-skills/rules/ui-safe-area-scroll.md +65 -0
- package/skill/react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
- package/skill/react-native-skills/rules/ui-styling.md +87 -0
- package/skill/react-vite-guide/SKILL.md +101 -0
- package/skill/react-vite-guide/references/composition-patterns.md +709 -0
- package/skill/react-vite-guide/references/performance-optimization.md +1222 -0
- package/skill/react-vite-guide/references/vite-specific.md +385 -0
- package/skill/react-vite-guide/references/web-interface.md +146 -0
- package/skill/skill-maker/SKILL.md +52 -0
- package/skill/skill-maker/references/content_spec.md +67 -0
- package/skill/skill-maker/references/frontmatter_spec.md +96 -0
- package/skill/skill-maker/references/input_validation.md +90 -0
- package/skill/skill-maker/references/skill_structure.md +74 -0
- package/skill/system-prompt-creator/SKILL.md +50 -0
- package/skill/system-prompt-creator/references/data_format_selection.md +135 -0
- package/skill/system-prompt-creator/references/multi_prompt_architecture.md +386 -0
- package/skill/system-prompt-creator/references/prompt_structure.md +140 -0
- package/skill/system-prompt-creator/references/quality_criteria.md +83 -0
- package/skill/typst-creator/SKILL.md +51 -0
- package/skill/typst-creator/references/layout.md +401 -0
- package/skill/typst-creator/references/math.md +297 -0
- package/skill/typst-creator/references/scripting.md +237 -0
- package/skill/typst-creator/references/styling.md +217 -0
- package/skill/typst-creator/references/syntax.md +234 -0
- package/skill/web-design-guidelines/SKILL.md +35 -0
- package/terminal.png +0 -0
|
@@ -0,0 +1,1000 @@
|
|
|
1
|
+
# Kysely SELECT Reference
|
|
2
|
+
|
|
3
|
+
## Basic SELECT
|
|
4
|
+
```sql
|
|
5
|
+
SELECT id, name FROM person
|
|
6
|
+
```
|
|
7
|
+
```ts
|
|
8
|
+
db.selectFrom('person')
|
|
9
|
+
.select(['id', 'name'])
|
|
10
|
+
.execute()
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Select Single Column
|
|
14
|
+
```sql
|
|
15
|
+
SELECT id FROM person WHERE first_name = 'Arnold'
|
|
16
|
+
```
|
|
17
|
+
```ts
|
|
18
|
+
db.selectFrom('person')
|
|
19
|
+
.select('id')
|
|
20
|
+
.where('first_name', '=', 'Arnold')
|
|
21
|
+
.execute()
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Select with Table Prefix
|
|
25
|
+
```sql
|
|
26
|
+
SELECT person.id FROM person, pet
|
|
27
|
+
```
|
|
28
|
+
```ts
|
|
29
|
+
db.selectFrom(['person', 'pet'])
|
|
30
|
+
.select('person.id')
|
|
31
|
+
.execute()
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Select All Columns
|
|
35
|
+
```sql
|
|
36
|
+
SELECT * FROM person
|
|
37
|
+
```
|
|
38
|
+
```ts
|
|
39
|
+
db.selectFrom('person')
|
|
40
|
+
.selectAll()
|
|
41
|
+
.execute()
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Select All from Specific Table
|
|
45
|
+
```sql
|
|
46
|
+
SELECT person.* FROM person
|
|
47
|
+
```
|
|
48
|
+
```ts
|
|
49
|
+
db.selectFrom('person')
|
|
50
|
+
.selectAll('person')
|
|
51
|
+
.execute()
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Aliases
|
|
55
|
+
```sql
|
|
56
|
+
SELECT first_name AS fn, p.last_name AS ln FROM person AS p
|
|
57
|
+
```
|
|
58
|
+
```ts
|
|
59
|
+
db.selectFrom('person as p')
|
|
60
|
+
.select(['first_name as fn', 'p.last_name as ln'])
|
|
61
|
+
.execute()
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## DISTINCT
|
|
65
|
+
```sql
|
|
66
|
+
SELECT DISTINCT first_name FROM person
|
|
67
|
+
```
|
|
68
|
+
```ts
|
|
69
|
+
db.selectFrom('person')
|
|
70
|
+
.select('first_name')
|
|
71
|
+
.distinct()
|
|
72
|
+
.execute()
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## DISTINCT ON (PostgreSQL only)
|
|
76
|
+
```sql
|
|
77
|
+
SELECT DISTINCT ON (person.id) person.* FROM person
|
|
78
|
+
INNER JOIN pet ON pet.owner_id = person.id
|
|
79
|
+
WHERE pet.name = 'Doggo'
|
|
80
|
+
```
|
|
81
|
+
```ts
|
|
82
|
+
db.selectFrom('person')
|
|
83
|
+
.innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
84
|
+
.where('pet.name', '=', 'Doggo')
|
|
85
|
+
.distinctOn('person.id')
|
|
86
|
+
.selectAll('person')
|
|
87
|
+
.execute()
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## WHERE Conditions
|
|
91
|
+
|
|
92
|
+
### Simple Comparison
|
|
93
|
+
```sql
|
|
94
|
+
WHERE status = 'active'
|
|
95
|
+
```
|
|
96
|
+
```ts
|
|
97
|
+
.where('status', '=', 'active')
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Multiple AND Conditions
|
|
101
|
+
```sql
|
|
102
|
+
WHERE status = 'active' AND type = 'user'
|
|
103
|
+
```
|
|
104
|
+
```ts
|
|
105
|
+
.where('status', '=', 'active')
|
|
106
|
+
.where('type', '=', 'user')
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### IN Operator
|
|
110
|
+
```sql
|
|
111
|
+
WHERE id IN (1, 2, 3)
|
|
112
|
+
```
|
|
113
|
+
```ts
|
|
114
|
+
.where('id', 'in', [1, 2, 3])
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### NOT IN Operator
|
|
118
|
+
```sql
|
|
119
|
+
WHERE id NOT IN (1, 2, 3)
|
|
120
|
+
```
|
|
121
|
+
```ts
|
|
122
|
+
.where('id', 'not in', [1, 2, 3])
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### IS NULL / IS NOT NULL
|
|
126
|
+
```sql
|
|
127
|
+
WHERE deleted_at IS NULL AND name IS NOT NULL
|
|
128
|
+
```
|
|
129
|
+
```ts
|
|
130
|
+
.where('deleted_at', 'is', null)
|
|
131
|
+
.where('name', 'is not', null)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### LIKE / NOT LIKE
|
|
135
|
+
```sql
|
|
136
|
+
WHERE name LIKE '%john%'
|
|
137
|
+
```
|
|
138
|
+
```ts
|
|
139
|
+
.where('name', 'like', '%john%')
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### ILIKE (PostgreSQL only)
|
|
143
|
+
```sql
|
|
144
|
+
WHERE name ILIKE '%john%'
|
|
145
|
+
```
|
|
146
|
+
```ts
|
|
147
|
+
.where('name', 'ilike', '%john%')
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### BETWEEN
|
|
151
|
+
```sql
|
|
152
|
+
WHERE age BETWEEN 18 AND 65
|
|
153
|
+
```
|
|
154
|
+
```ts
|
|
155
|
+
.where('age', 'between', [18, 65])
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Column to Column Comparison (whereRef)
|
|
159
|
+
```sql
|
|
160
|
+
WHERE log.created_at >= enrollment.start_dt
|
|
161
|
+
```
|
|
162
|
+
```ts
|
|
163
|
+
.whereRef('log.created_at', '>=', 'enrollment.start_dt')
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Complex WHERE (OR/AND)
|
|
167
|
+
```sql
|
|
168
|
+
WHERE (status = 'active' AND type = 'a') OR (status = 'pending' AND type = 'b')
|
|
169
|
+
```
|
|
170
|
+
```ts
|
|
171
|
+
.where((eb) =>
|
|
172
|
+
eb.or([
|
|
173
|
+
eb.and([
|
|
174
|
+
eb('status', '=', 'active'),
|
|
175
|
+
eb('type', '=', 'a'),
|
|
176
|
+
]),
|
|
177
|
+
eb.and([
|
|
178
|
+
eb('status', '=', 'pending'),
|
|
179
|
+
eb('type', '=', 'b'),
|
|
180
|
+
]),
|
|
181
|
+
])
|
|
182
|
+
)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### EXISTS Subquery
|
|
186
|
+
```sql
|
|
187
|
+
WHERE EXISTS (SELECT 1 FROM pet WHERE pet.owner_id = person.id)
|
|
188
|
+
```
|
|
189
|
+
```ts
|
|
190
|
+
.where((eb) =>
|
|
191
|
+
eb.exists(
|
|
192
|
+
eb.selectFrom('pet')
|
|
193
|
+
.whereRef('pet.owner_id', '=', 'person.id')
|
|
194
|
+
.select(sql.lit(1))
|
|
195
|
+
)
|
|
196
|
+
)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
## JOIN
|
|
201
|
+
|
|
202
|
+
### INNER JOIN
|
|
203
|
+
```sql
|
|
204
|
+
SELECT * FROM person INNER JOIN pet ON pet.owner_id = person.id
|
|
205
|
+
```
|
|
206
|
+
```ts
|
|
207
|
+
db.selectFrom('person')
|
|
208
|
+
.innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
209
|
+
.selectAll()
|
|
210
|
+
.execute()
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### LEFT JOIN
|
|
214
|
+
```sql
|
|
215
|
+
SELECT * FROM person LEFT JOIN pet ON pet.owner_id = person.id
|
|
216
|
+
```
|
|
217
|
+
```ts
|
|
218
|
+
db.selectFrom('person')
|
|
219
|
+
.leftJoin('pet', 'pet.owner_id', 'person.id')
|
|
220
|
+
.selectAll()
|
|
221
|
+
.execute()
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### RIGHT JOIN
|
|
225
|
+
```sql
|
|
226
|
+
SELECT * FROM person RIGHT JOIN pet ON pet.owner_id = person.id
|
|
227
|
+
```
|
|
228
|
+
```ts
|
|
229
|
+
db.selectFrom('person')
|
|
230
|
+
.rightJoin('pet', 'pet.owner_id', 'person.id')
|
|
231
|
+
.selectAll()
|
|
232
|
+
.execute()
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### FULL JOIN
|
|
236
|
+
```sql
|
|
237
|
+
SELECT * FROM person FULL JOIN pet ON pet.owner_id = person.id
|
|
238
|
+
```
|
|
239
|
+
```ts
|
|
240
|
+
db.selectFrom('person')
|
|
241
|
+
.fullJoin('pet', 'pet.owner_id', 'person.id')
|
|
242
|
+
.selectAll()
|
|
243
|
+
.execute()
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### CROSS JOIN
|
|
247
|
+
```sql
|
|
248
|
+
SELECT * FROM person CROSS JOIN pet
|
|
249
|
+
```
|
|
250
|
+
```ts
|
|
251
|
+
db.selectFrom('person')
|
|
252
|
+
.crossJoin('pet')
|
|
253
|
+
.selectAll()
|
|
254
|
+
.execute()
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Complex JOIN Conditions
|
|
258
|
+
```sql
|
|
259
|
+
SELECT * FROM person
|
|
260
|
+
INNER JOIN pet ON pet.owner_id = person.id AND pet.name = 'Doggo'
|
|
261
|
+
```
|
|
262
|
+
```ts
|
|
263
|
+
db.selectFrom('person')
|
|
264
|
+
.innerJoin('pet', (join) => join
|
|
265
|
+
.onRef('pet.owner_id', '=', 'person.id')
|
|
266
|
+
.on('pet.name', '=', 'Doggo')
|
|
267
|
+
)
|
|
268
|
+
.selectAll()
|
|
269
|
+
.execute()
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### JOIN with Subquery
|
|
273
|
+
```sql
|
|
274
|
+
SELECT * FROM person
|
|
275
|
+
INNER JOIN (SELECT owner_id, name FROM pet WHERE name = 'Doggo') AS doggos
|
|
276
|
+
ON doggos.owner_id = person.id
|
|
277
|
+
```
|
|
278
|
+
```ts
|
|
279
|
+
db.selectFrom('person')
|
|
280
|
+
.innerJoin(
|
|
281
|
+
(eb) => eb
|
|
282
|
+
.selectFrom('pet')
|
|
283
|
+
.select(['owner_id', 'name'])
|
|
284
|
+
.where('name', '=', 'Doggo')
|
|
285
|
+
.as('doggos'),
|
|
286
|
+
(join) => join.onRef('doggos.owner_id', '=', 'person.id')
|
|
287
|
+
)
|
|
288
|
+
.selectAll()
|
|
289
|
+
.execute()
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### LATERAL JOIN (PostgreSQL, MySQL)
|
|
293
|
+
```sql
|
|
294
|
+
SELECT person.first_name, p.name FROM person
|
|
295
|
+
INNER JOIN LATERAL (SELECT name FROM pet WHERE pet.owner_id = person.id) AS p ON true
|
|
296
|
+
```
|
|
297
|
+
```ts
|
|
298
|
+
db.selectFrom('person')
|
|
299
|
+
.innerJoinLateral(
|
|
300
|
+
(eb) => eb
|
|
301
|
+
.selectFrom('pet')
|
|
302
|
+
.select('name')
|
|
303
|
+
.whereRef('pet.owner_id', '=', 'person.id')
|
|
304
|
+
.as('p'),
|
|
305
|
+
(join) => join.onTrue()
|
|
306
|
+
)
|
|
307
|
+
.select(['first_name', 'p.name'])
|
|
308
|
+
.execute()
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## GROUP BY
|
|
312
|
+
```sql
|
|
313
|
+
SELECT type, COUNT(*) AS cnt FROM items GROUP BY type
|
|
314
|
+
```
|
|
315
|
+
```ts
|
|
316
|
+
db.selectFrom('items')
|
|
317
|
+
.select(['type', (eb) => eb.fn.countAll().as('cnt')])
|
|
318
|
+
.groupBy('type')
|
|
319
|
+
.execute()
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Multiple GROUP BY
|
|
323
|
+
```sql
|
|
324
|
+
SELECT first_name, last_name, COUNT(*) FROM person GROUP BY first_name, last_name
|
|
325
|
+
```
|
|
326
|
+
```ts
|
|
327
|
+
db.selectFrom('person')
|
|
328
|
+
.select(['first_name', 'last_name', (eb) => eb.fn.countAll().as('count')])
|
|
329
|
+
.groupBy(['first_name', 'last_name'])
|
|
330
|
+
.execute()
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## HAVING
|
|
334
|
+
```sql
|
|
335
|
+
SELECT type, COUNT(*) FROM items GROUP BY type HAVING COUNT(*) > 5
|
|
336
|
+
```
|
|
337
|
+
```ts
|
|
338
|
+
db.selectFrom('items')
|
|
339
|
+
.select(['type', (eb) => eb.fn.countAll().as('cnt')])
|
|
340
|
+
.groupBy('type')
|
|
341
|
+
.having((eb) => eb(eb.fn.countAll(), '>', 5))
|
|
342
|
+
.execute()
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## ORDER BY
|
|
346
|
+
```sql
|
|
347
|
+
ORDER BY created_at DESC, id ASC
|
|
348
|
+
```
|
|
349
|
+
```ts
|
|
350
|
+
.orderBy('created_at', 'desc')
|
|
351
|
+
.orderBy('id', 'asc')
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### ORDER BY with NULLS
|
|
355
|
+
```sql
|
|
356
|
+
ORDER BY created_at DESC NULLS LAST
|
|
357
|
+
```
|
|
358
|
+
```ts
|
|
359
|
+
.orderBy('created_at', (ob) => ob.desc().nullsLast())
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## LIMIT / OFFSET
|
|
363
|
+
```sql
|
|
364
|
+
SELECT * FROM person LIMIT 10 OFFSET 20
|
|
365
|
+
```
|
|
366
|
+
```ts
|
|
367
|
+
db.selectFrom('person')
|
|
368
|
+
.selectAll()
|
|
369
|
+
.limit(10)
|
|
370
|
+
.offset(20)
|
|
371
|
+
.execute()
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## Aggregate Functions
|
|
375
|
+
```sql
|
|
376
|
+
SELECT COUNT(*), SUM(amount), AVG(price), MIN(age), MAX(age) FROM orders
|
|
377
|
+
```
|
|
378
|
+
```ts
|
|
379
|
+
db.selectFrom('orders')
|
|
380
|
+
.select((eb) => [
|
|
381
|
+
eb.fn.countAll().as('count'),
|
|
382
|
+
eb.fn.sum('amount').as('total'),
|
|
383
|
+
eb.fn.avg('price').as('avg_price'),
|
|
384
|
+
eb.fn.min('age').as('min_age'),
|
|
385
|
+
eb.fn.max('age').as('max_age'),
|
|
386
|
+
])
|
|
387
|
+
.execute()
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### COUNT with Column
|
|
391
|
+
```sql
|
|
392
|
+
SELECT COUNT(id) FROM person
|
|
393
|
+
```
|
|
394
|
+
```ts
|
|
395
|
+
db.selectFrom('person')
|
|
396
|
+
.select((eb) => eb.fn.count('id').as('count'))
|
|
397
|
+
.execute()
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
## Window Functions
|
|
401
|
+
|
|
402
|
+
### ROW_NUMBER
|
|
403
|
+
```sql
|
|
404
|
+
SELECT *, ROW_NUMBER() OVER (PARTITION BY type ORDER BY created_at DESC) AS rn FROM items
|
|
405
|
+
```
|
|
406
|
+
```ts
|
|
407
|
+
db.selectFrom('items')
|
|
408
|
+
.selectAll()
|
|
409
|
+
.select((eb) =>
|
|
410
|
+
eb.fn
|
|
411
|
+
.agg<number>('ROW_NUMBER')
|
|
412
|
+
.over((ob) => ob.partitionBy('type').orderBy('created_at', 'desc'))
|
|
413
|
+
.as('rn')
|
|
414
|
+
)
|
|
415
|
+
.execute()
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### COUNT/SUM/AVG OVER
|
|
419
|
+
```sql
|
|
420
|
+
SELECT *, COUNT(1) OVER (PARTITION BY type) AS cnt FROM items
|
|
421
|
+
```
|
|
422
|
+
```ts
|
|
423
|
+
db.selectFrom('items')
|
|
424
|
+
.selectAll()
|
|
425
|
+
.select((eb) =>
|
|
426
|
+
eb.fn.count(sql.lit(1))
|
|
427
|
+
.over((ob) => ob.partitionBy('type'))
|
|
428
|
+
.as('cnt')
|
|
429
|
+
)
|
|
430
|
+
.execute()
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Multiple PARTITION BY
|
|
434
|
+
```sql
|
|
435
|
+
PARTITION BY enrollment_id, monitoring_type
|
|
436
|
+
```
|
|
437
|
+
```ts
|
|
438
|
+
.over((ob) => ob.partitionBy(['enrollment_id', 'monitoring_type']))
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## CASE WHEN
|
|
442
|
+
```sql
|
|
443
|
+
CASE
|
|
444
|
+
WHEN type = 'a' THEN col1
|
|
445
|
+
WHEN type = 'b' THEN col2
|
|
446
|
+
ELSE col3
|
|
447
|
+
END AS result
|
|
448
|
+
```
|
|
449
|
+
```ts
|
|
450
|
+
eb.case()
|
|
451
|
+
.when('type', '=', 'a')
|
|
452
|
+
.then(eb.ref('col1'))
|
|
453
|
+
.when('type', '=', 'b')
|
|
454
|
+
.then(eb.ref('col2'))
|
|
455
|
+
.else(eb.ref('col3'))
|
|
456
|
+
.end()
|
|
457
|
+
.as('result')
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### Simple CASE
|
|
461
|
+
```sql
|
|
462
|
+
CASE status WHEN 'active' THEN 1 WHEN 'inactive' THEN 0 ELSE -1 END
|
|
463
|
+
```
|
|
464
|
+
```ts
|
|
465
|
+
eb.case('status')
|
|
466
|
+
.when('active')
|
|
467
|
+
.then(1)
|
|
468
|
+
.when('inactive')
|
|
469
|
+
.then(0)
|
|
470
|
+
.else(-1)
|
|
471
|
+
.end()
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
## WITH (CTE)
|
|
475
|
+
```sql
|
|
476
|
+
WITH filtered AS (SELECT id FROM person WHERE age > 18)
|
|
477
|
+
SELECT * FROM filtered
|
|
478
|
+
```
|
|
479
|
+
```ts
|
|
480
|
+
db.with('filtered', (db) =>
|
|
481
|
+
db.selectFrom('person')
|
|
482
|
+
.select('id')
|
|
483
|
+
.where('age', '>', 18)
|
|
484
|
+
)
|
|
485
|
+
.selectFrom('filtered')
|
|
486
|
+
.selectAll()
|
|
487
|
+
.execute()
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Multiple CTEs
|
|
491
|
+
```sql
|
|
492
|
+
WITH cte1 AS (SELECT id FROM t1),
|
|
493
|
+
cte2 AS (SELECT id FROM cte1)
|
|
494
|
+
SELECT * FROM cte2
|
|
495
|
+
```
|
|
496
|
+
```ts
|
|
497
|
+
db.with('cte1', (db) => db.selectFrom('t1').select('id'))
|
|
498
|
+
.with('cte2', (db) => db.selectFrom('cte1').select('id'))
|
|
499
|
+
.selectFrom('cte2')
|
|
500
|
+
.selectAll()
|
|
501
|
+
.execute()
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## UNION / INTERSECT / EXCEPT
|
|
505
|
+
```sql
|
|
506
|
+
SELECT id, first_name AS name FROM person
|
|
507
|
+
UNION
|
|
508
|
+
SELECT id, name FROM pet
|
|
509
|
+
```
|
|
510
|
+
```ts
|
|
511
|
+
db.selectFrom('person')
|
|
512
|
+
.select(['id', 'first_name as name'])
|
|
513
|
+
.union(db.selectFrom('pet').select(['id', 'name']))
|
|
514
|
+
.execute()
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### UNION ALL
|
|
518
|
+
```sql
|
|
519
|
+
SELECT id FROM person UNION ALL SELECT id FROM pet
|
|
520
|
+
```
|
|
521
|
+
```ts
|
|
522
|
+
db.selectFrom('person')
|
|
523
|
+
.select('id')
|
|
524
|
+
.unionAll(db.selectFrom('pet').select('id'))
|
|
525
|
+
.execute()
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### INTERSECT
|
|
529
|
+
```ts
|
|
530
|
+
db.selectFrom('person')
|
|
531
|
+
.select('id')
|
|
532
|
+
.intersect(db.selectFrom('pet').select('id'))
|
|
533
|
+
.execute()
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### EXCEPT
|
|
537
|
+
```ts
|
|
538
|
+
db.selectFrom('person')
|
|
539
|
+
.select('id')
|
|
540
|
+
.except(db.selectFrom('pet').select('id'))
|
|
541
|
+
.execute()
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
## Subquery in SELECT
|
|
545
|
+
```sql
|
|
546
|
+
SELECT name, (SELECT COUNT(*) FROM pet WHERE pet.owner_id = person.id) AS pet_count
|
|
547
|
+
FROM person
|
|
548
|
+
```
|
|
549
|
+
```ts
|
|
550
|
+
db.selectFrom('person')
|
|
551
|
+
.select((eb) => [
|
|
552
|
+
'name',
|
|
553
|
+
eb.selectFrom('pet')
|
|
554
|
+
.whereRef('pet.owner_id', '=', 'person.id')
|
|
555
|
+
.select((eb2) => eb2.fn.countAll().as('count'))
|
|
556
|
+
.as('pet_count')
|
|
557
|
+
])
|
|
558
|
+
.execute()
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
## FOR UPDATE / FOR SHARE (Locking)
|
|
562
|
+
```sql
|
|
563
|
+
SELECT * FROM person WHERE id = 1 FOR UPDATE
|
|
564
|
+
```
|
|
565
|
+
```ts
|
|
566
|
+
db.selectFrom('person')
|
|
567
|
+
.selectAll()
|
|
568
|
+
.where('id', '=', 1)
|
|
569
|
+
.forUpdate()
|
|
570
|
+
.execute()
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### FOR SHARE
|
|
574
|
+
```ts
|
|
575
|
+
db.selectFrom('person')
|
|
576
|
+
.selectAll()
|
|
577
|
+
.forShare()
|
|
578
|
+
.execute()
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### SKIP LOCKED
|
|
582
|
+
```ts
|
|
583
|
+
db.selectFrom('person')
|
|
584
|
+
.selectAll()
|
|
585
|
+
.forUpdate()
|
|
586
|
+
.skipLocked()
|
|
587
|
+
.execute()
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
### NOWAIT
|
|
591
|
+
```ts
|
|
592
|
+
db.selectFrom('person')
|
|
593
|
+
.selectAll()
|
|
594
|
+
.forUpdate()
|
|
595
|
+
.noWait()
|
|
596
|
+
.execute()
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## Raw SQL
|
|
600
|
+
```ts
|
|
601
|
+
import { sql } from 'kysely'
|
|
602
|
+
|
|
603
|
+
// Raw expression in select
|
|
604
|
+
db.selectFrom('person')
|
|
605
|
+
.select([
|
|
606
|
+
'id',
|
|
607
|
+
sql<string>`CONCAT(first_name, ' ', last_name)`.as('full_name')
|
|
608
|
+
])
|
|
609
|
+
.execute()
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### Literal Value
|
|
613
|
+
```ts
|
|
614
|
+
sql.lit(1)
|
|
615
|
+
sql.lit('active')
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
## Dynamic Column Reference
|
|
619
|
+
```ts
|
|
620
|
+
const { ref } = db.dynamic
|
|
621
|
+
const columnName = 'first_name'
|
|
622
|
+
|
|
623
|
+
db.selectFrom('person')
|
|
624
|
+
.select(ref(columnName))
|
|
625
|
+
.execute()
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
## Conditional Query Building ($if)
|
|
629
|
+
```ts
|
|
630
|
+
async function getPeople(includeAge: boolean) {
|
|
631
|
+
return await db
|
|
632
|
+
.selectFrom('person')
|
|
633
|
+
.select(['id', 'first_name'])
|
|
634
|
+
.$if(includeAge, (qb) => qb.select('age'))
|
|
635
|
+
.execute()
|
|
636
|
+
}
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
## WITH RECURSIVE (Recursive CTE)
|
|
640
|
+
```sql
|
|
641
|
+
WITH RECURSIVE subordinates AS (
|
|
642
|
+
SELECT id, name, manager_id FROM employees WHERE id = 1
|
|
643
|
+
UNION ALL
|
|
644
|
+
SELECT e.id, e.name, e.manager_id
|
|
645
|
+
FROM employees e
|
|
646
|
+
INNER JOIN subordinates s ON s.id = e.manager_id
|
|
647
|
+
)
|
|
648
|
+
SELECT * FROM subordinates
|
|
649
|
+
```
|
|
650
|
+
```ts
|
|
651
|
+
db.withRecursive('subordinates', (db) =>
|
|
652
|
+
db.selectFrom('employees')
|
|
653
|
+
.select(['id', 'name', 'manager_id'])
|
|
654
|
+
.where('id', '=', 1)
|
|
655
|
+
.unionAll(
|
|
656
|
+
db.selectFrom('employees as e')
|
|
657
|
+
.innerJoin('subordinates as s', 's.id', 'e.manager_id')
|
|
658
|
+
.select(['e.id', 'e.name', 'e.manager_id'])
|
|
659
|
+
)
|
|
660
|
+
)
|
|
661
|
+
.selectFrom('subordinates')
|
|
662
|
+
.selectAll()
|
|
663
|
+
.execute()
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
## CTE Materialization (PostgreSQL)
|
|
667
|
+
```sql
|
|
668
|
+
WITH filtered AS MATERIALIZED (SELECT id FROM person WHERE age > 18)
|
|
669
|
+
SELECT * FROM filtered
|
|
670
|
+
```
|
|
671
|
+
```ts
|
|
672
|
+
db.with(
|
|
673
|
+
(cte) => cte('filtered').materialized(),
|
|
674
|
+
(db) => db.selectFrom('person')
|
|
675
|
+
.select('id')
|
|
676
|
+
.where('age', '>', 18)
|
|
677
|
+
)
|
|
678
|
+
.selectFrom('filtered')
|
|
679
|
+
.selectAll()
|
|
680
|
+
.execute()
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
### NOT MATERIALIZED
|
|
684
|
+
```ts
|
|
685
|
+
db.with(
|
|
686
|
+
(cte) => cte('filtered').notMaterialized(),
|
|
687
|
+
(db) => db.selectFrom('person')
|
|
688
|
+
.select('id')
|
|
689
|
+
.where('age', '>', 18)
|
|
690
|
+
)
|
|
691
|
+
.selectFrom('filtered')
|
|
692
|
+
.selectAll()
|
|
693
|
+
.execute()
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
## INTERSECT ALL / EXCEPT ALL
|
|
697
|
+
### INTERSECT ALL
|
|
698
|
+
```sql
|
|
699
|
+
SELECT id FROM person INTERSECT ALL SELECT id FROM pet
|
|
700
|
+
```
|
|
701
|
+
```ts
|
|
702
|
+
db.selectFrom('person')
|
|
703
|
+
.select('id')
|
|
704
|
+
.intersectAll(db.selectFrom('pet').select('id'))
|
|
705
|
+
.execute()
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
### EXCEPT ALL
|
|
709
|
+
```sql
|
|
710
|
+
SELECT id FROM person EXCEPT ALL SELECT id FROM pet
|
|
711
|
+
```
|
|
712
|
+
```ts
|
|
713
|
+
db.selectFrom('person')
|
|
714
|
+
.select('id')
|
|
715
|
+
.exceptAll(db.selectFrom('pet').select('id'))
|
|
716
|
+
.execute()
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
## Data Type Casting (CAST)
|
|
720
|
+
```sql
|
|
721
|
+
SELECT CAST(age AS integer) AS age FROM person
|
|
722
|
+
```
|
|
723
|
+
```ts
|
|
724
|
+
db.selectFrom('person')
|
|
725
|
+
.select((eb) => [
|
|
726
|
+
eb.cast<number>('age', 'integer').as('age')
|
|
727
|
+
])
|
|
728
|
+
.execute()
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
### PostgreSQL Shorthand (::) - Raw SQL
|
|
732
|
+
```sql
|
|
733
|
+
SELECT age::integer FROM person
|
|
734
|
+
```
|
|
735
|
+
```ts
|
|
736
|
+
import { sql } from 'kysely'
|
|
737
|
+
|
|
738
|
+
db.selectFrom('person')
|
|
739
|
+
.select(sql<number>`age::integer`.as('age'))
|
|
740
|
+
.execute()
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
## JSON Data Processing
|
|
744
|
+
|
|
745
|
+
### JSON Extraction (->)
|
|
746
|
+
```sql
|
|
747
|
+
-- PostgreSQL: address->'city'
|
|
748
|
+
-- MySQL: JSON_EXTRACT(address, '$.city')
|
|
749
|
+
SELECT address->'city' AS city FROM person
|
|
750
|
+
```
|
|
751
|
+
```ts
|
|
752
|
+
db.selectFrom('person')
|
|
753
|
+
.select((eb) =>
|
|
754
|
+
eb.ref('address', '->').key('city').as('city')
|
|
755
|
+
)
|
|
756
|
+
.execute()
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
### JSON Text Extraction (->>)
|
|
760
|
+
```sql
|
|
761
|
+
-- PostgreSQL: address->>'city'
|
|
762
|
+
-- MySQL: JSON_UNQUOTE(JSON_EXTRACT(address, '$.city'))
|
|
763
|
+
SELECT address->>'city' AS city FROM person
|
|
764
|
+
```
|
|
765
|
+
```ts
|
|
766
|
+
db.selectFrom('person')
|
|
767
|
+
.select((eb) =>
|
|
768
|
+
eb.ref('address', '->>').key('city').as('city')
|
|
769
|
+
)
|
|
770
|
+
.execute()
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
### Nested JSON Access
|
|
774
|
+
```sql
|
|
775
|
+
SELECT profile->'address'->'city' AS city FROM person
|
|
776
|
+
```
|
|
777
|
+
```ts
|
|
778
|
+
db.selectFrom('person')
|
|
779
|
+
.select((eb) =>
|
|
780
|
+
eb.ref('profile', '->').key('address').key('city').as('city')
|
|
781
|
+
)
|
|
782
|
+
.execute()
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
### JSON Array Access
|
|
786
|
+
```sql
|
|
787
|
+
SELECT nicknames->0 AS first_nickname FROM person
|
|
788
|
+
```
|
|
789
|
+
```ts
|
|
790
|
+
db.selectFrom('person')
|
|
791
|
+
.select((eb) =>
|
|
792
|
+
eb.ref('nicknames', '->').at(0).as('first_nickname')
|
|
793
|
+
)
|
|
794
|
+
.execute()
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
### JSON Aggregation - Raw SQL
|
|
798
|
+
```sql
|
|
799
|
+
-- PostgreSQL: json_agg(pet)
|
|
800
|
+
-- MySQL: JSON_ARRAYAGG(pet.name)
|
|
801
|
+
```
|
|
802
|
+
```ts
|
|
803
|
+
// PostgreSQL
|
|
804
|
+
db.selectFrom('person')
|
|
805
|
+
.innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
806
|
+
.select((eb) => [
|
|
807
|
+
'person.id',
|
|
808
|
+
eb.fn.agg<string>('json_agg', ['pet']).as('pets')
|
|
809
|
+
])
|
|
810
|
+
.groupBy('person.id')
|
|
811
|
+
.execute()
|
|
812
|
+
|
|
813
|
+
// MySQL
|
|
814
|
+
db.selectFrom('person')
|
|
815
|
+
.innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
816
|
+
.select((eb) => [
|
|
817
|
+
'person.id',
|
|
818
|
+
eb.fn.agg<string>('JSON_ARRAYAGG', ['pet.name']).as('pet_names')
|
|
819
|
+
])
|
|
820
|
+
.groupBy('person.id')
|
|
821
|
+
.execute()
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
## Full Text Search
|
|
825
|
+
|
|
826
|
+
### PostgreSQL (@@)
|
|
827
|
+
```sql
|
|
828
|
+
SELECT * FROM documents WHERE to_tsvector('english', content) @@ to_tsquery('search')
|
|
829
|
+
```
|
|
830
|
+
```ts
|
|
831
|
+
import { sql } from 'kysely'
|
|
832
|
+
|
|
833
|
+
db.selectFrom('documents')
|
|
834
|
+
.selectAll()
|
|
835
|
+
.where(
|
|
836
|
+
sql`to_tsvector('english', ${sql.ref('content')})`,
|
|
837
|
+
'@@',
|
|
838
|
+
sql`to_tsquery(${sql.lit('search')})`
|
|
839
|
+
)
|
|
840
|
+
.execute()
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
### MySQL (MATCH AGAINST)
|
|
844
|
+
```sql
|
|
845
|
+
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('search terms')
|
|
846
|
+
```
|
|
847
|
+
```ts
|
|
848
|
+
import { sql } from 'kysely'
|
|
849
|
+
|
|
850
|
+
db.selectFrom('articles')
|
|
851
|
+
.selectAll()
|
|
852
|
+
.where(
|
|
853
|
+
sql`MATCH(title, body) AGAINST(${sql.lit('search terms')})`,
|
|
854
|
+
'>',
|
|
855
|
+
0
|
|
856
|
+
)
|
|
857
|
+
.execute()
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
## BETWEEN SYMMETRIC (PostgreSQL)
|
|
861
|
+
```sql
|
|
862
|
+
SELECT * FROM person WHERE age BETWEEN SYMMETRIC 60 AND 18
|
|
863
|
+
```
|
|
864
|
+
```ts
|
|
865
|
+
db.selectFrom('person')
|
|
866
|
+
.selectAll()
|
|
867
|
+
.where((eb) => eb.betweenSymmetric('age', 60, 18))
|
|
868
|
+
.execute()
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
## Advanced Grouping (Raw SQL Required)
|
|
872
|
+
|
|
873
|
+
### ROLLUP
|
|
874
|
+
> **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
|
|
875
|
+
```sql
|
|
876
|
+
SELECT type, region, SUM(amount) FROM sales GROUP BY ROLLUP(type, region)
|
|
877
|
+
```
|
|
878
|
+
```ts
|
|
879
|
+
import { sql } from 'kysely'
|
|
880
|
+
|
|
881
|
+
db.selectFrom('sales')
|
|
882
|
+
.select(['type', 'region', (eb) => eb.fn.sum('amount').as('total')])
|
|
883
|
+
.groupBy(sql`ROLLUP(type, region)`)
|
|
884
|
+
.execute()
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
### CUBE
|
|
888
|
+
> **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
|
|
889
|
+
```sql
|
|
890
|
+
SELECT type, region, SUM(amount) FROM sales GROUP BY CUBE(type, region)
|
|
891
|
+
```
|
|
892
|
+
```ts
|
|
893
|
+
import { sql } from 'kysely'
|
|
894
|
+
|
|
895
|
+
db.selectFrom('sales')
|
|
896
|
+
.select(['type', 'region', (eb) => eb.fn.sum('amount').as('total')])
|
|
897
|
+
.groupBy(sql`CUBE(type, region)`)
|
|
898
|
+
.execute()
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
### GROUPING SETS
|
|
902
|
+
> **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
|
|
903
|
+
```sql
|
|
904
|
+
SELECT type, region, SUM(amount) FROM sales
|
|
905
|
+
GROUP BY GROUPING SETS ((type), (region), ())
|
|
906
|
+
```
|
|
907
|
+
```ts
|
|
908
|
+
import { sql } from 'kysely'
|
|
909
|
+
|
|
910
|
+
db.selectFrom('sales')
|
|
911
|
+
.select(['type', 'region', (eb) => eb.fn.sum('amount').as('total')])
|
|
912
|
+
.groupBy(sql`GROUPING SETS ((type), (region), ())`)
|
|
913
|
+
.execute()
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
## Window Frame Clause (Raw SQL Required)
|
|
917
|
+
|
|
918
|
+
### ROWS BETWEEN
|
|
919
|
+
> **Note**: Kysely에서 프레임 절 직접 지원하지 않음 - Raw SQL 사용
|
|
920
|
+
```sql
|
|
921
|
+
SELECT id, amount,
|
|
922
|
+
SUM(amount) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS running_sum
|
|
923
|
+
FROM transactions
|
|
924
|
+
```
|
|
925
|
+
```ts
|
|
926
|
+
import { sql } from 'kysely'
|
|
927
|
+
|
|
928
|
+
db.selectFrom('transactions')
|
|
929
|
+
.select([
|
|
930
|
+
'id',
|
|
931
|
+
'amount',
|
|
932
|
+
sql<number>`SUM(amount) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)`.as('running_sum')
|
|
933
|
+
])
|
|
934
|
+
.execute()
|
|
935
|
+
```
|
|
936
|
+
|
|
937
|
+
### RANGE BETWEEN
|
|
938
|
+
```sql
|
|
939
|
+
SELECT id, amount,
|
|
940
|
+
AVG(amount) OVER (ORDER BY created_at RANGE BETWEEN INTERVAL '1 day' PRECEDING AND CURRENT ROW)
|
|
941
|
+
FROM transactions
|
|
942
|
+
```
|
|
943
|
+
```ts
|
|
944
|
+
import { sql } from 'kysely'
|
|
945
|
+
|
|
946
|
+
db.selectFrom('transactions')
|
|
947
|
+
.select([
|
|
948
|
+
'id',
|
|
949
|
+
'amount',
|
|
950
|
+
sql<number>`AVG(amount) OVER (ORDER BY created_at RANGE BETWEEN INTERVAL '1 day' PRECEDING AND CURRENT ROW)`.as('avg_amount')
|
|
951
|
+
])
|
|
952
|
+
.execute()
|
|
953
|
+
```
|
|
954
|
+
|
|
955
|
+
## DBMS-Specific Features (Raw SQL Required)
|
|
956
|
+
|
|
957
|
+
### MySQL Index Hints
|
|
958
|
+
> **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
|
|
959
|
+
```sql
|
|
960
|
+
SELECT * FROM person USE INDEX (idx_name) WHERE name = 'John'
|
|
961
|
+
```
|
|
962
|
+
```ts
|
|
963
|
+
import { sql } from 'kysely'
|
|
964
|
+
|
|
965
|
+
sql`SELECT * FROM person USE INDEX (idx_name) WHERE name = ${sql.lit('John')}`
|
|
966
|
+
.execute(db)
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
### PostgreSQL TABLESAMPLE
|
|
970
|
+
> **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
|
|
971
|
+
```sql
|
|
972
|
+
SELECT * FROM large_table TABLESAMPLE BERNOULLI(10)
|
|
973
|
+
```
|
|
974
|
+
```ts
|
|
975
|
+
import { sql } from 'kysely'
|
|
976
|
+
|
|
977
|
+
sql`SELECT * FROM large_table TABLESAMPLE BERNOULLI(10)`
|
|
978
|
+
.execute(db)
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
## Dialect Differences
|
|
982
|
+
|
|
983
|
+
### MySQL
|
|
984
|
+
- Uses backticks for identifiers: \`table\`.\`column\`
|
|
985
|
+
- `LIMIT offset, count` syntax supported
|
|
986
|
+
- Supports `REGEXP` operator
|
|
987
|
+
- JSON: `->`, `->>` maps to `JSON_EXTRACT`, `JSON_UNQUOTE`
|
|
988
|
+
- Full-Text: `MATCH (...) AGAINST (...)`
|
|
989
|
+
|
|
990
|
+
### PostgreSQL
|
|
991
|
+
- Uses double quotes for identifiers: "table"."column"
|
|
992
|
+
- `DISTINCT ON` supported
|
|
993
|
+
- `ILIKE` for case-insensitive LIKE
|
|
994
|
+
- `~`, `~*`, `!~`, `!~*` regex operators
|
|
995
|
+
- `NULLS FIRST` / `NULLS LAST` in ORDER BY
|
|
996
|
+
- JSON: Native `->`, `->>`, `#>`, `#>>` operators
|
|
997
|
+
- Full-Text: `to_tsvector`, `to_tsquery`, `@@` operator
|
|
998
|
+
- Type casting: `::type` shorthand (use raw SQL)
|
|
999
|
+
- CTE: `MATERIALIZED` / `NOT MATERIALIZED` hints supported
|
|
1000
|
+
- `BETWEEN SYMMETRIC` supported
|