Programming/SQL

SELECT 스킬 : 산술연산(숫자연산자, 문자 연산자, 별칭붙여서 출력) ,비교연산 2021-06-22

최동훈1 2021. 6. 22. 15:59

테이블에 저장된 다양한 필드를 가진 데이터들을 출력하는 방법이 있다.

예를들면,

ID PWD NAME
ming 0523
hun 2020 동훈
mori 0619 모리

이런 ID,PWD,NAME 필드를 가진 데이터가 DB에 저장되어 있을떄, 워하는 열 만 출력할수 있는지, 원하는 행만 출력할수 있는지, 이런 방법이 매우 중요하다. 또한 이미 저장되어있는 값에 숫자연산을 통채로 다 적용시킨 값을 열(colum)으로서 출력 할 수 도 있어야 한다. 

.1. ID와 PWD를 뽑는경우

SELECT ID,PWD FROM MEMBER;

2. PWD에 1 더한 값을 뽑는 경우

SELECT PWD+1 FROM MEMBER

그런데 이 방식으로 뽑으면 문제가 있다. 출력을 해보면,

PWD+1
0524
2021
0620

이렇게 출력해주는 열의 이름이 PWD+1로 나와버리는 것이다. 그러나 JDBC에서 필드이름을 가져올때는 더해진 값이 아니라 원래 값으로 처리를 하기에, 별칭 붙이기를 통해 원래 이름으로 바꿔 주어야 한다.

SELECT PWD+1 AS PWD FROM MEMBER;
SELECT PWD+1 PWD FROM MEMBER;--AS 생략 가능.

 

이러면 PWD란 별칭이 붙여져서 이렇게 출력된다.

PWD
0524
2021
0620

 그리고, PWD 필드의 모든 값에 +1이 적용된 채로 출력된다.

 

3. 테이블을 출력하는게 아니라, 숫자나 문자를 계산해서 출력해보고 싶은 경우

SELECT 1+'3' FROM DUAL;--4로 출력
SELECT 1||'a' FROM DUAL;--1a 로 출력

오라클에서는  자바와 달리 + 연산자는 숫자만을 연산할떄 쓰이기 떄문에 아무리 문자와 더해도 숫자로 변환하여 더해지고, 문자를 연결하고 싶은 경우에는 ||연산자를 통해 출력하면 된다. 또한 SELECT 명령어 뒤에는 무조건 FROM 명령어가 와야되기 때문에, 오라클에서는 DUAL 이라는 가상의 더미테이블을 만들어서, 단순계산을 할떄 쓰이도록 하였다.(아무 의미없는 테이블이다.)

 

4. 그렇다면, 테이블을 출력할떄 이름(ID) 이런 형식으로 출력을 할려면 어떻게 해야할까?

 

답은 매우 쉽다. 그냥 문자더하기 연산자만 적절히 사용해주면 된다.

SELECT NAME||'('||ID||')' FROM MEMBER ;

 

그다음은 SQL의 비교연산자가 있다.

오라클에서 사용가능한 비교연산자는

 =, !=, ^=, <>, <=, >=, IS NULL, IS NOT NULL

등이 있는데 다른건 직관적인 이해가 가능하지만 !=, ^=, <> 는 A와 B가 다른가? 라는 부정 비교연산자이다. 그런데 이 세개중 다른 DBMS도 사용 가능하고, 가장 범용성 있는 표준적인 연산자는 != 이다. 나머지는 오라클에서만 쓰인다.

**여기서 내 가설이 맞았다. 난 SQL 구문의 전체적인 형식은 비슷할 지라도, DBMS 제품별로 명령어는 조금씩 다를수 있을거라는 생각을 하였는데 여기서 내 말이 맞았다.

 

위 연산자를 사용하여 예시를 들어 보자면, PWD 가 0523인 테이블의 출력을 하려 할떄는

SELECT * FROM MEMBER WHERE PWD = '0523';-- =는 대입연산이 아닌 비교연산임.

이다. 그런데 여기서 내가 또 꺠달은 것이 있다. 난 그전 UPDATE 문에서 SET 열 = 바뀔값  WHERE 조건에서 =를 같이

INSERT INTO MEMBER(ID,PWD) VALUES('asdf','1234');

UPDATE MEMBER SET ID,PWD = 'abc', '1234' WHERE NAME = '최동훈'; 

쓰길래 " = "  연산자가 대입연산자인줄 알았는데, WHERE 명령어 뒤에 쓰면 A와 B가 같냐? 는 비교 연산자가 된다는 것을 알게 되었다.

 

또한 내용 입력 값이 없는 테이블을 출력할때는, = 'NULL' 이러면 안되고, IS NULL을 써야 한다.

SELECT * FROM NOTICE WHERE HIT>3;
SELECT * FROM NOTICE WHERE ID = 'NULL'; --이럼 안됨.
SELECT * FROM NOTICE WHERE ID IS NULL ;--이게 정답임.
UPDATE MEMBER SET ID='최동훈', PWD= 'abcd' ;  

처음 SQL이란 언어를 배워서 그런지 자꾸 DML 용례가 헷갈린다.. 이참에 다시 정리해보자

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

 

공부시간 2시간

순공부시간 1시간.

 

오늘은 오전 공부까지는 집중이 매우 잘 되었는데, 오후에 블로그 정리하면서 다시 INSERT, UPDATE 문을 쓸려고 했을떄, 자꾸 기억이 안나고 했갈렸다... 다시 복습해야겠다.. 백문이 불여일타 라는 말이 있듯이 백번 보고 듣는거 보다 한번 직접 코드를 짜보는것이 기억에 더 오래 남는거 같다.