SQLite는 가볍고 단순한 구조 덕분에 다양한 환경에서 널리 쓰입니다. 하지만 Oracle SQL에 익숙한 개발자라면 몇 가지 문법 차이 때문에 혼란스러울 수 있습니다. 이번 튜토리얼에서는 WITH 절, DECODE 함수, ROWNUM, 버전 확인, OUTER JOIN을 중심으로 살펴봅니다.
1. WITH 절 (CTE)
SQLite에서도 공통 테이블 표현식(CTE)를 지원합니다.
sql
WITH recent_orders AS ( SELECT * FROM orders WHERE order_date > '2026-01-01' ) SELECT customer_id, COUNT(*) FROM recent_orders GROUP BY customer_id;
👉 Oracle과 거의 동일하게 사용할 수 있습니다.
2. DECODE 함수 대체
Oracle의 DECODE는 SQLite에 없습니다. 대신 CASE 문을 사용하세요.
sql
SELECT CASE status WHEN 'A' THEN 'Active' WHEN 'I' THEN 'Inactive' ELSE 'Unknown' END AS status_text FROM users;
👉 CASE 문이 더 범용적이고 가독성도 좋습니다.
3. ROWNUM 대신 쓰는 방법
SQLite에는 ROWNUM이 없습니다. 대신 두 가지 방법을 씁니다.
(1) LIMIT / OFFSET
sql
SELECT * FROM users LIMIT 10 OFFSET 20; -- 21번째 행부터 10개
(2) ROW_NUMBER() 윈도우 함수
sql
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rn, name FROM users;
👉 SQLite 3.25.0 이상에서 지원됩니다.
4. SQLite 버전 확인
버전 확인은 간단합니다.
SQL 쿼리:
sql
SELECT sqlite_version();
CLI:
bash
sqlite3 --version
Python:
python
import sqlite3 print(sqlite3.sqlite_version)
5. OUTER JOIN
SQLite는 LEFT OUTER JOIN만 지원합니다.
sql
SELECT u.id, u.name, o.order_date FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
RIGHT OUTER JOIN → 테이블 순서를 바꿔서 LEFT JOIN으로 대체
FULL OUTER JOIN → LEFT JOIN과 RIGHT JOIN을 UNION으로 합쳐서 구현
마무리
Oracle에서 SQLite로 넘어올 때 가장 많이 부딪히는 차이점들을 정리했습니다.
WITH 절은 그대로 사용 가능
DECODE는 CASE로 대체
ROWNUM은 LIMIT/OFFSET 또는 ROW_NUMBER()
버전 확인은 sqlite_version()
OUTER JOIN은 LEFT만 지원, FULL은 UNION으로 구현
👉 이 튜토리얼을 따라가면 Oracle 개발자도 SQLite 환경에서 빠르게 적응할 수 있습니다.
#스하리1000명프로젝트,
한국에서 길을 잃었나요? 한국어를 못하더라도 이 앱을 사용하면 쉽게 돌아다닐 수 있습니다.
귀하의 언어로 말하면 귀하의 언어로 번역, 검색 및 결과가 표시됩니다.
여행자에게 좋습니다! 영어, 일본어, 중국어, 베트남어 등 10개 이상의 언어를 지원합니다.
지금 사용해 보세요!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127
#billcorea #운동동아리관리앱
🏸 Schneedle, um aplicativo obrigatório para clubes de badminton!
👉 Match Play – Grave pontuações e encontre oponentes 🎉
Perfeito para qualquer lugar, sozinho, com amigos ou em um clube! 🤝
Se você gosta de badminton, definitivamente experimente
Acesse o aplicativo 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay
#스하리1000명프로젝트,
Às vezes é difícil conversar com trabalhadores estrangeiros, certo?
Fiz um aplicativo simples que ajuda! Você escreve na sua língua e os outros veem na deles.
Ele é traduzido automaticamente com base nas configurações.
Muito útil para bate-papos fáceis. Dê uma olhada quando tiver uma chance!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416
#스하리1000명프로젝트,
In Korea verloren? Auch wenn Sie kein Koreanisch sprechen, hilft Ihnen diese App dabei, sich problemlos fortzubewegen.
Sprechen Sie einfach Ihre Sprache – es übersetzt, sucht und zeigt Ergebnisse in Ihrer Sprache an.
Ideal für Reisende! Unterstützt mehr als 10 Sprachen, darunter Englisch, Japanisch, Chinesisch, Vietnamesisch und mehr.
Probieren Sie es jetzt aus!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127
#billcorea #운동동아리관리앱
🏸 Schneedle, een onmisbare app voor badmintonclubs!
👉 Matchplay - Registreer scores en vind tegenstanders 🎉
Perfect voor overal, alleen, met vrienden of in een club! 🤝
Als je van badminton houdt, probeer het dan zeker
Ga naar appen 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay
@SuppressLint("JavascriptInterface", "SetJavaScriptEnabled") @Composable fun WebViewForAddress(addressFindActivity: AddressFindActivity, doFinish:() -> Unit) {
val blogspot = "https://billcoreatech.blogspot.com/2026/06/blog-post_480.html"; // "https://billcoreatech.blogspot.com/2022/06/blog-post.html"
var webViewContainer by remember { mutableStateOf<FrameLayout?>(null) } var mainWebView by remember { mutableStateOf<WebView?>(null) } var webView by remember { mutableStateOf<WebView?>(null) } var canGoBack by remember { mutableStateOf(false) } var isPostcodeRequested by remember { mutableStateOf(false) }