[SQL]SELECT문 기본 구조, 연산자

EUNJI LEE·2023년 4월 6일
0

SQL

목록 보기
1/14

Result Set

아래와 같은 화면을 result set이라고 한다. select문을 이용해서 원하는 테이블의 데이터를 뽑아냈을 때 값을 보여주는 화면이다. 아무 데이터도 출력 안 될 수 있다.

  1. Row(행, 튜플) : 한 줄을 하나의 값으로 구분한다. 하나씩 쪼개서 값으로 구분하지 않는다.

  2. 컬럼(도메인) : 특정 대상(Target Table)이 되는 값을 말한다.

  3. 기본키(Primary Key : PK) : Row를 구분할 수 있는 중복되지 않고 null이 아닌 특정 값을 말한다. 기본키에 해당하는 Row는 하나만 뽑아낼 수 있다.

  4. 외래키(Foreign Key) : 외부에서 받아와서 처리하는 것으로 다른 테이블에서 참조 받은 키를 말한다. 테이블끼리 연결할 때 데이터의 무결성을 보장하기 위해서 사용한다.

    💡 예를 들어 부서 정보를 입력하려고 할 때, 누군가는 ‘마케팅’이라고 입력하고 누군가는 ‘마케팅팀’, 또 누군가는 ‘maketing’이라고 입력한다면 값을 구분해내기 어려워진다. 이때 부서를 구분하는 테이블을 하나 만들어서 외래키로 받아오면 외래키 외에 다른 값은 오류가 발생하기 때문에 일관된 데이터를 저장할 수 있게된다.
  5. Null : null도 하나의 값으로 구분하지만 연산은 수행 불가능한 데이터다. 어떠한 연산도 불가하다.

  6. 컬럼값(속성값) : 컬럼 하나에 들어가는 개별 값을 말한다.

SQL(Structured Query Language)

뜻을 그대로 풀어내면 구조된 질문 언어로 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어이다. 원하는 데이터를 찾는 방법이나 절차를 기술하는 게 아닌 조건을 기술하여 작성한다.

분류용도명령어
DQL데이터 검색SELECT(조회)
DML데이터 조작INSERT(추가), UPDATE(수정), DELETE(삭제) : Row에 사용
DDL데이터 정의CREATE(생성), DROP(삭제), ALTER(수정) : TABLE에 사용
TCL트랜잭션 제어(DB Control)COMMIT, ROLLBACK

SELECT문

SELECT 컬럼명 혹은 * FROM 테이블명 [WHERE 조건식]; 으로 작성하며 DB에서는 모든 내용을 확인할 때 SELECT문을 사용한다. SELECT문을 작성할 때는 가독성을 위해 각 명령어마다 개행 해주는 것이 좋다. 오라클에서는 기본적으로 대문자로 작성하기 때문에 전부 대문자로 작성해도 된다.

WHERE절은 생략 가능하며, 조건식은 TRUE, FALSE가 나오는 구문을 작성해야 한다. 조건식이 TRUE인 경우에 출력하고 해당 조건이 모두 FALSE를 만족해도 오류는 발생하지 않는다. JAVA의 IF문과 비슷한 기능이라고 볼 수 있다. 여러 개의 조건을 이어서 작성하는 경우에는 AND, OR로 이어서 작성할 수 있다.

--EMPOLYEE TABLE 전체 데이터 출력
SELECT *
FROM EMPLOYEE;

--EMPLOYEE TABLE의 이름, 주민번호, 이메일, 핸드폰번호 컬럼만 조회
SELECT EMP_NAME, EMP_NO, EMAIL, PHONE
FROM EMPLOYEE;

--WHERE절 이용
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE='D9';

--사원 중 월급이 200만원 이상인 사원을 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY>=2000000;

산술 연산

SELECT문에는 함수, 데이터, 연산 처리 결과 등 다양한 데이터를 넣어서 조회할 수 있다. 이 때 산술 연산의 피연산자로는 리터럴, 컬럼 사용 가능하다.

SELECT 10+20, 10-20, 20/3, 5*4 
FROM DUAL; --✅연산 조회를 위해서 오라클에서 제공하는 샘플 테이블

--리터럴, 컬럼 연산
SELECT SALARY+100
FROM EMPLOYEE;

--컬럼, 컬럼 연산
SELECT SALARY+BONUS
FROM EMPLOYEE;
💡 Oracle은 숫자 자료형은 하나로 쓰기 때문에 정수 연산해서 결과 값이 실수가 나와도 형변환이 필요 없다. ✅ NULL은 연산이 불가능하다. 연산 시 계산하는 값에 상관없이 결과는 NULL이 나온다.

💡 문자열 연산?
오라클에서 산술 연산은 숫자형만 가능하다. 오라클에서 문자열 리터럴은 ' '을 사용한다. " "은 다른 의미이다.

--SELECT 'hi'+100
--FROM DUAL; ->에러 출력 : 수치 부적합
--SELECT EMP_NAME+'HI' ->문자열끼리도 불가
--FROM DUAL;

ORACLE에서 문자열을 연결해주는 연산자로 || 을 사용할 수 있다.

SELECT 'HI '||'ORACLE' AS "문자열 연산"
FROM DUAL;

SELECT EMP_NAME||EMP_NO||EMAIL AS INFO
FROM EMPLOYEE;

SELECT EMP_NAME||SALARY||BONUS AS INFO1
--실수의 소수점 앞 0은 사라진다. ->자동 변환됨
FROM EMPLOYEE;

가상 컬럼 및 AS 예약어

SELECT문에서 연산 결과를 하나의 컬럼으로 만들어서 Result Set에 출력해주는데 이때 만들어진 컬럼을 가상 컬럼이라고 한다. 가상 컬럼은 실제로 존재하는 것은 아니며 명칭을 정해주지 않았을 때는 연산식 전체를 가상 컬럼명으로 지정해서 출력한다. 이때 가상 컬럼명을 정하기 위한 예약어AS를 사용할 수 있다.

꼭 연산식 결과를 나타내는 컬럼 외에도 일반 컬럼에도 명칭을 부여할 수 있으며, AS 생략 후 띄어쓰기 해도 가상 컬럼 명칭을 부여할 수 있다.

--사원 테이블에서 사원명, 부서코드, 월급, 연봉 조회
SELECT EMP_NAME, DEPT_CODE, SALARY, SALARY*12 AS 연봉
FROM EMPLOYEE;

SELECT EMP_NAME 사원명, SALARY 월급, EMAIL 이메일
FROM EMPLOYEE;

💡 단, 명칭 사이에 특수기호, 공백을 추가하는 경우 구문의 명칭의 종료 시점을 구분하지 못하기 때문에 " "큰따옴표로 묶어주면 하나의 문자열로 묶어서 구분하겠다는 의미가 된다.

SELECT EMP_NAME AS "사 원 명", SALARY AS "월!급"
FROM EMPLOYEE;

DISTINCT

조회되는 데이터의 중복을 제거해주는 예약어로 컬럼명 앞에 사용하고 SELECT문 맨 앞에만 작성 가능하다. SELECT DISTINCT 컬럼명[,컬럼명2,...] FROM 테이블명; 형태로 사용한다.

이때, 중복 데이터의 기준은 Row이기 때문에 컬럼을 여러 개 썼을 경우 해당 컬럼의 모든 값이 중복되는 데이터만 찾아서 제거한다.

--부서명을 하나씩만 출력
SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;

--부서명과 이름이 중복되는 값을 제거
SELECT DISTINCT DEPT_CODE, EMP_NAME
FROM EMPLOYEE;

날짜 대소 비교

Oracle에서 날짜를 대소 비교할 때는 문자열로 대소 비교한다. 문자열 패턴을 맞춰준 후, 부등호로 대소 비교가 가능하다. 기본 문자 패턴은 YY/MM/DD으로 사용하며 설정에서 변경 가능하다.

--입사일이 2000년 01월 01일 이전인 사원의 이름, 입사일 조회
SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE<'00/01/01';

--입사일부터 오늘까지의 날짜
SELECT SYSDATE-HIRE_DATE
FROM EMPLOYEE;
💡 오늘 날짜를 출력하는 기능 SYSDATE를 이용하면 된다.

BETWEEN AND

특정 범위에 있는 값 조회을 조회할 때 사용하는 기능이다. 컬럼명 BETWEEN 값 AND 값; 형태로 작성한다.

--사원 중 월급 200만원 이상 300만원 이하 월급을 받는 사원의 이름, 월급
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 2000000 AND 3000000;

--사원 중 입사일이 00년 01월 01부터 02/12/31까지 전체 조회
SELECT * FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '00/01/01' AND '02/12/31' AND DEPT_CODE='D9';
-->BETWEEN AND 끝내고 AND연산 이어서 실행

LIKE

원하는 문자열 패턴으로 검색할 수 있는 기능이다. 부분 일치, 포함 여부, 원하는 문자열 패턴 등을 찾을 수 있다. 문자열 패턴을 나타내는 기호로는 %와 _를 사용한다. 컬럼명 LIKE '패턴'; 형태로 작성한다.

% : 해당 자리에 문자가 존재하지 않거나 여러 개가 존재해도 출력한다.

_ : 해당 자리에 문자가 1개인 아무 문자나 허용할 때 사용한다.

--사원 중 유씨성을 가진 사원의 이름, 월급, 부서코드 조회
SELECT EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '유%';
--'유__'도 가능

--이메일 주소에 yo를 포함하는 사원의 사원명, 이메일 조회
SELECT EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '%yo%';

--일치하지 않는 값을 찾고 싶을 땐 NOT(부정연산자) 사용
--김씨가 아닌 사람을 전부 출력
SELECT*
FROM EMPLOYEE
WHERE EMP_NAME NOT LIKE '김%';

--이메일 주소에 언더바 앞글자가 세글자인 사원의 사원명, 이메일 조회
SELECT EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___\_%' ESCAPE '\';

💡 이스케이프로 지정한 것 뒤에는 문자열로 인식한다. ESCAPE '지정문자' 형태로 사용할 수 있다.

IS NULL

null의 여부를 확인한다. null이 있으면 true를 반환하고 없으면 false를 반환하는 비교 연산자이다. null이 없으면 true를 반환하고 싶으면 IS NOT NULL 이라고 작성할 수 있다. 컬럼 IS NULL; 형태로 작성한다.

--부서가 없는 사원 출력
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL;

--보너스가 있는 사원 출력
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;

IN, NOT IN

여러 개의 값을 OR로 연결해서 동등 비교할 때 사용하는 연산자. IN (비교값1, 비교값2, …); 형태로 사용할 수 있다.

--사원 중 부서코드가 D5, D6, D7, D8인 사람 구하기
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IN ('D5','D6','D7','D8'); --OR로 묶인다.

--서브 쿼리문에서 많이 사용
--총무부나 부서명에 '해외'가 포함된 부서의 코드를 출력
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IN(SELECT DEPT_ID FROM DEPARTMENT WHERE DEPT_TITLE='총무부'
				OR DEPT_TITLE='%해외%');

연산자 우선 순위

💡연산자에는 우선 순위가 존재하므로 구문을 작성할 때 우선 순위를 주의해서 작성해야 한다. 우선 순위를 고려하지 않았을 경우 잘못된 결과 값이 출력될 수 있다.

profile
천천히 기록해보는 비비로그

0개의 댓글