SW공부 54일차

Guryena·2023년 3월 29일
0

SQL

목록 보기
3/3

1. 제약 조건에 대하여 설명하시오.

제약조건(constraint)이란 데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙을 의미한다.
이러한 제약 조건은 CREATE 문으로 테이블을 생성할 때나 ALTER 문으로 컬럼을 추가할 때도 설정할 수 있다.

SQL의 제약조건은 다음과 같다.

  • NOT NULL
    NOT NULL 제약 조건을 설정하면, 해당 필드는 NULL 값을 저장할 수 없다.
    즉, 이 제약 조건이 설정된 필드는 무조건 데이터를 가지고 있어야 한다.
CREATE TABLE 테이블이름
(
    필드이름 필드타입 NOT NULL,
    ...
)
  • UNIQUE
    UNIQUE 제약 조건을 설정하면, 해당 필드는 서로 다른 값을 가져야 한다.
    즉, 이 제약 조건이 설정된 필드는 중복된 값을 저장할 수 없다.
1. CREATE TABLE 테이블이름
(
    필드명 필드타입 UNIQUE,
    ...
)
 
2. CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
)
  • PRIMARY KEY
    PRIMARY KEY 제약 조건을 설정하면, 해당 필드는 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가진다.
    따라서 이 제약조건이 설정된 필드는 NULL 값을 가질 수 없으며, 또한 중복된 값을 가질 수 없다.
    이러한 PRIMARY KEY 제약 조건을 기본 키라고 한다.
    테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다.
1. CREATE TABLE 테이블이름
(
    필드이름 필드타입 PRIMARY KEY,
    ...
)
 
2. CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
)
  • FOREIGN KEY
    FOREIGN KEY 제약 조건을 설정한 필드를 외래 키라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할을 한다.
    외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조해서 레코드가 입력된다.
    즉, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만든다.
    FOREIGN KEY를 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY가 설정되어 있어야 한다.
CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름]
    FOREIGN KEY (필드이름)
    REFERENCES 테이블이름 (필드이름)
)
  • DEFAULT
    DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해준다.
    만약 레코드를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본 값을 저장한다.
CREATE TABLE 테이블이름
(
    필드이름 필드타입 DEFAULT 기본값,
    ...
)

2. primary key 란?

기본 키(primary key)는 주 키 또는 프라이머리 키라고 하며, 관계형 데이터베이스에서 조(레코드)의 식별자로 이용하기에 가장 적합한 것을 관계 (테이블)마다 단 한 설계자에 의해 선택, 정의된 후보 키를 말한다.
유일 키는 0~1개 이상의 속성의 집합으로 볼 수 있다. 즉, 관계에 저장된 레코드를 고유하게 식별하는 후보 키 (=속성 또는 속성의 집합) 가운데, 설계자가 일반적으로 이용되어야한다고 정해 놓은 것을 가리킨다.

관계형 데이터베이스 관리 시스템(RDBMS)과 미들웨어, 애플리케이션 등의 레코드 식별자가 필요한 경우 기본 키가 사용된다.
반드시 기본 키를 사용해야만 하는 경우가 아니면, 다른 후보 키로 대체되어도 기능 수행에는 문제가 없다.
따라서 기본 키의 이론적 의의는 크지 않지만 실무에서 널리 사용되고 있는 개념이다.
그러나 기본 키는 NULL의 존재가 허용되지 않지만, 후보 키에 허용이 되는 차이가 있다. (레코드 추가, 업데이트할 때 제약 조건으로 기본 키를 생각한다면, 고유 제약 조건에 NOT NULL 제약을 가한 것이 기본 키 제약 조건이라고 생각할 수 있다).
관계에 있는 후보 키가 하나인 때에는 그 후보 키가 당연히 기본 키가 된다.
또한 기본 키가 아닌 후보 키는 대리 키(alternate key)라고 한다.

3. roll back 과 commit 의 개념에 대하여 설명하시오.

  • rollbakc
    rollback은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다. 후진 복귀라고도 한다. 데이터베이스는 업데이트 이전 저널 파일을 사용하여 원래의 정상적인 상태로 되돌린다. 이것은 오류 동작 이후에도 깨끗한 사본으로 복원시킬 수 있기 때문에, 무결성을 위해 중요하다. 데이터베이스 서버의 충돌로부터 복원하는데도 중요하다. 충돌이 일어날 때, 특정 트랜잭션을 롤백시킴으로써 데이터베이스는 일관적인 상태로 되돌려진다.

    롤백은 보통 트랜잭션 로그를 통해 수행되지만, 다중버전 동시성 제어를 통해 구현되기도 한다.

  • commit
    COMMIT 문은 관계형 데이터베이스 관리 시스템(RDBMS)에서 트랜잭션을 종료하고 다른 사용자에게 변경된 모든 사항을 보이도록 만드는 문이다.
    일반적으로 트랜잭션 종료시 해당 업데이트를 확정한다는 의미에서 "커밋"이라고 사용한다. 반대로 업데이트를 취소 처리를 롤백 (ROLLBACK)이라고 하며, 이러한 제어를 약속 제어라고 부른다. SQL에서는 ROLLBACK 문이 그 처리를 한다.

    SQL에서 COMMIT은 RDBMS 내에 있는 데이터베이스 트랜잭션을 종결시키고, 모든 변화를 다른 사용자들이 볼 수 있게 만들어 준다. 일반적인 포맷은 BEGIN WORK 구문으로 시작하여, COMMIT 구문이 나온다. 다른 방법으로 ROLLBACK 구문으로 시작될 수 있으며, 이것은 BEGIN WORK로 시작된 모든 작업을 그 이전으로 되돌린다. COMMIT 구문은 또한 현존하는 SAVEPOINT가 사용될 수 있을 것이다.

    트랜잭션의 측면에서 커밋의 반대는 트랜잭션의 임시적인 변화를 포기하는 것(롤백)이다.

4. 트랜잭션이란?

데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.

이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 ACID라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.

어떤 시스템들에서는 트랜잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다.

5. 아래 객체에 대하여 설명하시오.

  • Connection
    특정 데이터 원본에 대한 커넥션은 Connection 인터페이스가 구현된 클래스의 객체로 표현된다. 어떤 SQL 문장을 실행시키기 전에 우선 Connection 객체가 있어야 한다.
    Connection 객체는 특정 데이터 원본과 연결된 커넥션을 나타내고, 특정한 SQL 문장을 정의하고 실행시킬 수 있는 Statement 객체를 생성할 때 Connection 객체를 사용한다.

    Connection 객체는 데이터베이스에 대한 데이터인 메타데이터(Meta Data)에 관한 정보를 데이터 원본에 질의하는데 사용한다. 이 때, 사용 가능한 테이블의 이름, 특정 테이블의 열에 정보 등이 포함된다.

  • Statement
    Statement 인터페이스는 Connection 객체를 통해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합을 정의한다. Statement 객체는 Statement 인터페이스를 구현한 객체로, 항상 인수가 없는 Connection 클래스의 CreateSteatement() 메소드를 호출함으로써 얻어진다.

    Statement 객체를 생성하면 Statement 객체의 exequteQuery() 메소드를 호출하여 SQL 질의를 실행시킬 수 있다.
    메소드의 인수로는 SQL 질의 문장을 담은 String 객체를 전달한다.
    Statement 객체는 단순한 질의문을 사용할 경우에 좋다.

  • ResultSet
    SQL 문에서 SELECT 문을 사용한 질의의 경우 성공 시 결과물로 ResultSet을 반환한다.
    ResultSet은 SQL 질의에 의해 생성된 테이블을 담고 있다. 또한 ResultSet 객체는 커서(cursor)라고 불리는 것을 가지고 있는데, 그것으로 ResultSet에서 특정 행에 대한 참조를 조작할 수 있다.

    커서는 초기에 첫번째 행의 직전을 가리키도록 되어 있는데, ResultSet객체의 next() 메소드를 사용하면 다음 위치로 커서를 옮길 수 있다.



    ResultSet에서 행을 처리하는데 반복문을 사용하여 next() 메소드가 유효한 행이 있으면 true, 없으면 false를 리턴하는 것을 이용하여 while문으로 제어할 수 있다.

    ResultSet 객체에서 현재 행에서 필드명 혹은 레코드셋에서의 위치를 통해 어떤 필드의 값을 가져올 수 있는 메소드를 제공한다.



    해당 필드의 데이터 타입이 문자열이면 getString()이 되고, 해당 필드의 데이터 타입이 int면 getInt()가 된다.

6. emp.jsp (emp 테이블에 있는 모든 데이타를 뽑아 오시오.)

<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String url = "jdbc:oracle:thin:@localhost:1521/xe";
	Class.forName("oracle.jdbc.driver.OracleDriver");
	
	String sql = "SELECT * FROM dept";
	String sqlEMP = "SELECT * FROM EMP";
	String sqlSal = "SELECT ENAME AS 이름, SAL *12 + NVL(COMM, 0) AS 연봉 FROM EMP";
	
	Connection con = DriverManager.getConnection(url, "scott", "tiger");
	Statement st = con.createStatement();
	ResultSet rs2 = st.executeQuery(sqlEMP);
	
	
	while(rs2.next()){
		out.print(rs2.getString("EMPNO") +" || " + rs2.getString("ENAME") + " || " + rs2.getString("JOB") +" || " + 
				rs2.getString("MGR") +" || " +rs2.getString("HIREDATE") +" || " +rs2.getString("SAL") 
				+" || " +rs2.getString("COMM") +" || " +rs2.getString("DEPTNO") +"<br>");
		out.print("<hr>");
	}
		
	
	rs.close();
	st.close();
	con.close();
	
	
%>
</body>
</html>

0개의 댓글