Database SQL/Oracle

[DB#16] 조회(SELECT)

양동민 2020. 11. 25. 15:19

데이터 조회(SELECT)는 데이터베이스에서 가장 많이 하는 작업으로 , 내가 원하는 결과를 조회할 수 있는 명령이다.

1개의 데이터를 조회하기 위한 명령은 아래와 같다.

 

SELECT 항목 FROM 테이블 [WHERE 조건] [GROUP설정] [정렬조건];

 

첫 번째로, 전체 조회는 와일드카드(*)를 사용한다.

SELECT * FROM 테이블; 

해석하자면 -> SELECT(조회) *(전부) FROM 테이블명(테이블에서)

 

두 번째로, 특정 칸(ex.이름)을 조회

SELECT PERSON_NAME FROM 테이블명

 

세 번째로, 특정 칸(ex.성별)을 조회

SELECT GENDER FROM 테이블명

 

네 번째로, 특정 칸1과 칸2(ex.이름, 성별)을 조회

SELECT PERSON_NAME, GENDER FROM 테이블명

 

다섯 번째로, 조건(WHERE)을 설정

WHERE는 필터링(filtering)하는 방법이다. 조건, 기준을 여자만 또는 남자만, 점수를 60점이상 또는 90점 미만, 또는 올해, 또는 작년 등 다양한 필터를 사용하여 필터링한 결과를 조회하는 것이다.

 

시험에서 A, B항목중 A항목 점수가 60점인 사람을 조회

SELECT PERSON_NAME FROM 테이블명 WHERE ASCORE = 60; 

-> SELECT 사람이름 FROM 테이블명 WHERE A항목점수 = ??점 하면 ?? 점인 사람을 조회할 수 있다.

 

여섯 번째로, B항목 점수가 70점 미만인 사람을 조회

SELECT * FROM 테이블명 WHERE BSCORE < 70;

 

일곱 번째로, A항목과 B항목 점수 합계가 150점 이하인 사람을 조회

SELECT * FROM 테이블명 WHERE (ASCORE+BSCORE) <= 150;

SELECT PERSON_NAME, ASCORE+BSCORE FROM 테이블명;

 

만약 PERSON_NAME 뒤에 한글로 이름 을 입력하고 ASCORE+BSCORE 뒤에 총점을 입력하면

출력창에도 이름, 총점이라고 칸명이 바뀐다.

SELECT PERSON_NAME 이름, ASCORE+BSCORE 총점 FROM 테이블명 WHERE (ASCORE+BSCORE) <= 150;

 

보통 조회할 테이블(테이블명)을 실행하고

다음 조회하고싶은 항목인 SELECT이후부터 테이블명 전까지를 실행,

다음으로 조건을 실행하여 출력한다.

 

여덟 번째로, 이름과 평균점수를 구하여 조회

오라클 나눗셈은 정수형이 없고, 별칭에 띄어쓰기 하고 싶을때 ""로 감싸면 된다.

SELECT PERSON_NAME "이름", (ASCORE+BSCORE)/2 "평균 점수" FROM 테이블명;

 

아홉 번째로, ASCORE가 70점이상 80점 이하인 사람을 조회(구간조회)

SELECT * FROM 테이블명 WHERE ASCORE>=70 AND ASCORE<=80;

 

JAVA에서 &&를 썼다면 AND로 ||를 썼다면 OR로 오라클에서 쓰면된다.

 

열번 째로, 각 점수가 40점 이상이면서 평균 60점 이상인 사람을 조회(조건+구간조회)

SELECT * FROM 테이블명

WHERE

          ASCORE >= 40

          AND BSCORE >= 40

          AND (ASCORE + BSCORE) / 2 >= 60;

 

열두 번째로, 지금까진 숫자조건이였다면, 문자열 조건을 입력하여 보자.

자바는 문자열을 EQUALS로 비교하지만 데이터베이스는 그런게 없다.

만약 성별이 "여자"인 사람을 조회한다면,

SELECT * FROM 테이블명 WHERE GENDER = '여자';

 

"남자"인 사람을 조회한다면 뒤에 '남자'로 바꿔주면 되고 

이런 방식으로도 표현이 가능하다

SELECT * FROM 테이블명 WHERE FROM GENDER != '여자'; -> 여자가 아닌사람 = 남자

 

+) 문자열 유사 검색의 경우

- LIKE 검색 : LIKE 키워드와 문자열 내부의 %을 이용하여 특정 글자 유무를 파악한다.

- %는 해당하는 위치에 글자가 있어도 되고 없어도 된다는 의미이다. ex)'김%' = 김ㅇㅇ, '%윤' = ㅇㅇ윤 

만약 초성, 중성, 종성으로 조회를 하고싶다면, 한글 초성 중성 종성 분해하는 한글 유니코드를 찾아서

한글 문자코드를 보고 초성(19개), 중성(21개), 종성(28개)로 나뉘는 것을 확인하고,

한글 문자 코드같은 경우는,

(초성 순서 * 21 * 28) + (중성순서 * 28) + 종성순서 + 0xAC00과 같이하거나

((초성순서 * 21) + 중성순서) * 28 + 종성순서 + 0xAC00 으로 공식을 생각하면 된다.

 

INSTR 명령 : INSTR 명령은 자바의 INDEXOF와 같은 명령이다. 일치하는 문자의 위치를 반환하는 것이다.

오라클은 문자열이 1번부터 시작하므로 검색했을 때 결과가 0보다 크면 존재한다고 본다.

시작 검사를 할때는 LIKE 가 빠르고, 나머지는 INSTR이 빠르다. 

 

열세 번째로, "김"씨 성을 가진 사람을 조회

SELECT * FROM 테이블명 WHERE PERSON_NAME LIKE '김%';

 

열네 번째로, "윤"으로 끝나는 이름을 가진 사람을 조회

SELECT * FROM 테이블명 WHERE PERSON_NAME LIKE '%윤';

 

열다섯 번째로, "민"이 포함된 이름을 가진 사람을 조회

SELECT * FROM 테이블명 WHERE PERSON_NAME LIKE '%민%';

INSTR을 사용한다면

SELECT * FROM 테이블명 WHERE INSTR (PERSON_NAME, '민') > 0;

 

날짜 조건은 숫자처럼 계산이 가능하고, 문자열처럼 유사검색도 가능하다. 또한 날짜 전용 명령도 존재한다.

열여섯 번째로, 모든 사람들의 이름과 가입년도를 출력.

EXTRACT ( 추출항목 FROM 대상컬럼)을 사용하면된다.

SELECT PERSON_NAME 이름, EXTRACT(YEAR FROM REGIST_DATE) 가입년도 FROM 테이블명;

SELECT PERSON_NAME 이름, EXTRACT(MONTH FROM REGIST_DATE) 가입월 FROM 테이블명; (가입월 출력)

 

열일곱 번째로, 작년에 가입한 사람들의 이름과 점수 평균을 출력

SELECT PERSON_NAME 이름, (ASCORE+BSCORE)/2 평균 FROM 테이블명

WHERE EXTRACT (YEAR FROM REGIST_DATE) = EXTRACT (YEAR FROM SYSDATE);  -> 올해

 

SELECT PERSON_NAME 이름, (ASCORE+BSCORE)/2 평균 FROM 테이블명

WHERE EXTRACT (YEAR FROM REGIST_DATE) = EXTRACT (YEAR FROM SYSDATE)-1; -> 작년

 

SELECT PERSON_NAME 이름, (ASCORE+BSCORE)/2 평균 FROM 테이블명

WHERE EXTRACT (YEAR FROM REGIST_DATE) = EXTRACT (YEAR FROM SYSDATE)+1; -> 내년

 

열여덟 번째로, 여름(6,7,8월)에 가입한 사람들의 이름과 성별을 출력

SELECT PERSON_NAME, GENDER FROM 테이블명

WHERE

     EXTRACT(MONTH FROM REGIST_DATE) = 6

     OR EXTRACT(MONTH FROM REGIST_DATE) = 7

     OR EXTRACT(MONTH FROM REGIST_DATE) = 8;

 

SELECT PERSON_NAME, GENDER FROM 테이블명

WHERE

     EXTRACT(MONTH FROM REGIST_DATE) >= 6

     OR EXTRACT(MONTH FROM REGIST_DATE) <= 8;

 

BETWEEN은 ~이상 ~이하를 처리할 수 있다 ( 구간조회)

SELECT PERSON_NAME, GENDER FROM 테이블명

WHERE EXTRACT(MONTH FROM REGIST_DATE) BETWEEN 6 AND 8;