[SQL] 데이터 관리를 위한 SQL 기초

ebebebbbebeb·2025년 5월 21일
0
post-thumbnail

SQL 기초

데이터베이스는 각각의 테이블로 구성되고

테이블의 구성요소는 다음과 같다

  • 열(컬럼): 테이블에 보관하는 데이터 항목
  • 행(레코드): 데이터 한 건에 해당하며, RDBMS는 반드시 행 단위로 데이터를 읽고 쓴다

데이터베이스와 테이블 만들기

create database [데이터베이스 이름]

데이터베이스를 만들고 난 후에는 사용하고자 하는 데이터베이스를 지정해야하며

이는 MySQL을 새로 열때마다 실행해야 한다

use [데이터베이스 이름]

다음으로 데이터베이스 하부에 테이블을 만들어보도록 하자

테이블을 만드는 쿼리 형식은 다음과 같다

create table <테이블명>
(
[열 이름 1] [데이터 형태] [이 열의 제약],
[열 이름 2] [데이터 형태] [이 열의 제약],
[열 이름 3] [데이터 형태] [이 열의 제약],
….
<테이블의 제약 1>, <테이블의 제약 2>, …. 
);

테이블 정의 변경하기

  • 테이블에 열을 추가로 만들거나 삭제를 해야하는 등 테이블의 정의를 변경해야 하는 경우
    -> ALTER TABLE 문을 사용
alter table [테이블명] add column [열 이름] [열 정의];
  • 삭제의 경우
alter table [테이블명] drop column [열명];

테이블에 데이터 등록하기

SQL에서 데이터를 등록하는 쿼리는 다음과 같다

insert into [테이블명] values (값);
  • 예시
insert into goods values ('0001', '티셔츠', '의류', 1000, 500, '2020-09-20');
insert into goods values ('0002', '펀칭기', '사무용품', 500, 320, '2020-09-11');
insert into goods values ('0003', '와이셔츠', '의류', 4000, 2800, NULL);
insert into goods values ('0004', '식칼', '주방용품', 3000, 2800, '2020-09-20');
insert into goods values ('0005', '압력솥', '주방용품', 6800, 5000, '2020-01-15');

SQL 기초 구문

select - 열 선택

select [열 이름 1] , [열 이름 2], … [열 이름 n]
from [테이블명];

as 키워드를 사용하면 열에 별명을 부여할 수도 있다

select [열 이름 1] as [별명]
from [테이블명];

distinct - 중복 제거

중복된 데이터가 있는 경우 중복되는 값을 제거하고

고유한 값만 확인하고 싶을 때는 distinct 키워드를 사용한다

select distinct [열 이름]
from [테이블명];

where - 원하는 행 선택

여러 데이터 중 조건에 부합하는 행만 선택할 때는

where 키워드를 사용하면 된다

select [열 이름], …
from [테이블명]
where [조건식];

연산자

연산자는 SQL 문에서 연산을 수행하기 위해 사용되는

사전에 예약된 단어 또는 문자로써 일반적으로 where 구 안에서 사용된다

흔히 사용되는 연산자는 다음과 같다

  • 산술 연산자 (+, -, *, /)
  • 비교 연산자 (=, <>, >=, >, < ..)
  • 논리 연산자 (and, or ..)

집약 함수

여러 레코드(행)를 하나로 집약시키는 기능으로써

대표적인 집약 함수는 다음과 같다

count - 행 숫자를 계산

select count(*)
from goods;

sum - 합계를 계산

select sum(sell_price), sum(buy_price)
from goods;

avg - 산술 평균을 계산

select avg(sell_price)
from goods;

max, min ...

그룹화와 정렬

데이터를 특정 기준으로 그룹을 나누어 값을 계산해야 하는 경우가 많은데

이러한 경우 SQL에서는 group by를 사용하여 데이터를 그룹화할 수 있다

또한 검색 결과를 특정 기준으로 정렬할 필요가 있을 경우 order by를 사용하면 된다

그룹 나누기

그룹화를 위한 쿼리문 형식은 다음과 같다

select [열 이름 1], [열 이름 2], …..
from [테이블명]
group by [열 이름 1], [열 이름 2], ….

만약 group by를 통해 나온 결과에 조건을 지정하려면 어떻게 해야 할까?

이 경우 where이 아닌 having 키워드를 사용해야 한다

select [열 이름 1], [열 이름 2], …
from [테이블 명]
group by [열 이름 1], [열 이름 2], …
having [그룹값에 대한 조건]

검색 결과 정렬

SQL에서는 결과가 무작위로 정렬되므로 쿼리를 실행할 때 마다 결과가 변한다

오름차순이나 내림차순으로 결과를 정렬하고자 할 경우에는 order by 구를 사용한다

select [열 이름 1], [열 이름 2], …
from [테이블명]
order by [재정렬 기준 열 1], [재정렬 기준 열 2], …

order by 구는 기본적으로 오름차순으로 데이터를 정렬하는데

만일 내림차순으로 정렬하고자 할 경우 재정렬 기준 뒤에 desc 키워드를 사용한다

select *
from goods
order by sell_price desc;

뷰와 서브쿼리

기초구문 만으로는 복잡한 형태의 데이터분석을 하는게 한계가 있는데

뷰와 서브쿼리를 이용하면 이러한 작업을 쉽게 할 수 있다

뷰 만들기

뷰는 기본적으로 테이블과 거의 동일하다

그러나 테이블과의 차이는 실제 데이터를 저장하고 있지 않다는 점!

뷰는 데이터를 저장하지 않고 있으며 뷰에서 데이터를 꺼내려고 할 때

내부적으로 쿼리를 실행하여 일시적인 가상 테이블을 만든다

즉, 데이터가 아닌 쿼리를 저장하고 있다고 보면 된다

뷰의 장점

  • 데이터를 저장하지 않기 때문에 기억 장치 용량을 절약 가능
  • 자주 사용하는 쿼리를 매번 작성하지 않고 뷰로 저장하면 반복해서 사용 가능
  • 뷰는 원래의 테이블과 연동되므로 데이터가 최신 상태로 갱신되면 뷰의 결과 역시 자동으로 최신 상태로!
create view 뷰 이름 ([뷰의 열 이름 1], [뷰의 열 이름 2], ...)
as
[쿼리];
  • 예시
create view GoodSum (goods_classify, cnt_goods)
as
select goods_classify, count(*)
from goods
group by goods_classify;

뷰의 데이터를 확인하는 방법은 테이블의 데이터를 확인하는 방법과 동일하다

select *
from GoodSum;

뷰 삭제

drop view GoodSum;

서브쿼리

서브쿼리란 쿼리 내의 쿼리이며 일회용 뷰를 의미한다

즉, 뷰를 정의하는 구문을 그대로 다른 구 안에 삽입하는 것이다

select goods_classify, cnt_goods
from (
 select goods_classify, count(*) as cnt_goods
 from goods
 group by goods_classify
) as GoodsSum;

스칼라 서브쿼리

스칼라 서브쿼리란 단이 값이 반환되는 서브쿼리다

이를 통해 =, <, > 등 비교 연산자의 입력값으로 사용할 수 있다

select *
from goods
where sell_price > (select avg(sell_price) from goods);

스칼라 서브쿼리는 where 구 뿐만 아니라

select, group by, having, order by 등 거의 모든 곳에 쓸 수 있다

with

with 문 또한 서브쿼리를 만드는 하나의 방법이다

with [별명] as (
	[서브쿼리]
)
  • 예시
with heavy_users as (
    select host_id
    from PLACES
    group by host_id
    having count(name) >= 2
)

select *
from heavy_users
...

출처

데이터 관리를 위한 SQL 기초 (MySQL) - Youtube[헨리의 금융MBA]

0개의 댓글