Chapter 5: Performing Calculations and using Functions

참조 : The Programmer’s Guide to SQL

  • 사칙연산/비트연산/괄호 사용법 모두 자바와 동일
  • SELECT 절의 조건은 컬럼 이거나 어떤 값들이든지 될 수 있다.
  • WHERE 절의 조건은 Boolean 형태여야 한다.
  • 숫자 다루기 (오라클)
    • 내림 FLOOR()
    • 올린 CEIL()
    • 반올림 ROUND(컬럼, 자릿수)
  • 문자 다루기 (오라클)
    • SUBSTR(컬럼, x, y) : x는 시작 인덱스, y는 길이. y를 빼면, x부터 끝까지 잘라옴.
    • INSTR(원문, 검색어) : 원문에서 검색어가 시작하는 인덱스를 반환해 줌.
    • LENGTH(컬럼)
    • UPPER(컬럼)
    • LOWER(컬럼)
  • 날짜/시간 다루기(오라클)
    • DATE TIME TIMESTAMP 를 시간이나 날짜를 나타내는 문자열 앞에 붙여야 한다.
    • DATE ‘2003-05-02’
    • CURRENT_DATE 으로 현재 날짜/시간을 가져올 수 있다.
  • 데이터 타입 변환하기(오라클)
    • 문자열로 변환하기
      • TO_CHAR(DATE ‘2003-05-23’, ‘DD MONTH YYYY’)
    • 숫자로 변환하기
      • TO_NUMBER(‘$5,102.25’, ‘$9,999.99’) — Returns 5102.25
    • 일반적인 형변환
      • CAST(‘3.521’ AS DECIMAL(3,2)) — Returns 3.52
  • 사용자 정의 함수(UDF) 만들기
    • CREATE [OR REPLACE] FUNCTION function_name
      (parameter_list)
      RETURN data_type
      IS
      variable_list
      BEGIN
         [<SQL statements>]
         RETURN expression;
      END;
      /
    • Baik Keesun 이라는 값을 Keesun, Baik로 변환해주는 함수
    • CREATE OR REPLACE FUNCTION FormatName(FullName IN varchar)
      RETURN varchar
      IS
      FormattedName varchar(50);
      BEGIN
         FormattedName :=
            SUBSTR(FullName, INSTR(FullName, ‘ ‘) + 1) || ‘, ‘ ||
            SUBSTR(FullName, 1, INSTR(FullName, ‘ ‘) – 1);
         RETURN(FormattedName);
      END;
      /

Chapter 4: Summarizing and Grouping Data

참조 : The Programmer’s Guide to SQL

  • 레코드 갯수 세기
    • COUNT(*) : 모든 레코드 갯수
    • COUNT(DISTINCT 컬럼) : 해당 컬럼의 값이 NULL이 아니고 중복되지 않는 레코드 갯수
    • COUNT(ALL 컬럼) : COUNT(컬럼) 형태로 쓰면 default로 ALL을 붙여서 사용함. 중복 허용.
  • 합계 구하기
    • SUM(DISTINCT 컬럼)
    • SUM(ALL 컬럼)
  • 평균 구하기
    • AVG(컬럼)
    • 오라클은 숫자 타입이 NUMBER라서 정수가 아닌 수도 담을 수 있다. 따라서 정수만 담긴 컬럼의 평균 값이 소수가 나올 수 있다.
  • 최소/최대값 구하기
    • MIN(컬럼)
    • MAX(컬럼)
  • 그룹핑 하기
    • SELECT ColumnA, AggFunc(AggFuncSpec) FROM Table
      WHERE WhereSpec
      GROUP BY ColumnA;
    • 주의할 것 : SELELT 절에 있는 ColumnA는 써도 되고 안 써도 되지만, 다른 컬럼은 쓰면 안 됌.
  • 그룹핑 후에 조건 주기
    • SELECT StudentID, AVG(Mark) AS AverageMark
      FROM StudentExam
      GROUP BY StudentID
      HAVING AVG(Mark) < 50 OR AVG(Mark) > 70;
    • WHERE 절은 그룹핑 하기 전에 실행되기 때문에, 그룹핑의 결과를 다룰 수는 없슴.
    • 따라서 HAVING을 사용하여 그룹핑 후에 조건을 줄 수 있슴.
  • 상위에서 N개의 레코드 가져오기
    • 오라클의 ROWNUM 사용하기.
    • SELECT StudentID, AverageMark FROM (
         SELECT StudentID, AVG(Mark) AS AverageMark
         FROM StudentExam
         GROUP BY StudentID
         ORDER BY AverageMark DESC
      )
      WHERE ROWNUM <= 5;
    • ROWNUM 키워드는 WHERE 절에서만 사용할 수 있다.
  • 랭킹 매기기
    • 오라클에서 RANK() OVER () 사용하기
    • SELECT Ranking, StudentID, AverageMark FROM (
         SELECT RANK() OVER (ORDER BY AVG(Mark) DESC) AS Ranking,
                 StudentID, AVG(Mark) AS AverageMark
         FROM StudentExam
         GROUP BY StudentID)
      WHERE Ranking <= 4;
    • 소수점 이하를 모두 버렸을 때, 순위를 매기면 누가 더 높은 것인지 알 수 있다.
  • Analytic Functions
    • 함수() OVER () 문법으로 SQL 표준은 아닌데 오라클에서 사용 가능한 문법.
    • SELECT StudentID, Mark, AVG(Mark) OVER
      (PARTITION BY StudentID
       ORDER BY StudentID, Mark) Running_Avg_by_Student
      FROM StudentExam
      ORDER BY StudentID, Mark;
    • OVER는 어렵다 어려워;;

Spring Security 2.0 Milestone 1 드디어 나옴.

스프링 포럼에서 젤 먼저 알려주는 군요.

다운로드 받기.
변경사항 보기.

gk21.xml
위 XML 파일을 보시면 Spring Secutiry 2.0 이전의 설정 방법은 전부 주석처리를 해두었기 때문에, 비교하면서 볼 수 있습니다.

근데 왜 필요한 네임스페이스는 등록도 안 해둔거지..-_-;; 어떡하라고.. 벤 알렉스!

레퍼런스도 별로 바뀐게 없는 듯 합니다.

Chapter 3: Modifying Data

참조 : The Programmer’s Guide to SQL

  • 새로운 값 추가하기
    • INSERT INTO 테이블 (컬럼들) VALUES (값들);
    • INTO는 MySQL에서는 생략가능 하지만, SQL-99 스팩이며 오라클에서는 필수다.
    • 컬럼명을 안 써도 되는 경우
      • RDBMS가 값을 반드시 자동 생성 해주는 경우. ex) 주키 컬럼
      • RDBMS가 갑을 자동으로 채워줄 수 있는 경우. ex) 기본값을 설정해둔 컬럼
      • 컬럼이 timestamp 타입임 경우. RDBMS가 알아서 현재 날짜와 시각을 넣어 줌.
      • NULL을 허용하는 컬럼.
    • 기본값으로 전부 채우기
      • INSERT INTO Author DEFAULT VALUES;
    • 여러 줄 한 번에 넣기
      • VALUES 대신에 SELECT 문 사용.
  • 수정하기
    • UPDATE 테이블 SET 컬럼 = 값, 컬럼 = 값 WHERE 조건;
    • 만약에 WHERE 절 빼면 해당 테이블의 모든 컬럼이 바뀌게 되니까 UPDATE 문 실행하기 전에 UPDATE를 SELECT로 바꿔서 변경 대상을 확인하는 것이 좋다.
  • 삭제하기
    • DELETE FROM 테이블 WHERE 조건;
      • FROM도 선택적인데 사용하는 것이 좋다.
      • 주키 컬럼을 조건절에 사용하는 것이 좀 더 안전하다. 유일한 컬럼을 지칭하니까.
    • TRUNCATE TABLE 테이블;
      • DELETE FROM과는 달리 삭제에 대한 로그를 남기지 않아서 좀 더 빠르다.
      • 대신 롤백이 불가능하다.

Chapter 2: Retrieving Data with SQL

참조 : The Programmer’s Guide to SQL

  • ‘모든 컬럼 가져오기(SELECT * FROM Student;)’의 안 좋은 점.
    • 해당 테이블에 몇 개의 컬럼이 있는 DB가 알아봐야 하는 부과작업 필요해짐.
    • 컬럼들이 어떤 순으로 어떤게 올지 예측할 수 없다.
    • 간단한 테스트 용도 외에는 잘 안써.
  • 예약어Reseved나 SQL 키워드를 테이블 명이나 컬럼 명으로 했을 경우.
    • 오라클은 ” “를 사용하여 감싸주며 그 안에는 모두 대분자로 표시해야함.
      • 자동으로 예약어나 키워드를 대문자로 변경하기 때문에…
  • AS 로 별칭 사용하기. SELECT s.name AS StudentName FROM Student AS s
    • FROM 절의 테이블 별칭에서 AS는 생략하는 것이 SQL-99 스팩.
    • 하지만 가독성을 위해서 명시적으로 표기해주는 것이 좋다.
  • 문자열 연결할 때 오라클은 || ‘ ‘ || 이것 사용.
    • SELECT name || ‘은 ‘ || age || ‘살 입니다.’ FROM Student;
    • 문자열 연결 용도라서 숫자 타입도 자동으로 문자로 변환해줌.
  • 정렬하기
    • ORDER BY 컬럼 ACS/DESC
  • 중복제거
    • SELECT DISTINCT 컬럼명 FROM 테이블;
    • 컬럼 두 개 이상을 지정하면, 두 개를 하나의 묶음으로 생각한 유일한 레코드Record 들을 가져온다.
  • WHERE 절로 조건 주기
    • 조건이 TRUE를 만족하는 레코드만 가져오고 FALSE나 UNKNOWN인 레코드는 무시한다.
    • 날짜 비교하기
      • ‘yyyy-mm-dd’ 형태의 문자열은 모든 밴더들이 날짜로 변환해준다.
    • AND 나 OR로 여러개의 조건 표시 가능.
    • IN 을 사용하여 특정 컬럼의 값 범위 지정 가능.
  • 패턴 매칭
    • WHERE comments LIKE ‘%greate%’ = 컬럼에 greate가 들어가는 레코드.
    • WHERE UPPER(comments) LIKE ‘%GREATE%’ = 대소문자 구분 없이 greate가 들어가는 레코드.
    • 만약에 값에 %가 포함되어 있는 경우.
      • WHERE CustomerRating LIKE ‘%50p%%’ ESCAPE ‘p’;
      • 이런식으로 ESCAPE 문자 지정해서 바로 다음 문자 무시하도록 하기.