[이것이 MySQL이다] 6장 정리
SQL에 대한 기본적인 문법과 사용법을 배우는 데 초점을 맞춘 문서입니다. 데이터베이스 생성, 테이블 생성, 데이터 삽입, 주석 작성, select문 사용, 서브쿼리 사용, 결과 정렬, 중복 제거, 결과 개수 제한, 테이블 복사, 그룹화, 집계 함수 사용, 데이터 업데이트 및 삭제, 테이블 삭제, 그리고 join을 사용하는 방법 등에 대해 설명하고 있습니다.
Jan 24, 2024
쿼리
create database sampledb;
use sampledb;
create table sampleTBL (name char(10) not null primary key, age int null);
insert into sampleTBL values("홍길동", 30);
-- insert into sampleTBL(name) values("홍길동"); 불가능
insert into sampleTBL(name) values("김김김");
/*
insert into sampleTBL(age) values(30); 불가능
*/
핵심 포인트
- create 명령어를 통해 데이터베이스를 생성할 수 있다.
- use 명령어를 통해 데이터베이스를 선택할 수 있다.
- primary key로 설정된 속성은 중복된 값을 가질 수 없다.
- insert 명령어를 통해 데이터를 삽입할 수 있다.
- primary key를 입력하지 않고 데이터를 삽입할 수 없다.
- 주석은 —, /* */ 명령어로 작성할 수 있다.
usertbl 테이블

buytbl 테이블

쿼리
use sqldb; -- 시작하기 전에 어떤 db를 참조할 지 명시
select * -- price가 300 이상인 모든 칼럼을 출력
from buytbl
where price>=300;
select name, height, addr
from usertbl
-- where birthyear>=1970 and height>=182;
-- where height between 180 and 183;
-- where addr in ('경남', '전남', '경북'); -- 해당 값들을 가지는 주소
-- where addr like '_남'; -- 앞에 한 글자만 오고 남으로 끝나는 주소만
where name like '김%'; -- 김으로 시작하고 몇글자든 뒤에 오는 이름만
핵심 포인트
- select문은 데이터베이스 내의 테이블에서 원하는 정보를 추출하는 명령이다.
- select문은 크게 select, from, where, group by, having, order by 절로 나뉜다.
- select 문을 사용하기 이전에 use 명령어를 통해 현재 사용하는 데이터베이스를 지정하거나 변경할 수 있다.
- select문에는 출력하기를 원하는 칼럼을 작성한다.
- from문에는 데이터를 가져올 테이블을 작성한다.
- where문은 가져올 칼럼의 조건을 지정한다.
쿼리
select name, height, addr -- 메인쿼리
from (
select a.name, a.height, a.addr -- 서브쿼리
from usertbl as a
where name like '김%'
) as b -- alias(별칭 부여)
where b.height<=175;
select name, height
from usertbl
where height>( -- 서브쿼리를 통해 원하는 조건을 입력할 수 있다
select height
from usertbl
where name='김경호'
);
select *
from buytbl
where userid = any ( -- any: 서브쿼리의 여러 개 결과 중 하나라도 만족
select userid
from usertbl
where birthyear > 1975
);
select height
from usertbl
where height > all ( -- all: 서브쿼리의 결과 중 여러 개의 결과를 모두 만족
select height -- select max(height)가 더 성능이 좋음
from usertbl
where birthyear < 1975
);
select max(height) as '가장 큰 키' -- 위와 같은 결과 출력
from usertbl
where birthyear < 1975;
핵심 포인트
- 서브쿼리란 쿼리문 안에 또 쿼리문이 들어 있는 것이다.
- any는 서브쿼리의 여러 개 결과 중에 하나라도 만족해도 된다.
- all은 서브쿼리의 결과 중 여러 개의 결과를 모두 만족시켜야 한다.
쿼리
select userid, prodname, amount -- order by 기본값: 오름차순
from buytbl
order by amount desc;
select distinct(userID) -- distinct로 중복 없이 출력
from buytbl
where amount>=3;
select * -- limit: 상위 5개 값만 가져옴
from usertbl
limit 5;
핵심 포인트
- order by를 통해 출력된 결과를 정렬할 수 있으며, 기본값은 오름차순이다.
- distinct()를 통해 중복된 값을 하나만 보여주게 할 수 있다.
- limit를 통해 출력할 결과의 개수를 설정할 수 있다.
쿼리
create table buytbl_backup -- create table ... select로 테이블 복사 가능
select * from buytbl;
핵심 포인트
- create table … select문으로 원하는 테이블을 복사할 수 있다. 이 경우 제약조건이 복사되지는 않는다.
쿼리
select userid, sum(price*amount) as total -- 집계 함수로 칼럼 생성 가능
from buytbl
group by userid -- group by로 그룹핑
having total>100 -- having으로 집계 함수 조건 설정 가능
order by total desc;
select userid, max(price), min(price), count(userid), avg(price*amount)
from buytbl
group by userid;
select count(distinct(prodname))
from buytbl;
핵심 포인트
- group by 절을 통해 그룹핑을 할 수 있다.
- 집계 함수는 group by 절과 함께 쓰이며 데이터를 그룹화해주는 기능을 한다.
- sum(), avg(), min(), max(), count(), count(distinct), stdev(), var_samp() 등의 집계함수가 있다.
- having절을 통해 집계 함수에 대해서 조건을 제한할 수 있다.
쿼리
select * from usertbl;
update usertbl
set mobile2 = '12341234'
where userid='bbk'; -- where절 없이 update하면 데이터 전부에 덧씌워진다.
delete from usertbl where userid='yjs'; -- where절 없이 delete하면 데이터 전부를 삭제한다.
drop table buytbl_backup; -- drop은 table을 삭제한다.
truncate table usertbl; -- truncate는 트랜젝션 로그를 기록하지 않으므로 속도가 빠르다.
핵심 포인트
- update문을 통해 기존에 입력되어 있는 값을 변경할 수 있다.
- delete 문을 통해 행 단위의 데이터를 삭제할 수 있다.
- update와 delete문을 사용할 때 where문을 작성하지 않으면 데이터 전부에 영향을 끼치므로 조심해야 한다.
- truncate문은 delete문과 비슷하지만, 트랜잭션 로그를 기록하지 않기 때문에 속도가 delete문보다 빠르다.
쿼리
select u.userid, sum(price*amount)
from usertbl as u
join buytbl as b -- join은 연산횟수가 많으므로 잘 써야 한다. 잘못 쓰면 성능이 떨어진다. join문과 서브쿼리는 서로 변환할 수 있는 형태다.
on u.userid = b.userid
where u.height < 175
group by u.userid;
select b.userid, sum(price*amount) -- 키가 175 이하인 사람들이 구매한 총액
from buytbl as b
where b.userid = any ( -- any를 in으로 써도 결과는 같다.
select u.userid
from usertbl as u
where height < 175
)
group by userid;
핵심 포인트
- 두 개 이상의 테이블이 서로 관계되어 있는 상태에서 join을 통해 두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 낼 수 있다.
- join은 연산 횟수가 많으므로 쿼리의 구조를 잘 짜야 오버헤드를 줄일 수 있다.
- join으로 작성할 수 있는 쿼리문은 대부분 서브쿼리의 형태로도 작성할 수 있으므로, 둘 중 오버헤드가 적게 생기는 경우를 사용한다.
결론
- 해당 코드들을 작성하면서 기본적인 SQL문의 문법과 join을 활용하는 방법을 익힐 수 있었다.
Share article