[SQL] SQL 레벨업 6강 SELECT문

sa_woll 2023. 11. 13. 10:42

2장 SQL 기초

RDB는 데이터를 관계(relation)이라는 형식으로 저장한다. 구현으로는 테이블(table)이라고 부른다.

sql은 테이블을 검색해 데이터를 검색하거나 갱신할 때 사용하는 언어이다. 

6강 select 구문

검색: 데이터가 저장되어 있는 테이블에서 필요한 데이터를 뽑아내는 것. aka 질의, 추출

- 검색을 위해 사용하는 sql 구문: select 구문 

 

1. select 구와 from 구
- select 구문은 select구와 from구로 이루어져 있다. 전자에는 테이블이 갖고 있는 필드를 여러 개 쓸 수 있다. 후자에는 데이터를 선택할 대상 테이블이 지정된다.- 데이터를 어떤 방법으로 선택할지는 쓰여있지 않다: DBMS가 알아서 함

 

2. where 구- 특정 조건에 맞는 일부의 레코드만 선택하고 싶을 때 추가적인 조건을 지정한다.- 다양한 조건 지정: '=', '<>', '>=', '>', '<=', '<' 등의 연산자가 있다. <>는 ~와 같지 않음, 즉 =/= 을 나타낸다.

- 두 가지 이상의 조건을 모두 만족하는 레코드를 선택하려면 and를 사용한다.(교집합)

- 두 가지 이상의 조건 중 한 개 이상의 조건을 만족하는 레코드를 선택하려면 or을 사용한다.(합집합)

- 벤다이어그램을 그리기 위한 도구라고 할 수 있다.

- or을 사용할 때 나열해야 할 조건이 너무 많은 경우 in을 사용할 수 있다.

SELECT name, address
FROM Address
WHERE address IN('서울시', '부산시', '인천시');

이 교재에서는 mysql과 달리 대소문자 구분이 존재하는 언어를 상정하고 설명하고 있는 듯 하다.

 

- 이렇게 하면 서울시, 부산시, 인천시 중 하나에 거주하는 사람들의 주소와 이름을 select할 수 있다.

 

- 특정 컬럼에 대한 값이 존재하지 않는 레코드(NULL)를 선택하기 위해서는 IS NULL을 사용한다.

SELECT name, phone_nbr
FROM Address
WHERE phone_nbr IS NULL;

이렇게 하면 핸드폰번호가 입력되지 않은 사람들의 이름을 출력할 수 있다.

실행 결과에는 이름 옆에 핸드폰 번호 칸이 공란으로 표시된다.

 

3. Group by 구

- 테이블에서 단순하게 데이터를 선택하는 것뿐 아니라 합계 또는 평균 등의 집계 연산을 구현할 수 있다.

- count, sum, avg, max, min 이 대표적인 집계 함수

SELECT sex, COUNT(*)
FROM Address
GROUP BY sex;

이렇게 하면 성별별로 레코드의 수(사람의 수)를 센 결과를 알 수 있다.

 

- 그룹을 나눌 때의 기준은 필드여야 한다.(컬럼의 이름 사용)

- group by()는 키를 지정하지 않은 것으로 테이블 전체를 하나의 그룹으로 보는 것이다. 생략해도 된다.

 

4. Having 구

- 앞서 group by로 선택한 그룹에서 다시 조건을 걸어 레코드를 선택하는 기능이다.

select address, COUNT(*)
from Address
having COUNT(*) = 1;

 

이렇게 하면 살고 있는 사람 수가 한 명뿐인 주소 필드를 선택하여 주소이름을 출력할 수 있다.

 

- where구가 '레코드'에 조건을 지정한다면 having구는 '집합'에 조건을 지정하는 기능이다.

- 매우 강력한 기능

 

5. Order by 구

- select구문의 결과는 정해진 순서가 없이 처리되는 대로 출력된다.

 

select name, phone_nbr, address, sex, age
from Address
order by age DESC;

이렇게 하면 테이블의 모든 레코드를 사람의 나이가 많은 순서대로(내림차순) 정렬해 출력한다.

age뒤에 아무 키워드도 붙이지 않으면 오름차순이다. 

 

- 정렬 키가 두개 이상일 수도 있다.

 

6. 뷰와 서브쿼리

- 자주 사용하는 select 구문을 따로 저장해놓는 것이 뷰이다.

 

create view 뷰 이름 (필드이름, 필드이름2, ...) as  

이 뒤에 select 구문을 이어 작성하면 된다.

 

- 이렇게 지정한 이후 from 절에 뷰의 이름을 지정하여 select문을 사용할 수 있다.

- 뷰는 테이블의 모습을 한 select 구문이라고 할 수 있다.

 

- 뷰는 사용방법이 테이블과 같지만 내부에 데이터를 보유하지 않는 점이 테이블과 다르다. select문의 from구에 뷰를 사용하면 select문안에서 또 select문을 실행하는 중첩구조가 되는 것이다. 

- from구에 직접 지정하는 select 구문을 서브쿼리라고 한다.

 

- where구의 조건에 서브쿼리를 사용할 수도 있다. 

-> ...where name IN (SELECT name FROM Address2);

이렇게 in안에 서브쿼리를 넣을 수 있다. 이렇게 in과 서브쿼리를 함께 사용하는 구문은 데이터가 변경되어도 따로 수정할 필요가 없다. in안에 상수를 직접 입력(하드코딩)하면 데이터가 바뀔 때마다 in안의 인수도 변경해 주어야 할 것이다.