DB

SELECT 기본구조

tioon 2023. 4. 21. 21:30

 

SELECT 문장 문법

 

SELECT a FROM  R as WHERE r.c=10 GROUP BY <~~~~> HAVING <~~~~> ORDER BY <~~~~>

-select문장은 주어진 조건에 적합한 데이터를 검색하는 문장입니다
.모두 6개의 절을 가질 수 있는데 여기서 select절과 from절은 필수조건이고, 그외의 AS, WHERE, GROUP BY, HAVING, ORDER BY는 생략 가능 합니다.

SELECT

  • 해당 테이블의 속성을 선택하여 명시함. (*일시 모든 속성 다가지고옴)
  • 터플 중복을 허용함. (터플중복을 허용하지 않을시 distinct 조건 명시) (기본은 ALL옵션으로 중복허용)
  • 관계대수의 투영연산과 같음.

 FROM

  • 테이블을 명시, 여러개의 테이블도 가능.
  • 테이블을 여러개 가져올시 관계대수의 카티시안곱과 같음.
  • WHERE의 조건과함께 명시할시 조인연산도 가능

WHERE

  • 터플이 만족하여야하는 조건 명시.
  • 관계대수의 선택연산과 같음.

AS

  • 테이블의 새 이름을 지정할 수 있음.
  • 관계때수의 재명명연산과 같음

 

 

SELECT 문장 실행 순서

 

  1. (FROM) - 어떤 테이블에서 데이터를 가져올 것인지 결정합니다 
  2. (WHERE) - 가져올 데이터의 조건을 적용합니다.
  3. (GROUP BY) - 지정된 컬럼을 기준으로 그룹화를 진행합니다.
  4. (HAVING) - 그룹화된 결과에 조건을 적용합니다.
  5. (SELECT) - 결과 데이터 값을 계산(집계함수) 한 후 출력합니다.
  6. (OREDER BY) - 결과 데이터 값을 특정 기준으로 정렬합니다.

 

 

 

집계함수

데이터 베이스 시스템은 총 다섯개의 집계함수를 지원하는데 종류는 아래와 같다. 해당 집계함수는 중복제거를 해주지 않으며,중복제거를 하려면 값 앞에 distinct를 붙여야함.

ex) SELECT count(distinct name) FROM database;
  1. avg(값) : 평균값 구하는 함수
  2. min(값): 최소값 구하는 함수
  3. max(값): 최대값 구하는 함수
  4. sum(값) : 값의 총합 구하는 함수
  5. count(값) : 갑의 개수를 계산하는 함수
    COUNT(*)는 NULL값을 포함합니다.
    COUNT(표현식)은 NULL값을 포함하지않습니다.

null값과 집계함수

-집계함수는 기본적으로 널값 무시. count는 널값을 세지않고, 그외함수들은 null을 반환한다.

count(null) = 0

max(null) = null

 

 

 

 

 

 

group by 절

전체 테이블을 특정 속성 값으로 터플을 분류하고 그룹으로 나누는 함수

SELECT name, avg(age)
FROM person
GROUP BY name;

 

다음은 테이블과 group by문의 결과입니다.

GROUP BY TABLE

name age
kay 30
young 24
kay 26
ree 21

 

결과 TABLE (name이 같은것끼리 그룹을 만들어서 나이 평균이 만들어짐)

name age
kay 28
young 24
ree 21



여기서 중요한 것은 group by에 있는것만 select에 나와야한다는 것이다. 만약 group by에 없는것이 select에 나오면 오류가 나온다. 하지만, group by에 있는것이 select에 있는것은 괜찮다.

 

SELECT name,height, avg(age)
FROM person
GROUP BY name;   (에러! , group by에 없는것이 select문에 나오면안됨.) 
SELECT avg(age)
FROM person
GROUP BY name;   (정상,select에 없는것을 group by해도 괜찮음)

 

 

 

 

 

 

 

 

 

 

having절

group by 절 결과로 생성된 그룹에 대하여 임의의 조건을 명시하는데 사용, 즉,group by로 그룹을 만들때 조건을 추가하는 함수입니다. 이 조건을 추가함으로써 그룹내에서 사용자가 원하는 그룹만 보이게 할 수 있습니다.

(WHERE절과 비슷하지만, 전체 조건 명시가 아닌, group by의 조건을 명시한다는 차이점이 있습니다.) 

 

SELECT name, avg(age)
FROM person
GROUP BY name
HAVING avg(age) > 25;

 

 

결과 ->     avg(age)값이 25이하인값들은 다 출력하지 않는걸 볼수있다.

name age
kay 28

 

 

 

where 절과의 차이점?

-having과 where절은둘다 임의 조건식을 명시한다는 점에선 동일함. 하지만

where절 -> 각 터플에 적용후 조건을 만족하는 식을 그룹에 넣음

having절 -> 만들어진 그룹에 적용하여 조건에맞는 그룹만 출력

이라는 차이점이있다.

 

 

 

ORDER BY절

-SELECT로 조회된 데이터들을 다양한 목적에 맞게 특정 속성을 기준으로 정렬하여 출력하는데 사용하는 절입니다.
속성 한개일땐 해당 속성으로만 정렬하나, 다중 속성일땐 여러개의 속성을 기반으로 정렬합니다.
(기본적으로는 오름차순이나, DESC옵션으로 내림차순으로 정렬도 가능합니다.)

(Order by 1 처럼 숫자로 정렬할 수 있습니다. 해당 숫자에 해당하는 속성을 기준으로 정렬을 할 수 있습니다.)

SELECT * FROM employees
ORDER BY last_name;

 

 

 

랭킹

 

RANK()

-특정 속성을 순위를 매겨 정렬해주는 함수

SELECT name,RANK() over (ORDER BY height desc) as hRank  FROM student;

->학생 테이블에서 키를 기반으로 내림차순으로 정렬하는 명령. (속성은 name, rank라는 등수가 출력됨)

->널값이 포함될 시, 기본(ASC)에는 널값을 가장크게, DESC에는 널값을 가장 작게봄.

 

 

파티션 랭킹

-조건에 맞는 부분으로 그룹을 나눠 순위를 매겨 정렬하는 것. (GROUP BY와 비슷한 기능)

SELECT class,RANK() over (PARTITION BY class ORDER BY height desc) as hRank FROM student;

-> 학생 테이블에서 class를 기반으로 파티션을 나눠 키로 내림차순 순위를 매기는 명령.

 

 

ntile() 랭킹

-조건의 속성값을 기준으로 전체 테이블을 균등하게 분배하는 함수.

SELECT name, ntile(3) over (ORDER BY height desc) as hRank  FROM student;

->학생의 키를 기반으로 학생들의 이름을 1,2,3으로 구분해 정렬하는 명령