SQL-연산자01
SQL이란?
- Structured Query Language(구조적인 질의어)
종류
- 데이터 정의어(DDL): Data Definition Language (중요)
- 객체(예:table, view, sequence, trigger)에 대한 생성, 삭제, 변경, 이름변경, 데이터 잘라내기
- 데이터베이스 관리자나 응용프로그래머가 데이터베이스의 논리적인 구조를 정의하기 위한 언어.
- 명령어: CREATE(객체추가), DROP(객체삭제), ALTER(열삭제), RENAME(객체이름변경), TRUNCATE(잘라내기)
- 데이터 조작어(DML): Data Manipulation Language (매우 중요)
- 데이터베이스에 저장된 데이터를 조작(추가,삭제,수정)하기 위해 사용하는 언어.
- 명령어: INSERT, DELETE, UPDATE
- 데이터 제어어(DCL): Data Control Language
- 데이터베이스에 대한 접근 권한 부여등의 데이터베이스 시스템의 관리를 위한 목적으로사용되는 언어
- 명령어: GRANT(권한부여), REVOKE(권한회수)
- 데이터 질의어(DQL): Data Query Language (매우 중요)
- 데이터 (행렬) 검색, 조회 명령어
- 명령어: SELECT
- 일련의 과정 제어어 (TCL) : Transaction Control Language
- transaction 관리 - 논리적인 작업의 단위
- 공동 작업에서 의미가 있음. 개인작업은 의미없음.
- 명령어: COMMIT(일련의 과정이 끝날 때 - 멀티캠퍼스 과정 끝났을 때가 COMMIT), ROLLBACK(일련의 과정 속 오류떴을 때 롤백), SAVEPOINT
각 테이블의 구조(컬럼명,자료형) 검색
- DESC 테이블명
- 테이블을 구성하는 컬럼과 자료형을 표현.
테이블에 저장된 데이터에 대한 검색(조회)
-
형식 : SELECT (조회하고싶은)컬럼명 FROM (컬럼이 속한)테이블명 WHERE 조건식;
- sql은 대소문자 구분하지 않음
- sql은 명령문을 왼쪽에서 오른쪽이 아니라 오른쪽에서 왼쪽으로 읽는다.
- sql에서 문자와 문자열 구분없이 인용부호 ‘ ‘를 사용한다. (자바와 다른 점)
select '안녕하세요' from dual; select 2*3 from dual; // 이런 식으로도 가능
- 별칭 사용하기
select '안녕하세요' as msg from dual;
- as 생략 가능
select empno 사원번호 from emp;
- 별명에 띄어쓰기 들어가면 “ “ 를 사용해야함.
select empno "사원 번호" from emp;
- 컬럼에 산술연산도 가능
select sal, sal*12 as yearsal from emp; // 급여와 연봉 출력 SAL YEARSAL ------ ---------- 800 9600 1600 19200 1250 15000 2975 35700 1250 15000 2850 34200
- 접합연산자 : || → 부드러운 문장 출력 가능
select ename||'사원의 직책은 '||job||'입니다.' as 직책정보 from emp; 직책정보 ------------------------------------ SMITH사원의 직책은 CLERK입니다. ALLEN사원의 직책은 SALESMAN입니다. WARD사원의 직책은 SALESMAN입니다. JONES사원의 직책은 MANAGER입니다. MARTIN사원의 직책은 SALESMAN입니다.
- 결과값에 대한 중복제거
- 형식 : select distinct 중복이 예상되는 컬럼명 from 테이블명;
select distinct job from emp; JOB --------- CLERK SALESMAN PRESIDENT MANAGER ANALYST
- 형식 : select distinct 중복이 예상되는 컬럼명 from 테이블명;
- 10과 3의 사칙연산의 결과를 출력하는 sql문을 작성하시오.
select 10+3 as 더하기, 10-3 as 빼기, 10*3 as 곱하기, 10/3 as 나누기 from dual; 더하기 빼기 곱하기 나누기 ---------- ---------- ---------- ---------- 13 7 30 3.33333333
SQL 명령어 특징
- 관계형 데이터베이스의 ANSI표준언어
- 여러줄실행
- 종결문자필요 ;
- 키워드 단축 불가
- 버퍼에 마지막 명령문 저장
- 대소문자 구분없음 (단, 데이터를 표시할때는 반드시 대소문자를 구분함★)
where절
- 조건절, 출력행을 제어하는 역할
- 형식 : select 컬럼명 from 테이블명 where 조건식;
-
select는 열 제어, where은 행 제어
- 조건식의 구성
- where 기준 컬럼명 연산자(비교연산자, LIKE, IN, BETWEEN) 비교데이터
- 비교연산자
- 크거나 작거나 → <, <=, >, >=
- 같다 → = // 자바랑 다름. 자바는 ==
- 다르다 → !=, ^=, <> // 자바랑은 !=만 공통됨.
select empno, ename, deptno from emp where deptno = 30; EMPNO ENAME DEPTNO ----- -------------------- ---------- 7499 ALLEN 30 7521 WARD 30 7654 MARTIN 30 7698 BLAKE 30 7844 TURNER 30 7900 JAMES 30 // 이런 식으로 이용
- 데이터비교는 대소문자를 확실히 비교해야한다.
select empno, ename, hiredate, deptno from emp where ename = 'smith'; //이건 에러 select empno, ename, hiredate, deptno from emp where ename = "smith"; EMPNO ENAME HIREDATE DEPTNO ---------- -------------------- -------- ---------- 7369 SMITH 80/12/17 20
- 날짜 비교의 정석
SELECT EMPNO, ENAME, DEPTNO, HIREDATE FROM EMP WHERE HIREDATE > '810601'; // 야매 SELECT EMPNO, ENAME, DEPTNO, HIREDATE FROM EMP WHERE HIREDATE > to_date(810 601); // 정석 EMPNO ENAME DEPTNO HIREDATE ---------- -------------------- ---------- -------- 7654 MARTIN 30 81/09/28 7782 CLARK 10 81/06/09 7788 SCOTT 20 87/04/19 7839 KING 10 81/11/17 7844 TURNER 30 81/09/08 7876 ADAMS 20 87/05/23 7900 JAMES 30 81/12/03 7902 FORD 20 81/12/03 7934 MILLER 10 82/01/23
like 연산자
- 형식 : 컬럼명 like ‘pattern’
- 패턴과 닮은 컬럼이 속한 행을 조회
- 패턴 내의 예약문자 (횟수를 표현하는 문자)
- % : 0~n개의 문자를 대체
- _ : 단 1개의 문자를 대체
-
%, _ 이거를 사용하지않으면 LIKE연산자는 큰 의미가 없음.
문자데이터 예) ‘a’, ‘ab’, ‘ad’, ‘abc’, ‘abbbbbbb’, ‘bababa’
-
like ‘a%’ ===> ‘a’문자로 시작하는 데이터 —> ‘a’, ‘ab’, ‘ad’, ‘abc’, ‘abbbbbbb’
- like ‘a__’ —> ‘abc’
-
like ‘%a’ ===> ‘a’문자로 끝나는 데이터 —> ‘a’, ‘bababa’
-
like ‘__c’ —> ‘abc’
-
likc ‘%a%’ ===> ‘a’문자를 포함하는 데이터 ===> ‘a’, ‘ab’, ‘ad’, ‘abc’, ‘abbbbbbb’, ‘bababa’
- 문제) 이름이 ‘A’로 시작하는 사원의 사원번호, 사원명, 급여를 출력하시오.
select empno,ename,sal from emp where ename like 'A%'; EMPNO ENAME SAL ----- -------------------- ---------- 7499 ALLEN 1600 7876 ADAMS 1100
- 문제) 이름이 ‘S’로 끝나는 사원의 사원번호, 사원명, 급여를 출력하시오.
select empno,ename,sal from emp where ename like '%S'; EMPNO ENAME SAL ------ -------------------- ---------- 7566 JONES 2975 7876 ADAMS 1100 7900 JAMES 950
- 문제) 이름에 ‘A’문자가 포함된 사원의 사원번호, 사원명, 급여를 출력하시오.
select empno,ename,sal from emp where ename like '%A%'; EMPNO ENAME SAL ----- -------------------- ---------- 7499 ALLEN 1600 7521 WARD 1250 7654 MARTIN 1250 7698 BLAKE 2850 7782 CLARK 2450 7876 ADAMS 1100 7900 JAMES 950
- 문제) 이름의 세번째 문자에 ‘A’가 들어가는 사원의 사원번호, 사원명, 급여를 출력하시오.
select empno,ename,sal from emp where ename like '__A%'; EMPNO ENAME SAL ----- -------------------- ---------- 7698 BLAKE 2850 7782 CLARK 2450 7876 ADAMS 1100
- DML로 새로운 행 추가하기
insert into emp (empno, ename, sal) values (8000, '홍%길동', 2500);
- 문제) 이름에 ‘%’문자가 포함된 사원의 사원번호, 사원명, 급여를 출력하시오.
- 참고) ESCAPE옵션: ‘%’ 또는 ‘_’ 를 와일드 카드가 아닌 문자의 의미를 가지고자 할 때 사용. —> 컬럼명 LIKE ‘패턴’ ESCAPE ‘부호’ ;
select empno,ename,sal from emp where ename like '%%%'; // 잘못된 방법 select empno,ename,sal from emp where ename like '%\%%' ESCAPE '\'; // 올바른 방법 EMPNO ENAME SAL ----- -------------------- ---------- 8000 홍%길동 2500
- rollback ; —-> insert작업 (홍%길동 행 추가한 작업)을 취소!!
in 연산자
- 문제) 커미션을 300 또는 500 또는 1400받는 사원들의 사원번호, 사원명, 부서번호, 커미션을 출력.
select empno, ename, deptno, comm from emp where comm=300 or comm=500 or comm=1400; // 이게 너무 복잡하므로 select empno, ename, deptno, comm from emp where comm in (300, 500, 1400); // 이렇게 IN연산자를 사용 EMPNO ENAME DEPTNO COMM ------ -------------------- ---------- ---------- 7499 ALLEN 30 300 7521 WARD 30 500 7654 MARTIN 30 1400
BETWEEN AND 연산자
- 범위 조건시 사용
- 형식) BETWEEN a AND b ===> a이상 b이하 (BETWEEN 최소값 AND 최대값)
- 주의) BETWEEN AND 연산자는 초과와 미만은 표현을 못함!!
- 문제) 급여가 1600 이상이고 3000 이하인 사원의 사원번호, 사원명, 급여를 출력하시오.
select empno, ename, sal from emp where sal>=1600 AND sal<=3000; // 이건 너무 복잡하므로 select empno, ename, sal from emp where sal between 1600 and 3000; // 이렇게 BETWEEN AND 연산자를 사용 EMPNO ENAME SAL ----- -------------------- ---------- 7499 ALLEN 1600 7566 JONES 2975 7698 BLAKE 2850 7782 CLARK 2450 7788 SCOTT 3000 7902 FORD 3000
댓글남기기