Programming Language/MySQL

[MySQL] MySQL 기초 - 1

LeeJaeJun 2023. 12. 27. 00:42
728x90
반응형

데이터베이스(database, DB)

여러 사람이 공유하여 사용할 목적으로 체계화하여 통합, 관리하는 데이터의 집합

 

데이터베이스 관리 시스템(DBMS)

다수의 사용자들이 데이터베이스 내의 데이터를 접근할 수 있도록 해주는 소프트웨어 도구의 집합

대량의 데이터를 다수의 사람이 안전하고 간단히 다룰 수 있게 해줍니다.

가장 일반적으로 사용되는 것이 관계형 데이터베이스(Relational Database): 엑셀 시트처럼 열과 행으로 이루어진 2차원 표 형식으로써 데이터를 관리하거나 이해하기 쉬움

관계형 데이터베이스 관리 시스템 중 대표적으로 사용되는 것이 오라클 RDBMS, MS SQL Server, Postgre SQL, MySQL 등이 있습니다.

 

테이블  구성

데이터베이스는 각각의 테이블로 이루어져 있음.

열(컬럼): 테이블에 보관하는 데이터 항목

행(레코드): 데이터 한 건에 해당하며, RDBMS는 반드시 행 단위로 데이터를 읽고 씁니다.

셀(값): 행과 열이 교차하는 값이며, 하나의 셀 안에는 하나의 데이터만 넣을 수 있습니다.

 

MySQL

  • 데이터베이스 만들기: create database 데이터베이스명;
  • 쿼리 실행 방법:
    • Windows: Ctrl + Shift + Enter
    • Mac: Command + Shift + Enter
  • 데이터베이스 지정: use 데이터베이스명; (MySQL를 열 때 마다 지정을 해주어야 함)
  • 테이블 만들기: create table 테이블명 (<열 이름1> <데이터 형태> <이 열의 제약>, <열 이름2> <데이터 형태> <이 열의 제약>,···,<테이블의 제약1>, <테이블의 제약2>,···);
create table goods
(
goods_id char(4) not null,
godds_name varchar(100) not null, # varchar(n): 문자를 최대 n개 까지 저장
goods_classify varchar(32) not null,
sell_price integer,
buy_price integer,
register_date date,
primary key (goods_id) # primary key는 기본키. 데이터를 구분할 때 고유한 데이터를 갖는 열을 지정하는 것
);
  • 테이블 정의 변경: alter table 테이블명
    • 열 추가: add column <열 이름> <열 정의>;
    • 열 삭제: drop column <열 이름>;
alter table goods add column goods_name_eng varchar(100);
alter table goods drop column goods_name_eng;
  • 테이블에 데이터 등록: insert into <테이블명> values (값);
insert into goods values ('0001','티셔츠','의류',1000,500,'2020-09-20');
insert into goods values ('0002','와이셔츠','의류',4000,2800,'2020-08-20');
insert into goods values ('0003','포크','주방용품',500, NULL,'2020-09-23');
insert into goods values ('0004','도마','주방용품',900,790,'2020-09-25');
  • 열 선택하기: select <열 이름1>,...,<열 이름 n> from <테이블명>;
select goods_id, goods_name, buy_price from goods;
select * from goods; # 모든 열이 출력
  • 열 선택하여 별명 부여하기: select <열 이름1> as <별명> from <테이블명>;
select goods_id as id,
	goods_name as name,
    buy_price as price
from goods; # 열 이름이 별명으로 출력됨.
  • 상수 및 계산식 작성:
select '상품' as category, # category에는 '상품' 값을 넣어라
	38 as num, # num에는 38 값을 넣어라
    '2022-01-01' as date, # date에는 '2022-01-01' 값을 넣어라
    goods_id,
    goods_name,
    sell_price, buy_price, sell_price - buy_price as profit
from goods;
  •  중복 제거하기: select distinct <열 이름> from <테이블명>;
select distinct goods_classify
from goods; # 고유한 값만 가져와라
  • 조건식 : select <열 이름>, ··· from <테이블명> where <조건식>;
select goods_name, goods_classify
from goods
where goods_classify = '의류'; # sql에서는 같다는 의미로 등호가 한 개만 사용된다.
select *, sell_price - buy_price as profit
from goods
where sell_price - buy_price >= 500;
select goods_name, goods_classify, sell_price
from goods
where goods_classify = '주방용품'
and sell_price >= 3000;
  • 집약 함수: 여러 개의 레코드(행)를 하나로 집약시키는 기능
    • count: 행 숫자를 계산
    • sum: 합계를 계산
    • avg: 평균을 구함
    • max: 최댓값을 구함
    • min: 최솟값을 구함
select count(*) # count(*)은 null이 포함된 행의 수.
from goods; # goods에서 모든 행의 개수를 세어라

select count(buy_price) #  null을 제외한 행의 수를 계산하고자 할 때는 인수에 특정 열을 입력
from goods;

select count(distinct goods_classify) # 고유한 값의 개수
from goods;

select sum(sell_price), sum(buy_price) # null 값은 무시하고 계산
from goods;

select avg(sell_price)
from goods;
  • 그룹 나누기: select <열 이름1>, <열 이름 2>, ···  from <테이블명> group by <열 이름1>, <열 이름 2>, ··· ;
select goods_classify, count(*) # goods_classify 이름을 나타내기 위해 goods_classify도 select
from goods
group by goods_classify; # goods_classify 별로 그룹을 묶에 데이터의 수를 계산. group by는 null 값도 별도의 그룹으로 분리
select buy_price, count(*)
from goods
where goods_classify = '의류'
group by buy_price;
  • group by를 통해 나온 결과에 조건을 지정하기 위해서는 having을 사용해야 합니다. where은 group by 계산 이전, having은 group by 계산 이후 적용합니다.
  • select <열 이름 1>, <열 이름 2>, ··· from <테이블 명> group by <열 이름 1>, <열 이름 2>, ··· having <그룹값에 대한 조건>
select goods_classify, avg(sell_price)
from goods
group by goods_classify
having avg(sell_price) >= 2500;
  • 정렬하기: select <열 이름 1>, <열 이름 2>, ··· from <테이블명> order by <재정렬 기준 열1>, ···
select *
from goods
order by sell_price; # 기본은 오름차순

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 * from goods
where sell_price > (select avg(sell_price)
from goods;)

select goods_id, goods_name, sell_price,
	(select avg(sell_price) from goods) as avg_price
from goods;
728x90
반응형

'Programming Language > MySQL' 카테고리의 다른 글

[MySQL] MySQL 비밀번호 변경  (0) 2023.12.27
[MySQL] upsert에 대한 이해  (0) 2023.12.27
[MySQL] MySQL 기초 - 2  (0) 2023.12.27
[MySQL] Mac M1 MySQL 재설치  (0) 2023.12.27