반응형

bitcamp-docs - sql에서 확인 가능.

 

Exam01.sql

SQL 사용 // DBMS에게 내리는 명령의 문법을 이야기 함. // SQL에는 3가지 형태가 있다.

        // 1. DDL // (table) 생성, 변경, 삭제 // 2. DML // (data) 입력, 변경, 삭제 // 3. DQL // 데이터 조회 및 join(조인)

        // 1. DDL(Data Definition Language) // DB 객체(테이블, 뷰, 함수, 트리거 등)를 생성, 변경, 삭제하는 명령이다.

        // 데이터베이스(database) = 스키마(schema) // 트리거(trigger) // 특정 조건에서 자동으로 호출되는 함수

        // 특정 조건? SQL 실행 전/후 등 // ServerApp에서는 Observer의 역할이라고 이해하면 된다.

        // SQL 명령어

        // $ create database 데이터베이스명 옵션들...; // 데이터베이스 생성

        // $ drop database 데이터베이스명; // 데이터베이스 삭제

        // $ alter database 데이터베이스명 옵션들...; // 데이터베이스 변경

        // $ create database 데이터베이스명 옵션들...; // 데이터베이스 생성

        // $ create table test01 (name varchar(50) not null, kor int not null);

        // $ create table 테이블명 (컬럼명 타입 NULL여부 옵션, 컬럼명 타입 NULL여부 옵션, .... ); 테이블 생성

        // $ describe test01; // $ describe 테이블명; // 테이블 정보 보기

        // $ drop table test01; // $ drop table 테이블명; // 테이블 삭제하기

        // $ insert into test1(no, name) values(1, 'aaa');

        // int 값에 부동 소수점 넣었을 때 // 소수점 이하 반올림하고 짜름

        // $ c3 numeric(6,2) // 소수점 자릿수를 지정하는 거, 총 6자리인데 소수점 이하가 2자리라는 뜻 // 0000.00

        // $ insert into test1(c3) values(123456789); // 입력 오류. 5자리 초과 // 앞자리가 4자리까지만 된다.

        // $ insert into test1(c3) values(12345); // 입력 오류. 1자리 초과

        // $ insert into test1(c3) values(3.14159); // 2자리를 초과한 값은 반올림.

        // $ c4 numeric // numeric 뒤에 아무런 표시를 주지 않으면 int와 같다 

        // char(n) // 0 <= n <= 255 // 한 문자를 저장하더라도 n자를 저장할 크기를 사용

        // varchar(n) //0 ~ 65535 바이트 크기를 갖는다 // UTF-8로 지정된 경우 n은 최대 21845까지 지정

        // 한 문자를 저장하면 한 문자 만큼 크기의 메모리를 차지 

        // 메모리 크기가 가변적이라서 데이터 위치를 찾을 때 시간이 오래 걸린다. // 속도가 느리다.

        // char 범위에 해당하여 속도가 더 빠른 char를 사용해도 되지만 실무에서는 varchar를 사용한다.

        // $ c1 char(5) // insert into test1(c1) values('가나다라마'); // 한글 영어 상관없이 5자

        // $ insert into test1(c1) values('abcdefghi'); // 입력 크기 초과 오류!

        // $ insert into test1(c1) values('가나다라마바'); // 입력 크기 초과 오류! 

        // $ c2 varchar(5) // $ insert into test1(c2) values('abcdefghi'); // 입력 크기 초과 오류!

        // $ insert into test1(c1) values('abc'); // $ select * from test1 where c1='abc'; // MySQL은 검색 가능.

        // DBMS 중에는 고정 크기인 컬럼의 값을 비교할 때 빈자리까지 검사하는 경우도 있다.

        // c1을 char(5)의 크기로 설정하였기 때문에 몇몇 DBMS에서는 검색이 안될 수도 있다.

        // $ select * from test1 where c1='abc  '; // 검색이 안되는 DBMS에서는 이렇게 빈칸까지 채워야지만 검색 가능

        // text(65535), mediumtext(약 1.6MB), longtext(약 2GB) // 긴 텍스트를 저장할 때 사용하는 컬럼이다.

        // 오라클의 경우 long 타입과 CLOB(character large object) 타입이 있다.

        // date // 년,월,일 정보를 저장한다 // 오라클의 경우 날짜 뿐만 아니라 시간 정보도 저장한다.

        // time // 시, 분, 초 정보를 저장한다. // datetime // 날짜와 시간 정보를 함께 저장할 때 사용한다.

        // rdt datetime not null default now() // default now()를 설정하면 현재 시간이 들어간다.(current_timestamp())

        // $ c1 date // insert into test1(c1) values('2017-11-21 16:13:33'); // 날짜 정보만 저장 // 시간은 버린다.

        // $ c2 time // insert into test1(c2) values('2017-11-21 16:13:33'); // 시간 정보만 저장 // 날짜는 버린다.

        // $ c1 char(1) // $ c2 int // $ c3 boolean // 회사마다 True false 표시를 하는 방법이 다르다.

        // c1일때는 Y, N // T, F // 1,0 // c2일때는 1,0 // c3일때는 true/false

        // primary key // 테이블의 데이터를 구분할 때 사용하는 컬럼들이다. // PK라고 표시

        // 컬럼들인 이유는 값 두개 이상을 구분 값으로 사용할 수도 있기 때문이다.

        // $ name varchar(20) primary key, // 기존엔 $ name varchar(20), 로 넣었다.

        // $ create table test1(name varchar(20), age int, constraint test1_pk primary key(name, age));

        // $ create table 테이블명(컬럼명, 컬럼명, constraint 테이블명_pk primary key(컬럼명,컬럼명));

        // 두개 이상 primary key 설정 가능. // 이 경우에는 primary key들의 값이 다 같아야 중복으로 확인한다.

        // 즉 name만 같거나 age만 같으면 중복이라고 판단하지 않는다.

        // 여러 개의 컬럼을 묶어서 PK로 사용하면 데이터를 다루기가 불편하다. 

        // 데이터를 찾을 때 마다 name과 age 값을 지정해야 하기 때문이다.

        // 실무에서는 이런 경우 '학번'처럼 임의의 값을 저장하는 컬럼을 만들어 PK로 사용한다.

        // $ create table test1(no int primary key, name varchar(20), age int); // PK값으로 사용할 컬럼을 만든다.

        // 그러나 이 경우에는 번호는 중복되지 않았지만, name과 age값이 중복되는 경우를 막을 수 없다.

        // PK값만 비교해서 중복값을 걸러내기 때문이다.

        // unique // PK는 아니지만 PK처럼 중복을 허락하지 않는 컬럼을 지정할 때 사용

        // PK를 대신해서 사용할 수 있는 key라고 해서 "대안키(alternate key)"라고 부른다.

        // create table test1(no int primary key, name varchar(20), age int, constraint test1_uk unique (name, age));

        // $ create table 테이블명(컬럼명 primary key, 컬럼명, 컬럼명, constraint 테이블명_uk unique (컬럼명,컬럼명));

        // 이 경우에는 번호(PK)가 중복되지 않았더라도, name, age의 값이 중복되면 저장이 되지 않는다.

        // 반대로 name,age 값이 중복되지 않았더라도, 번호(PK)의 값이 중복되면 저장이 되지 않는다.

        // 모든 설정을 맨 뒤에 붙힐 수 있다.

        // $ create table test1(no int, name varchar(20), age int,

        // $ constraint test1_pk primary key(no), constraint test1_uk unique (name, age)); // 이렇게 뒤로 보낼 수 있다.

        // desc test1;로 상세정보를 확인해보면 uk로 표시되지 않고, 묶인 컬럼중 하나에만 mul이라는 표시가 뜬다.

        // index // 특정 컬럼의 값을 A-Z, Z-A로 정렬시키는 문법이 index이다.

        // DBMS는 해당 컬럼의 값으로 정렬한 데이터 정보를 별도로 생성한다.

        // index로 지정된 컬럼의 값이 추가/변경/삭제 될 때 index 정보도 갱신한다.

        // 입력/변경/삭제가 자주 발생하는 테이블에 대해 index 컬럼을 지정하면, 입력/변경/삭제 속도가 느리다.

        // 입력/변경/삭제를 자주 해주어야 하기 때문이다. // 단 정렬이 잘 되어있는 상태기 때문에 조회가 빠르다.

        // $ create table test1(no int, name varchar(20), age int, fulltext index test1_name_idx (name));

        // $ create table 테이블명(컬럼명, 컬럼명, 컬럼명, fulltext index 테이블명_컬럼명_idx (컬럼명));

        // $ select * from test1 where name = 'bbb'; // *를 넣으면 모든 컬럼이 다 나온다.

        // $ select 컬럼명, 컬럼명 from 테이블명 where 컬럼명 = '찾을값'; // 찾는 방법.

        // $ alter table test1 add column no int; // 테이블에 컬럼 추가

        // $ alter table 테이블명 add column 컬럼명 컬럼타입;

        // $ alter table test1 add column no2 int, add column age2 int; // 컬럼 두개 이상 추가하는 방법

        // $ alter table test1 
  add constraint test1_pk primary key (no),
  add constraint test1_uk unique (name, age),
  add fulltext index test1_name_idx (name);

         // 길어서 자름 위에서 순서대로 primary unique index을 각각 추가하는 방법.

         // $ alter table test1 modify column name varchar(20) not null, modify column age int not null;

         // 컬럼값을 not null로 변경하는 옵션을 추가하는 방법.

         // $ alter table test1 modify column no int not null auto_increment; // 컬럼 값을 1씩 자동적 증가 시키는 방법.

         // $ alter table 테이블명 modify column 컬럼명 컬럼타입 null타입 auto_increment;

         // auto_increment를 적용하는 컬럼의 경우에는 key(PK, UK)여야만 하고, 숫자타입의 컬럼이여야 한다.

         // 데이터를 입력할 때 해당 컬럼의 값을 넣지 않아도 자동으로 증가한다.

         // 단 삭제를 통해 중간에 비어있는 번호는 다시 채우지 않는다. // 즉 증가된 번호는 계속 앞으로 증가할 뿐이다.

         // auto_increment의 값을 생략하면 마지막 auto_increment 값에서 증가되어 적용한다.

         // 기존까지 진행된 auto_increment의 값이 3까지고 만약 auto_increment값을 수기로 100을 입력한다면

         // 다음 auto_increment를 생략하고 값을 넣으면 auto_increment은 101이된다. 

         // 즉 가장 마지막 auto_increment 값에서 1씩 증가한다.

         // 다른 DBMS의 경우 입력 오류가 발생하여도 번호가 자동으로 증가하는 경우가 있다. 

         // Oracle은 씨퀀스를 사용하는데 위처럼 입력 오류가 발생해여 값을 넣지 못해도 auto_increment는 증가한다.

         // MariaDB의 경우에는 입력 오류가 발생하여 값을 넣지 못하면 auto_increment는 증가하지 않는다.

         // view // 조회 결과를 테이블처럼 사용하는 문법 $ select 문장이 복잡할 때 뷰로 정의해 놓고 사용하면 편리

         // $ create view worker as select no, name, class from test1 where working = 'Y'; 

         // $ create view 컬럼 as select 컬럼명,컬럼명,컬럼명 from 테이블명 where 컬럼명 = 값;

         // view를 실행하면 새로운 해당 table이 생기는데, 이는 가상테이블이다.

         // view가 참조하는 테이블에 데이터를 입력한 후 view를 조회한다면 view에 즉각적으로 반영한다.

         // view를 조회할 때 마다 매번 select 문장을 실행한다. // 일종의 조회 함수 역할을 한다.

         // 목적은 복잡한 조회를 가상의 테이블로 표현할 수 있어 SQL문이 간결해진다.

         // $ drop view worker; // view 삭제

 

Exam02.sql

        // $ insert into test2(name,tel) select name, tel from test1 where addr='seoul';

        // $ insert into 이동할테이블(컬럼명,컬럼명) select 컬럼명, 컬럼명 from 복사당할테이블명 where 조건='컬럼값';

        // 복사당할테이블명에서 조건=컬럼값 데이터의 컬럼명,컬럼명을 이동할테이블(컬럼명,컬럼명)에 복사한다

        // $ update test1 set pstno='11111', fax='222' where no=3; // 조건에 해당하는 컬럼명 값을 변경한다.

        // $ update 테이블명 set 컬럼명=값, 컬럼명=값, ... where 조건...;

        // $ update test1 set fax='333'; // 조건을 지정하지 않으면, 모든 데이터에 대해 변경한다.

        // $ set autocommit=false; // mysql은 autocommit의 기본 값이 true이다.

        // 명령창에서 SQL을 실행하면 바로 실제 테이블에 적용된다. // autocommit을 false로 바꿔놓고,

        // 현재 명령창에서 delete from test1;를 하게 되면 모든 test1에 있는 데이터가 날아가는데,

        // select * from test1;을 해봐도 Empty set으로 나오게 된다. // 근데 이 상황은 현재 명령창에서만 그렇게 보인다.

        // autocommit의 값이 false이기 때문에 새로 명령창을 띄워 확인을 해본다면 데이터는 아직 남아있다.

        // delete from test1;을 작업한 명령창에서 복구하는 방법 또한 있다. // autocommit이 true면 안된다.

        // $ rollback; // 마지막 commit 상태로 돌아오게 한다.

        // 단 delete의 경우에는 복구가 가능하지만 drop으로 삭제하는 경우에는 rollback자체가 불가능하다.

        // delete는 Temp라는 임시Database에서 지우기 때문에 rollback이 가능하지만, // autocommit = false

        // drop은 Database에서 다이렉트로 작업하기 때문에 rollback이 불가능하다.

        // $ delete from 테이블명 where 조건; // $ delete from test1 where no=2 or no=3;

        // $ delete from test1; // 조건을 지정하지 않으면 모든 데이터가 삭제된다.

 

Exam03.sql

        // $ select no, name, tel from test1;

        // $ select 컬럼명,컬럼명 from 테이블; // 특정 컬럼의 값만 조회할 때 => "프로젝션(projection)"이라 부른다.

        // 컬럼을 선택하는 걸 projection이라고 하고, data를 선택하는걸 selection이라 한다. // 용어 조심

        // $ select no, concat(name,'(',class,')') from test1; // 가상의 컬럼 값을 조회하기

        // concat이란 기능은 name(class) 이렇게 출력하게끔 컬럼을 만들어 준다. // 별명을 붙힐때 도와주기 위함

        // 별명을 붙이지 않으면 원래의 컬럼명이 조회 결과의 컬럼이름으로 사용 // 조회결과를 보기 쉽다.

        // $ select 컬럼명 [as] 별명 // 컬럼에 별명 붙이기

        // $ select no as num, concat(name,'(',class,')') as title from test1; 

        // $ select 컬럼명 as 별명, concat(컬럼명,'(',컬럼명,')') as 별명 from 테이블명; 

        // test1에서 컬럼명을 별명으로, (컬럼명,'(',컬럼명,')')을 concat한 애를 별명으로 출력함.

        // select ... from ... where 조건... // 이렇게 조건을 지정하여 결과를 선택하는 것을 "셀렉션(selection)" 이라 한다.

        // select * from test1 where no > 5; // test에서 no가 > 5 인 애들 전체 목록(*) 출력

        // OR : 두 조건 중에 참인 것이 있으면 조회 결과에 포함시킨다. // where working='Y' or class='java100';

        // AND : 두 조건 모두 참일 때만 조회 결과에 포함시킨다. // where working='Y' and class='java100';

        // where 절을 통해 결과 데이터를 선택(selection)한 다음 결과 데이터에서 가져올 컬럼을 선택(projection)한다.

        // from ==> where ==> select 순서로 이루어 진다.

        // NOT : 조건에 일치하지 않을 때만 결과에 포함시킨다. // where not working = 'Y'; // !=, <>도 사용 가능하다.

        // !=, <>이 안되는 DBMS도 있으니, DBMS마다 다르다. // &&나 ||는 불가능

        // $ update test1 set tel = '1111' where (no % 2) = 0; // where문 조건에 사칙연산 결과도 넣을 수 있다.

        // $ where tel is null; // null인지 여부를 가릴 때는 is 또는 is not 연산자를 사용

        // $ select (4 + 5), (4 - 5), (4 * 5), (4 / 5), (4 % 5); // - +, -, *, /, % 연산자를 사용할 수 있다. // 단순 계산 가능

        // $ select (4=5), (4!=5), (4>5), (4>=5), (4<5), (4<=5), (4<>5); // - =, !=, >, >=, <, <=, <> 

        // $ select 5 between 3 and 5; // between 값1 and 값2 // 두 값 사이(두 값도 포함)에 있는지 검사

        // false면 0 true면 1을 나타낸다. // 3과 5의 경우에도 사이에 있다고 판단함.

        // $ select * from test1 where class like 'java%'; // class(컬럼) 이름이 java로 시작하는 모든 학생 조회하기

        // $ select * from test1 where class like '%java%'; // class(컬럼) 이름에 java를 포함한 모든 학생 조회하기 

        // $ select * from test1 where class like '%5'; // class(컬럼) 이름이 5로 끝나는 반의 모든 학생 조회하기

        // $ select * from test1 where name like 's0_';

        // 학생의 이름에서 첫번째 문자가 s이고 두번째 문자가 0인 학생 중에서 3글자의 이름을 가진 학생을 조회

        // %는 붙은 위치에 대한 0자 이상을 의미하고, _는 붙은 위치에 대한 1자를 의미한다.

        // $ select * from test1 where regdt = '2017-6-17'; // 특정 날짜의 게시글 찾기

        // $ select * from test1 where regdt between '2017-11-1' and '2017-12-31'; // 특정 기간의 게시글 조회

        // $ select * from test1 where regdt >= '2017-11-1' and regdt <= '2017-12-31'; // 특정 기간의 게시글 조회

        // $ select now(); // 현재 날짜 및 시간 알아내기

        // $ select curdate(); // 현재 날짜 알아내기

        // $ select curtime(); // 현재 시간 알아내기

        // $ select regdt, date(regdt), time(regdt) from test1; // 주어진 날짜, 시간에서 날짜만 뽑거나 시간만 뽑기

        // $ select date_add(now(), interval 11 day); // date_add(날짜데이터, interval 값 단위);

        // 날짜데이터에 interval 값 단위(시, 분, 초, 일, 월, 년)을 추가

        // $ select date_sub(now(), interval 11 day); // date_sub(날짜데이터, interval 값 단위); 

        // 날짜데이터에 interval 값 단위(시, 분, 초, 일, 월, 년)을 빼기

        // $ select datediff(curdate(), '2018-3-19'); // datediff(날짜1, 날짜2); // 두 날짜 사이의 간격을 알아내기 

        // date_format(날짜, 형식) // 날짜에서 특정 형식으로 값을 추출하기

        // $ select date_format(now(), '%m/%e/%Y'); // 09/7/2017

        // $ select date_format(now(), '%M/%d/%y'); // September/07/17

        // $ select date_format(now(), '%W %w %a'); // Thursday 4 Thu

        // $ select date_format(now(), '%M %b'); // September Sep

        // $ select date_format(now(), '%p %h %H %l'); // PM 01 13 1

        // $ select date_format(now(), '%i %s'); // 05 45

        // 문자열을 날짜 값으로 바꾸기

        // $ select str_to_date('11/22/2017', '%m/%d/%Y'); // $ select str_to_date('2017.2.12', '%Y.%m.%d'); 

        // $ insert into test1 (title, regdt) values('aaaa', '2017-11-22');

        // 날짜 값 저장 기본 형식은 yyyy-MM-dd // 그 외의 문자열을 날짜 값으로 지정할 수 없다. // 11/22/2017 불가

        // $ insert into test1 (title, regdt) values('bbbb', str_to_date('11/22/2017', '%m/%d/%Y'));

        // str_to_date() 함수를 사용하면 다른 형식의 문자열을 날짜 값으로 저장할 수 있다.

 

Exam04.sql

        // FK(Foreign Key) // 다른 테이블의 PK를 참조하는 컬럼이다.

        // FK(foreign key) 제약 조건 설정

        // 데이터가 변경되었을 때, 연관이 있는 데이터에도 적용을 받아야 하기 때문이다.

        // 다른 테이블의 데이터와 연관된 데이터를 저장할 때 무효한 데이터가 입력되지 않도록 하는 문법

        // 데이터의 무결성(data integrity; 결함이 없는 상태)을 유지하게 도와주는 문법

        // $ delete from test2; // $ alter table test2 add constraint test2_bno_fk foreign key (bno) references test1(no);

        // $ alter table 테이블명 add constraint 제약조건이름 foreign key (컬럼명) references 테이블명(컬럼명);

        // 무효한 데이터가 있을 수도 있어, 기존 테이블을 지운다. // 다른 테이블의 PK를 참조하는 컬럼으로 선언한다.

        // test1 처럼 다른 테이블에 의해 참조되는 테이블을 '부모 테이블'이라 부른다.

        // test2 처럼 다른 테이블의 데이터를 참조하는 테이블을 '자식 테이블'이라 부른다.

 

Exam05.sql

        // COMMENT '수강생'; // 컬럼에도 COMMENT를 붙힐 수도, table에도 붙힐 수도 있다. // 주석이랑은 다르다.

        // $ CREATE UNIQUE INDEX UIX_tcher ON tcher (acc_no ASC, bank ASC); // ASC는 오름차순을 말한다.

        // $ ALTER TABLE stnt ADD CONSTRAINT FK_memb_TO_stnt FOREIGN KEY (mno) REFERENCES memb (mno);

        // ALTER TABLE stnt ADD CONSTRAINT // stnt 테이블에 제약을 추가한다는 의미이다. 

        // FK_memb_TO_stnt // memb에 적용을 받는 foreign key를 stnt에 설정한다는 의미이다.

        // FOREIGN KEY ( mno ) REFERENCES memb ( mno ) // stnt의 mno 값은 memb의 mno를 참조한다는 의미이다.

        // stnt의 mno의 값은 중복되지 않아야 하는 값이고 존재해야 한다. // mno가 PR이기 때문

        // memb의 mno의 값은 중복되지 않아야 하는 값이고 존재해야 한다. // mno가 PR이기 때문

        // memb의 mno에는 stnt의 mno값이 모두 다 있기 때문에 1이다. // memb(1)

        // stnt의 mno에는 memb의 mno값이 있을 수도, 없을 수도 있기 때문에 0..1이다. // stnt(0..1)

        // 쉽게 설명하면 memb는 존재하지만, stnt는 있을 수도 있고 없을수도 있다. // memb(1) stnt(0..1)

        // memb은 1이고, stnt는 0..1로 표현한다. // ER-Diagram // (일 대 영 또는 일) 이라고 말한다.

        // ER-Diagram // DBMS의 관계도를 그림으로 표현한 것. 

        // memb가 부모테이블, stnt가 자식테이블이다.

        // ALTER TABLE lect_appl ADD CONSTRAINT FK_stnt_TO_lect_appl FOREIGN KEY (mno) REFERENCES stnt (mno);

        // ALTER TABLE lect_appl ADD CONSTRAINT // lect_appl table에 constraint(제약)을 add하는 변경을한다.

        // FK_stnt_TO_lect_appl // foreign key를 lect_appl로부터 stnt에 설정한다.

        // FOREIGN KEY (mno) REFERENCES stnt (mno); // foreign key는 stnt (mno)이다. 이 값을 lect_appl mno에 적용

        // 모든 stnt는 memb이다. // memb(1) // 모든 memb는 stnt이거나 아니다. // stnt(0..1)

        // memb은 1이고, stnt는 0..1로 표현한다. // ER-Diagram // (일 대 영 또는 일) 이라고 말한다.

        // ER-Diagram // DBMS의 관계도를 그림으로 표현한 것. 

        // memb가 부모테이블, stnt가 자식테이블이다.

        // 모든 수강신청(lect_appl)은 학생(stnt)이 신청한다. // stnt(1)

        // 모든 학생(stnt)은 수강신청(lect_appl)을 (여러개) 할 수도, 안할수도 있다 // lect_appl(0..*)

        // stnt가 부모테이블 lect_appl이 자식테이블이다.

        // 모든 강의(lect)는 강의실(room)이 배정 되어 있을 수도 없을 수도 있다. // room(0..1)

        // 모든 강의실(room)은 강의(lect)가 (여러개) 있을 수도, 없을 수도 있다. // lect(0..*)

        // lect_appl가 stnt를 참조할 때에는 1 대 0..*인데, lect가 room을 참조할 때에는 0..1 대 0..*이다.

        // lect_appl의 mno는 UK, stnt의 mno는 PK이며, lect의 rno는 UK, room의 rno는 PK다. // 두 형식이 똑같다.

        // 형식이 같은데 왜 lect_appl stnt 참조는 1 대 0..*이고, lect room 참조는 0..1 대 0..*인가 ?

        // 이유는 lect_appl의 mno는 not null이 설정되어있다. // 신청 안 할 수도 라는 선택지 자체가 불가능하다.

        // 반면에 lect의 rno는 not null이 설정되어있지 않다. // 배정이 없을수도 라는 선택지가 가능하다.

        // mgr가 부모테이블 lect이 자식테이블이다.

        // 모든 매니저(mgr)는 수업(lect)를 할 수도, 안할 수도 있다. // mgr(0..1)

        // 모든 수업(lect) 매니저(mgr)가 (여러개) 할 수도, 안할수도 있다. // lect(0..*)

        // 모든 방사진(room_phot)은 방(room) 사진 이다. // room_phot(1)

        // 모든 방(room)방사진(room_phot)를 (여러개)가질 수도 없을 수도 있다. // room(0..*)

        // ER-Diagram을 쉽게 그리는 방법 // 개인 생각

        // 1. 모든 테이블을 먼저 그린다. // 각 컬럼의 성격들을 적는다. // PK, UK, null 여부 등

 

Exam06.sql // Exam06.spl은 데이터를 넣기 밖에 하지 않았음.

 

Exam07_1.sql

        // $ select distinct loc from room; // 컬럼명으로 중복 값을 한 개만 추출한다.

        // $ select distinct loc, name from room; // 컬럼이 2 개 이상일 때 중복 값을 한 개만 추출한다.

Exam07_2.sql

        // $ select rno, loc, name from room; // 기본 인덱스 컬럼을 기준으로 정렬

        // $ select rno, loc, name from room order by name asc; // 컬럼(name)의 오름 차순으로 정렬하기 //생략가능

        // $ select rno, loc, name from room order by name desc; // 컬럼(name)의 내림 차순으로 정렬하기

        // $ select rno, loc, name from room order by loc asc, name asc;

        // 지점명(loc)은 오름차순(내림차순)으로, 이름(name)은 오름차순(asc) 정렬하기

Exam07_3.sql

        // $ select rno as room_no, loc as location, name from room; // 라벨명을 지정하지 않으면 컬럼명 출력

        // rno을 room_no로 loc을 location로 name을 room으로 출력한다. // as 생략 가능

        // $ select rno 'room no', loc location, name from room; // 라벨명에 공백 추가하는 방법 // ' ' 안에 라벨명 작성

        // $ select concat(name, '(', loc, ')') title from room; // 복잡한 형식으로 출력할때, 라벨명을 붙힌다.

        // $ select count(*) from room; // table에 들어있는 data 갯수 확인하기.

Exam07_4.sql

        // select 결과 합치기 // union // 중복값은 제거하여 출력한다.

        // $ select distinct bank from stnt union select distinct bank from tcher;

        // select 결과 합치기 // union all // 중복값을 제거하지 않고 출력한다.

        // $ select distinct bank from stnt union all select distinct bank from tcher;

Exam07_5.sql

       // join 조인 // 서로 관련된 테이블의 데이터를 연결하여 추출하는 방법

       // 1. CROSS 조인  2. NATURAL 조인  3. JOIN ~ ON // inner join   4. OUTER JOIN

       // 1. CROSS 조인 // 두 테이블의 데이터를 1:1로 모두 연결한다.

       // $ select mno, name from memb;  // $ select mno, work, bank from stnt; // 얘네를 묶겠다는거

       // $ select memb.mno, name, stnt.mno, work, bank from memb cross join stnt;

       // $ select memb.mno, name, stnt.mno, work, bank from memb, stnt; // 예전 문법

       // 어떤 테이블의 칼럼인지 표시하지 않으면 오류가 발생한다. // memb.mno처럼 표시해줘야 한다.

       // $ select m.mno, name, s.mno, work, bank from memb m cross join stnt s; // 별명을 붙혀서 짧게 호출 가능.

       // 순서대로 모든 항목을 출력한다.

       // 2. NATURAL join // 같은 이름을 가진 컬럼 값을 기준으로 연결한다.

       // $ select m.mno, name, s.mno, work, bank from memb m natural join stnt s; 

       // $ select m.mno, name, s.mno, work, bank from memb m, stnt s where m.mno=s.mno; // 예전 문법

       // 조인 기준이 되는 컬럼 이름이 다를 때 연결되지 못한다 // 상관 없는 컬럼과 이름이 같을 때 잘못 연결된다.

       // 같은 이름의 컬럼이 여러 개 있을 경우 잘못 연결된다. // 모든 컬럼의 값이 일치할 경우에만 연결되기 때문이다.

       // join ~ using (기준컬럼) // 두 테이블에 같은 이름의 컬럼이 여러 개라면 기준이 될 컬럼을 지정한다.

       // $ select m.mno, name, s.mno, work, bank from memb m join stnt s using (mno);

       // 3. join ~ on 컬럼a=컬럼b // 조인할 컬럼명이 다르다면 각 테이블의 어떤 컬럼과 값을 비교할 것인지 지정한다.

      // $ select m.mno, name, s.mno, work, bank from memb m inner join stnt s on m.mno=s.mno; // inner 생략가능

       // $ select m.mno, name, s.mno, work, bank from memb m, stnt s where m.mno=s.mno; // 예전 문법

       // 같은 값을 갖는 데이터가 없다면 연결되지 않고, 결과로 출력되지 않는다.

       // ex) 강의실이 아직 지정되지 않은 강의의 경우 데이터와 연결하지 못해 결과로 출력되지 않는 문제

       // 4. OUTER JOIN

       // 일치하는 데이터가 없어, 다른 테이블의 데이터와 연결되지 않았더라도 결과로 뽑아내고 싶을때 사용

       // $ select l.lno, l.titl, r.rno, r.loc, r.name from lect l left outer join room r on l.rno=r.rno;

       // 왼쪽 테이블인 lect를 기준으로 room 데이터를 연결한다.

       // lect와 일치하는 데이터가 room에 없더라도 lect 데이터를 출력한다.

       // $ select l.lno, l.titl, r.rno, r.loc, r.name from lect l right outer join room r on l.rno=r.rno;

       // 오른쪽 테이블 room을 기준으로 lect 데이터를 연결한다.

       // room와 일치하는 데이터가 lect 에 없더라도 room데이터를 출력한다.

// select la.lano, l.titl, m.name member_name, s.work, la.rdt, r.name room_name, m2.name manager_name,

mr.posi  from lect_appl la  join memb m on la.mno=m.mno  join stnt s on la.mno=s.mno   join lect l on la.lno=l.lno

left outer join room r on l.rno=r.rno  left outer join memb m2 on l.mno=m2.mno 

left outer join mgr mr on l.mno=mr.mno; // 이렇게 응용도 가능하다.

 // 해석은 조인시키고 조인시키고 조인시키고 왼쪽 아우터 입히고 왼쪽 아우터 입히고 왼쪽 아우터 입히면 된다.

Exam07_6.sql

       // 서브쿼리 // 쿼리문 안에 쿼리문을 실행하는 기법 // 성능 문제를 생각하면서 사용해야 한다.

       // select la.lano, (select titl from lect where lno=la.lno) as lect_title, la.mno, la.rdt from lect_appl la; // 예 1

       // 자세한 서브쿼리문은 직접 Exam07_6.sql 가서 확인하자.

       // ex) select 안에 select를 넣는 방식, from 절에 서브쿼리 사용, where 절에 서브쿼리 사용 등

       // JOIN의 경우 잘개 쪼개진 데이터를 한번에 가져오기 때문에 빠르다. // 단 직관성이 떨어진다.

       // 서브쿼리는 직관성은 보다 편하나, 실행속도가 느리다. // JOIN을 사용하자.

 

 

 

반응형

+ Recent posts