SELECT 문은 구축이 완료된 테이블에서 데이터를 추출하는 기능을 한다. 기본형식은 아래와 같으며 그 순서를 지켜야한다.
select 열_이름 from 데이터베이스_이름.테이블_이름 where 조건식 group by 열_이름 having 조건식 order by 열_이름 limit 숫자;
SELECT 문의 열_이름에 해당하는 데이터를 조회한다. 열_이름 대신 *를 사용하면 모든 열의 데이터를 가져온다.
select * from ex_database.ex_table; --전부 조회
select ex_column1, ex_column2 from ex_database.ex_table; --해당하는 열 조회
그리고 USE 문을 활용해 기본으로 사용하는 데이터베이스를 지정할 수 있다.
use ex_database; --데이터베이스 지정 select * from ex_table; --지정된 데이터베이스에서 테이블 조회
또한 열_이름의 해당하는 데이터 중 특정 조건에 해당하는 데이터만 조회할 수 있는데, WHERE 문이 그 기능을 수행한다. 또한 관계 연산자(<, >, ...)와 논리 연산자(and, or, ...), IN(), LIKE 등과 함께 사용할 수 있다.
--예시1) 연산자 활용 use market_db; select mem_id, mem_name from member where height>=165 and mem_number>6;
--예시2) 연산자 활용 use market_db; select * from member where height between 160 and 170;
--예시3) in 활용 select mem_name "이름", addr "주소" from market_db.member where addr in ('경기', '강원');
--예시4) like 활용 use market_db; select * from member where mem_name like '에%' or mem_name like '__핑크';
--예시5) 서브 쿼리 use market_db; select mem_name "이름", height "평균 키" from member where height > (select height from member where mem_name='뉴진스');
결과의 정렬을 위한 ORDER BY, 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT 등을 SELECT 문과 함께 사용할 수 있다.
ORDER BY는 기본적으로 오름차순(ASC)으로 정렬하며, 명령에 따라 내림차순(DESC)로 정렬할 수 있다. 또한 앞선 조건에 따라 먼저 정렬한다.
--예시) 키 큰 순서대로, 키가 같으면 데뷔 날짜가 오래된 순서(작은 순서)대로 정렬해서 조회 select * from member where height > 160 order by height desc, debut_date asc;
LIMIT는 시작과 개수를 통해서 출력 개수를 제한한다.
--예시1) 첫번째 부터 2개 출력 select mem_name from member limit 2; -- 시작은 기본적으로 0으로 설정되어 있기 때문에 limit 0, 2;와 동일
--예시2) 두번째 부터 3개 출력 select mem_name from member limit 1, 3;
--예시2) 세번째 부터 4개 출력, offset 활용 select mem_name from member limit 4 offset 2;
DISTINC는 중복된 결과를 제거하고, GROUP BY는 집계함수와 같이 쓰여 데이터를 그룹화한다. 특히 그룹화 할때의 조건은 WHERE이 아닌 HAVING을 사용한다.
집합의 원소와 같다고 생각하면 편하다. 열_이름 앞에 붙여주면 된다.
--예시1) select addr from member;
실행결과 : 경기, 경남, 서울, 경남, 전남, 서울 , 경북, 경기
--예시2) select distinct addr from member order by addr;
실행결과 : 경기, 경남, 경북, 서울, 전남
집계함수(aggregate function)와 관련된 조건을 제한하여 그룹화한다. 집계 함수는 다음과 같다.
--예시) 연락처가 있는 회원 수 select count(phone1) "연락처 있는 회원 수" from member;
--예시) 총 구매금액 1000원을 넘긴 회원들의 아이디를 총 구매금액이 큰 순서대로 조회 select mem_id "회원 아이디", sum(price*amount) "총 구매금액" from buy group by mem_id having sum(price*amount) > 1000 order by sum(price*amount) desc;
테이블에 데이터를 삽입하는 명령이다.
--예시1) 테이블에 데이터 삽입 use market_db; create table hongong1 (toy_id int, toy_name char(4), age int); insert into hongong1 values (1, '우디', 25); insert into hongong1 (toy_name, toy_id) values ('버즈', 2);
--예시2) toy_id를 auto_increment로 지정한 테이블 create table hongong2 ( toy_id int auto_increment primary key, --꼭 primary key로 지정해야 함 toy_name char(4), age int); insert into hongong2 values (null, '보핍', 25); insert into hongong2 values (null, '슬링키', 22); insert into hongong2 values (null, '렉스', 21);
--예시3) auto_increment의 시작을 100으로 증가값을 3으로 바꾸기 alter table hongong2 auto_increment=100; set @@auto_increment_increment=3; --시스템 변수는 앞에 @@ 붙임
--예시4) 다른 테이블의 데이터를 한 번에 입력 create table city_popul (city_name char(35), popul int); insert into city_popul select Name, Population from world.city;
기존에 입력되어 있는 값을 수정하는 명령이다.
--예시1) city_name열의 'Seoul'인 행의 city_name을 '서울'로 수정 update city_popul set city_name = '서울' where city_name = 'Seoul';
--예시2) city_name열의 'New York'인 행의 city_name을 '뉴욕'으로, popul을 0으로 수정 update city_popul set city_name = '뉴욕', popul = 0 where city_name = 'New York';
--예시3) 모든 행의 city_name을 '서울'로 수정 update city_popul set city_name = '서울';
데이터를 행 단위로 삭제하는 명령이다.
--예시1) 'New'로 시작하는 행 상위 5개만 삭제 delete from city_popul where city_name like 'New%' limit 5;
--예시2) 모든 행 삭제 truncate table city_popul;
TRUNCATE 문은 DELETE FROM 문을 WHERE 없이 사용하는 것과 동일한 효과이지만 속도는 전자가 훨씬 빠르다. DROP 문은 테이블을 삭제하는 명령어로 앞선 두 명령어와 다르다. TRUNCATE 문은 빈 테이블이 남지만, DROP 문은 테이블이 아예 사라진다.
저자 우재남, 혼자 공부하는 SQL, 한빛미디어