반응형
💡 GROUP BY
  • GROUP BY 컬럼
    컬럼의 값 중 NULL도 있다면 NULL도 하나의 그룹이 될수 있음
    => 사원, 대리, 과장, 차장, 부장, 직급이 정해지지 않은(NULL)이 있을 때, 이를 직급 별로 group화 하면, 6개로 그룹화 가능
  • GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없음
  • 집계 함수는 WHERE 절에 올 수 없음
    =>집계 함수는 GROUP BY 절에서 사용 가능
  • WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거하는 역할 

 

💡 GROUP BY - HAVING 절 [53]
  • GROUP BY가 없다고 해서 HAVING에 오류가 발생하지는 않는다
    예시)
SELECT SUM(주문금액) AS 합계
FROM 주문
HAVING AVG(주문금액) > 100;

 

=> GROUP BY가 생략된 경우, 적절한 PK로 그룹핑 되고, 그 그룹의 주문 금액 평균이 100보다 크다면 해당 주문금액들의 총합을 출력하는 쿼리이다.

주문ID | 주문금액
-----------------
1      | 80
2      | 120
3      | 90
4      | 110
5      | 95


 이와 같은 테이블이 있다면, 주문ID에 대해 자동 그룹핑될 것이고, 해당 그룹마다 평균 주문금액이 100보다 큰 것은, 주문ID 2와 4의 그룹이므로, 해당 그룹의 주문 금액 합은 120+110=230이다.

합계
-----
230

 

 

  • COUNT와 같은 집계함수를 AVG함수로 감싸 평균을 구할 수 없다
    COUNT는 말 그대로 카운트 한 값을 한 레코드로 출력하는 것이고, 이의 평균이랄 것으로 나눌 값이 명시되지 않기 때문에 AVG함수와 함께 쓸 수 없다
    예시)
SELECT 메뉴ID, 사용유형코드, AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용이력
GROUP BY 메뉴ID, 사용유형코드;

 

 

💡 ORDER BY [56] [57]
  • GROUP BY를 사용할 경우 GROUP BY 표현식이 아닌 값은 기술될 수 없음
    예시)
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 년 DESC;

=> 지역에 대해서 그룹핑 되어 매출금액의 SUM을 구하기 때문에, 이를 년이라는 컬럼으로 ORDER할 수 없다

 

  • ORACLE에서는 NULL값을 가장 큰 값으로 간주
    => 오름차순 정렬 시 NULL이 가장 마지막에
    => 내림차순 정렬 시 NULL이 가장 먼저
  • SQL server에서는 NULL을 가장 작은 값으로 간주
    => 오름차순 정렬 시 NULL이 가장 먼저
    => 내림차순 정렬 시 NULL이 가장 마지막에
  • ORDER BY정레 컬럼명 대신 ALIAS 명이나 컬럼 순서를 나타내는 정수를 혼용하여 사용할 수 있음

 

💡 SELECT 문장 실행 순서 [59]

FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

 

 

💡 TOP() 질의문 
  • SQL server의 TOP N 질의문에서 N에 해당하는 값이 동일한 경우 함께 출력되도록 하는 WITH TIES 옵션을 ORDER BY 절과 함께 사용해야 함
  • 예시)
    SELECT TOP(3) WITH TIES 팀명, 승리건수
    FROM 팀별성적
    ORDER BY 승리건수 DESC;

    =>팀별성적에서 팀명과 높은 순으로 승리건수를 조회하는데, 가장 위 3개를 조회한다. 단 3위의 승리건수와 동일한 팀이 있다면 해당 팀까지도 같이 출력한다.
     

 

💡 EQUI JOIN 문장
  • SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
    FROM 테이블1, 테이블2
    WHERE 테이블1.칼럼명1=테이블2.칼럼명2;
    => WHERE 절에 JOIN 조건을 넣음
  • SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
    FROM 테이블1 INNER JOIN 테이블2
    ON 테이블1.칼럼명1=테이블2.칼럼명2;
    => ON 절에 JOIN 조건을 넣음

 

💡 JOIN
  • 일반적으로 JOIN은 PK와 FK 값의 연관성에 의해 성립됨
  • DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 2개씩 묶어서 JOIN을 처리함
  • EQUI JOIN은 JOIN에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법임
  • EQUI JOIN은 = 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN임
  • 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있음
반응형
반응형
💡 비절차적 데이터 조작어(DML) VS 절차적 데이터 조작어(ORACLE / SQL server) [4]
  • 비절차적 데이터 조작어는 사용자가 무슨(what) 데이터를 원하는 지만을 명세
  • 절차적 데이터 조작어는 어떻게(how) 데이터를 접근해야 하는지 명세

💡 DDL / DML / DCL / TCL 
  • DDL : CREATE, DROP, ALTER, RENAME
  • DML : SELECT, INSERT, UPDATE, DELETE
  • DCL : GRANT, REVOKE
  • TCL : COMMIT, ROLLBACK

 

💡 SQL server [7]
  • SQL server에서는 여러개의 컬럼을 동시에 수정하는 구문은 지원하지 않는다.
  • SQL server에서는 괄호를 사용하지 않는다.

 

💡 PK / UNIQUE
  • PK : UNIQUE & NOT NULL
  • UNIQUE : 테이블 내 중복 값 x, NULL 입력 가능

 

💡 테이블명-칼럼명 설정 규칙
  • 반드시 문자로 시작
  • A-Z, a-z, 0-9, $, _, #

 

💡 외래키
  • 외래키 값은 널 값을 가질 수 있음
  • 한 테이블에 여러개 존재 가능

 

💡 컬럼 삭제 sql [16]
  • ALTER TABLE 테이블명 DROP COLUMN 컬럼명;

 

💡 참조무결성 규정 [19]
  • DELETE/MODIFY
    CASCADE : master 삭제시 child 같이 삭제
    Set Null : master 삭제 시 child 해당 필드 Null
    Set Default : master 삭제 시 child 해당 필드 Default 값으로 설정
    Restrict : child 테이블에 PK 값이 없는 경우만 master 삭제 허용
    No Action : 참조무결성을 위반하는 삭제/수정 액션을 취하지 않음
  • INSERT
    Automatic : master 테이블에 PK가 없는 경우 master PK를 생성 후 child 입력
    Dependent : master 테이블에 PK가 존재할 때만 child 입력 허용

 

💡 테이블 이름 변경 sql [18]
  • RENAME 구이름 TO 새이름;

 

💡 제약조건에 따른 실행 [22]
  • FK에 대한 제약조건으로, DELETE 시 SET NULL = 부모 키가 DELETE되면 해당 FK는 NULL을 갖도록 설정
  • 그런데, 문제에서는 해당 FK 컬럼이 NOT NULL로 지정되어 있기 때문에, 위와 같이 설정되어 있더라도 NULL 값을 가질 수 없으므로, 이와 같이 수행되는 SQL문은 오류가 발생함 

 

💡 DELETE [23]

 

Q. 개발 프로젝트의 표준은 모든 삭제 데이터에 대한 로그를 남기는 것을 원칙으로 하고, 테이블 삭제의 경우는 허가된 인력만이 정기적으로 수행 가능하도록 정하고 있다. 개발팀에서 사용 용도가 없다고 판단한 STADIUM 테이블의 데이터를 삭제하는 가장 좋은 방법은 무엇인가?

 

A. DELETE FROM STADIUM;

 

  • DELETE는 로그는 남기고, 데이터만 삭제한다.
  • TRUNCATE TABLE과 DROP은 로그를 남기지 않으므로 해당하지 않는다.

 

💡 TRUNCATE TABLE
  • 특정 테이블의 모든 데이터를 삭제
  • 디스크 사용량을 초기화

 

💡 DROP vs TRUNCATE vs DELETE [26]
DROP TRUNCATE DELETE
DDL DDL(일부 DML 성격) DML
ROLLBACK 불가능 ROLLBACK 불가능 ROLLBACK 가능
AUTO COMMIT AUTO COMMIT 사용자 COMMIT
테이블이 사용했던 Storage를
모두 Release
테이블이 사용했던 storage 중 최초 테이블 생성시 할당된 storage만
남기고 release
데이터를 모두 delete해도 사용했던
storage는 release되지 않음
테이블의 정의 자체를 완전히 삭제 테이블을 최초 생성된 초기상태로 만듬 데이터만 삭제
반응형

+ Recent posts