🧑‍💻/SQL

SQL) Oracle vs SQL Server 명령어 전체 비교 (2)

유리맥 2021. 3. 24. 00:04
반응형

이전 포스트를 참고해주세요! 😄

[🧑‍💻/SQL] - SQL) Oracle vs SQL Server 명령어 전체 비교 (1) - DDL, DML, ...


집합연산자

  Oracle Database SQL Server
합집합 (중복 행 제외, 정렬 O) UNION UNION
합집합 (중복 행 포함, 정렬 X) UNION ALL UNION ALL
교집합 INTERSECT INTERSECT
차집합 MINUS EXCEPT
곱집합 CROSS JOIN CROSS JOIN


조인

  Oracle Database SQL Server
조건에서 동일한 값이 있는 행만 반환 테이블1 INNER JOIN 테이블2 ON|USING ( 조건 ) 테이블1 INNER JOIN 테이블2 ON ( 조건 )
동일한 이름을 갖는 모든 컬럼에 대해 EQUI JOIN 테이블1 NATRUAL JOIN 테이블2 ON|USING ( 조건 ) 없음
좌측 테이블로 데이터를 읽어 온다. 조건이 맞지 않으면 NULL로 채움. 테이블1 LEFT [OUTER] JOIN 테이블2 ON|USING ( 조건 ) 테이블1 LEFT [OUTER] JOIN 테이블2 ON ( 조건 )
우측 테이블로 데이터를 읽어 온다. 조건이 맞지 않으면 NULL로 채움 테이블1 RIGHT [OUTER] JOIN 테이블2 ON|USING ( 조건 ) 테이블1 RIGHT [OUTER] JOIN 테이블2 ON ( 조건 )
좌우측 테이블의 모든 데이터를 읽어 온다. 중복 행 삭제 테이블1 FULL [OUTER] JOIN 테이블2 ON|USING ( 조건 ) 테이블1 FULL [OUTER] JOIN 테이블2 ON ( 조건 )
M*N 건의 데이터 조합을 반환 테이블1 CROSS JOIN 테이블2 테이블1 CROSS JOIN 테이블2


계층형 질의

  Oracle Database
계층 구조 전개의 시작(루트) 위치 지정 START WITH
다음에 전개될 자식 데이터 지정 CONNECT BY 
부모 -> 자식 순방향 전개
자식 -> 부모 역방향 전개
PRIOR 자식 = 부모
PRIOR 부모 = 자식
동일한 데이터 전개 X NOCYCLE
동일 LEVEL 사이 정렬 ORDER SIBLINGS BY
루트는 1, 하위 데이터는 1씩 증가 LEVEL
리프 데이터면 1, 아니면 0 CONNECT_BY_ISLEAF
사이클 발생하면 1, 아니면 0 CONNECT_BY_ISCYCLE
루트부터 현재까지 경로 표시 SYS_CONNECT_ BY_PATH
루트 표시 CONNECT_BY_ROOT


예제로 보는 서브쿼리

  Oracle Databse SQL Server
단일 행 서브쿼리 (결과 1건 이하)
=, <, <=, >, >=, <>

SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버
FROM PLAYER
WHERE HEIGHT <= (SELECT AVG(HEIGHT) FROM PLAYER)
ORDER BY PLAYER_NAME;
다중 행 서브쿼리 (결과 여러 건 이하)
IN, ALL, ANY, SOME, EXISTS
SELECT REGION_NAME 연고지명, TEAM_NAME 팀명, E_TEAM_NAME 영문팀명
FROM TEAM
WHERE TEAM_ID IN (SELECT TEAM_ID FROM PLAYER WHERE PLAYER_NAME = '정현수')
ORDER BY TEAM_NAME;
다중 컬럼 서브쿼리 (결과 여러 컬럼 반환) SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT) FROM PLAYER GROUP BY TEAM_ID)
ORDER BY TEAM_ID, PLAYER_NAME;
없음

 



그룹 함수

  Oracle Databse SQL Server
N+1 레벨의 SubTotal 생성 / 순서 중요 ROLLUP(컬럼1[, 컬럼2, ...]) ROLLUP(컬럼1[, 컬럼2, ...])
결합 가능한 모든 값에 대해 다차원 집계 생성 CUBE(컬럼1[, 컬럼2, ...]) CUBE(컬럼1[, 컬럼2, ...])
개별 집계 생성 GROUPING SETS(컬럼1[, 컬럼2, ...]) GROUPING SETS(컬럼1[, 컬럼2, ...])
ROLLUP, CUBE, GROUPING SETS에 의한 SubTotal이면 1, 아니면 0 GROUPING(컬럼) GROUPING(컬럼)


예제로 보는 윈도우 함수

  Oracle Database SQL Server
-M ~ +N 범위 RANGE BETWEEN M PRECEDING AND N FOLLOWING
앞 M행 ~ 뒤 N행 범위 ROWS BETWEEN M PRECEDING AND N FOLLOWING
1,2,2,4 동일한 값에 대해 동일한 순서를 부여 SELECT JOB, ENAME, SAL, RANK( ) OVER (ORDER BY SAL DESC)  ALL_RANK, RANK( ) OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK FROM EMP;
1,2,2,3 동일한 순위를 하나의 등수로 간주 SELECT JOB, ENAME, SAL, DENSE_RANK( ) OVER (ORDER BY SAL DESC) DR FROM EMP;
1,2,3,4 동일한 값이라도 고유한 순위 부여 SELECT JOB, ENAME, SAL, ROW_NUMBER() OVER (ORDER BY SAL DESC) RN FROM EMP;
파티션별 카운트를 인수 값으로 N등분한 결과 SELECT ENAME, SAL, NTILE(4) OVER (ORDER BY SAL DESC) as QUAR_TILE FROM EMP
파티션별 윈도우의 합 SELECT MGR, ENAME, SAL, SUM(SAL) OVER (PARTITION BY MGR) MGR_SUM FROM EMP;
파티션별 윈도우의 최대값 SELECT MGR, ENAME, SAL, MAX(SAL) OVER (PARTITION BY MGR) as MGR_MAX  FROM EMP;
파티션별 윈도우의 최소값 SELECT MGR, ENAME, HIREDATE, SAL, MIN(SAL) OVER(PARTITION BY MGR ORDER BY HIREDATE) as MGR_MIN FROM EMP;
조건에 맞는 데이터의 평균값 SELECT MGR, ENAME, HIREDATE, SAL, ROUND (AVG(SAL) OVER (PARTITION BY MGR ORDER BY HIREDATE ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)) as MGR_AVG FROM EMP;
조건에 맞는 데이터의 개수 SELECT ENAME, SAL, COUNT(*) OVER (ORDER BY SAL RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) as SIM_CNT FROM EMP;
파티션별 윈도우의 첫번째 값 SELECT DEPTNO, ENAME, SAL, FIRST_VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC ROWS UNBOUNDED PRECEDING) as DEPT_RICH FROM EMP; 없음
파티션별 윈도우의 마지막 값 SELECT DEPTNO, ENAME, SAL, LAST_VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as DEPT_POOR FROM EMP; 없음
파티션별 윈도우의 이전 N번째 행의 값 SELECT ENAME, HIREDATE, SAL, LAG(SAL) OVER (ORDER BY HIREDATE) as PREV_SAL FROM EMP WHERE JOB = 'SALESMAN'; 없음
파티션별 윈도우의 이후 N번째 행의 값 SELECT ENAME, HIREDATE, LEAD(HIREDATE, 1) OVER (ORDER BY HIREDATE) as "NEXTHIRED" FROM EMP; 없음
파티션 내 전체 합에 대한 행별 컬럼 값의 백분율. >0, <=1 SELECT ENAME, SAL, ROUND(RATIO_TO_REPORT(SAL) OVER (), 2) as R_R FROM EMP WHERE JOB = 'SALESMAN'; 없음
파티션별 행의 순서 백분율. >=0, <=1 SELECT DEPTNO, ENAME, SAL, PERCENT_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) as P_R FROM EMP; 없음
현재 행보다 작거나 같은 건수에 대한 누적 백분율. >0, <=1 SELECT DEPTNO, ENAME, SAL, CUME_DIST() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) as CUME_DIST FROM EMP; 없음

 



DCL

  Oracle Databse SQL Server
시스템 권한 부여 GRANT CREATE TABLE | USER | ... TO 계정; GRANT CREATE TABLE | USER | ... TO 계정;
객체 권한 부여 GRANT SELECT | INSERT | DELETE | UPDATE ON 테이블 TO 계정;
GRANT SELECT | INSERT | DELETE | UPDATE ON 테이블 TO 계정;
ROLE 사용하여 권한을 한번에 부여 e.g.) CREATE ROLE LOGIN_TABLE;
GRANT CREATE SESSION, CREATE TABLE TO LOGIN_TABLE;
GRANT LOGIN_TABLE TO JISUNG;
dbcreater, sysadmin, db_owner 등 제공되는 ROLE 멤버에 참여하는 방식
시스템 권한 회수 REVOKE CREATE TABLE | USER | ...  FROM 계정; REVOKE CREATE TABLE | USER | ...  FROM 계정;
객체 권한 회수 REVOKE SELECT | INSERT | DELETE | UPDATE ON 테이블 FROM 계정; REVOKE SELECT | INSERT | DELETE | UPDATE ON 테이블 FROM 계정;
타 계정 테이블 접근 시 계정 이름으로 접근
e.g.) SELECT * FROM PJS.MENU;
스키마 이름으로 접근
e.g.) SELECT * FROM dbo.MENU


절차형 SQL

PL/SQL (Oracle Database) T-SQL (SQL Server)
CREATE Procedure Procedure_name ( argument1 mode data_type1, argument2 mode date_type2, ... ... ) IS AS ... ... BEGIN ... ... EXCEPTION ... ... END;

DROP Procedure Procedure_name;
CREATE Procedure schema_name.Procedure_name @parameter1 data_type1 mode, @parameter2 date_type2 mode, ... ... WITH AS ... ... BEGIN ... ... ERROR 처리 ... ... END;

DROP Procedure schema_name.Procedure_name;
DECLARE
     선언부(변수, 상수)
BEGIN
     실행부
EXCEPTION
     예외 처리부
END
DECLARE
     선언부(변수, 상수)
BEGIN
     실행부
ERROR 처리
     예외 처리부
END

 



2편 포스팅 마무리를 시험 끝나고 나서야 하게됐네요. 정신없이 바쁜 한 주 였어서.. ㅠㅠ
SQLD 시험 보기 전 마지막 핸드폰으로 스르륵 보는 것을 추천합니다. 💯💯💯

🌈 참고

반응형