기출 및 노랭이 풀면서 시험에 필요한 개념위주로 정리했습니다.
모든 개념을 담지 않았습니다. 대강 이런게 나오는구나하고 참고해주시면 감사합니다.
💡 1과목 공부 꼭 해야하는 것
💡 2과목 공부 꼭 해야하는 것 - SQL 문은 대부분 Oracle 기준으로 씀(Oracle 이나 SQL Server 기준으로 쿼리 알면 됨)
TOP()
, ROWNUM
모델링 : 시스템 구현+ 업무,업무형상화 목적
SELECT
INSERT, DELETE, UPDATE
INSERT INTO 테이블명 (칼럼리스트) VALUES (칼럼 값);
UPDATE 테이블명 SET 수정되어야할 칼럼명 = 값; DELETE FROM 테이블명;
SELECT 칼럼리스트 FROM 테이블명;
DROP, CREATE, ALTER, RENAME, TRUNCATE
ALTER TABLE DEPT ALTER COLUMN VARCHAR(30) NOT NULL;
ALTER TABLE 테이블명 ADD 칼럼명 데이터 유형; - 여러개 컬럼 동시수정 불가(SQL Server)
ALTER TABLE 테이블명 DROP COLUMN 칼럼명;
ALTER TABLE 테이블명 MODIFY (칼럼명 데이터유형 DEFAULT식 NOT NULL); - 칼럼 데이터 유형, 조건 등 변경 / Oracle
ALTER TABLE 테이블명 ALTER (칼럼명 데이터유형 DEFAULT식 NOT NULL); / SQL Server
ALTER TABLE 테이블명 RENAME COLUMN 변경전칼 럼명 TO 뉴칼럼명; Ora
ALTER TABLE 테이블명 DROP CONSTRAINT 조건명; 제약조건 삭제
ALTER TABLE 테이블명 ADD CONSTRAINT 조건명 조건 (칼럼명); 조건 추가
RENAME 변경전테이블명 TO 변경후테이블명; Ora
sp_rename ‘db0.TEAM’,‘TEAM_BACKUP’; SQL
sp_rename 변경전칼럼명, 뉴칼럼명, ‘COLUMN’; SQ
DROP TABLE 테이블명 [CASCADE CONSTRAINT] CASCADE CONSTRAINT : 참조되는 제약조건 삭제
TRUNCATE TABLE 테이블명; 행 제거, 저장공간 재 사용
- 01 : CREATE TABLE TAB1 (N1 NUMBER, N2 NUMBER);
- 02 : INSERT INTO TAB1 VALUES (1,1);
- 03 : INSERT INTO TAB1 VALUES (2,2);
- 04 : CREATE TABLE TAB2 (V1 VARCHAR2(10), V2 VARCHAR2(10));
- 05 : ROLLBACK;
- 06 : SELECT COUNT(*) FROM TAB1; // 2
SELECT DEPTNO, COUNT(EMPNO)
FROM SCOTT.EMP
WHERE SAL >= 500
GROUP BY DEPTNO
HAVING COUNT(EMPNO) > 2
ORDER BY DEPTNO;
FROM과 JOIN
JOIN이 먼저 실행되어 데이터가 SET으로 모아지게 됌.여기에는 서브쿼리도 함께 포함되어 임시적인 테이블을 만들 수 있게 도와줌.
WHERE
데이터셋을 형성하게 되면 WHERE의 조건이 개별 행에 적용이 된다.
이 WHERE절의 제약 조건은 FROM절로 가져온 테이블에 적용이 될 수 있다.
GROUP BY
WHERE의 조건 적용 후 나머지 행은 GROUP BY절에 지정된 열의 공통 값을 기준으로 그룹화된다.
쿼리에 집계 기능이 있는 경우에만 이 기능을 사용해야 한다.
HAVING
GROUP BY 절이 쿼리에 있을 경우 HAVING 절의 제약조건이 그룹화된 행에 적용됌.
SELECT
SELECT에 표현된 식이 마지막으로 적용됌.
DISTINCT
표현된 행에서 중복된 행은 삭제됌
ORDER BY
지정된 데이터를 기준으로 오름차순, 내림차순을 지정
LIMIT / OFFSET
LIMIT와 OFFSET에서 벗어나는 행들이 제외되어서 출력됨
EMP.DEPTNO
같은 owner 명 기재 불가)SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME FROM EMP NATURAL JOIN DEPT; // ERROR
두 테이블간 동일한 이름과 형식의 컬럼이 둘 이상인 경우 natural join 사용 불가. 이때 using 사용
SELECT *
FROM DEPT JOIN DEMPT_TEMP
USING (DEPTNO);
SELECT col1, (SELECT ...) -- 스칼라 서브쿼리(Scalar Sub Query): 하나의 컬럼처럼 사용 (표현 용도)
FROM (SELECT ...) -- 인라인 뷰(Inline View): 하나의 테이블처럼 사용 (테이블 대체 용도)
WHERE col = (SELECT ...) -- 일반 서브쿼리: 하나의 변수(상수)처럼 사용 (서브쿼리의 결과에 따라 달라지는 조건절)
NVL(v1,v2)
: Null 이 컬럼에 포함된 경우 어떠한 값으로 치환하는 함수v1 에 null 이 있다면 v2 로 치환 보통 문자면 ‘X’, 숫자면 0 으로 치환함
SELECT COL1, COL2
FROM TAB1
WHERE NVL(COL1, 'X') <> 'A01';
COL1이 NULL 인 경우 ‘X’ 로 치환, 그 후 COL1값이 ‘A01’이 아니면 출력 → 보통 Null 행도 출력하기 위해 사용함(해당 함수를 사용하지 않는다면 Null인 행은 자동으로 배제되고 출력됨)
실행결과
<TAB1 테이블 구조>
COL1 COL2
A01 10
A02 20
A03 30
NULL 40
NULL 50
<실행 결과>
CO1 CO2
A02 20
A03 30
NULL 40
NULL 50
ISNULL(v1,v2)
: NVL과 동일COALESCE(v1,v2,...,vn)
: 모든 v들이 null이면 null 반환하지만, 하나라도 아닌 경우 null이 아닌 최초의 표현식을 반환NULLIF(v1,v2)
: 특정값을 NULL로 대치하기 위한 함수+
, ||
(연산자), CONCAT
,trim
AVG
SUM
COUNT
이외의 다른 집계함수는 아무 결과가 없다면 NULL → NVL
함수 필요
SELECT nvl(count(*), 9999) from table where 1=2 // 0
COUNT(*)
: NULL 포함해서 결과 반환COUNT(column)
: 해당 컬럼값이 NULL 인것 제외해서 결과 반환DECODE(칼럼,조건1,결과1,조건2,결과2,...)
NULL
반환CASE
: 최근 권장ELSE
없고 해당값이 아니면 NULL
반환윈도우 함수 개념 정리
- https://velog.io/@yewon-july/Window-Function
SELECT WINDOW_FUNCTION(ARGUMENTS)
OVER (PARTITION BY 칼럼
ORDER BY WINDOWING절
RANGE BETWEEN start_point AND end_point)
FROM 테이블명;
WINDOW_FUNCTION 가능한 것
PARTITION_BY
: group by 과 비슷
RANGE BETWEEN start_point AND end_point
: 누적 평균 낼 수 있음
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
: 누적평균UNBOUNDED PRECEDING
: start_point만 들어갈 수 있으며, 파티션의 first rowUNBOUNDED FOLLOWING
: end_point만 들어갈 수 있으며, 파티션의 last rowCURRENT ROW
: start, end_point 둘다 가능. 윈도우는 CUREENT ROW에서 start하거나 end 함SELECT COL1, COL2,
ROUND ( AVG (COL3)
OVER( PARTITION BY COL1 ORDER BY COL3
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) , 0)
AS 누적평균
FROM TAB1
ORDER BY COL1, COL3;
ROLLUP
CUBE
GROUPING SETS
https://velog.io/@dongchyeon/오라클Oracle-그룹-함수-ROLLUP-CUBE-GROUPING-등
IN
COL1 IN(NULL, 'A')
: COL1 = Null or COL1 = ‘A’ 로 치환됨. 결과는 null인 행은 출력안함COL1 NOT IN(NULL, 'A')
: NOT IN의 조건절에 NULL
이 하나라도 포함되면 아무행도 출력안함SELECT * FROM A WHERE A.v1 IN (SELECT B.v1 FROM B)
: not goodtrue
SELECT * FROM A WHERE EXISTS (SELECT 'X' FROM B WHERE A.v1 = B.v1)
: good=
COL1=NULL
: NULL 을 비교시 항상 False를 함. 따라서 실제 Null인 행이 있어도 출력 암것도 안함IS
, IS NOT
SUM
SUM(NULL, 1)
: 1INTERSECT
UNION
UNION ALL
: 중복 제거하기 위한 정렬 안함[데이터]
TABLE A
COL1 COL2
-----------
1 2
1 2
1 3
TABLE B
COL1 COL2
-----------
1 2
1 4
1 5
[SQL]
SELECT DISTINCT COL1, COL2 FROM TAB_A
UNION ALL
SELECT COL1, COL2 FROM TAB_B;
// 결과 : 5
HAVING COUNT(*)
SELECT 주문일자, 고객명, COUNT(*)
FROM TAB1
GROUP BY 주문일자,고객명
HAVING COUNT(*) >= 2;
order by case ROWNUM when 3 then 0
)select a,b,c
일때 a 가 1, b가 2, c가 3, 만약 여기서 order by 4
하면 오류남(4에 해당하는 칼럼이 없으므로)group by col1 order by count(*)
: col1에 따라 개수 셈select user_name as name from dept order by name
group by
절 내에서는 alias 로 명명지은 이름 사용 불가 (group by 는 select 이전에 실행되기 때문)TOP
(SQL Server), ROWNUM
: OracleSELECT ENAME, SAL
FROM (SELECT ENAME, SAL
FROM SCOTT.EMP
ORDER BY SAL DESC)
WHERE ROWNUM < 4 ;
SELECT TOP(3) ENAME,SAL
FROM SCOTT.EMP
ORDER BY SAL DESC
SELECT *
FROM SCOTT.EMP A,
SCOTT.DEPT B
WHERE A.DEPTNO = B.DEPTNO AND B.DNAME = 'SALES'
SELECT *
FROM SCOTT.EMP A INNER JOIN SCOTT.DEPT B
ON A.DEPTNO = B.DEPTNO
WHERE 1=1
AND B.DNAME ='SALES';
--문법--
CREATE VIEW 뷰이름[(속성이름[,속성이름])]AS SELECT문;
--고객 테이블에서 주소가 서울시인 고객들의 성명과 전화번호를 서울고객이라는 뷰로 만들어라--
CREATE VIEW 서울고객(성명, 전화번호)
AS SELECT 성명 전화번호
FROM 고객
WHERE 주소 = '서울시';
--문법--
DROP VIEW 뷰이름 RESTRICT or CASCADE
--서울고객이라는 뷰를 삭제해라--
DROP VIEW 서울고객 RESTRICT;
RESTRICT : 뷰를 다른곳에서 참조하고 있으면 삭제가 취소된다.SELECT MAX(LEVEL)
FROM SCOTT.EMP
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;
:OLD
: 기존 데이터:NEW
: 변경될 데이터<>
, !=
, ^=
, NOT
)는 인덱스 사용 불가