문제:

풀이방법:

동물 이름 중 두 번 이상 쓰였다면 이름을 기준으로 grouping 했을 때, 그 갯수가 2개 이상일 것이다. 따라서 group by 와 HAVING 절을 사용하여 동명 동물들을 찾는다.

1
SELECT NAME,count(NAME) as 'COUNT' from ANIMAL_INS group by NAME HAVING count(NAME) >1 ORDER BY NAME;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59041

 

코딩테스트 연습 - 동명 동물 수 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

문제:

풀이방법:

시간단위로 값을 출력하는 HOUR를 사용해서 시간대를 표현하도록 한다. HOUR를 사용하면 2019-10-2 09:35 -> 9

2019-10-3 09:59 -> 9 와 같이 변환시켜준다. 따라서 이를 기준으로 GROUPBY를 하고 갯수를 세준다. 또한 9시부터 19시까지라고 시간이 정해져 있으므로 이에 대한 조건을 HAVING으로 넣어주도록 한다.

1
2
SELECT HOUR(DATETIME) as 'HOUR',COUNT(*) as 'COUNT' FROM ANIMAL_OUTS
GROUP BY HOUR HAVING HOUR>=9 AND HOUR<=19 ORDER BY HOUR;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59412

문제:

풀이방법:

 HAVING 절을 사용하는 예제이다. HAVING절은 WHERE절과 비슷하게 조건을 걸어줄 수 있다. 하지만 WHERE절에 조건을 걸 때에는 제약이 없지만 HAVING절은 GROUPBY에 사용한 컬럼에 대해서만 조건을 걸어 줄 수 있다. 따라서 NAME에 대해서 GROUPBY를 걸어주고 count가 1보다 크다는 조건을 걸어서 두 번 이상 쓰인 이름을 파악한다.

1
SELECT name,count(name) as 'COUNT' from animal_ins GROUPBY name HAVING count(name) >1 ORDER BY NAME;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59041

문제:

풀이방법:

특정한 분류를 기준으로 값들을 묶어야 할 때 GROUPBY를 사용한다. GROUPBY절을 사용하면 이 절에 사용한 컬럼만을 SELECT절에 사용을 해야하며 COUNT와 같은 내장함수는 이 컬럼을 기준으로 작동한다. 따라서 GROUPBY ANIMAL_TYPE을 사용했으므로 SELECT에 ANIMAL_TYPE만을 사용해야 하며 COUNT도 CAT과 DOG의 수를 세어준다.

1
SELECT ANIMAL_TYPE,COUNT(ANIMAL_TYPE) FROM ANIMAL_INS GROUPBY ANIMAL_TYPE;
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/59040

SQL은 비절차적 언어이므로 사용자는 자신이 원하는(what)만 명시하며, 원하는 것을 처리하는 방법(how)은 명시할 수 없다. 또한 SQL은 대화식 SQL , 내포된 SQL 두 가지의 인터페이스를 가지고 있으며, 데이터 검색, 데이터 조작어, 데이터 정의어, 트랜잭션 제어, 데이터 제어어로 구성되어 있다.

 

데이터 정의어

스키마의 생성과 제거의 기능을 제공하며 다음과 같이 정의한다.

 

CREATE TABLE STUDENTS

(STUNO NUMBER NOT NULL,

STUNAME CHAR(10),

GRADE NUMBER,

CLASS NUMBER,

PRIMARY KEY(STUNO), [ 제약조건 ] )

 

STUDENTS의 스키마를 만드는데 그 안에 STUNO, STUNAME, GRADE, CLASS 와 같은 애트리뷰트를 가지는 것을 의미한다. 각 애트리뷰트명 옆에 써져 있는 것은 데이터 타입이고 다음 표와 같은 것들이 있다. 그리고 마지막에 PRIMARY KEY(STUNO)와 같이 기본키를 명시하고 제약 조건들을 명시해줄 수 있다.

데이터 타입

의미

INTEGER or INT 정수형
NUMBER(n , s) 소수점을 포함한 n개의 숫자에서 소수 아래 숫자가 s개인 십진수
CHAR(n) n바이트 문자열 n을 생략하면 1
VARCHAR(n) 최대 n바이트 까지 가변 길이 문자열
BIT(n) n개의 비트열 또는 최대 n개까지의 가변 비트열
DATE 날짜형, 날짜와 시간을 저장

 

이 밖에도 릴레이션 제거(DROP TABLE CLASSROOM), ALTER TABLE, 인덱스 생성 (CREATE INDEX)과 같은 기능들을 지원한다.

 

SELECT문

관계 데이터베이스에서 정보를 검색하는 SQL문으로 관계 대수의 실렉션과 의미가 완전히 다르다.

관계 대수의 실렉션, 프로젝션, 조인, 카티션 곱 등을 결합한 것과 같다고 볼 수 있으며 가장 많이 사용된다.

기본적인 SQL 질의에서 SELECT 절과 FROM절만 필수적인 절이고, 나머지는 선택 사항이다.

 

SELECT  [DISTINCT] 애트리뷰트(들)

FROM 릴레이션(들)

[WHERE 조건 [중첩 질의]] [GROUP BY 애트리뷰트(들)] [HAVING 조건] [ORDER BY 애트리뷰트(들) [ASC|DESC]];

 

다음은 SELECT문에서 사용할 수 있는 기능들이다.

 

별칭(alias)

서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 속해 있을 때 애트리뷰트의 이름을 구분하는 방법

FROM EMPLOYEE AS E, DEPARTMENT AS D

 

모든 애트리뷰트 검색

SELECT  * FROM DEPARTMENT;

DISTINCT

모든 상이한 값들만 검색하고자 할 때 사용한다. SELECT DISTINCT TITLE FROM EMPLOYEE;

 

WHERE

특정한 조건의 투플들만 검색하고자 할 때 사용한다.

 

2번 부서에 근무하는 사원들의 정보를 검색해라 == SELECT * FROM EMPLOYEE WHERE DNO=2;

 

문자열 비교

이씨 성을 가진 사원들의 이름, 직급, 소속 부서 번호를 검색하라.

SELECT EMPNAME, TITLE, DNO FROM EMPLOYEE WHERE EMPNAME LIKE '이%' ;

 

ORDER BY절

사용자가 SELECT문에서 질의 결과의 순서를 명시하지 않으면 릴레이션에 투플들이 삽입된 순서대로 사용자에게 제시된다. ORDER BY 절을 명시하면 해당 애트리뷰트를 기준으로 검색 결과를 정렬한다. SELECT문에 가장 마지막에 사용되며 디폴트 정렬 순서를 오름차순(ASC)이며, DESC를 지정하며 내림차순으로 정렬할 수 있다.

단, SELECT절에 명시한 애트리뷰트들을 사용해서 정렬해야 한다.

 

그룹화

GROUP BY절에 사용된 애트리뷰트에 동일한 값을 갖는 투플들이 하나의 그룹으로 묶임 이 애트리뷰트를 그룹화 애트리뷰트라고 한다. SELECT 절에는 집단 함수, 그룹화 애트리뷰트들만 나타날 수 있다.

HAVING절

어떤 조건을 만족하는 그룹들에 대해서만 집단 함수를 적용할 수 있다. 따라서 각 그룹마다 하나의 값을 갖는 애트리뷰트를 사용해서 각 그룹이 만족해야 하는 조건을 명시한다. 그룹화 애트리뷰트에 같은 갖는 투플들의 그룹에 대한 조건을 나타내고, 이 조건을 만족하는 그룹들만 질의 결과에 나타난다.

조인

두 개 이상의 릴레이션으로부터 연관된 투플들을 결합한다. 일반적인 형식은 FROM절에 두 개 이상의 릴레이션들이 열거되고, 두 릴레이션에 속하는 애트리뷰트들을 비교하는 조인 조건이 WHERE절에 포함된다. 흔히 =(비교 연산자)로 연결한다.

 

이 밖에도 많은 기능이 있으나 실습편에서 소개하겠습니다.

중첩 질의

질의의 where 또는 FROM절에 다시 SELECT문이 포함되는 것이며 부 질의라고 한다.

 

부 질의에서 한 개의 스칼라 값이 반환되는 경우 where절에서 상수 또는 애트리뷰트가 사용될 위치에 나타날 수 있다.

만약 릴레이션이 반환되는 경우에는 IN,  ANY, ALL, EXISTS와 같은 연산자를 사용해야 한다.

 

 

 

'Lecture Note > DataBase' 카테고리의 다른 글

[강의노트_DB]13. SQL-3  (0) 2019.07.02
[강의노트_DB]12. SQL-2  (0) 2019.06.27
[강의노트_DB]10. 관계 대수-2  (0) 2019.05.09
[강의노트_DB]9. 관계 대수 - 1  (1) 2019.05.07
[강의노트_DB]8. 무결성 제약조건  (0) 2019.05.02

+ Recent posts