8/12 [java]-쪽지시험 [database]-제약조건 포함
[java]-쪽지시험
[치환하는 법]
package 첫패키지;
import java.util.Scanner;
public class 치환 {
public static void main(String[] args) {
//new -> 도구 생성
//생성 -> 운영체제(Os) 자원을 가져다가 씀
Scanner sc = new Scanner(System.in);
int num1=sc.nextInt();
int num2=sc.nextInt();
System.out.println(num1); //20
System.out.println(num2); //20
sc.nextInt();
sc.close();//os 자원을 반환
//값 치환
int temp = num1; // num1=10 num2 = 20 temp =10
num1 = num2;//num1=20 num2=20 temp=10
num2 = temp; //num1=20 num2=10 tmep=10
System.out.println(num1); //20
System.out.println(num2); //10
}
}
[Q1. 컴파일러와 인터프리터를 비교하시오.]
- 컴파일러: 작성한 코드를 기계어로 바꿔 줌, 작성된 코드를 한번에 번역, 번역시간이 오래걸리고 그 과정이 복잡하지만 실행시간은 빠름
- 인터프리터: 작성한 코드를 기계어로 바꿔줌, 줄 단위로 번역과 실행, 번역시간은 빠르지만 실행시간은 느림
[Q2. JDK,JRE,JVM,IDE의 역할을 서술하시오.]
- JDK : java 개발을 위해 필요한 도구를 포함
- JRE : 컴파일된 자바 프로그램을 실행시킬 수 있는 자바 환경
- JVM: 자바 바이트 코드(.class)를 실행코드로 변환하여 실행
- IDE: 소스코드 편집, 컴파일, 디버깅을 한꺼번에 할 수 있는 소프트웨어 통합 개발
[Q3. 변수와 상수의 의미를 서술하고 선언 방식을 작성하시오]
- 변수: 변하는 수를 담을 수 있는 공간 int num;
- 상수: 변하지 않는 수를 담을 수 있는 공간 final int num =3;(*값을 변경하지 못하기 때문에 할당 필수)
[Q4. 다음 중 잘못된 변수 이름을 모두 고르고 사용이 불가능한 이유를 작성하시오.]
1. int class; -> 예약어 사용 불가
2. char #_a; -> #사용 불가, _는 가능
3. double_number2 -> 가능
4. String 12number; -> 숫자로 시작 불가
5. int 변수; ->가능
6. int total Score; -> 변수 이름에 공백 불가
[Q5. 각 형태와 크기에 해당하는 기본 자료형을 작성하시오.]
1byte | 2byte | 3byte | 4byte | |
논리 | boolean | |||
문자 | char | |||
정수 | byte | short | int | long |
실수 | float | double |
[Q6. 다음 문장을 보고 변수를 선언하시오.(형변환 활용)]
1) long 타입 변수 선언 후 25할당
long num = 25;
2) float 타입 변수 선언 후 1.5할당
float num = 1.5f; or float num = (float)1.5;
3) char 타입 변수 선언 후 A할당
char c = 'A';
4) boolean 타입 변수 선언 후 true 할당
boolean sw = true;
[Q7.다음 코드를 실행 후 출력되는 결과를 작성하시오.]
String a = 10+7+""+8+2; ->1782
String b = 8+""+2+(6+4); ->8210
String c = ""+5+(5+"3")+2; -> 5532
[Q8.다음 코드를 실행 후 출력되는 결과를 작성하시오.]
int opr =10;
System.out.println(opr++); -> 10
System.out.println(opr); -> 11
System.out.println(opr--); -> 11
System.out.println(opr); -> 10
System.out.println(++opr); -> 11
System.out.println(opr); -> 11
System.out.println(--opr); -> 10
System.out.println(opr); -> 10
[Q9.다음 코드를 실행 후 출력되는 결과를 작성하시오.]
int num1 =10;
int num2 = 12;
System.out.println(num1==10&&num2==12); -> true
System.out.println(num1<12||num2>12); -> true
[Q10. 논리, 대입, 비교, 산술, 삼항, 증감연산자의 우선순위를 작성하시오.]
증감 연산자 > 산술 연산자 > 비교 연산자 > 논리 연산자 > 삼항연산자 > 대입연산자
[Q11. 다음 코드를 보고 실행순서를 나열하시오.]
int sum =0; if(grade > 100) { ① sum += 100; } else if (grade >50) { ② sum +=50; } else { ③ sum+=20; } if(grade>20){ ④sum +=10; } ⑤system.out.println(sum); |
1) grade가 110일 때
답 : 1-4-5
2) grade가 80일 때
답: 2-4-5
3)grade가30일 때
답: 3-4-5
4)grade가 10 일 때
답 : 3-5
[문제12 다음 코드를 보고 실행순서를 나열하시오.]
int num =0; int num2 =0; ①while(num<1){ ②while(num2<0){ ③System.out.println("melon"); ④num2++; } ⑤System.out.println("apple"); ⑥++num; } |
답: 1 - 2 - 5 - 6 - 1
[문제13]
package 반목문예제모음;
import java.util.Scanner;
public class ex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자 입력 >> ");
int num = sc.nextInt();
System.out.println("10으로 나눈 몫 : "+(num/10));
System.out.println("10으로 나눈 나머지 : "+(num%10));
}
}
[문제14]
package 반목문예제모음;
import java.util.Scanner;
public class ex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("나이 >> ");
int age = sc.nextInt();
if(age<=40) {
System.out.println("초년입니다");
}else if(age<=60) {
System.out.println("중년입니다");
}else {
System.out.println("노년입니다");
}
}
}
[문제15]
package 반목문예제모음;
import java.util.Scanner;
public class ex {
public static void main(String[] args) {
int sum =0;
for(int i=1; i<=100; i++) {
if(i%2==1) {
System.out.print(i+" ");
sum+=i;
}else {
System.out.print(-i+" ");
sum-=i;
}
}
System.out.println("\n결과 : "+sum);
}
}
[문제16]
package 반목문예제모음;
import java.util.Scanner;
public class ex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("단 수 입력 : ");
int dan = sc.nextInt();
System.out.print("어느 수까지 출력 : ");
int num = sc.nextInt();
System.out.println(dan+"단");
for(int i=1; i<=num; i++) {
System.out.printf("%d * %d = %d\n", dan, i, dan*i);
}
}
}
[문제17]
package 반목문예제모음;
import java.util.Scanner;
public class ex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력 : ");
int num = sc.nextInt();
int sum = 0;
while(num>0) {
sum+=num%10;
num/=10;
}
System.out.println("각 자리수 합 : "+sum);
}
}
[문제19]
package 반목문예제모음;
import java.util.Scanner;
public class ex {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
for(int j=5-i; j>=1; j--) {
System.out.print(" ");
}
for(int j=1; j<=2*i-1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
<data base>
[삭제 명령어]
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(10)
LOC VARCHAR2(13)
JOB VARCHAR2(10)
SQL> alter table dept
2 drop column loc;
Table altered.
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(10)
JOB
DDL -> drop 명령어는 data,데이터디션어리의 구조정보도 삭제된다, 저장공간도 삭제된다, 테이블 전체에 lock을 건다
지우때 사용하는 명령어 : delete(dml), 행삭제, 복구 rollback, 행 단위
truncate (ddl), dd정보, all 행삭제, 공간삭제, 복구 불가, 단 backup본이 있으면 가능
drop(ddl) all data정보, table 구조 정보 삭제,복구 불가, 단 backup본이 있으면 가능
[테이블 삭제]
- 테이블의 모든 데이터 및 구조를 삭제합니다.
- 보류 중인 트랜잭션을 모두 커밋합니다.
- 인덱스를 모두 삭제합니다.
- drop table 문은 롤백할 수 없습니다.
drop table dept80;
table dropped.
- drop table 문은 오라클 테이블의 정의를 제거합니다. 테이블을 삭제하면 데이터베이스는 테이블의 모든 데이터 및 이와 관련된 모든 인덱스를 잃게 됩니다.
- 테이블의 데이터를 모두 삭제합니다.
- 모든 뷰와 동의어는 그대로 남아 있지만 사용할 수 없습니다.
- 보류 중인 트랜잭션을 모두 커밋합니다.
- 해당 테이블을 생성한 사용자와 drop any table 권한을 가진 사용자만이 테이블을 제거할 수 있습니다.
SQL> desc dept
Name Null? Type
---------------------- ---------------- --------------
DEPT NUMBER(2)
DNAME VARCHAR2(50)
SQL> alter table dept
2 drop column dname;
Table altered.
SQL> desc dept
Name Null? Type
---------------------- ---------------- --------------
DNAME VARCHAR2(50)
데이터디션에리는 모든 데이터 들이 메타 데이터 형식대로 저장되어 있다 status ->used 상태로 저장되어 있다
unused는 data공간은 남겨놓고 삭제한다
SQL> alter table dept
2 drop unused columns;
//dept 테이블의 unused 상태인 컬럼들을 한번에 지워라
Table altered.
[객체 이름 변경]
- 테이블, 뷰, 시퀀스 또는 동의어의 이름을 변경하려면 RENAME 문을 실행하십시오.
RENAME dept TO detail_dept;
Table renamed.
- 사용자가 해당 객체의 소유자이어야 합니다.
(테이블 이름 변경)
추가 DDL 문으로 테이블, 뷰, 시퀀스 또는 동의어의 이름 변경에 사용되는 RENAME 문이 있습니다.
구문
RENAME old_name TO new_name;
구문 설명:
old_name 테이블,뷰,시퀀스 또는 동의어의 기존 이름입니다.
new_name 테이블, 뷰, 시퀀스 또는 동의어의 새 이름입니다.
* 테이블의 지우는 명령어
data | 공간 | 복구 | ||
delete (where절 사용 가능) (행 단위 삭제 할때 가능) |
DML(명령어) | 행삭제 | 남아있다 | rollback |
truncate= table 초기화 (전체 데이터 삭제 할때) |
DDL(명령어) | 모든 행 삭제,데이터디션어리 정보도 삭제된다 | 공간삭제, table 구조 남음 |
복구불가(단, 백업본 있으면 가능) |
drop | 모든 데이터,데이터디션어리 정보도 삭제된다,table 구조 정보도 삭제된다 | all |
[테이블 절단]
* truncate table 문:
- 테이블에서 모든 행을 제거합니다.
- 해당 테이블이 사용하는 저장 공간을 해제합니다.
TRUNCATE TABLE detail_dept;
Table truncated.
- truncate를 사용한 행 제거 작업은 롤백할 수 없습니다.
- 대신 delete 문을 사용하여 행을 제거할 수 있습니다
- truncate table 문은 테이블에서 모든 행을 제거하고 해당 테이블이 사용하는 저장 공간을 해제할 때 사용하는 DDL 문 입니다. truncate table 문을 사용한 행 제거 작업은 롤백할 수 없습니다.
- delete 문 역시 테이블에서 모든 행을 제거할 수 잇지만 저장 공간을 해제하지는 않으며 truncate 명령보다 느립니다.
truncate 문으로 행을 제거하는 것이 delete 문으로 제거 하는 것 보다 빠른 이유는 다음과 같습니다.
[테이블에 주석 추가]
- comment 문을 사용하여 테이블 또는 열에 주석을 추가할 수 있습니다.
comment on table employees
is 'employee information';
comment created.
- 주석은 데이터 딕셔너리 뷰를 통해 볼 수 있습니다.
1. all_col_comments
2. user_col_comments
3. all_tab_comments
4. user_tab_comments
<요약>
create table - 테이블 생성, 서브 쿼리를 사용하여 다른 테이블을 기반으로 하는 테이블을 생성
alter table - 테이블 구조를 수정, 열 폭(width) 과 데이터 유형을 변경하고 열을 추가
data table - 행 및 테이블 구조를 제거합니다, 이 명령문을 실행한 후에는 롤백 할 수 없습니다
rename - 테이블, 뷰, 시퀀스 또는 동의어의 이름을 변경합니다
truncate - 테이블에서 모든 행을 제거하고 해당 테이블이 사용하는 저장 공간을 해제합니다, delete문은 행만 제거
comment - 테이블 또는 열에 주석을 추가합니다, 데이터 딕셔너리를 질의하여 주석을 봅니다.
<10 제약 조건 포함>
제약조건 -> pk,fk -> 제약을 주는 조건
-> 조건을 줘서 조건에 맞는 데이터만 삽입, 또는 변경, 삭제를 수행하게 해서 무결성을 보장
-> 무결성을 보장하기 위한 조건
->제약조건은 컬럼별로 설치
-> 한개의 컬럼에 여러개의 제약조건을 설치 가능
[제약 조건이란?]
- 제약 조건은 테이블 레벨로 규칙을 적응합니다.
- 제약 조건은 종속된 테이블의 삭제를 방지하는건 fk와 관련이 있다.
- 다음은 유효한 제약 조건 유형입니다.
- not null -> 반드시
- UNIQUE -> 중복 허용x, NULL을 허용
- Primary key -> not null+uk 대표 columm 1개 설치 1개 컬럼에 1개의 pk가 있는것이 가장 이상적인 테이블이다
- foreign key-> 외부키, 참조키를 포함한 것으로 다른 table의 columm의 data를 참조할때 사용, table과 table의 관계를 설정할때 사용
- check(사용자 정의 조건)
[제약 조건 시점]
- 제약 조건에 이름을 지정하지 않으면 oracle serverrk가 sys_cn 형식의 이름을 생성합니다.
- 제약 조건 생성 시기 : 테이블이 생성될때 -> create table -> 생성문구 포함
: 테이블 생성된 후에 -> alter table ->추가
- 열 레벨 또는 테이블 레벨로 제약 조건을 정의합니다.
- 데이터 딕셔너리에서 제약 조건을 봅니다.
create table test (did number(5), dname number(5) no null, 컬럼 선언부 loc number(5), constraint test_did_pk primary key (did) => 제약조건 선안부 이름을 가진 제약조건은 설치 constraint test_loc_uk unique(loc) constraint 제약조건이름 제약조건유형(제약조건을 설치할 컬럼 이름) -> 생략가능 |
[제약 조건 정의]
create table[schema.]table
(column datatype [default expr]
[column_constraint],
...
[table_constraint][,...]);
create table employees(
employee_id NUmber(6),
first_name varchar2(20),
...
job_id varchar2(10) not null,
constraint emp_emp_id_pk
primary key (employee_id));
- 구문 설명
1.schema 소유자 이름과 동일합니다.
2. table 테이블 이름입니다.
3. default expr insert 문에 값이 생략된 경우 사용할 기본값을 지정합니다
4. column 열이름입니다.
5. datatype 열의 데이터 유형 및 길이입니다.
6. column_constraint 열 정의의 일부인 무결성 제약 조건입니다.
7. table_constraint 테이블 정의의 일부인 무결성 제약 조건입니다.
- 열 제약 조건 레벨
column [constraint constraint_name] constraint_type,
- 테이블 제약 조건 레벨
column,...
[constranint constraint_name] constraint_type
(column, ...),
제약 조건은 일반적으로 테이블이 생성될 때 생성되지만 테이블이 생성된 후에도 추가할 수 있으며 일시적으로 사용할 수 없게 만들 수도 있습니다. 제약 조건은 다음 두 가지 레벨 중 하나로 정의할 수 있습니다.
제약 조건 레벨 | 설명 |
열 | 단일 열을 참조하며 해당 제약 조건을 소유하는 열의 명세 부분에서 정의됩니다. 모든 무결성 제약 유형을 정의할 수 있습니다. |
테이블 | 하나 이상의 열을 참조하며 테이블의 열 정의와는 별도로 정의됩니다. NOT NULL을 제외한 모든 제약 조건을 정의할 수 있습니다. |
[NOT NULL 제약 조건]
- 해당 열에 널 값을 사용할 수 없도록 합니다.
- not null 제약조건을 사용하면 해당 열에 널 값이 사용되지 않습니다. not null 제약 조건이 없는 열은 기본적으로 널 값을 가질 수 있습니다.
create table employees(
employee_id number(6).
lat_name varchar2(25) not null, //<-시스템이 이름 지정
salary number(8,2),
commission_pct number(2,2),
hire_date date
constraint emp_hire_date_nn //<-사용자가 이름 지정
not null,
[unique 제약 조건]
- 중복 값을 허용하지 않을 때 사용
- unique 키 무결성 계약 조건은 열 또는 열 집합(키)의 모든 값이 고유하게 유지되도록 합니다. 즉 한 테이블에 있는 두 행은 지정된 열 또는 열 집합에서 중복된 값을 가질 수 없습니다. unique 키 제약 조건이 정의된 열 또는 열 집합을 고유 키라고 합니다. unique 제약 조건이 하나 이상의 열을 포함하는 경우 해당 열 그룹을 조합 고유 키라고 합니다.
- unique 제약 조건을 지정한 열에 not null 제약 조건을 정의하지 않으면 이 열에는 널 값이 허용됩니다. 널 값은 어떠한 값과도 동일한 것으로 취급되지 않으므로, not null 제약 조건이 없는 열에는 널 값이 포하된 행이 여러 개 존재할 수 있습니다. 열에 널 값이 있어도(또는 조합 unique 키가 적용되는 모든 열에 널 값이 있어도 unique 제약 조건은 항상만족합니다.
- 테이블 레벨 또는 열 레베로 정의합니다.
create table employees(
employee_id number(6),
last_name varchar2(25) not nill,
email varchar2(25),
salary number(8,2),
commission_pct number(2,2),
hire_date date not null,
...
constraint emp_email_uk unique(email);
[primary key 제약 조건]
- fk 가 참조하는 컬럼은 pk,uk가 반드시 설치되어야 한다
- fk -> pk,uk 참조 컬럼 -> dt. 길이가 같아야 함
emp | dept |
did(fk) | did(1. pk,uk 설치 되어있어야 한다} |
* 2개의 did는 data type,길이가 같아야 한다
create table departments(
department_id number(4),
department_name varchare2(30)
constraint dept_nme_nn not null,
manager_id number(6),
location_id number(4),
constraint dept id pk primary key(department id);
[foreign key 제약 조건]
- 참조 무결성 제약 조건은 열 또는 열 조합을 외래 킬로 지정하고 동일한 테이블이나 다른 테이블에 있는 기본 키 또는 공ㅍ 키와의 관계를 설정합니다.
constraint emp_dept_fk foreign key(department_id)
references departments(department_id)
- foreign key: 테이블 제약 조건 레벨로 자식 테이블의 열을 정의합니다.
- references: 부모 테이블 및 부모 테이블에서의 해당 열을 식별합니다.
- on delete cascade: 부모 테이블의 행이 삭제되는 경우 자식 테이블의 종속 행을 삭제합니다.
자식 테이블의 참조 행을 전체 삭제
- on delete set null: 종속 외래 키 값을 널로 변환 합니다, 참조 값만 null로 대체
[check 제약 조건]
- 각 행이 만족시켜야 하는 조건을 정의합니다.
- 다음 표현식은 허용 되지 않습니다.
- currval, nextval, level 및 rownum 의사 열 참조
- sysdate, uid, user 및 userenv 함수 호출
- 다른 행의 다른 값을 참조하는 질의
constraint emp_salary_min
check(salary>0),...
[제약 조건 추가 구문]
다음 작업에 alter table 문을 사용합니다.
- 제약 조건을 추가 또는 삭제할 수 있지만 구조를 수정할 수는 없습니다.
- 제약 조건을 활성화 또는 비활성화 합니다.
- modify 절을 사용하여 not null 제약 조건을 추가합니다.
alter table table
add [constraint constraint] type (column);
- employees 테이블에 foreign key 제약 조건을 추가 하는 다음 작업은 관리자가 employees 테이블에 유효한 사원으로 존재해야 함을 나타냅니다.
alter table employees
add constraint emp_manger_fk
foreign key(manager_id)
references employees(employee_id);
Table altered.
[테이블 생성]
1 create table test
2 (a number(5),
3 b number(5) not null,
4 c date,
5 d number(5),
6 constraint test_a_pk primary key(a),
7 constraint test_c_uk unique(c),
8 constraint test_d_ck check( d in(0,1));
Table created.
SQL> @empdept.sql
Table created
-> table 생성하기
* empdept 메모장에서 코드 짜기
drop table dept cascade constraints;
drop table emp cascade constraints;
create table DEPT
( DEPTNO number(2),
DNAME varchar2(14) not null,
LOC varchar2(13) not null,
constraint DEPT_LOC_pk primary key(deptno)
);
create table EMP
( EMPNO number(4),
ENAME varchar2(10) not null,
GENDER char(10) not null,
JOB varchar2(9) not null,
MAG number(4),
HIREDATE date not null,
SAL number (7,2) not null,
COMM number (7,2),
DEPTNO number(2),
constraint EMP_EMPNO_pk primary key(EMPNO),
constraint EMP_GENDER_ck check(GENDER in ('MAN','WOMAN')),
constraint EMP_DEPTNO_fk foreign key(DEPTNO) references dept(deptno)
);
insert into dept values(10,'Adminstration',1700);
insert into dept values(20,'Marketing',1800);
insert into dept values(30,'Purchasing',1700);
insert into dept values(40,'Human',2400);
insert into dept values(50,'Shipping',1500);
insert into emp values(100,'King','MAN','AD_PRES',null,'1987-01-17',24000,null,10);
insert into emp values(101,'Kochar','MAN','AD_VP',100,'1989-09-21',17000,null,50);
insert into emp values(102,'DE Haen','WOMAN','AD_VP',100,'1993-01-13',17000,null,50);
insert into emp values(103,'Hunold','MAN','IT_PROG',102,'1990-07-03',9000,null,40);
insert into emp values(104,'Ernst','WOMAN','IT_PROG',103,'1997-07-25',4800,null,40);