PK두개를 합침
CONSTRAINT CAR_PK PRIMARY KEY(ID, BRAND); -> 두개가 같이 중복되지만 않으면 됨
→이러한 현상이 발생하는 이유: 테이블이 정규화 되어있지 않기때문
-정규화를 위해서는 각 컬럼간의 관련성 파악, 관련성=함수적 종속성(FUNCTIONAL DEPENDECY)
따라서 하나의 테이블에서는 하나의 함수적 종속성만 존재하도록 정규화
함수: X-> Y
NULL
값은 없으나 주소를 가짐
정의되지 않은 값, 빈 값대신 미정값을 부여할 때 사용(PK는 불가능, FK는 가능)
NOT NULL 제약 조건
ALTER TABLE 테이블명 MODIFY 컬럼명 NOT NULL;
제약조건 삭제
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건 이름;
조건식
컬럼명 IS NULL: NULL이면 참
컬럼명 IS NOT NULL: NULL이 아니면 참
UNIQUE
SELECT NVL("POSITION", '미정') FROM PLAYER WHRER "POSITION" IS NULL;
SELECT NVL("POSITION", '미정') FROM PLAYER;
SELECT NVL2("POSITION", '확정', '미정') FROM PLAYER;
SELECT PLAYER_NAME "선수이름" ,NVL2("POSITION", '확정', '미정') AS 포지션 FROM PLAYER;
-ABS(N) 절대값
--실수->실수
-TRUNC(숫자, 자리수):소수점 이하 자리수 맞추기 위해서 버림 3.177567->3.17
SELECT TRUNC(3.177567,2) FROM dual;
-ROUND(숫자, 자리수)
SELECT ROUND(3.177567,2) FROM dual;
--실수->정수
--CEIL(숫자): 실수를 정수로 올림으로 변환
SELECT CEIL (3.177567) FROM DUAL; --4
--FLOOR(숫자): 실수를 정수로 내림으로 변환
SELECT FLOOR(3.177567) FROM dual; --3
SELECT INITCAP('hello') FROM DUAL; --INITIAL capital: 첫번째 대문자
SELECT UPPER('hello') FROM DUAL; --대문자로 변환
SELECT LOWER('OraCle')FROM DUAL; --소문자로 변환
SELECT LENGTH ('oracle') FROM DUAL; --문자열길이
SELECT SUBSTR('java program',3,5) FROM DUAL; ---부분 추출(문자열, 위치, 길이) 결과/ 오라클에서 인덱스는 1부터시작
SELECT SUBSTR('java program',-5,3) FROM DUAL; --부분추출결과 : 위치 음수이면 문자열 뒤에서부터(뒤에서부터 5번째 3개)
SELECT REPLACE('java progam','pro','프로') FROM DUAL; --문자열 바꾸기 . java 프로gram
SELECT INSTR ('java program','og') FROM DUAL;; --자바의 indexof/ 해당 문자열이 없으면 결과0
SELECT trim (' java program ')FROM DUAL; --공백(불필요한 앞뒤 공백)제거
SELECT LENGTH (' java program ') FROM dual; --공백포함 16
SELECT LENGTH (trim(' java program ')) FROM dual; --공백제거 12
날짜함수: TO_CHAR(날짜형식을 문자열로 변환) TO_DATE(문자열을 날짜형식으로 변환)
SELECT SYSDATE ,SYSTIMESTAMP FROM DUAL;
-SYSTIMESTAMP는 표준시와의 시차(타임존) 표시
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM DUAL; --기호는 상관없음
-기호는 상관없음, 한글은 x 사용하려면 'YYYY"년"' ""를넣어야함
-자동캐스팅해줄 수 있는 패턴은 YYYY-MM-DD만 가능
YYYY-MM-DD HH24:MI:SS 24시간기준
YYYY-MM-DD HH:MI:SS AM 12시간기준(AM,PM)
문자열은 패턴을 알려줘야 변경할 수 있다 TBL_MEMBER에 JOIN_DATE 인서트
INSERT INTO TBL_MEMBER VALUES (2,'박나연','parkny@gmail.com',
TO_DATE('2022-10-24 13:24:55','YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_MEMBER VALUES (10,'홍길동','GDhONG@gmail.com',TO_DATE('20240109','YYYYMMDD'));
날짜 찾기
WHERE TO_CHAR(BUYDATE,'YYYY-MM')='2022-04'
WHERE BUY_DATE BETWEEN TO_DATE('2023-07-01','yyyy-mm-dd')AND TO_DATE('2023-12-31','yyyy-mm-dd')
WHERE BUY_DATE BETWEEN '2023-07-01' AND '2023-12-31'
SELECT ADD_MONTHS(SYSDATE,3) FROM DUAL; -오늘날짜 +3개월이후. 첫번째 인자는 날짜형식, 두번째는 더해지는 값
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,3),'YYYY/MM/DD') FROM DUAL; -문자열 패턴 기호 - 또는 / 또는 구분기호 없음 가능
SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2022-09-23')) FROM DUAL; -지정된 2개의 날짜 사이에 간격(월). 결과는 소수점
SELECT TRUNC(SYSDATE) - TO_DATE('20240110','YYYYMMDD')FROM DUAL;-2개의 날짜형식 값 간격(일) 날짜끼리 뺄셈
SELECT TRUNC(SYSDATE) FROM DUAL; - 2개의 날짜의 간격(일). TRUNC(SYSDATE)는 일(DAY)까지로 변환
SELECT SYSDATE +5 FROM DUAL;
-정렬 기준을 두개로 만들때
SELECT PLAYER_NAME, HEIGHT, WEIGHT FROM PLAYER
ORDER BY 2,3; -> 키순으로 정렬 한 후 몸무게 순으로 정렬함
-컬럼명이 어려울때-> 컬럼의 순서(인덱스)로 지정 가능 (SELECT에서는 X)
SELECT *FROM PLAYER ORDER BY 12 DESC;
CASE
CASE WHEN 조건식 THEN '참 값' ELSE '거짓 값' END
--SAL이 3000이상이면 HIGH, 1000이상은 MID 다아니면 LOW
SELECT ENAME, SAL
CASE
WHEN SAL >=3000 THEN ' HIGH';
WHEN SAL >=1000 THEN 'MID'
ELSE 'LOW'
END
FROM EMP;
ELSE는 생략 가능, WHEN 여러번 가능.. (IF문 처럼)
중첩케이스문
코드
SELECT ENAME, SAL
CASE
WHEN SAL >=3000 THEN 'HIGH';
ELSE(
CASE WHEN ELSE END
)
END '연봉' ->연봉: AS
FROM EMP;
S - 1번째 기준 , M 두번째기준, 그 이외: L