우당탕탕 개발일지
[DB] DBMS & SQL 본문
데이터베이스 시스템은 데이터베이스 관리 시스템(DBMS), 데이터베이스, 데이터 모델 세 가지로 구성된다.
1) DBMS
데이터를 관리하는 소프트웨어 시스템으로, 주기억장치에 상주하면서 사용자와 데이터베이스를 연결해 준다.
2) 데이터베이스
'여러 사람이 공용으로 사용하기 위해 통합하고 저장한 운영 데이터의 집합'
데이터를 구조화된 형태로 보관하며, 컴퓨터 내부의 하드디스크에 물리적으로 저장된다.
3) 데이터 모델
데이터베이스에 데이터가 어떻게 구조화되어 저장되는지를 결정하며, 현재 가장 많이 사용되는 데이터 모델은 관계 데이터 모델이다.
DBMS
DBMS는 사용자와 데이터베이스를 연결해 주는 소프트웨어로, 데이터베이스 사용자가 데이터베이스를 생성 및 관리를 할 수 있도록 지원해주는 역할을 한다. DBMS는 데이터베이스 전용 언어인 SQL을 사용한다.
관계 데이터 모델
릴레이션은 행과 열로 구성된 테이블로 스키마와 인스턴스로 이루어진다. 스키마는 테이블의 헤더에 나타나며 각 테이블의 특징을 나타내는 속성, 자료 타입 등의 정보를 담고 있다. 인스턴스는 정의된 스키마에 따라 테이블에 실제로 저장되는 데이터의 집합을 의미한다.
- 속성(Attribute): 릴레이션 스키마의 열
- 튜플(Tuple): 릴레이션의 행
릴레이션과 테이블은 같은 의미로 사용된다. 릴레이션은 주로 구조를 강조하는 의미로 이론을 설명할 때 많이 사용되고, 테이블은 데이터를 강조하는 의미로 실무에서 많이 사용된다. 또한, 속성은 '열', 튜플은 '행'이라고 부르는 경우가 많다.
릴레이션 용어 | 실무에서 많이 사용되는 용어 | 같은 의미의 파일 시스템 용어 |
릴레이션(Relation) | 테이블(Table) | 파일(File) |
속성(Attribute) | 열(Column) | 필드(Field) |
튜플(Tuple) | 행(Row) | 레코드(Record) |
데이터베이스 언어
SQL은 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 구성된다.
데이터 정의어는 DBMS에 저장된 테이블 구조를 정의하는 데 사용되며 CREATE, ALTER, DROP 문 등이 있다. 데이터 조작어는 데이터를 검색, 삽입, 삭제, 수정하는 데 사용하며 SELECT, INSERT, DELETE, UPDATE 문 등이 있다. 데이터 제어어는 데이터의 사용 권한을 관리하는 데 사용하며 GRANT, REVOKE 문 등이 있다.
SQL의 핵심은 데이터를 검색하는 쿼리문이다. 쿼리문은 SELECT - FROM - WHERE 구조로 되어 있다.
SELECT : 질의 결과 추출되는 속성 리스트를 열거한다.
FROM : 질의에 어느 테이블이 사용되는지 열거한다.
WHERE : 질의의 조건을 작성한다.
SELECT [ ALL | DISTINCT ] 속성이름
FROM 테이블이름
[ WHERE 검색조건 ]
[ GROUP BY 속성이름 ]
[ HAVING 검색조건 ]
[ ORDER BY 속성이름 [ ASC | DES ] ]
SELECT 문
SQL 문은 기본적으로 중복을 제거하지 않는다. 중복을 제거하고 싶으면 DISTINCT라는 키워드를 사용한다.
SELECT DISTINCT bookname, price
FROM Book;
WHERE 조건
술어 | 연산자 |
비교 | =, <>, <. <=, >, >= |
범위 | BETWEEN |
집합 | IN, NOT IN |
패턴 | LIKE |
NULL | IS NULL, IS NOT NULL |
복합조건 | AND, OR, NOT |
WHERE 절에 두 개 이상의 값을 비교하려면 IN 연산자와 NOT IN 연산자를 사용하면 편리하다. IN 연산자는 집합의 원소인지 판단하는 연산자다.
SELECT *
FROM Book
WHERE publisher IN ('굿스포츠', '대한미디어');
문자열의 패턴을 비교할 때는 LIKE 연산자를 사용한다. WHERE 절 조건에 LIKE를 사용하며 비교하며, 만약 찾는 속성이 텍스트 혹은 날자 데이터를 포함한다면 비교 값은 반드시 영문 작은 따옴표(' ')로 감싸야 한다.
와일드 문자 | 의미 | 사용 예 |
% | 0개 이상의 문자열과 일치 | '%축구%' : 축구를 포함하는 문자열 |
[ ] | 1개의 문자와 일치 | '[0-5]%' : 0~5 사이 숫자로 시작하는 문자열 |
[^] | 1개의 문자와 불일치 | '[^0-5]%' : 0~5 사이 숫자로 시작하지 않는 문자열 |
_ | 특정 위치에 있는 1개의 문자와 일치 | '_구%' : 두 번째 위치에 '구'가 들어가는 문자열 |
[ 이름에 el이 들어가는 동물 찾기 ]
보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
[ TABLE ]
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE LIKE 'DOG' AND NAME LIKE '%EL%'
ORDER BY NAME;
[ RESULT ]
집계 함수
SELECT SUM(saleprice) AS Total,
AVG(saleprice) AS Average,
MIN(saleprice) AS Minimum,
MAX(saleprice) AS Maximum
FROM Orders;
[ 최솟값 구하기 ]
동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
[ TABLE ]
-- 코드를 입력하세요
SELECT MIN(DATETIME) AS 시간
FROM ANIMAL_INS;
이름 순으로 조회라는 조건이 있기 때문에 ORDER BY 절이 필요하다.
[ RESULT ]
GROUP BY
GROUP BY 절을 사용하면 속성값이 같은 값끼리 그룹을 만들 수 있다. HAVING 절은 GROUP BY 절의 결과에 나타나는 그룹을 제한하는 역할을 한다.
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING COUNT(*) >= 2;
[ 동명 동물 수 찾기 ]
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
[ TABLE ]
-- 코드를 입력하세요
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) >= 2;
NULL 값은 COUNT 함수에 포함되지 않기 때문에, NAME 컬럼에 NULL이 있을 경우 필터링해주는 WHERE 절이 필요하다.
[ RESULT ]
'기타 > 개발 지식' 카테고리의 다른 글
[Git] Issue, Branch 활용 (0) | 2024.08.21 |
---|---|
공공데이터포털 오픈 API (0) | 2024.05.12 |
빌드(Build)란? (2) | 2024.01.04 |