Programming/SQL

SQL 관계연산자, 패턴비교 연산자. 2021-06-24

최동훈1 2021. 6. 24. 16:35

 

복습.

DML의 종류에는 SELECT INSERT UPDATE 등이 있다.

사용용례 :

SELECT 열 AS 별칭 FROM 테이블
INSERT INTO 테이블(열,열) VALUES(값,값);
UPDATE 테이블 SET 열=값, 열=값 WHERE 조건.

SQL의 관계연산자는

NOT, AND, OR, BETWEEN, IN;

등이 있다. 딱히 부연설명이 필요없이 사례로서 보이겠다.

 

1. DB에서 조회수 1~3의 열만 추출.

SELECT * FROM NOTICE WHERE 1<=HIT AND HIT<=3;

다른 자바의 &&연산이랑 똑같음. 

그런데 복잡하게 부등호 말고, 간결한 표현을 원할 경우.

SELECT * FROM NOTICE WHERE HIT BETWEEN 1 AND 3 ;

대신, 이건 양 끝값이 모두 등호에 포함되는 경우임.

 

 

2.DB에서 조회수 0,5,2,3 인 열만 추출.

 

이 경우는 두가지 방법이 존재하는데

SELECT * FROM NOTICE WHERE HIT=0 OR HIT=5 OR HIT=2 OR HIT=3;

 비교연산자를 관계연산자로 묶어주는 경우인데 너무 복잡하다. 이걸 쉽게 바꾸면,

SELECT * FROM NOTICE WHERE HIT IN(0,5,2,3);

이렇게 IN 연산자를 쓸 경우에 IN의 값 안에 포함되어 있는 값이 해당 레코드의  HIT이면, 뽑아낼 수 있다.

 

3.DB에서 조회수 0,5,2,3이 아닌 열만 추출.

 

이 경우는 어떨까? 앞서쓴 IN과 NOT 부정연산자를 쓰면 된다.

SELECT * FROM NOTICE WHERE HIT NOT IN(0,5,2,3);

요약하면 연속적인 데이터 값의 추출은 BETWEEN을 쓰면 되고, 산발적인 데이터의 추출은 IN을 쓰면 된다.

 

SQL에서 어떠한 문자열을 추출하고 싶을때 쓰는 패턴비교연산자는 3가지가 있다.

LIKE, %, _;

 

이것도 바로 사례로서 설명하겠다.

 

1. 성이 '최' 씨인 사람을 DB에서 추출할떄.

SELECT * FROM MEMBER WHERE NAME LIKE '최%';

그럼 NAME 필드의 이름이 '최'로 시작하는 모든 문자열을 가진 테이블이 출력된다.

주의할점은 

SELECT * FROM MEMBER WHERE NAME = '최%';

가 아니라는 것이다. 이 퀴리를 실행하게 된다면, 액면가 그대로 이름이 '최%' 인 사람만 출력된다.

 

2. 그렇다면, 이름 중에 '미' 가 들어가는 사람을 추출은 어떻게 하면 될까?

 

응용인대, 나도 처음에는 %연산을 두번 써도 되는지 모르고 OR 연산자를 써야 하는지 알았다.

하지만 %연산자는 해당 글자의 앞,뒤 모두 올수 있고, "%미%"는 '미'로 이름이 시작하는 사람, '미'라는 글자가 중간에 포함되는 사람, '미'라는 글자가 마지막에 들어가는 사람 모두를 포함한다.

SELECT * FROM MEMBER WHERE NAME LIKE '%미%';

 이럼 미가연, 최미, 최미연, 최미미 이런 이름들이 모두 출력된다.

 

3.그럼 성이 '최' 이고 이름이 외자인 사람 추출할떄.

 

%연산자의 의미는 0개 이상글자는 모두 포함 이라는의미를 가지고 있어서 '최%' 로만 다 필터링 할수 없다. 이렇게 구체적인 글자수를 제한해야 할 경우에는 ,

 

SELECT * FROM MEMBER NAME WHERE LIKE '최_';

이렇게 쓴다. _ 의 개수가 글자의 개수이다.

 

공부시간 1시간.

순공부시간 30분.

 

오늘은 오전,오후 다 외근으로 어르신 모시고 병원갔다온다고 공부를 조금밖에 하지 못했다. 그래도 짧은시간이지만 밀도있게 마무리한거 같아서 뿌듯하다. 항상 기억하자. 끝까지 하는 사람은 10%밖에 안된다. 무엇이든 끝까지 하는 것만으로도 상위 10%가 될수 있다. 자연스럽게 그냥 아무생각없이 하자. 열심히? 악으로? 할 필요 없다. 그냥 하자. 내 일상의 루틴처럼.