제목 태그 : 제목 입력 시 사용

형식

 <h1>문자열</h1>
 <h2>문자열</h2>
 <h3>문자열</h3>
 <h4>문자열</h4>
 <h5>문자열</h5>
 <h6>문자열</h6>

 

참조

 h1~h6까지 있음

 body 태그 안에서 쓰인다.

 

예제

<h1>H1 Tag</h1>
<h2>H2 Tag</h2>
<h3>H3 Tag</h3>
<h4>H4 Tag</h4>
<h5>H5 Tag</h5>
<h6>H6 Tag</h6>

 

실행화면

 

 

 

본문 태그

 p : 단락을 만드는 태그

 br : 줄 바꾸기 태그

 hr : 수평선을 긋는 태그

 pre : 글자, 글꼴, 줄 바꿈을 입력한 그대로 출력하는 태그

 

참조

 body 태그 안에서 쓰인다.

 

예시

<p>p tag 입니다</p> 

<hr>	<!-- 수평선 -->

<br>	<!-- 줄바꿈 -->

<pre style="font-size: 200%; background-color: #ffff00; font-family: verdana">
안녕하세요!
반갑습니다.
비가 오는군요.
</pre>

 

실행 화면

 

 

 

앵커(Anchor) 태그 : 서로 다른 웹페이지 사이를 이동하거나 웹페이지 내부에서 특정한 위치로 이동할 수 있는 태그(하이퍼링크)

기본 형식

  <a href="주소">문자열</a>

 

참조

 body 태그 안에서 쓰인다.

 참조할 주소가 없을 경우(빈 링크) 주소 입력에 #을 입력합니다.

 

예시

<!-- 구글로 이동하기 -->
<a href="http://www.google.com">구글로 이동</a>
<!-- 참조 주소 없음 -->
<a href="#">참조 주소 없음</a>

 

a 속성 & 속성 값

 target : 링크된 문서를 클릭했을 때 문서가 열릴 위치를 명시

 target 속성 값 : self (클릭 시 현재창에서 이동)

                               _blank (클릭시 새창으로 이동)

                                _top (다운로드 속성: 파일 다운로드)

 

예시

<!-- 구글로 이동하기 -->
<a href="http://www.google.com" target="_blank">구글로 이동</a>

<a href="http://www.google.com" target="_self">구글로 이동</a>

<a href="파일경로" target="_top">파일 다운로드</a>

 

 

 

글자 태그

 b : 굵은 글자

 strong : 굵은 글자

 u : 밑줄 글자

 ins : 밑줄 글자
 i : 기울어진 글자

 em : 기울어진 글자

 small : 작은 글자

 sub : 아래에 달라붙는 글자

 sup : 아래에 달라붙는 글자

 del : 가운뎃줄이 그어진 글자

 mark : 배경이 노란색(강조) 글자

 

참조

 body 태그 안에서 쓰인다.

 

예시

<p><b>b(굵은) </b> 텍스트</p>
<p><strong>strong(굵은) </strong> 텍스트</p>
<p><u>u(밑줄) </u> 텍스트</p>
<p><ins>ins(밑줄) </ins> 텍스트</p>
<p><i>i(기울어진) </i> 텍스트</p>
<p><em>em(기울어진) </em>텍스트</p>
<p><small>small(작은) </small> 텍스트</p>
<p><sub>sub(아래첨자) </sub>텍스트</p>
<p><sup>sup(윗첨자) </sup>텍스트</p>
<p><del>del(가운데줄) </del>텍스트</p>
<p><mark>mark(강조) </mark> 텍스트<p>

 

실행화면

Collection

정의
참조형 데이터를 저장하는 '저장소' 객체
자료구조 : 가변배열

 

종류
List : 순서보존 O, 중복허용 O ,
자료형 : ArrayList, LinkedList
Set : 순서보존 X, 중복허용X, 정렬을 해줌, 크기제한 X, (쓸일 거의 없다) 옵션..
자료형 : TreeSet

 

ArrayList

List 인터페이스를 상속받아 데이터의 저장 순서가 유지되고 중복을 허용
크기가 가변적이고, 선형구조를 가지고 있다.
ArrayList 사용 시 import문을 작성해 주어야 한다.

선형구조 : O-O-O-O-O-O
삭제 후 정리, 검색 속도가 빠르다.

 

LinkedList

배열은 가장 기본적인 형태의 자료구조로 구조가 간단하다
LinkedList사용 시 import문을 작성해 주어야 한다.

장점
사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장 빠르다.

단점
크기를 변경할 수 없다.
비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.


ArrayList에 어떠한 클래스 든 다 저장하고 싶은 경우

참조
ArrayList에 넣고 싶은 자료형에 따라 Generic에 Class를 넣어줘야하는데, Generic에 Object로 넣을 경우
모든 데이터 타입을 다 집어 넣을 수 있게 된다.

 

예시

import java.util.ArrayList;
import java.util.LinkedList;

public class Array_Linked {
	public static void main(String[] args) {

		ArrayList<Object> arraylist = new ArrayList<Object>();
	}
}

 

 

add(요소) : ArrayList 요소 추가

		// 추가
		arraylist.add("red");

		String str = new String("blue");
		arraylist.add(str);

		arraylist.add(new String("green"));



add(index, 요소) : ArrayList 원하는 위치에 요소 추가

 		// 원하는 위치에 추가(중간)
		String num = new String("yellow");
		arraylist.add(1, num);

		arraylist.add(1, "yellow");

 

set(index, 요소) : ArrayList 원하는 위치에 요소 수정

		// arraylist 수정
		arraylist.set(2, "black");

 

remove(index) : ArrayList 원하는 위치에 요소 삭제

		// 0번째 삭제
		arraylist.remove(0);

 

indexOf(검색 요소) : ArrayList index번호 검색

		// yellow의 index의 번호
		int index = arraylist.indexOf("yellow");

 

size() : ArrayList 길이

		// arraylist 길이
		int len = arraylist.size();

 

ArrayList 전체 출력

		// foreach문 사용	
		System.out.println("arraylist");
		for (Object ob1 : arraylist) {
			System.out.print((String) ob1+"\t");
		}

 

LinkedList에 ArrayList 복제하기

참조
LinkedList는 ArrayList와 호환 가능하다.
원본(arraylist)에 영향을 주지 않습니다.

형식
LinkedList <자료형> linklist = new LinkedList <자료형>(arraylist명);

예시

		// ArrayList와 호환 가능!
		// Generic은 같은형으로 잡아주고 생성자 안에 ArrayList명을 넣어준다.

		LinkedList<Object> linklist = new LinkedList<Object>(arraylist);



addLast(요소) : linklist 맨뒤에 요소 추가 / addFirst(요소) : 맨 앞에 요소 추가

참조
 ArrayList는 index를 지정하여 요소를 추가할 순 있지만 linklist처럼 맨 앞이나 맨뒤에 요소를 추가할 수 없다.

예시

 		// 맨 뒤에 요소(element)를 추가
		linklist.addLast("sleap");
		
		// 맨 앞에 요소(element)를 추가
		linklist.addFirst(1);




위 코드의 전체 코드입니다.

import java.util.ArrayList;
import java.util.LinkedList;

public class Array_Linked {
	public static void main(String[] args) {

		ArrayList<Object> arraylist = new ArrayList<Object>();

		// 추가
		arraylist.add("red");

		String str = new String("blue");
		arraylist.add(str);

		arraylist.add(new String("green"));

		// 원하는 위치에 추가(중간)
		String num = new String("yellow");
		arraylist.add(1, num);

		arraylist.add(1, "yellow");

		// foreach문 사용	
		System.out.println("arraylist");
		for (Object ob1 : arraylist) {
			System.out.print((String) ob1+"\t");
		}
		System.out.println();
		System.out.println();
		// 삭제
		// 0번째 삭제
		arraylist.remove(0);

		// 검색
		// yellow의 index의 번호
		int index = arraylist.indexOf("yellow");



		// ArrayList와 호환 가능!
		// Generic은 같은형으로 잡아주고 생성자 안에 ArrayList명을 넣어준다.

		LinkedList<Object> linklist = new LinkedList<Object>(arraylist);

		// linklist 전체 출력문
		System.out.println("linklist");
		for (Object ob : linklist) {
			System.out.print((String) ob+"\t");
		}
		System.out.println();
		System.out.println();
		
		// 맨 뒤에 요소(element)를 추가
		linklist.addLast("sleap");
		
		// 맨 앞에 요소(element)를 추가
		linklist.addFirst(1);
		
		// arraylist 수정
		arraylist.set(2, "black");
		
		// arraylist 길이
		int len = arraylist.size();
		
		// arraylist 전체 출력문
		System.out.println("linklist에 요소 추가 후 arraylist");
		for (Object ob1 : arraylist) {
			System.out.print((String) ob1+"\t");
		}
		System.out.println();
		System.out.println();
		
		// linklist 전체 출력문
		System.out.println("요소 추가 후 linklist");
		for (Object ob : linklist) {
			System.out.print((Object) ob+"\t");
		}
	}
}



실행화면

arraylist
red	yellow	yellow	blue	green	

linklist
yellow	yellow	blue	green	

linklist에 요소 추가 후 arraylist
yellow	yellow	black	green	

요소 추가 후 linklist
1	yellow	yellow	blue	green	sleap

 

'IT > Java' 카테고리의 다른 글

JAVA 용어정리  (0) 2021.09.16
[자바] jsoup을 이용하여 웹 크롤링 구현하기  (0) 2021.07.20
[자바] 상속/오버라이딩  (0) 2021.06.01
[자바] 싱글톤(Sington)  (0) 2021.05.31
[자바] 파일 쓰기  (0) 2021.05.26

상속(Inheritance)이란?

정의
 부모의 모든 것을 자식에게 상속하는 것 ( == 사용할 수 있게 하는 것)

형식
 클래스 자식 클래스명 extends 부모 클래스명
         ex) class Strawberry extends Fruit 

참조
 상속 관계에선 Overriding을 할 수 있다.

 

 

오버라이딩(overriding)이란 ? : 덮어쓴다.

정의
 상속받은 조상의 메서드를 자신에 맞게 변경하는 것

 

참조
 선언부 변경불가. 내용만 변경가능

조건
 1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
   : 선언부(반환타입, 메서드이름, 매개변수 목록)
 2. 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
 3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

예시

class Fruit { // 부모class 생성
	String name;
	Fruit(String name){
		super(); // 생략된 것 (부모는 Object)
		this.name = name;
	}
	void color() {
		System.out.println(" 노란색");
	}
	void p(String str) {
		System.out.print(str);
	}
	void pln(String str) {
		System.out.println(str);
	}
}

class Strawberry extends Fruit { // 자식class 생성
	int count;
	Strawberry(String name, int count){
		super("딸기");
		this.count = count;
	}
	void color() { // 부모메소드 오버라이딩
		System.out.print(" 빨간색");
	}
	void action() {
		System.out.println("이다.");
	}
}
public class User {

	public static void main(String[] args) {
		Fruit f = new Fruit("바나나");
		f.p(f.name+"는");
		f.color();
		
		Strawberry s = new Strawberry("딸기", 10);
		s.p(s.name+"는");
		s.color(); 
		s.action(); 
		s.pln(s.count+"개 정도 먹고싶다.");
		
		Fruit f3 = new  Strawberry("바나나", 12); // 다형성
		
		Fruit f1 = s; // 부모 -> 자식 (자동형변환)
		f1.p(f1.name+"는 ");
		f1.color();  
	/*  f1.action(); 
		f1.pln(f1.count+"개 정도 먹고싶다."); */
		f.pln("");
		
		Strawberry s1 = (Strawberry) f1; // 자식 -> 부모 (강제형변환) 다 쓸 수 있다.
		s1.p(s1.name+"는");
		s1.color(); 
		s1.action(); 
		s1.pln(s1.count+"개 정도 먹고싶다.");
		
	/*	Strawberry s2 = (Strawberry) f; // 잘못된 강제형변환	ClassCastException (원래 부모인데 자식에 끼어맞추면 깨져버린다.)
		s2.p(s.name+"는");								RunTimeError (컴파일은 되는데 실행이 안된다.)
		s2.color(); 
		s2.action(); 
		s2.pln(s.count+"개 정도 먹고싶다."); */
	}
}

 

참조
 형변환은 상속관계에서만 가능하다.
  자동형변환( 자식 → 부모 ) → 묵시적
    : overroding유지, 부모 객체만 호출 가능.
  강제형변환( 부모 → 자식 ) → 명시적
    : overroding유지, 자식 객체 호출 가능.
  잘못된 강제 형 변환은 RuntimeException를 발생시킨다. 컴파일은 가능, 실행 불가.


실행화면

바나나는 노란색
딸기는 빨간색이다.
10개 정도 먹고싶다.
딸기는  빨간색
딸기는 빨간색이다.
10개 정도 먹고싶다.

동의어(SYNONYM) : 객체의 별명 부여

 

사용 이유

 이미 생성된 테이블 명이 너무 길어서 쓰기 어려울 경우 사용한다.

 

형식

 CREATE SYNONYM 시노니명
 FOR 참조할 테이블명;

 

예제

-- hr스키마

CREATE SYNONYM EMP
FOR EMPLOYEES;

 

 

 

SYNONYM 이용하여 데이터 입력

형식

 INSERT INTO 시노니명(컬럼명1, 컬럼명2, ....., 컬럼명n)
 VALUES(값1, 값2,....,값n);

 

참조

 참조한 테이블에서 컬럼의 제약조건에 맡게 값을 넣어 주어야 한다.

 

예제

INSERT INTO EMP(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID)
VALUES(EMPLOYEES_SEQ.nextval, '공손', 'mm@naver.com', SYSDATE, 'IT_PROG');

 

 

 

SYNONYM  삭제

형식

 DROP SYNONYM 시노님명;

 

예제

DROP SYNONYM EMP;

시퀀스(SEQUENCE) : 유일한 값을 생성해주는 오브젝트

참조

 초기화가 불가하다.

 사용예시) 회원번호, 게시판 글번호(고유번호)

 

 

 

SEQUENCE 생성

형식

 CREATE SEQUENCE 시퀀스명
 INCREMENT BY 증가값
 START WITH 10 시작값
 MAXVALUE 100 마지막값
 MINVALUE 최소값;

 

예시

CREATE SEQUENCE TEST_SEQ
INCREMENT BY 1 -- 1 씩 증가
START WITH 10 -- 10부터 시작
MAXVALUE 100 -- 마지막 번호 100
MINVALUE 1;

 

 

 

CURRVAL : 현재 SEQ 값 조회

형식
 SELECT 시퀀스명.CURRVAL FROM DUAL;

 

참고

 최소 1번은 증가 시켜줘야 출력이 된다.

 

예시

SELECT TEST_SEQ.CURRVAL FROM DUAL;

 

 

 

NEXTVAL : 증가시키기

형식
 SELECT 시퀀스명.NEXTVAL FROM DUAL;

 

예시

SELECT TEST_SEQ.NEXTVAL FROM DUAL;

 

 

 

INCREMENT BY : 시퀀스 설정 변경

형식
 ALTER SEQUENCE 시퀀스명
 INCREMENT BY 변경값;

 

예시

ALTER SEQUENCE TEST_SEQ
INCREMENT BY 3; -- 3씩 증가하도록 바꿔라

 

 

 

 

VIEW (가상 테이블)

실체가 없는 테이블, 다른 테이블에  접근하기 위한 테이블, 중간에 있는 테이블

 

참고

 속도가 빠르다.

 한 개의 뷰로 여러 개의 테이블을 검색할 수 있다.

 제한 설정이 가능하다.(READONLY)

 

VIEW생성

형식

 CREATE OR REPLACE VIEW 뷰명
 AS
 SELECT *
 FROM 접근할 테이블명;

 

예제

-- hr스키마

CREATE OR REPLACE VIEW TEST_VIEW
AS
SELECT *
FROM jobs;

 

 

 

원하는 컬럼만 넣어 VIEW생성

형식

 CREATE OR REPLACE VIEW 뷰명
 AS
 SELECT 컬럼명1, 컬럼명2...컬럼명n
 FROM 접근할 테이블명;

 

참조

 이때 컬럼명은 접근할 테이블의 컬럼명이다.

 또한, 테이블 간 JOIN을 하여 여러 데이터를 집어넣는 것도 가능하다.

 

예시

CREATE OR REPLACE VIEW TEST_VIEW
AS
SELECT job_id, job_title, min_salary
FROM jobs;

 

 

 

VIEW로 접근하여 테이블에 데이터 집어넣기

형식

 INSERT INTO 뷰명(컬럼명1, 컬럼명2, ...컬럼명n)
 VALUES(값1,값2...값n);

 

참조

 실제로 VIEW에서 접근 테이블에 데이터를 집어넣는 건 매우 위험하다고 한다..

 거의 사용할 일이 없다.

 

예시

INSERT INTO UB_TEST_01(job_id, job_title, min_salary)
VALUES('DEVELOPER', '개발자', 10000);

 

 

 

ROLLBACK : 되돌리기

형식

 ROLLBACK;

 

참조

 INSERT 후 ROLLBACK을 하게 되면 데이터를 넣기 전으로 되돌릴 수 있다.

 COMMIT시 ROLLBACK불가!!

 

 

 

COMMIT : DB에 적용하기

형식

 COMMIT;

 

참조

 데이터를 집어넣으려면 필수!!

 

 

 

읽기전용 VIEW 생성

형식

 CREATE OR REPLACE VIEW 뷰명
 AS
 SELECT *
 FROM 접근할 테이블명

 WITH READ ONLY;

참조

 읽기 전용으로 VIEW생성 시 INSERT 할 수 없다.

 

예제

CREATE OR REPLACE VIEW TEST_VIEW
AS
SELECT *
FROM jobs
WITH READ ONLY; -- 읽기전용 

 

 

 

VIEW 검색

형식

 SELECT * FROM 뷰명;

 

예제

SELECT * FROM TEST_VIEW;

 

 

 

VIEW 삭제

형식

 DROP VIEW 뷰명;

 

예제

DROP VIEW TEST_VIEW;

무결성(CONSTRAINT) : COLUMN을 지정하는 성질(설정)

 

 

종류

 Primary Key : 기본키. 중복을 허용하지 않는다. NULL을 허용하지 않는다. 예시) ID, 주민번호
 Unique Key  : 고유키. 중복을 허용하지 않는다. NULL을 허용한다.       예시) e-mail
 Foreign Key : 외래키. JOIN(테이블과 테이블의 연결)이 목적. NULL을 허용한다.
                          외래키로 지정된 컬럼은 연결된 테이블에서 PK나 UK로 설정되어 있어야 한다.
 CHECK           : 범위를 지정. 지정된 값 외에 사용할 수 없다. 중복을 허용한다. NULL을 허용한다.
 NOT NULL    : 중복을 허용한다. NULL을 허용하지 않는다. 

 

 

 

NOT NULL : 데이터 삽입 시 NULL을 허용하지 않는다.

 

형식

 CREATE TABLE 테이블명(
    컬럼명 데이터형식(크기) NOT NULL,
  );

 

참고

 행 삽입 시 NOT NULL 지정 컬럼에 데이터를 삽입하지 않으면 경우 에러가 발생한다.

예시

-- 테이블 생성

CREATE TABLE TB_TEST08(
    COL1 VARCHAR2(10) NOT NULL,
    COL2 VARCHAR2(20)
);


-- 데이터 삽입

INSERT INTO TB_TEST08(COL1, COL2)
VALUES ('AAA','111');


INSERT INTO TB_TEST08(COL1)
VALUES ('BBB');


INSERT INTO TB_TEST08(COL2)
VALUES ('222'); -- 오류발생 COL1 NOT NULL

 

 

 

CASCADE CONSTRAINTS : 무결성 제약조건까지 모두 삭제

형식 

 DROP TABLE 테이블명
 CASCADE CONSTRAINTS;

 

참조

 예시처럼 똑같이 진행 시 이미 테이블이 생성되어 있어서 에러가 발생할 것입니다.

 테이블 생성 시마다 아래 예시를 실행해주어야 에러가 발생하지 않습니다.

 

예시

DROP TABLE TB_TEST08
CASCADE CONSTRAINTS;

 

 

 

Primary Key(기본키) : 중복금지 + NOT NULL

형식

 1. CREATE TABLE 테이블명(
       컬럼명 데이터형식(크기) PRIMARY KEY
     );

 

 2. CREATE TABLE 테이블명(
       컬럼명 데이터형식(크기) CONSTRAINT Key ID PRIMARY KEY
    );

 

 3. CREATE TABLE 테이블명(
       컬럼명1 데이터형식(크기),
       컬럼명2 데이터형식(크기)
       CONSTRAINT Key ID PRIMARY KEY(컬럼명1, 컬럼명2)
     );

 

참고

 1 형식으로 만들 수 있지만, Key ID 지정하지 않았을 경우 지정한 PRIMARY KEY만 삭제를 하지 못하게 된다.

 지정한 PRIMARY KEY 삭제 시 Key ID 필요!

 3 형식으로 생성 시 2개 이상의 컬럼을 PRIMARY KEY로 지정할 수 있다.

 행 삽입 시 PRIMARY KEY로 지정 컬럼에 데이터를 삽입하지 않으면 경우 에러가 발생한다.

 행 삽입 시 PRIMARY KEY로 지정 컬럼에 데이터를 중복 삽입할 경우 에러가 발생한다.

 

예시

CREATE TABLE TB_TEST08(
--  PK_COL VARCHAR2(10) PRIMARY KEY -- 가능하지만
    PK_COL VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY, --  PK_TEST_01 : Primary Key ID 지정
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


INSERT INTO TB_TEST08(PK_COL, COL1, COL2)
VALUES('AAA','aaa','111');

INSERT INTO TB_TEST08(PK_COL)
-- VALUES('AAA'); -- 중복 허용X , 에러발생. 
VALUES('BBB');

-- INSERT INTO TB_TEST08(PK_COL, COL1, COL2)
-- VALUES('','aaa','111'); -- '' = NULL , 에러발생



-- 에러 only one primary key
/*
CREATE TABLE TB_TEST08(
    PK_COL1 VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY,
    PK_COL2 VARCHAR2(10) CONSTRAINT PK_TEST_02 PRIMARY KEY,
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);
*/


-- 프라이머리키 2개 이상 생성 방법
CREATE TABLE TB_TEST08(
    PK_COL VARCHAR2(10),
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(PK_COL, COL1)
);

 

 

 

무결성이 없는 테이블 생성 후 무결성 변경하는 방법

형식

 1. ALTER TABLE 테이블명

    ADD PRIMARY KEY (컬럼명1, 컬럼명2..);

 2. ALTER TABLE 테이블명
    ADD CONSTRAINT Key ID명
    PRIMARY KEY(컬럼명);

 

참조

 진행 전 무결성이 없는 테이블이 생성되어 있어야 합니다.

 

예시

-- 무결성 없는 테이블 생성

CREATE TABLE TB_TEST08(
    PK_COL1 VARCHAR2(10),
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


-- 테이블 만든 후 나중에 무결성 변경가능
-- 1형식 

ALTER TABLE TB_TEST08 
ADD PRIMARY KEY (PK_COL);


-- 2형식
ALTER TABLE TB_TEST08
ADD CONSTRAINT PK_TEST_01
PRIMARY KEY(PK_COL1);

 

 

 

무결성 삭제 방법

형식

 1. ALTER TABLE 테이블명

    DROP PRIMARY KEY;

 2. ALTER TABLE 테이블명
    DROP CONSTRAINT Key ID명 ;

 

참조

 1 형식으로 키 추가를 했다면 1 형식으로만 삭제해야 한다.

 1 형식은 지정한 Key ID값을 삭제할 수 없고, 전체 키값이 삭제된다.
 2 형식으로 키 추가했을 경우 2가지 경우 다 삭제 가능하다

 

예시

-- 1형식

ALTER TABLE TB_TEST08 DROP PRIMARY KEY;


-- 2형식

ALTER TABLE TB_TEST08
DROP CONSTRAINT PK_TEST_01;

 

 

 

Unique(고유키) : 중복된 값은 입력 불가. NULL은 허용

형식

1. CREATE TABLE 테이블명(
       컬럼명 데이터형식(크기) UNIQUE
     );

 

 2. CREATE TABLE 테이블명(
        컬럼명 데이터 형식(크기) CONSTRAINT Key ID UNIQUE
     );

 

참조

 기본키와 마찬가지로 1 형식으로 만들 수 있지만, Key ID 지정하지 않았을 경우 지정한 UNIQUE KEY만 삭제를 하지 못하게 된다.

지정한 UNIQUE 삭제 시 Key ID 필요!

 

예시

CREATE TABLE TB_TEST08(
--  UK_COL VARCHAR2  UNIQUE -- 가능
    UK_COL VARCHAR2(10) CONSTRAINT UK_TEST_01 UNIQUE,
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


INSERT INTO TB_TEST08(UK_COL, COL1, COL2)
VALUES('','aaa','111'); -- ''가능하다 (프라이머리키와 차이점)

INSERT INTO TB_TEST08(COL1, COL2)
VALUES('aaa','111'); -- ''가능하다 (프라이머리키와 차이점)

 

 

 

FOREIGN KEY(외래키) : 대상 테이블에서 pk, uk로 설정되어 있어야 한다.  NULL 값을 허용. 중복 허용

형식

 CREATE TABLE 테이블명(
     DEPARTMENT_ID VARCHAR2(10),
     CONSTRAINT Key ID FOREIGN KEY(컬럼명)
        REFERENCES 대상테이블명(대상테이블의 기본키(OR 고유키) 컬럼명)
  );

 

참조

 외래키 테이블 생성 전 대상테이블이 생성되어 있어야 한다.

 외래키에 데이터를 넣기 전 대상테이블의 기본키에 데이터가 들어가 있어야 한다.

 외래키의 크기는 대상테이블의 기본키(OR 고유키)보다 크기가 같거나 커야 한다.

 대상테이블의 기본키와 외래키의 컬럼명을 달라도 된다.

 외래키 데이터는 아무 값이나 넣으면 안 된다.(대상 테이블의 기본키의 데이터와 같아야 한다.)

 

예시

-- 대상 테이블 생성

CREATE TABLE TB_DEPT(
    DEPARTMENT_ID VARCHAR2(10),
    DEPARTMENT_NAME VARCHAR2(20),
    LOCATION_ID NUMBER,
    CONSTRAINT PK_DEPT_TEST PRIMARY KEY(DEPARTMENT_ID)  -- PRIMARY KEY이거나 Unique여야 한다.
); 


-- 데이터 추가

INSERT INTO TB_DEPT(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID)
VALUES('10', '기획부', '120');

INSERT INTO TB_DEPT(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID)
VALUES('20', '관리부', '150');

INSERT INTO TB_DEPT(DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID)
VALUES('30', '개발부', '180');


-- 기준 테이블 생성

CREATE TABLE TB_EMP(
    EMPNO VARCHAR2(10),
    ENAME VARCHAR2(20),
    DEPARTMENT_ID VARCHAR2(10), -- 외래키의 크기는 대상테이블의 기본키(OR 고유키)보다 크기가 같거나 커야 한다.
    CONSTRAINT FK_EMP_TEST FOREIGN KEY(DEPARTMENT_ID)
        REFERENCES TB_DEPT(DEPARTMENT_ID) -- 기본키와 외래키의 컬럼명을 달라도 된다.
); -- 이제 JOIN이 가능해 진다.


-- 데이터 추가
INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('100', '일', '20'); -- DEPARTMENT_ID 아무값이나 넣으면 안된다.(대상 테이블의 기본키값과 같아야한다.)

INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('101', '이', '10');

INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('102', '삼', '30');

INSERT INTO TB_EMP(EMPNO, ENAME, DEPARTMENT_ID)
VALUES('103', '사', ''); -- 외래키는 NULL값 허용한다.


-- INNER JOIN

SELECT e.empno, e.ename, d.department_id, d.department_name
FROM tb_emp e, tb_dept d
WHERE e.department_id = d.department_id;

 

 

 

CHECK : 범위 값을 설정하거나 지정된 값만 넣을 수 있다. NULL 허용, 중복 허용

형식

 CREATE TABLE TB_CHECK(
     컬럼명1 데이터형식(크기),
     컬럼명2 데이터형식(크기),
     CONSTRAINT Key ID ( 컬럼명1 IN('지정값1', '지정값2', '지정값3') ),
     CONSTRAINT Key ID ( 컬럼명2 > 범위1 AND COL2 <= 범위2)
  );

 

예시

-- 테이블 생성 

CREATE TABLE TB_CHECK(
    COL1 VARCHAR2(10),
    COL2 VARCHAR2(20),
    CONSTRAINT CHK_01 CHECK( COL1 IN('사과', '배', '바나나') ), -- 사과, 배, 바나나와 NULL
    CONSTRAINT CHK_02 CHECK( COL2 > 0 AND COL2 <= 100) -- 1~100 숫자와 NULL
);


-- 데이터 삽입

INSERT INTO tb_check(COL1,COL2)
VALUES('사과', 50);

INSERT INTO tb_check(COL1,COL2)
VALUES('귤', 50); -- 불가능 에러

INSERT INTO tb_check(COL1,COL2)
VALUES('', 50);

INSERT INTO tb_check(COL1,COL2)
VALUES('', 101); -- 불가능 에러

 

테이블 수정하기

 

 

테이블명 변경

형식

 ALTER TABLE 기존 테이블명
 RENAME
 TO 변경할 테이블명; 

 

예시

-- TB_TEST04의 이름을 TB_TEST99로 변경

ALTER TABLE TB_TEST04
RENAME
TO TB_TEST99;

 

 

 

단일 컬럼 추가

형식

 ALTER TABLE 테이블명
 ADD
 컬럼명 데이터형식;

 

예시

ALTER TABLE TB_TEST99
ADD
COL_NEW1 VARCHAR2(30);

 

 

 

다중 컬럼 추가

형식

 ALTER TABLE 테이블명
 ADD
 (컬럼명1 데이터형식, 컬럼명2 데이터형식);

 

예시

ALTER TABLE TB_TEST99
ADD
(COL_NEW2 NUMBER, COL_NEW3 DATE);

 

 

 

단일 컬럼 수정

형식

 ALTER TABLE 테이블명
 MODIFY 
 변경할 컬럼명 데이터형식;

 

예시

ALTER TABLE TB_TEST99
MODIFY 
COL_NEW1 VARCHAR2(40); -- 용량은 늘리는 경우가 많다.

 

 

 

다중 컬럼 수정

형식

 ALTER TABLE 테이블명
 MODIFY 
 (변경할 컬럼명1 데이터형식, 변경할 컬럼명2 데이터형식);

 

예시

ALTER TABLE TB_TEST99
MODIFY
(COL_NEW2 VARCHAR2(10), COL_NEW3 NUMBER);

 

 

 

단일 컬럼 삭제

형식

 ALTER TABLE 테이블명
 DROP
 COLUMN 삭제할 컬럼명;

 

예시

ALTER TABLE TB_TEST99
DROP
COLUMN COL_NEW1;

 

 

 

다중 컬럼 삭제

형식

 ALTER TABLE 테이블명
 DROP
 (삭제할 컬럼명1, 삭제할 컬럼명2);

 

예시

ALTER TABLE TB_TEST99
DROP
(COL_NEW2, COL_NEW3);

 

 

 

휴지통 비우기(복구불가)

형식

 PURGE RECYCLEBIN;

테이블 복제 

참고

 기본키와 외래키는 가져오지 않는다.

 오리지널 테이블에 영향을 주지 않는다.

 

 

 

컬럼 + 데이터 복제하기

형식

 CREATE TABLE 생성할 테이블명
 AS SELECT * FROM 복제할 테이블명;

 

예시

-- hr 스키마

CREATE TABLE TB_TEST01
AS SELECT * FROM jobs;

 

 

 

컬럼(형태)만 복제하기

참고

 맞지않는 조건을 넣어주면 컬럼만 들어오게 된다.

 

형식

 CREATE TABLE 생성할 테이블명
 AS SELECT * FROM 복제할 테이블명

 WHERE 1=2;

 

예시

CREATE TABLE TB_TEST02
AS SELECT * FROM jobs
WHERE 1=2; -- 맞지않는 조건

 

 

 

원하는 컬럼만 복제하기

형식

 CREATE TABLE 생성할 테이블명
 AS SELECT 복제할 컬럼명1, 복제할 컬럼명2 FROM 복제할 테이블명

 

예시

CREATE TABLE TB_TEST03
AS SELECT job_id, job_title FROM jobs;

 

 

 

컬럼명 바꿔서 복제하기

형식

 CREATE TABLE 생성할 테이블명("바꿀 컬럼명1", "바꿀 컬럼명1")
 AS SELECT 복제할 컬럼명1, 복제할 컬럼명2 FROM 복제할 테이블명

 

예시

CREATE TABLE TB_TEST04("업무번호", "업무명")
AS SELECT job_id, job_title FROM jobs;

 

 

 

가장 많이 사용하는 예시

참고

 GROUP BY, 서브쿼리를 사용하지 않아도 그룹함수를 사용할 수 있게 된다.

-- 테이블 생성
CREATE TABLE TB_TEST05("부서번호", "총합계", "평균")
AS SELECT DEPARTMENT_ID, SUM(SALARY), AVG(SALARY) FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

-- 생성 후 JOIN
SELECT E.FIRST_NAME, E.SALARY, T."부서번호", T."총합계", T."평균"
FROM EMPLOYEES E, TB_TEST05 T
WHERE E.DEPARTMENT_ID = 50 AND T."부서번호" = 50;

싱글톤패턴이란?

정의

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 

 

참조
주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

 

예시

public class SingletonClass {

	private static SingletonClass si = null;
    	public int s_num;
	private SingletonClass() {}
    
	public static SingletonClass getInstance() {
		if(si == null) {
			si = new SingletonClass();
		}
		return si;
	}
}        

 

싱글톤패턴 사용 이유 

한번의 객체 생성으로 객체를 재사용 함으로써 메모리 낭비 방지

데이터 공유의 편리성

 

다른 클래스에서 접근 예시

public class MyClass {
	private int number;
	
	public MyClass() {
		number = 256;
	}

	public int getNumber() {
		return number;
	}
	// SingletonClass 객체 생성
	public void method() {
		SingletonClass si = SingletonClass.getInstance();
		si.s_num = number; // 대입 0 <- 256
	}
}

 

출처 : 위키백과

 

+ Recent posts