데이터베이스
단일행 서브쿼리
서브쿼리에서 단 하나의 행만을 검색하여 메인쿼리에 반환하는 질의문을 뜻한다.

WHERE절의 조건에 서브쿼리가 사용되었다.
기본키인 아이디를 비교대상으로 사용했기에 단일행의 결과가 나올 것이다.
원하는 데이터를 골라오기 위한 문장을 우선적으로 만들고, 그 문장의 결과로 나오는 데이터를 활용해 조건을 더욱 복잡하게 줄 수도 있게 된다.
쿼리의 계획설명에서.. 옵티마이저가 계산한 cost값이 가장 적은, 가독성은 좋은 쿼리가 데이터베이스에서는 가장 좋은 쿼리인 것 같다.

위의 예제에서는 서브쿼리를 두개 사용하였다.
이런식으로 쿼리를 작성하면 서브쿼리만 두개이기 때문에 cost가 높아질 수 밖에 없다.
또한 where절에서의 서브쿼리는 메인쿼리가 실행되기전에 한번씩 실행된다.
즉, 행의 갯수만큼 검색이 되는 것이지 한번만 검색이 되는것이 아니다.

위의 쿼리가 정보미디어학부에 소속된 모든 학과의 DEPTNO를 구하는 쿼리이다.
이럴 학생테이블의 DEPTNO와 비교해 최종적으로 문제를 해결했다.
서브쿼리가 어렵지 않으려면 문장 해석을 단계적으로 해서 어떤식으로 해결해 나갈지 확인하는 연습이 필요하다.
바로 아래의 쿼리를 작성하는 것이 아니라 단계적으로 아랫단계부터 작성해 나가는것이 헷갈리지 않고 좋다.
다중행 서브쿼리
결과의 행이 여러개인 서브쿼리로, 단일행 서브쿼리와는 달리 사용 가능한 연산자가 많다.
IN연산자는 기존에 봤던 것과 동일한 기능이다.

ANY연산자는 메인쿼리의 비교조건에서 서브쿼리의 출력 결과와 하나라도 일치하면 메인쿼리 조건절이 참이되는 연산자이다.
ALL연산자는 ANY와 달리 하나라도 가 아닌, 모두 가 일치해야 한다.
ANY와 ALL 모두 동등연산 뿐만 아니라 비교연산도 가능하다.

EXISTS 연산자는 서브쿼리에서 검색된 결과가 하나라도 존재하면 메인쿼리 조건절이 참이 되는 연산자이다.
반대는 NOT EXISTS로, 매우 직관적이다.
이는 후에 로그인같은 기능에 사용될 수 있다고 하셨다.
다중컬럼 서브쿼리
이친구가 제일 어렵다.
이제까지 배운 단일행 서브쿼리와 다중행 서브쿼리 모두 칼럼 하나를 기준으로 했었다.
여기서는 이제 이름 그대로 칼럼이 여러개가 되는 것이다.
비교대상의 칼럼의 수가 여러개가 되었으므로, 메인쿼리의 조건절에서도 서브쿼리의 칼럼수만큼 지정해야 한다.

다중컬럼에서 비교방법에는 PAIRWISE, UNPAIRWISE방법이 있는데 그림으로 보면 이해가 수월하다.
이름에서도 알 수 있듯이, 각 행을 짝으로 보고 비교하느냐, 그렇지 않느냐로 판단한다.

위 두 예제의 결과는 확연한 차이를 갖고 있다.

여러 테이블을 연관지어 결과를 도출해 내는 과정을 여러가지 방법을 사용해 시도하는 연습을 하는것이 좋다.
최대한 여러 방법을 사용해 시도함으로써 어떤 결과를 도출해낼때, 최적의 방법에 보다 수월하게 도달할 수 있을 것이다.
위의 스크린샷에서 맨 마지막의 쿼리는 상호연관 서브쿼리이다.
상호연관 서브쿼리란, 메인쿼리절과 서브쿼리간의 검색결과를 교환하는 서브쿼리를 일컫는데, 이는 행을 비교할 때마다 결과를 메인으로 반환하는 관계이기 때문에 성능이 저하될 수 있다.
다중칼럼 서브쿼리를 실무에서 사용시 주의해야하는 것은 역시 비교되는 칼럼수의 일치여부이다.
또한 서브쿼리 내에서 ORDER BY를 사용하지 않는 것이 좋다. 사용시에 오류가 발생하기도 하지만, 애초에 ORDER BY는 맨 마지막에 결과를 도출한 후 하는것이 바람직하기에 서브쿼리 내에는 사용하는것을 지양하는 버릇을 들이도록 하는것이 좋을 것이다.
데이터조작어(DML)
데이터 조작어를 들어가기 앞서, DDL, DML, DCL의 차이점을 알고 가자.
이 세개는 공통적으로, DATA _ LANGUAGE이다.
즉 데이터를 어떻게 하는 언어인 것이다.
DDL : Data Definition Language : 데이터 정의어
DML : Data Menufactual Language : 데이터 조작어
DCL : Data Control Language : 데이터 제어어
DDL 에는 CREATE, ALTER, DROP, TRUNCATE, REPLACE 등의 명령어가 속하며 OBJECT를 대상으로 하는 언어이다.
DML은 INSERT, UPDATE, DELETE, MERGE 등의 명령어가 속하며 Data를 대상으로 하는 언어이다.
DCL은 COMMIT, ROLLBACK, SAVEPOINT, GRANT, REVOKE(권한빼앗기) 등의 명령어가 속하며 COMMIT, ROLLBACK, SAVEPOINT 이 셋은 따로 TCL(Transaction Control Language)라고 한다.
여기서 Transaction은 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 뜻한다.
프로그래머가 어떻게 해놨는지에 따라 트랜잭션중인 데이터에 접근했을 때 결과값이 다르게 나온다.
이에 관해 자세한건 실무에서 직접 마주하며 배우게 될 것이다.
이 중 데이터 조작어(DML)이란 테이블에 새로운 데이터를 입력하거나 기존 데이터를 수정 또는 삭제하기 위한 명령어로, 그간 쿼리를 작성해오며 많이 사용했던 명령어들이 보인다.

테이블의 칼럼을 명시하지 않고 행을 추가하면, VALUES에 모든 칼럼에 대한 값을 타입에 맞춰, 순서에 맞게 입력해주면 된다.
자바스크립트
프로토타입
프로토타입은 생성된 객체가 공유하는 공간이다.
이 열두글자는 통째로 외워도 무방할정도로 중요하다.

Circle이라는 함수를 정의했다.
첫 글자가 대문자인 것을 보고 이 함수의 사용 용도는 생성자함수일 것임을 예측할 수 있다.
이 함수는 radius라는 프로퍼티와 getArea라는 함수타입의 프로퍼티를 가지고 있다.
객체를 생성할 때 모든 객체가 두 프로퍼티를 가지고 생성될 것이다.
하지만 생성되는 객체의 수가 너무 많아진다면, 불필요한 용량 차지가 아닐수 없다.
이유인즉, 메서드 getArea가 모든 객체에 내용이 같기 때문이다.
반지름은 모든 객체가 다를 수 있지만, 넓이를 구하는 메서드의 내용은 모든 객체가 같기 때문이다.
이처럼 중복되는 프로퍼티들은 굳이 모든 객체가 가지고 있을 필요가 없이 프로토타입의 공간에 정의해주면 한번만 정의하고 모든 객체가 공유할 수 있게 된다.
이를 그림으로 표현하자면,


즉 아래처럼 중복되는 프로퍼티들은 프로토타입으로 정의해 주는 것이 좋다.

첫 예제를 프로토타입으로 정의했다.
이런식으로 하면 getArea라는 메서드는 자바스크립트 엔진에서 딱 한번만 용량을 차지할 것이다.
프로토타입의 공간에는 메서드 뿐만 아니라 변수도 공간을 차지할 수 있다.

선생님이 즉석에서 내주신 예제이다.
자바를 하고 왔다고 해서 헷갈리면 안된다. 자바스크립트에는 포매터가 없음을 꼭 기억하자.
leading zero 또한 아얘 까먹고 있었다.
toMyString()이라는 메서드를 Date타입의 프로토타입 객체에 정의했으므로 모든 Date타입의 객체에 적용할 수 있는 메서드가 되었다.


위의 예제는 예술예제가 맞다..
오버라이딩과 프로퍼티 섀도잉에 관한 예제인데 deepdive책에서는 288pg이다.
Person이라는 상수에는 즉시실행함수가 담겨있다.
그 안에는 생성자함수와 프로토타입객체에 정의한 sayHello()라는 메서드가 있다.
그러고나서 Person을 반환한다.
즉 위의 예제에서는 즉시실행함수 안에 프로토타입에 정의할 메서드와 생성자함수를 품고 있다.

저 뒤에 생성한 객체에 같은 이름의 메서드로 프로퍼티를 추가하면 이제 프로토타입에 정의된 메서드가 가려진다.
덮어쓰임으로 인해서 사라지는 것이 아니라 가려진다는 표현이 제일 적절하다.

즉, 프로퍼티를 제거하면 다시 원래의 결과가 나온다.
하지만, 위의 프로퍼티 제거는 프로토타입의 프로퍼티를 제거한 것이 아니라 해당 객체의 프로퍼티를 제거한 것이므로

추가로 제거한다 해도 프로토타입에 정의된 메서드는 사라지지 않는다.
프로토타입에 정의된 메서드를 제거하려면 아래의 방식대로 해야한다.

오늘은 여기까지!!
지금 진행중인 부분이 가장 어려운 부분이라 말씀하셨다.
꾸준한 복습으로 다 기억할 수 있게 노력해야겠다.
'과정평가형 정보처리산업기사' 카테고리의 다른 글
D - 45 데이터베이스 무결성 제약조건, 인덱스, 뷰, 권한, 동의어, 계층적 질의문 (0) | 2022.03.14 |
---|---|
D - 44 데이터베이스 pivoting insert, 트랜잭션, 시퀀스 (0) | 2022.03.13 |
D - 42 데이터베이스 OUTER JOIN, SELF JOIN, SUBQUERY 자바스크립트 생성자함수, 함수객체의 프로퍼티들 (0) | 2022.03.06 |
D - 41 데이터베이스 그룹함수, JOIN, ANSI JOIN 자바스크립트 const키워드와 let키워드, 생성자함수에 의한 객체생성 (0) | 2022.03.03 |
D - 40 데이터베이스 문자, 날짜, 일반함수 및 DECODE 자바스크립트 전역변수를 제어하는방법(즉시실행함수, 네임스페이스 객체, 모듈패턴) (0) | 2022.03.02 |