나는 실습용테이블이 없어서 직접 다넣어놓고 실습했다.
EMP 테이블
employee약어로 사원정보가 들어가있다.
DEPT 테이블
department약어로 회사 부서정보가 들어가있다.
SALGRADE 테이블
salary grade약어로 사원들의 급여정보이다.
셀렉션
행단위로 조회하는 방법이다.
프로젝션
열단위로 조회하는 방법이다.
셀렉션과 프로젝션을 함께 사용할 수도 있다.
조인
두개 이상의 테이블을 연결하여 하나의 테이블인것처럼 데이터를 조회하는 방식
→사실 이런 용어는 중요하지않고 어떻게 쓰냐가 중요함
sql문의 기본구성은 이렇다
SELECT [조회할 열이름1],[조회할 열이름2]...[N열 이름]
FROM [조회할 테이블 이름];
*로 테이블 전체 조회하기
SELECT *
FROM EMP;
테이블 부분 열 출력하기
emp테이블에서 사원번호, 사원이름, 부서번호만 조회하면,
SELECT EMPNO, ENAME, DEPTNO
FROM EMP;
distinct는 select절에 열이름을 명시하기전 선택적으로 사용하면 된다.
DISTINCT로 중복제거하기전
SELECT DEPTNO
FROM EMP;
DISTINCT로 열 중복 제거하기(열이 한 개인 경우)
SELECT DISTINCT DEPTNO
FROM EMP;
DISTINCT로 열 중복 제거하기(열이 여러 개인 경우)
SELECT DISTINCT JOB, DEPTNO
FROM EMP;
job과 deptno 둘다고려해서 중복된경우만 삭제한다.
ALL로 중복되는 열 제거 없이 그대로 출력하기
SELECT ALL JOB, DEPTNO
FROM EMP;
ALL은 기본으로 설정되어 있다.
앞서 배운 select문에서 select절에 명시된 열이름이 결과로 뜨는데, select문에 쓰인 열이름 대신 다른 이름을 붙일수 있다. 이를 별칭, alias라고 한다.
왜쓰는가?
열과 연산식
열에 연산식을 사용하여 출력할 수 있다.
SELECT ENAME, SAL, SAL*12+COMM, COMM
FROM EMP;
null이 나오는것은 COMM에 null값이 있어 연산이 불가능하기 때문.
만약, SAL*12+COMM을 SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+COMM으로 바꾼다면,
SELECT ENAME, SAL, SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+SAL+COMM, COMM
FROM EMP;
이렇게 찍히는데, 열 이름이 그렇게 좋아보이진 않는다. 그래서 별칭을 사용한다.
SELECT ENAME, SAL, SAL*12+COMM as ANNSAL, COMM
FROM EMP;
이렇게.
별칭을 지정하는 방식은 as를 안쓰고 그냥 띄어쓰는방법, 큰따옴표를 쓰는방법등 여러가지가 있는데, 그냥 as를쓰고 한칸띄우고 별칭을 다는 방법만 쓰자.
왜냐면 그게 직관적으로 보기편하고 큰따옴표를 쓰면 javascript에서 혼란이 있을 수 있기 때문이다.
ORDER BY절은 SELECT문을 작성할때 가장 마지막 부분에 작성한다.
ASC
오름차순정렬이다. 기본이 오름차순 정렬이기 때문에 안써도 무방하다.
DESC
내림차순정렬이다.
EMP테이블에서 급여기준으로 내림차순
SELECT *
FROM EMP
ORDER BY SAL DESC;
각각의 열에 내림차순과 오름차순 동시에 사용하기
EMP테이블의 전체열을 부서번호(오름차순)와 급여(내림차순)로 정렬하기
SELECT *
FROM EMP
ORDER BY DEPTNO ASC, SAL DESC;
이경우에 부서번호로 일단 오름차순으로 내고, 그다음 그안에서 급여로 내림차순 정렬을 한것이다.
정처기나 문제에서는
"부서번호로 오름차순정렬하시오. 부서번호가 같다면 급여순서대로 내림차순 정렬하시오"
이런식으로 나오는데, 자칫IF 조건문처럼 보일수 있지만, 속지말자.
ORDER BY절 사용시 주의사항
꼭필요한 경우가 아니라면 사용하지 않는것이 좋다.
왜냐하면 정렬하는데도 메모리자원 즉 비용이 들고, 시간도 많이 걸리기 때문에 SQL문의 효율이 떨어진다. → 알고리즘문제
정렬을 해야하는 경우는 select문을 통해 조회 데이터가 확정된 상태에서 정렬을 한다.