본문 바로가기
학교/데이터베이스시스템응용

7. 5장 SQL: QUERIES,CONSTRNNTS, TRIGGERS - DML , Basic Singe-table Queries

by 움바둠바 2024. 10. 15.
728x90

DML에 어떤 종류가 있는지를 계속 살펴본다.

 

SELECT [DISTINCT] <column expression list>
FROM <single table>
[WHERE <predicate>]
[GROUP BY <column list>
	[HAVING <predicate>] ]
[ORDER BY <column list>]
[LIMIT <ingeger>];

이렇게,,, 다양한 종류가 있다!! 하나씩 천천히 보자,,

 

1. SELCT, FROM, WHERE

SELECT <column expression list>
FROM <single table>
WHERE <predicate>;

이전 글에서도 봤던 가장 간단한 구조이다!

-> SELECT 뒤에, 내가 테이블에서 어떤 column을 보여줄 지 적어준다

-> FROM뒤에 어떤 테이블을 이용할것인지 명시해준다

-> WHERE뒤에 내가 볼 데이터들의 조건을 설정해준다.

 

2. DISTINCT

그냥 SELECT로만 하면,, 멀티셋이 만들어질 수 있다!!

-> 내가 S.name만 보려고 하면,,, 동명이인이 있을 때 멀티셋이 생긴다!

=> 이렇게 멀티셋이 생기는게 싫으면 DISTINCT라는 키워드를 추가해주면 중복을 제거해준다.

SELECT DISTINCT <column expression list>
FROM <single table>
WHERE <predicate>;

 

3. ORDER BY

각 행들을 특정 기준에 맞게 정렬해주고 싶을 때 사용한다.

정렬은 사전순 (lexicographic)이다 -> 문자열도 가능한가보다!

기본적으로 Ascending 오름차순으로 정렬해준다 (내림차순은 DESC 추가해주기)

SELECT 	S.name, S.gpa, S.age * 2 AS a2
FROM	Students S
WHERE	S.dept = 'CS'
ORDER BY S.gpa DESC, S.name, a2;

=> 정렬 기준을 여러개 만들어줄 수 있다.

    이런경우,,, 일단 gpa로 정렬, gpa가 같으면 name순, 또 name도 같으면 a2순,, 이런식이다.

 

4. LIMIT

결과 row의 개수를 조절하고 싶을 때 사용한다

(상위 n개만 출력해주는식!)

=> Order by랑 같이 섞어쓰면 max라던지,, min이라던지,, 등등 뽑아낼 수 있을것이다

(하지만 max가 한개가 아닌 여러개인경우,,,, LIMIT 1 로하면 한개만 나와서 좀 애매해지긴한다)

SELECT 	S.name, S.gpa, S.age * 2 AS a2
FROM	Students S
WHERE	S.dept = 'CS'
ORDER BY S.gpa DESC, S.name, a2
LIMIT 3;

 

5. Aggregates

오 약간 자체함수 느낌으로 쓸 수 있나보다!

=> 평균, 최대값, 최소값 등등,, 이 있다 (SUM, COUNT, MAX, MIN)

=> aggregate의 경우, 결과값이 1개뿐이다 (즉 table인데 row가 한개밖에 없는 table이 되는것)

SELECT 	AVG(S.gpa)
FROM	Students S
WHERE	S.dept = 'CS'

이렇게 하면, gpa 평균 딱 한줄만 결과로 나온다!

DISTINCT Aggregates

count 하려고 하는데,,,, 중복이 있으면 어떻게 해야할까??? -> distinct를 쓴다!!

근데 이걸 count랑 같이쓸때는 순서를 주의해줘야한다

SELECT 	COUNT(DISTINCT S.name)
FROM	Students S
WHERE	S.dept = 'CS'

SELECT 	DISTINCT COUNT(S.name)
FROM	Students S
WHERE	S.dept = 'CS'

첫번째는,,, 조건에 맞는 이름들 중, 중복을 제거한 다음에! count를 해준다 -> 즉 중복제거한 row의 개수가 잘 나온다

근데 두번째는,,, 조건에 맞는 이름들의 개수를 센 다음에!! 중복제거를 하기 때문에 의미가 없어진다 (count를 하는순간 이미 원소가 1개인 table이니까)

=> 이런부분때문에 주의해줄 필요가 있다!

 

6. GROUP BY

partition해준는 부분이다!

주어지는 attribute내에서, 똑같은 속성끼리 묶어준다

=> 이렇게 하면, aggregate연산을 실행했을 때 그룹단위로 해준다! 

=> 즉 결과가 하나의 원소가 아니라,,, 그룹개수만큼 나온다

SELECT AVG(S.gpa), S.dept
FROM	Students S
GROUP BY	S.dept

=> 학과별로 그룹짓고, 학과단위로 gpa평균을 구해준다!

=> 어떤 그룹인지 알기 위해 dept도 같이 출력해준다.

이름은,, 같이 출력할 수 없다! (다양한 이름이 있으니까..)

HAVING

그룹지을때, 각 그룹에 조건을 넣어줄 수 있다!

SELECT AVG(S.gpa), S.dept
FROM	Students S
GROUP BY	S.dept
	HAVING COUNT(*) > 2;

group by 안에서 *을 쓰는건,,, 해당 "테이블 전체"가 아니라, "하나의 그룹속 원소의 전체"로 생각해준다!

즉 이렇게 쓰면,, 학과별로 그룹짓고, 그룹 하나의 count (개수)가 2 초과인 (즉 3 이상) 그룹만 보여주라는 뜻이된다

HAVING은 aggregate랑만 같이 사용할 수 있다.

 

 

728x90