관계형 데이터에서 데이터를 조회하거나 조작하기 위해 사용하는 표준검색언어
SELECT {*||[DISTINCT] column [as alias]||계산식||함수식||...} FROM table_name [WHERE 컬럼명 비교연산자 비교값] [ORDER BY 정렬할 컬럼명 정렬방식];
*
또는 컬럼명 : 조회할 컬럼 범위 지정*
은 모든 컬럼조회*구문에서 []
는 생략 가능 구문, {}은 안의 내용중 하나는 입력해야 한다는 의미
✨SQL문 작성 유의 사항
- SQL문장은 대소문자 구별을 하지 않는다
- SQL문장은 한 줄 또는 여러 줄에 입력될 수 있다.
- 일반적으로 키워드는 대문자로 입력한다.
- 다른 모든 단어, 즉 테이블 이름, 열 이름은 소문자로 입력을 권장
- 가장 최근 명령어 한개가 SQL buffer에 저장된다.
- SQL문 마지막절에
;
를 기술하여 명령의 끝을 표시한다.
✨오라클 DATATYPE
- 오라클에서 문자열저장은 VARCHAR2권장. 처음에 크기는 할당하지만 들어오는 값에 따라 유동적.
- CHAR도 문자열 오라클에서는 문자는 없다. 무조건 문자열. 고정적인 저장공간. 처음에 크기는 할당시 그대로..
- NUMBER는 숫자보관시 정수,실수 구분없이 다 NUMBER
- DATE 날짜
SELECT * -- select절 : 컬럼 선택 FROM 테이블이름; -- from절 : 검색대상 테이블 선택
;
를 넣고 엔터를 입력해야 한다!*
를 넣으면 선택된 테이블의 모든 컬럼을출력하라는 의미SELECT 컬럼이름1, 컬럼이름2, 컬럼이름3,... FROM 테이블이름;
,
로 구분하여 원하는 컬럼명을 적어주면 된다.
SELECT 컬럼명 별칭, 컬럼명2 별칭2 FROM 테이블이름;
SELECT 컬럼명 AS 별칭, 컬럼명2 AS 별칭 FROM 테이블이름;
SELECT 컬럼명 "별칭", 컬럼명2 "별칭" FROM 테이블이름;
""
(쌍따옴표)로 묶어야 함TAB 테이블은 table의 약자로 접속한 계정이 소유하고 있는 테이블의 정보를 알려주는 딕셔너리.
데이터 딕셔너리는 Oracle 시스템에서 객체(테이블)에 대한 정보를 저장하는 곳. 테이블에 대한 컬럼, 도메인, 제약조건에 대한 메타 데이터를 저장.
- 계정 확인
show user;
- 계정이 소유하고 있는 테이블 확인
SELECT * FROM tab;
DESC 테이블명;
DESC는 테이블에 대한 컬럼, 제약조건 등을 정보를 확인하는 명령어로 사용자 소유의 테이블 정보를 확인하기 위해 사용한다.
값이 중복되는 행을 한개씩만 선택하고자 할때 사용하는 키워드
SELECT DISTINCT 컬럼명, 컬럼명1, 컬럼명2
FROM 테이블명;
+
,-
,*
,/
가 있으며 컬럼 모두 자료형이 숫자형(NUBMER)이나 날짜형(DATE)이어야 한다. 날짜형은 +
,-
만 사용 가능
SELECT 10+20 FROM DUAL;
DUAL은 오라클이 제공하는 테스트용 기본 테이블 ,결과는 LOW로 나옴
select문 조회시에 컬럼 사이에 특정 문자를 넣고 싶을 때 사용하는 연산자
SELECT 컬럼명||'문자리터럴'||컬럼명 FROM 테이블명;
SIMSON의 급여는 500만원 입니다.
SELECT name||'의 급여는 '||sal||'만원 입니다.' FROM emp;
데이터를 조회할 떄 사용자가 원하는 조건에 맞는 데이터만을 조회하고 싶을 떄 사용하는 구문
SELECT 컬럼명, 컬럼명1
FROM 테이블명
WHERE 컬럼이름 비교연산자 조건값;
=
: 같다>
: 크다<
: 작다>=
: 크거나 같다<=
: 작거나 같다<>
,!=
,^=
: 같지않다✨ 숫자형 값을 비교할 떄는 비교연산자 뒤나 앞에 그냥 숫자만 적어주면 된다. 하지만 문자형이나 날짜형을 비교할때는 값에
' '
를 붙여줘야 한다. 날짜를 비교할 경우 날자 형식에 맞춰서 비교하여 값을'년/월/일'
로 넣어 주면 된다.
- 입사일이 2000/01/01이후 입사한 사원의 이름,부서,직책,입사일 출력하기
SELECT emp_name, dept_code, job_code, hire_date FROM employee WHERE hire_date>='00-01-01';
- 형식대로쓰면 자동형변환되기 떄문에 문자열도 대소비교 가능
- '00-01-01' '00/01/01' '000101' '2000 01 01'은 가능,
'00년 01월 01일'은 불가- 원래 형변환하는 법
SELECT emp_name, dept_code, job_code, hire_date FROM employee WHERE hire_date>=TO_DATE('20000101','YYYYMMDD');
조건A AND 조건B
: 두 가지 조건이 모두 만족되도록 결과 조회 (교집합) SELECT emp_name, dept_code, salary
FROM employee
WHERE salary>=3000000 AND dept_code='D5';
조건A OR 조건B
: 두 가지 조건 중 하나라도 만족되도록 결과 조회 (합집합)NOT 조건A
: 조건을 만족하지 않도록 결과 조회 (여집합)✨ WHERE절은 기본적으로 앞에서부터 순차적으로 논리연산 진행!
()
를 이용하여 논리연산의 우선순우를 사용자가 지정할 수 있음.
()
가 있으면()
안에 있는 연산을 우선 실행
BETWEEN 조건A AND 조건B
, NOT BETWEEN a AND b
연산자일정 범위를 조회할 떄 사용하는 연산자
BETWEEN 조건A AND 조건B
: A와 B 사이의 데이터 출력(A,B포함)NOT BETWEEN a AND b
: a와 b사이에 있지 않은 데이터를 출력(a,b포함되지 않음)SELECT * FROM student WHERE birthday BETWEEN '2002/01/01' AND '2002/12/31';
IN (list)
, NOT IN (list)
연산자비교할 값이 여러개일 경우 사용하는 비교 연산자. 컬럼 값과 비교할 대상이 여러개 일 경우 IN(비교값,비교값1,...)을 사용.
복수값을 제외하고 싶을 경우 NOT IN(비교값,비교값1,...)
예)SELECT * FROM student WHERE class_name IN ('햇님반','달님반');
LIKE
, NOT LIKE
연산자문자열 값이 지정하는 문자열패턴을 만족하면 TURE를 리턴하여 선택하도록 하는 연산자
문자열패턴 지정을 위해 와일카드문자(%,_)를 사용한다.
%
: 0개이상의 임의의 문자열을 의미_
: 문자 1개를 의미- Escape Option: 와일드카드(%,_)문자를 기록값으로 가진 데이터에서 기록값과 와일드 카드를 구분하기 위해 사용.
SELECT student_name, student_age FROM student WHERE student_name LIKE '고%'; --이름이 김으로 시작하는 학생찾기 WHERE student_name LIKE '%양%'; --이름에 '아'가 들어가는 학생찾기 WHERE student_name LIKE '%이'; --이름이 '아'로 끝나는 학생찾기
- 사원번호 마지막 글자가 '%K'인 직원정보 조회하기
SELECT * FROM emp WHERE emp_no LIKE '%#%K' ESCAPE '#';
ESCAPE 예외처리 지정한 글자 뒤에 오는 거 무시해
IS NULL
, IS NOT NULL
연산자데이터 값은 NULL값을 가질 수 있는데 NULL값은 0이나 빈공간이 아니라 미확정(알수 없는 값)을 의미한다.
따라서 NULL값은 연산, 할당, 비교가 불가능하여=
연산자 사용이 불가
NULL값 여부 확인은IS NULL
,IN NOT NULL
로 가능
IS NULL
: NULL값을 가진 데이터를 출력IS NOT NULL
: NULL값을 갖지 않는 데이터를 출력SELECT * FROM student WHERE address IS NULL;
ORDER BY은 특정 컬럼의 데이터를 중심으로 오름차순(ASC)이나 내림차순(DESC)으로 정렬하는 기능을 하는 절
SELECT 컬럼명,컬럼명1 FROM 테이블명
WHERE 컬럼이름 연산자 조건값
ORDER BY 컬럼명 정렬방식(ASC,DESC);
- 오름차순 (ASC) -> 기본 default로 생략가능
- 숫자 : 작은 값부터 정렬
- 문자 : 사전 순서대로 정렬
- 날짜 : 빠른 날짜 순서로 정렬
- NULL : 가장 마지막에 나옴
- 내림차순 (DESC)
- 숫자 : 큰 값부터 정렬
- 문자 : 사전 순서 반대로 정렬
- 날짜 : 늦은 날짜 순서로 정렬
- NULL : 가장 먼저 나옴
SELECT * FROM student
ORDER BY stdent_class ASC, student_name DESC;
SELECT * FROM student
ORDER BY 6 ASC, 5 DESC;
SELECT DEPT_CODE, SALARY, BONUS
FROM EMPLOYEE
ORDER BY BONUS DESC NULLS LAST;
데이터들을 원하는 그룹으로 나눌때 사용.
그룹을 나누고자 하는 컬럼명을 GROUP BY절 뒤에 추가하여 사용한다.
컬럼의 중복값들 끼리만 집계를 할 수 있게 해줌. 그룹별로 중복값이 있어야 한다. 그룹은 유일한 값끼리 묶이면 안됨!
부서별 임금의 합계는
SELECT DEPT_CODE, SUM(SALARY) FROM EMPLOYEE WHERE DEPT_CODE IS NOT NULL GROUP BY DEPT_CODE;
- 리절트셋의 기준으로 그룹바이
- NULL도 널끼리 그룹으로 묶임.
그룹함수에 대한 조건을 설정할때 사용
HAVING의 위치는 GROUP BY바로 뒤에 들어감.
부서별 월급의 평균이 300만원보다 큰 부서는조회
SELECT DEPT_CODE, AVG(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE HAVING AVG(SALARY)>=3000000;
SELECT 컬럼,컬럼....
--5FROM 테이블명
--1[WHERE 조건식]
--2[GROUP BY 컬럼명...]
--3[HAVING 조건식]
--4[ORDER BY 컬럼]
--6출처 및 참고자료