SQL 활용 가이드
데이터를 직접 꺼내 쓰는 법
SQL은 데이터베이스에 질문하는 언어입니다. 영어 문장처럼 읽히도록 설계되어 있어서, 규칙 몇 가지만 알면 복잡한 조건으로도 데이터를 뽑아낼 수 있습니다. 아래 예시를 복붙해서 바로 사용하세요.
Datasette SQL 창 여는 법
사이드바 "직접 조회 (SQL)"를 클릭하면 Datasette 기본 화면으로 이동합니다. 아래 순서로 SQL 입력창을 엽니다.
1
DB 선택
사이드바에서 DB를 클릭합니다. 계약·의안 → 시민감시 DB(civic), 정리된 결산 → 계약·결산(integrated), 입법예고 → 입법예고(elis).
2
SQL 버튼 클릭
DB 페이지 상단 오른쪽 ▶ SQL 쿼리 실행 버튼을 클릭합니다.
3
SQL 붙여넣기 후 실행
아래 예시 오른쪽 복사 버튼 → 텍스트 창 붙여넣기 → ▶ 실행 클릭. 새 탭으로 바로 열고 싶다면 바로 실행 버튼을 사용하세요.
4
결과 내보내기
결과 표 아래 CSV 버튼 → 엑셀에서 바로 열 수 있는 파일로 저장됩니다.
팁: 검색 조건을 바꿀 때는 WHERE 다음의 값만 수정하면 됩니다. 예)
'대전광역시' → '세종특별자치시'SQL 기초 문법
"어떤 정보를 / 어느 테이블에서 / 어떤 조건으로 / 어떻게 정렬해서 / 몇 개나"라는 순서로 읽으면 됩니다.
SELECT
어떤 컬럼을 볼지
SELECT * → 전체 / SELECT 이름, 금액 → 일부
FROM
어느 테이블에서
FROM contracts → contracts 테이블
WHERE
조건 필터링
WHERE region = '대전광역시'
LIKE
부분 일치 검색
LIKE '%청솔%' → "청솔"이 포함된 값
ORDER BY
정렬 기준
ORDER BY contract_amount DESC → 금액 큰 순
LIMIT
결과 개수 제한
LIMIT 50 → 최대 50개만 표시
GROUP BY
묶어서 집계
GROUP BY org → 기관별로 묶기
COUNT / SUM
건수 세기 / 합계
COUNT(*) 건수, SUM(amount) 합계
AND vs OR: 조건 두 개를 모두 만족 →
AND. 둘 중 하나만 → OR. 예) 대전 AND 수의계약 / 대전 OR 세종수집 중인 테이블 목록
FROM 다음에 쓰는 테이블 이름입니다.
| 테이블명 | DB | 내용 및 주요 컬럼 |
|---|---|---|
contracts | civic | 나라장터 계약 (2018~현재) region, org, vendor, contract_name, contract_amount, contract_date, bid_method |
bills | civic | 국회·지방의회 의안·법안 bill_type, bill_name, region, org, proposer, propose_date, committee, result |
meetings | civic | 지방의회 회의록 region, org, meeting_date, agenda, speaker, content |
people | civic | 의원 정보 (국회·지방 925명) name, region, org, party, district, position, gender |
law_master | civic | 전국 자치법규 (조례·규칙) law_name, region, org, law_type, promulgate_date |
announcements | civic | 나라장터 입찰공고 org, title, bid_method, budget_amount, deadline_date |
contract | integrated | 계약 정리본 (85,892건) — 부서·분류 정제됨 gov_code, dept_norm, dept_category, fiscal_year, contract_name, method, vendor, amount |
settlement | integrated | 지방재정 결산 (158,759건, 2002~2024) gov_code, fiscal_year, category_name, amount |
subsidy | integrated | 지방 보조금 집행 (16,634건) gov_code, fiscal_year, category_name, amount |
notices | elis | ELIS 입법예고 (자동 수집) title, ministry, field, start_date, end_date, url, outcome |
gov_code 주요 값 (integrated DB):
3000000 대전광역시 · 3011000 동구 · 3012000 중구 · 3013000 서구 · 3014000 유성구 · 3015000 대덕구 · EDU-DJ 대전교육청나라장터 계약 감시
DB: civic · 테이블: contracts · bid_method 값: '수의계약' '제한경쟁' '일반경쟁' '지명경쟁'
대전시 수의계약 1억 원 이상 목록
계약금액 큰 순으로 정렬. 금액은 원 단위.
SELECT org, vendor, contract_name, contract_amount, contract_date, bid_method FROM contracts WHERE region = '대전광역시' AND bid_method = '수의계약' AND contract_amount >= 100000000 ORDER BY contract_amount DESC LIMIT 50;
특정 업체의 계약 내역 전체 검색
업체명 일부만 알아도 됩니다. % 는 "아무 문자나 가능" 의미.
SELECT org, contract_name, contract_amount, contract_date, bid_method FROM contracts WHERE vendor LIKE '%업체명%' -- '업체명' 자리에 찾고 싶은 이름을 넣으세요 ORDER BY contract_date DESC;
기관별 수의계약 총액 순위
어느 기관이 수의계약을 가장 많이 맺었는지 파악.
SELECT org,
COUNT(*) AS 계약건수,
SUM(contract_amount) AS 총계약액
FROM contracts
WHERE region = '대전광역시'
AND bid_method = '수의계약'
AND contract_date >= '2023-01-01'
GROUP BY org
ORDER BY 총계약액 DESC
LIMIT 20;특정 기간·기관 계약 목록
날짜는 'YYYY-MM-DD' 형식. BETWEEN 으로 기간 지정.
SELECT org, vendor, contract_name, contract_amount, contract_date, bid_method FROM contracts WHERE org LIKE '%대전광역시교육청%' AND contract_date BETWEEN '2024-01-01' AND '2024-12-31' ORDER BY contract_amount DESC;
의안·법안 추적
DB: civic · 테이블: bills · bill_type: 'national_bill'(국회) 'local_bill'(지방의회)
대전시의회 최근 의안 목록
result 값: 가결 / 부결 / 폐기 / 계류 등.
SELECT bill_name, proposer, propose_date, committee, result FROM bills WHERE org LIKE '%대전광역시의회%' ORDER BY propose_date DESC LIMIT 50;
특정 의원이 발의한 의안 전체
이름 일부만 입력해도 됩니다.
SELECT bill_name, org, propose_date, committee, result FROM bills WHERE proposer LIKE '%홍길동%' -- 의원 이름을 넣으세요 ORDER BY propose_date DESC;
키워드로 의안 검색
제목에 특정 단어가 포함된 의안을 찾습니다.
SELECT bill_name, org, proposer, propose_date, result FROM bills WHERE bill_name LIKE '%청년%' -- 검색할 키워드를 넣으세요 OR bill_name LIKE '%복지%' ORDER BY propose_date DESC LIMIT 100;
재정·결산 분석
DB: integrated · 테이블: settlement(결산) contract(계약 정리본) subsidy(보조금)
gov_code: 대전광역시
3000000 / 동구 3011000 / 중구 3012000 / 서구 3013000 / 유성구 3014000 / 대덕구 3015000 / 대전교육청 EDU-DJ대전광역시 세출 결산 (연도별 상위 항목)
어느 분야에 가장 많이 지출했는지 파악.
SELECT fiscal_year, category_name, amount FROM settlement WHERE gov_code = '3000000' -- 대전광역시 AND fiscal_year >= 2020 ORDER BY fiscal_year DESC, amount DESC LIMIT 50;
부서별 계약 건수 및 총액 순위
정리본 테이블 사용. 부서 분류가 정제되어 분석에 적합.
SELECT dept_norm AS 부서명,
dept_category AS 분류,
COUNT(*) AS 계약건수,
SUM(amount) AS 총액
FROM contract
WHERE gov_code = '3000000'
AND fiscal_year >= 2022
GROUP BY dept_norm
ORDER BY 총액 DESC
LIMIT 20;대전시 구별 결산 비교 (동일 연도)
5개 자치구를 한 번에 비교합니다.
SELECT gov_code, category_name, amount
FROM settlement
WHERE gov_code IN ('3011000','3012000','3013000','3014000','3015000')
AND fiscal_year = 2023
ORDER BY gov_code, amount DESC;보조금 사업 항목 순위
어떤 사업에 보조금이 가장 많이 집행됐는지.
SELECT fiscal_year, category_name,
SUM(amount) AS 총보조금액
FROM subsidy
WHERE gov_code = '3000000'
GROUP BY fiscal_year, category_name
ORDER BY fiscal_year DESC, 총보조금액 DESC
LIMIT 30;입법예고 모니터링
DB: elis · 테이블: notices · 하루 수차례 자동 수집. 의견 제출 기한 전에 확인하세요.
주의:
end_date는 2026-06-29 와 2026. 7. 13. 형식이 함께 들어 있습니다. 아래 예시는 두 형식을 모두 정규화해서 조회하도록 작성했습니다.현재 의견 수렴 중인 입법예고
오늘 기준 마감일이 지나지 않은 항목만.
WITH notice_src AS (
SELECT *,
rtrim(replace(replace(replace(replace(trim(end_date), char(160), ''), ' ', ''), '.', '/'), '-', '/'), '/') AS ds
FROM notices
WHERE end_date IS NOT NULL AND end_date != ''
), notice_parts AS (
SELECT *,
substr(ds, 1, instr(ds, '/') - 1) AS y,
substr(ds, instr(ds, '/') + 1) AS rest1
FROM notice_src
WHERE instr(ds, '/') > 0
), notice_norm AS (
SELECT title, ministry, field, start_date, end_date, url,
date(printf(
'%04d-%02d-%02d',
CAST(y AS INTEGER),
CAST(substr(rest1, 1, instr(rest1, '/') - 1) AS INTEGER),
CAST(substr(rest1, instr(rest1, '/') + 1) AS INTEGER)
)) AS end_date_norm
FROM notice_parts
WHERE instr(rest1, '/') > 0
)
SELECT title, ministry, field, start_date, end_date, url
FROM notice_norm
WHERE end_date_norm >= date('now')
ORDER BY end_date_norm ASC;특정 분야·부처 입법예고 검색
field(분야) 또는 ministry(부처명)로 필터링.
SELECT title, ministry, field, start_date, end_date, url FROM notices WHERE field LIKE '%환경%' -- 분야 키워드 OR title LIKE '%환경%' -- 제목에 키워드 포함 ORDER BY start_date DESC LIMIT 50;
최근 30일 입법예고 부처별 건수
어느 부처에서 가장 많은 예고를 올렸는지.
WITH notice_src AS (
SELECT ministry,
rtrim(replace(replace(replace(replace(trim(start_date), char(160), ''), ' ', ''), '.', '/'), '-', '/'), '/') AS ds
FROM notices
WHERE start_date IS NOT NULL AND start_date != ''
), notice_parts AS (
SELECT ministry,
substr(ds, 1, instr(ds, '/') - 1) AS y,
substr(ds, instr(ds, '/') + 1) AS rest1
FROM notice_src
WHERE instr(ds, '/') > 0
)
SELECT ministry, COUNT(*) AS 건수
FROM (
SELECT ministry,
date(printf(
'%04d-%02d-%02d',
CAST(y AS INTEGER),
CAST(substr(rest1, 1, instr(rest1, '/') - 1) AS INTEGER),
CAST(substr(rest1, instr(rest1, '/') + 1) AS INTEGER)
)) AS start_date_norm
FROM notice_parts
WHERE instr(rest1, '/') > 0
)
WHERE start_date_norm >= date('now', '-30 days')
GROUP BY ministry
ORDER BY 건수 DESC;자주 쓰는 패턴 & 팁
금액을 억 원 단위로 보기
숫자가 너무 길 때 ROUND로 반올림.
SELECT org, vendor, contract_name,
ROUND(contract_amount / 100000000.0, 1) AS 금액_억원,
contract_date
FROM contracts
WHERE region = '대전광역시'
AND contract_amount >= 100000000
ORDER BY contract_amount DESC
LIMIT 30;연도별 추이 집계
substr() 로 날짜에서 연도만 뽑습니다.
SELECT substr(contract_date, 1, 4) AS 연도,
COUNT(*) AS 계약건수,
ROUND(SUM(contract_amount) / 100000000.0) AS 총액_억원
FROM contracts
WHERE region = '대전광역시'
AND bid_method = '수의계약'
GROUP BY 연도
ORDER BY 연도 DESC;두 조건 중 하나 (OR) 사용 예시
대전 또는 세종에서 체결된 계약.
SELECT org, vendor, contract_name, contract_amount, region FROM contracts WHERE (region = '대전광역시' OR region = '세종특별자치시') AND bid_method = '수의계약' AND contract_amount >= 50000000 ORDER BY contract_amount DESC LIMIT 50;
결과가 너무 많을 때: LIMIT 숫자를 줄이거나 WHERE 조건을 더 추가하세요.
결과가 하나도 없을 때: LIKE의 % 위치를 확인하거나 값의 오타를 점검하세요. 예)
결과가 하나도 없을 때: LIKE의 % 위치를 확인하거나 값의 오타를 점검하세요. 예)
LIKE '%대전%'으로 먼저 시도하세요.