DML에 어떤 종류가 있는지를 계속 살펴본다.
SELECT [DISTINCT] <column expression list>
FROM <single table>
[WHERE <predicate>]
[GROUP BY <column list>
[HAVING <predicate>] ]
[ORDER BY <column list>]
[LIMIT <ingeger>];
이렇게,,, 다양한 종류가 있다!! 하나씩 천천히 보자,,
SELECT <column expression list>
FROM <single table>
WHERE <predicate>;
이전 글에서도 봤던 가장 간단한 구조이다!
-> SELECT 뒤에, 내가 테이블에서 어떤 column을 보여줄 지 적어준다
-> FROM뒤에 어떤 테이블을 이용할것인지 명시해준다
-> WHERE뒤에 내가 볼 데이터들의 조건을 설정해준다.
그냥 SELECT로만 하면,, 멀티셋이 만들어질 수 있다!!
-> 내가 S.name만 보려고 하면,,, 동명이인이 있을 때 멀티셋이 생긴다!
=> 이렇게 멀티셋이 생기는게 싫으면 DISTINCT라는 키워드를 추가해주면 중복을 제거해준다.
SELECT DISTINCT <column expression list>
FROM <single table>
WHERE <predicate>;
각 행들을 특정 기준에 맞게 정렬해주고 싶을 때 사용한다.
정렬은 사전순 (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순,, 이런식이다.
결과 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;
오 약간 자체함수 느낌으로 쓸 수 있나보다!
=> 평균, 최대값, 최소값 등등,, 이 있다 (SUM, COUNT, MAX, MIN)
=> aggregate의 경우, 결과값이 1개뿐이다 (즉 table인데 row가 한개밖에 없는 table이 되는것)
SELECT AVG(S.gpa)
FROM Students S
WHERE S.dept = 'CS'
이렇게 하면, gpa 평균 딱 한줄만 결과로 나온다!
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이니까)
=> 이런부분때문에 주의해줄 필요가 있다!
partition해준는 부분이다!
주어지는 attribute내에서, 똑같은 속성끼리 묶어준다
=> 이렇게 하면, aggregate연산을 실행했을 때 그룹단위로 해준다!
=> 즉 결과가 하나의 원소가 아니라,,, 그룹개수만큼 나온다
SELECT AVG(S.gpa), S.dept
FROM Students S
GROUP BY S.dept
=> 학과별로 그룹짓고, 학과단위로 gpa평균을 구해준다!
=> 어떤 그룹인지 알기 위해 dept도 같이 출력해준다.
이름은,, 같이 출력할 수 없다! (다양한 이름이 있으니까..)
그룹지을때, 각 그룹에 조건을 넣어줄 수 있다!
SELECT AVG(S.gpa), S.dept
FROM Students S
GROUP BY S.dept
HAVING COUNT(*) > 2;
group by 안에서 *을 쓰는건,,, 해당 "테이블 전체"가 아니라, "하나의 그룹속 원소의 전체"로 생각해준다!
즉 이렇게 쓰면,, 학과별로 그룹짓고, 그룹 하나의 count (개수)가 2 초과인 (즉 3 이상) 그룹만 보여주라는 뜻이된다
HAVING은 aggregate랑만 같이 사용할 수 있다.
9. 5장 SQL: QUERIES,CONSTRNNTS, TRIGGERS - VIEW, subqueries, WITH, NULL (2) | 2024.10.16 |
---|---|
8. 5장 SQL: QUERIES,CONSTRNNTS, TRIGGERS - DML, multi-table (2) | 2024.10.16 |
6. 5장 SQL: QUERIES,CONSTRNNTS, TRIGGERS (2) | 2024.10.11 |
5. 4장 RELATIONAL ALGEBRA AND CALCULUS (0) | 2024.10.11 |
4. 2장 데이터베이스 설계 (database design) (4) - Logical Database Design (2) | 2024.10.10 |