CREATE OR REPLACE FUNCTION FUNC_SPLIT(COLNAME VARCHAR, SEP VARCHAR, NUM NUMBER)

RETURN VARCHAR

IS

STR VARCHAR2(512);

BEGIN

IF NUM > 0 THEN

IF INSTR(COLNAME, SEP, 1, NUM+1) < 1 THEN

IF INSTR(COLNAME, SEP, 1, NUM) > 0 THEN

SELECT SUBSTR(COLNAME, INSTR(COLNAME, SEP, 1, NUM) + LENGTH(SEP), LENGTH(COLNAME)) INTO STR FROM DUAL;

END IF;

END IF;

IF INSTR(COLNAME, SEP, 1, NUM+1) > 0 THEN

SELECT SUBSTR(COLNAME, INSTR(COLNAME, SEP, 1, NUM) + LENGTH(SEP), (INSTR(COLNAME, SEP, 1, NUM+1) - INSTR(COLNAME, SEP, 1, NUM) - LENGTH(SEP))) INTO STR FROM DUAL;

END IF;

END IF;

IF NUM = 0 THEN

SELECT SUBSTR(COLNAME, 0, INSTR(COLNAME, SEP, 1, 1) - 1) INTO STR FROM DUAL;

END IF;

RETURN STR;

END func_split;


사용법

예) SELECT FUNC_SPLIT('a$b$c', '$', 0) FROM DUAL;


첫번째 매개변수 : 자를 문자열

두번째 매개변수 : 구분자

세번째 매개변수 : 추출해낼 위치



안녕하세요 열코입니다.


SELECT는 SQL에서 가장 일반적으로 사용되는 문으로, 데이터 베이스에서 데이터를 검색해서 가져오는데 사용됩니다.

SELECT문을 통해 전체 테이블을 가져오거나 규칙을 지정하여 테이블의 일부만 가져올 수 있습니다.

반환 된 데이터는 결과 테이블에 저장되며 이 테이블을 결과 집합이라고 합니다.


기본적인 사용 구문


SELECT 필드명1, 필드명2, 필드명3 ... FROM 테이블명 


필드(컬럼)명은 하나 또는 여러개가 될 수 있으며 콤마(,)로 구분해서 사용합니다.

또한 테이블의 전체를 가져오려면 필드명에 *를 사용합니다. 


SELECT * FROM 테이블명


SELECT문에서 SELECT와 FROM은 필수적으로 사용되는 절이며, 나머지 기타 절은 선택사항입니다.

(기타절 : WHERE, GROUP BY, HAVING, ORDER BY)



☞ WHERE절 사용법

WHERE절은 검색 이외에 갱신(UPDATE), 삭제(DELETE)문에서도 사용할 수 있으며 행을 식별하는 

탐색 조건을 지정합니다. 탐색조건은 하나이상이 될 수 있으며 다음과 같이 사용 가능합니다.


SELECT 필드명 FROM 테이블명 WHERE 조건


위와 같이 WHERE을 SELECT문에 배치해서 사용합니다. WHERE에서 사용되는 조건은 보통 

비교 연산자 및 NOT 키워드를 사용합니다.

한가지 예를 들면 다음과 같은 테이블이 있다고 가정합니다.


[테이블 명 : 학생]

이름

 나이

점수

A

 24

90

B

 28

85

C

 34

80


이름, 나이, 점수 순으로 필드가 존재하는 위와 같은 테이블에서

85점 이상의 사람의 이름을 검색하고 싶을 때

다음과 같이 쿼리문을 작성합니다.


SELECT 이름 FROM 학생 WHERE 점수 >= '85'


결과는 다음과 같습니다.


이름

A

B


SQL에서 WHERE문에서 사용할 수 있는 비교 연산자는 다음과 같습니다.

<(초과), >(미만), =(같다), <=(이상), >=(이하), !=(같지않다)



또한 다른 언어들과 마찬가지로 AND와 OR 연산자를 지원합니다.

- AND는 AND앞과 뒤의 조건을 모두 만족해야 할 때 사용하며,

- OR는 OR 앞과 뒤 중 하나또는 모두 만족 할 때 사용됩니다.


더 나아가 여러 탐색 조건을 수행 할 수 있습니다.

- BETWEEN ~ AND : 두개의 다른 값 사이의 값이 충족되도록 조건을 지정합니다.

- IN : 값을 나열하여 나열한 값 사이에 있는 행을 모두 찾도록 조건을 지정합니다.

- EXISTS : 특정 행이 존재하는지 조건을 지정합니다.

- IS NULL : 널 값에 대한 테스트를 위해 사용합니다.



☞ ORDER BY 사용법

SELECT를 이용하여 출력 할 때 ORDER BY를 이용하여 테이블을 정렬 할 수 있습니다.

기준 튜플을 지정하고 오름차순, 내림차순을 설정할 수 있습니다.

예를 들어 다음과 같은 테이블이 존재한다고 가정합니다.


[테이블명 : 회원]

이름

전화번호

나이

A

010-1234-5678

15

B

010-2342-2341

27

C

010-3246-5436 

21

D

010-8923-8435

33

E

010-2464-9314

12


위 테이블에서 나이가 20살 이상인 사람들의 이름과 전화번호, 나이를 출력하려고 합니다.

다음과 같은 쿼리문을 사용하면 되겠죠?


SELECT * FROM 회원 WHERE 나이 >= '20'


쿼리문 실행 결과 아래와 같이 출력될 것입니다.



[테이블명 : 회원]

이름

전화번호

나이

B

010-2342-2341

27

C

010-3246-5436 

21

D

010-8923-8435

33


하지만 별로 보기가 좋지 않네요,

나이를 오름차순으로 정렬 하고 싶습니다.

다음과 같이 order by를 사용하여 정렬 할 수 있습니다.


SELECT * FROM 회원 WHERE 나이 >= '20' ORDER BY 나이


아래 결과를 확인해보세요.


[테이블명 : 회원]

이름

전화번호

나이

C

010-3246-5436

21

B

010-2342-2341

27

D

010-8923-8435

33


나이를 오름차순으로 정렬하여 출력한 결과입니다.

훨씬 보기 깔끔하네요~


내림차순으로 정렬하고 싶으면 맨 끝에 DESC를 추가하면 됩니다.


SELECT * FROM 회원 WHERE 나이 >= '20' ORDER BY 나이 DESC



이렇게 말이죠.



이상 'SELECT 사용법'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.







* 데이터베이스 책 추천


* 해당 책 제목을 누르면 구매 사이트로 이동합니다.



1. 가장 쉬운 데이터베이스 설계 책 - 적절한 데이터베이스 디자인을 위한 지침서


가장 쉬운 데이터베이스 설계 책


☞ 설계 초보자를 위한 책

☞ DB설계자, PL, PM이 꼭 읽어야 할 책

☞ 개발 프로세스의 논리적 설계 부분




2. 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술


데이터베이스를 지탱하는 기술


☞ DB기반 기술을 알고 싶은 초보자를 위한 책

☞ 대용량 데이터를 빠르고 안정적으로 처리하는 방법

☞ DB 관련 지식을 정리하고 싶거나 전체적인 모습을 파악하고 싶은 사람 추천




3. 그림으로 공부하는 오라클 구조


오라클 구조


☞ 오라클 구조 및 DB 기술이 궁금한 분을 위한 책

☞ 오라클 고유의 아키텍쳐와 동작을 그림으로 이해




4. 손에 잡히는 10분 SQL


손에 잡히는 10분 SQL


☞ 쿼리를 공부하고 싶은 초바자를 위한 책

☞ 10분 만에 간편하게 배우는 SQL 주요 문법




5. 새로쓴 대용량 데이터베이스 솔루션 Vol.1


새로쓴 대용량 데이터베이스 솔루션 Vol.1


☞ 초보자 및 고급 모두 꾸준히 봐야 할 책, 쿼리 위주의 공부

☞ 데이터베이스 기술의 바이블

☞ DB분야 10년간 최고 베스트셀러




6. MySQL 성능 최적화


MySQL 성능 최적화


☞ 초보자 및 고급 모두 꾸준히 봐야 할 책

☞ MySQL을 사용하는 모든 DBA와 개발자를 위한 솔루션 가이드





7. 오라클 실습 - 전문가로 가는 지름길


☞ 일반인을 위한 오라클 지침서





정규화란? 

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스


* 정규화의 목적 

- 중복성 및 종속성 제거 : 유연성 향상, 데이터 보호, 테이블 규칙성, 테이블 간의 관계 설정 

- 데이터베이스 변경시 이상(anomaly)현상 제거 


1) 삽입 이상

삽입 이상


위와 같은 정규화 되지않은 데이터베이스에서 새로운 교수인 C를 데이터베이스에 삽입하려 할 때 그가 아직 맡은 강의가 없기 때문에 강의 코드를 null로 하지 않는 이상 테이블에 추가 할 수 없음 


2) 삭제 이상

삭제 이상


위와 같은 정규화 되지않은 데이터베이스에서 C 교수의 운영체제 과목이 종료되어서 삭제하려고 할 때 그의 강의가 기록된 레코드를 삭제해야 하는데, 교수 레코드 자체가 사라지게 된다.


3) 갱신 이상

갱신 이상


위와 같은 정규화 되지않은 데이터베이스에서 B 교수의 전화번호가 변경되어 레코드를 수정하려 할 때 성공적인 갱신이 이루어지지 않을 수 있다.



☞ 이러한 문제들을 해결하기 위해 테이블의 구성을 논리적으로 변경하는 것을 정규화라고 한다.


* 정규화 과정

비공식적으로 관계형 데이터베이스 테이블이 제 3 정규화가 되었으면 '정규화 되었다' 라고 한다.


제 1 정규화(1NF; First Normal Form) - 중복되는 그룹 제거


정규화 되지 않은 테이블


위와 같은 테이블은 강의명 칼럼에 두개의 값을 가진다. 위 테이블을 제 1 정규화하면 다음과 같다.


제 1 정규화 된 테이블


제 2 정규화(2NF; Second Normal Form) - 부분 함수 종속성 제거

모든 기본 키의 특정 칼럼에 종속된 칼럼을 제거한다. 수강 과목은 이름 또는 학교에 종속되어 있으므로 이를 제거한다.(새로운 테이블 생성)

다음과 같은 테이블있다고 가정한다.


제 1 정규화 된 테이블


위 테이블은 제 1 정규화가 되었지만 여전히 갱신 이상의 위험이 존재한다.(중복성)

위 테이블의 후보 키는 { 이름 } 이 될 수있다. { 학교 }는 오로지 이름에만 종속된다.

이를 제거하면 다음과 같이 테이블을 분리할 수 있다.


제 2 정규화 된 테이블


제 3 정규화(3NF; Third Normal Form) - 이행 함수 족속성 제거

제 2 정규화로 갱신 이상을 제거했지만 그렇지 않은 테이블도 존재한다.

아래 테이블은 학번은 이름에 종속, 성적은 학번과 이름에 종속, 등급은 성적에 종속됨

이를 이행함수 종속성이라 한다.

제 2 정규화 된 테이블


위의 테이블은 중복되는 테이블이 없고, 함수 족속성도없는 제1, 2 정규화가 된 테이블이다.

하지만 여전히 이상현상이 존재한다. 

만약 100점이 A라는 등급을 주고싶지만 학번과 이름이 기본키가 되는 테이블에서 null값을 삽입 할 수 없다. (삽입 이상) 그리고 B등급의 점수를 70점으로 하향하고 싶다면 해당 성적의 학생을 모두 변경해야함.(갱신 이상) 마지막으로 B 학생의 테이블을 삭제한다면? A등급에 해당하는 점수가 모두 삭제된다.(삭제 이상) 이를 해결하는 방법은 아래와 같다.


제 3 정규화 된 테이블


다음과 같이 테이블을 분리하면 간단하게 해결된다.

이외에도 BCNF, 4NF, 5NF, 6NF 등이 있다.(이는 대부분 3NF이다)


오타 및 질문사항은 댓글로 남겨주세요!





Server에서 MySQL Console 관리자 ID로 접속 후, 다음 명령어 실행
GRANT ALL PRIVILEGES ON *.* TO 아이디@'ip주소' IDENTIFIED BY '비밀번호' WITH GRANT OPTION;
아이디, 비밀번호는 Server 관리자 아이디 입력
ip주소는 Server에서 접속 받을 Client 주소를 입력해야 합니다.
입력 후 Client에서 접속 확인!


to Top