2022의 게시물 표시

[sql] 제약조건

*(테이블에 저장되는)데이터에 대해서 "무결성"을 유지하기 위해 존재한다. *무결성 : 데이터의 정확성, 일관성을 유지한다. *종류로는 NOT NULL, UNIQUE, CHECK,기본키, 외래키 등이 있다.

[sql] 테이블 생성

이미지
*테이블은 데이터를 저장하는 가장 기본적인 객체이다. *새로운 테이블을 생성하기위해선 아래의 문법을 따라야 한다. //스키마 : 테이블의 제약조건을 정의해놓은 것을 뜻하며, (다른테이블과의)관계에 대한  정의 그리고 이를 유지하기위한 제약조건을 정의해놓은 것을 뜻한다. *[스키마.]와 [TABLESPACE 테이블스페이스명] 이 두개는 생략가능하며, 생략할 경우, 디폴트 이름으로 자동설정 된다. 다시말해 기초적인 테이블을 생성할 때에는 간략하게 할 수 있다. CREATE TABLE t_1{     VARCHAR2 column1 not null;          VARCHAR2 column2 not null; };

[spring]회원 관리 예제 - 웹 MVC 개발 > 회원 관리 예제 - 웹 MVC 개발, 등록, 조회

이미지
"Home"페이지 만들기 *새로운 "HomeController"을 추가합니다. *그리고 url 아무것도 없을 경우, "home.html"파일을 열도록 @GetMapping("/")으로 설정합니다. HomeController을 추가합니다. *서버를 구동시키고, "localhost:8080"으로 접속하여 의도한대로 화면으로 제대로 이동하는지 확인합니다. localhost:8080으로 접속하였습니다. *잠깐, 그런데 이미 정적 기본페이지가 존재하는데, 그 페이지가 호출되어야하는게 맞지않은가?? resources > static  > index.html 그렇지 않다, "GetMapping("/")호출이 static > index.html 호출보다 우선순위가 높기때문에 "GetMapping("/")"으로 설정된 페이지가 호출된다. 물론 이것이 없다면 "static > index.html" 페이지가  호출된다.

[spring]스프링 빈과 의존관계 > 자바 코드로 직접 스프링 빈 등록하기

이미지
*@Contorller, @Service, @Repository 등등의 어노테이션을 이용하여 우리는  스프링 컨테이너에 객체를 등록하여 관리하였다. *이외에도 개발자가 직접 객체(즉 bean 을..)을 직접 등록하는 방법도 존재한다. @Configuration *(새로운 생성한)클래스에 "@Configuration"어노테이션을 붙이면, spring 서버가 구동할때  가장 앞의 우선순위로 실행하게 된다. *"@Bean"어노테이션을 이용하면 (개발자가)스프링 컨테이너에 직접 객체를 등록할 수 있다. *하지만 @Controller와 같은 어노테이션은 스프링에서 직접 관리하는 객체임으로 굳치 "@Bean"을  사용하여 객체를 집접 등록할 필요가 없다. *예전에는 ".XML"파일을 이용하여 스프링 환결을 설정하였지만, 요즘은 ".java"파일을 이용하여 환경을  설정하는 추세이다. *생성자를 통한 의존 주입 *"필드주입방식"은 그다지 좋은 방식이 아니다. 그 이유로는  만약 주입해야할 객체를 변경하고자 할 경우, 많은 코드를 변경해야하기 때문이다. 필드 주입 방식은 나쁘다. *그래서 항상 "생성자"을 통해 의존성 주입을 해야 한다. *setter을 통해 주입하는 방법도 있으나 권장하지 않는다. *가장 베스트는 생성자을 통한 방식이다. 생성자를 통해 객체를 주입하자..!! *"@Bean"어노테이션을 이용하여 객체를 (스프링 컨테이너에)직접 등록하는 방법을 알았는데, 여기서 드는 의문은 "@Service, @Repository"등 이미 편리한 어노테이션이 존재하는데  굳이 "@Bean"같은 어노테이션을 사용해야할 경우가 있을까???  ==> 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변...

[spring]스프링 빈과 의존관계 > 컴포넌트 스캔과 자동 의존관계 설정

이미지
*spring-boot에서 사용되는 "객체"는 모두 "컨테이너"라는 저장공간 안에서 관리된다. *"컨테이너"안에서 특정 객체를 찾기위해선 반드시 어노테이션(표시)이 필요하다  spring-boot에서는 이를 "의존관계"라고 하는가?? @Controller 어노테이션을 명시한다. "@Contorller"라는 어노테이션을 명시하여 해당 "객체"는 spring-boot (객체)컨테이너에서 꺼내사용할 수 있도록 한다. spring-boot는 객체를 컨테이너로 관리한다. 보통 우리는 Controller에서 service을 호출하여 비즈니스을 수행하게 된다. 이때 Service객체를 "new"을 통해 인스턴스를 만들어서 비즈니스 함수를 호출하게되는데... 문제는 (인스턴스를 만든 service가) 하나의 Controller에서만 사용되는 service가 아닐 수 있지않나? 그러므로 이또한 (spring-boot의)컨테이너에 의해 (객체가)관리되도록 해야한다. 그러기 위해선 Service클래스에 "@Service"어노테이션을 명시해줘야 한다. @Service 어노테이션 사용 예 그리고 Controller에서는 (객체를 의존하고자하는(??))클래스에 "@Autowired"어노테이션을 명시한다. @AutoWired 어노테이션 사용 예 정리하자면,  service객체를 가져다 사용하고자할때마다 "new"키워드를 사용하여 객체를 생성하기  보단 "@AutoWired"키워드를 사용하여 spring-boot의 컨테이너가 관리하고 있는 객체를 꺼내 쓰면 된다. 물론 Service에서도 데이터베이스 관련 로직을 수행하기 위해서 "Repository"객체를 사용하고자할 때 위와 같은 방식으로 사용하 되, 이때 사용하는 어노테이션은 "@Repository"을 사...

[spring] 섹션 3. 회원 관리 예제 - 백엔드 개발 > 회원 서비스 개발

[spring] 섹션 3. 회원 관리 예제 - 백엔드 개발 > 비즈니스 요구사항 정리 및 테스트 케이스 작성

이미지
implements      option + enter 비즈니스 요구사항 정리 *클래스 생성 주의사항을 꼭 잃어보시라 MemberService : 서비스 로직을 처리하는 클래스  MemberRopository : 데이터베이스에 접근하여 데이터를 컨트롤 하는 클래스(인터페이스) MemoryMemberRopository : MemberRopository(인터페이스)을 구체화 한 클래스 *프로젝트 트리 controller,domain,repository package src > main > java  >hello.hellospring 경로 밑에 존재해야합니다. *controller : view에서 호출하고자하는 함수를 정의합니다. *service :  *domain :  service에서 데이터베이스에게 데이터를 넘길때(혹은 받아올때) 사용하는 클래스 *repository : 데이터베이스와 연결하는 클래스 테스트 케이스 작성 *junit 생성한 기능을 테스트을 하기 위해선 "실행"해봐야하는데 "실행"해보려면 main함수에서 해당 함수를 호출해보거나, url을 통해 특정 페이지으로  이동해서 button을 클릭해봐야하는게 아닌가 ... 이게 얼마나 번거로운 일인가  그래서 spring-boot에는 테스트할 수 있는 기능을 제공한다. test 파일의 위치를 확인하자 MemoryMemberRepositioy클래스의 함수기능을 테스트하기 위해 테스트용 클래스를 만들어야 한다. 이때 "(테스트 대상 클래스의)이름 + Test"의 방식으로 클래스 이름을 설정한다. 그리고 (당연하게도?) 테스트 하고자하는 클래스의 인스턴스를 생성한다. 테스트 하고자 하는 함수에 "@Test"어노테이션을 붙힌다. 그리고 테스트 함수가 모두 작성 완료 되었다면  함수의 플레이 버튼을 클릭하여 "Run 'MemoryMemberRepositi....' 을 실행시키면 된다. 테스트를 진행하는데...

[spring] 섹션 2. 스프링 웹 개발 기초 > API

이미지
 *정적컨텐츠만 제외한다면 다음 두가지 경우만 고려하면된다. 1. html을 렌더링 하여 보여줄 것인가???     //view 2. 데이터만 넘겨줄 것인가???                      //api *@RequestBody  html을 렌더링하지않고, 데이터만 넘기고자할 경우 사용하는 어노테이션 입니다. http는 header, body 부분으로 나뉘어져 있는데, 해당 어노테이션을 사용할 경우, body부분을 개발자가 직접 설정할 것을 명시합니다. 데이터를 뷰에게 넘기기 위해선 객체를 넘겨야 합니다. 그전에 넘기고자하는 클래스를 생성하여 사용해야 합니다. command + n을 누르면, getter and setter을 선택할 수 있다. 객체에 넘기고자하는 데이터를 setting한 뒤 리턴하면 된다. json converter가 객체의 데이터를 json형식으로 변환해 준다. 스프링 내부에서 동작하는 원리는 아래와 같다. ㅁResolver대신 httpMessageConverter가 있음을 명심하자. 

[spring] 섹션 2. 스프링 웹 개발 기초 > MVC와 템플릿 엔진

이미지
*인텔리제이에서 내가 사용하고자하는 함수의 option을 보고자할 때 사용하는 단축키 command + p  *url을 통해 파라미터를 넘기고자할때엔 다음과 같이 한다. @RequestParam( value = "", required = true / false ) required는 반드시 파라미터를 넘거야할지 말지 설정하는 옵션인데, 디폴트는 true이다. (true = 반드시 파라미터를 넘거야한다. false = 파라미터를 넘기지 않아도 된다.) 옵션을 설정하는게 번거롭다면 "@RequestParam( "..." )" 으로만 사용해도 된다.

[spring] 섹션 2. 스프링 웹 개발 기초 > 정적 컨텐츠

이미지
*정적 컨텐츠  특정 로직을 수행하지 않는 ".html"파일을 뜻한다.  서버(tomcat)에게 파일 그대로 전달한다.  스타트 페이지는 반드시 index.html으로 설정해야한다. 그 외 정적컨텐츠를 호출하고자할 경우, url에 반드시 .html을 붙여야 한다. 스프링 부트가 ".html"파일을 찾아가는 로직은 다음과 같다. 여기서 알아두어야할 점은, 반드시 "Contorller"에서 요청한 url이 존재하는지 우선 찾는다. "controller"에서 없다면 그제서야 "resources > static"에서 ".html"을 찾는다.

[spring] 섹션 1. 프로젝트 환경설정 > View 환경설정

이미지
*static 스타트 페이지를 설정하기 위해선 "resources > static" 폴더에 ".html"파일을 생성해놓는다. (위와같이)aaaaa1.html, aaaaa2.html파일이 존재하여도 무조건 "index"이름으로 된 html을 스타트 페이지으로 사용한다. "index"파일이 존재하지 않을 경우 error페이지를 출력한다. *controller contorller를 만들기 위해선 (관리를 위한)Package을 하나 생성해야하는데, Package생성 위치는 "src > main > java > 프로젝트 패키지 > contorller"이다. controller package을 생성할때 주의 할 점은  "src > main > java" 가 아니라, "src > main > java > hello.hellospring"에 생성해야한다는 점이다. 컨트롤러를 호출하여 이동하고자 하는 "html"파일은 "src > main > resources > templates"에 위치시키면 된다.

[spring] 섹션 1. 프로젝트 환경설정 > 프로젝트 생성

이미지
 *스프링부트 프로젝트를 생성하기 위해서 아래의 링크에 접속한다. https://start.spring.io/ Group : 기명업 artpact : 프로젝트명 Name, Description, Package name은 변경하지 않는다. 추가로 Dependencies항목에 "Spring Web, Thymeleaf"을 추가한다. 추가가 완료되었다면 (아래)"GENERATE"버튼을 클릭하여 프로젝트를 다운로드 받는다. 그럼 위와 같이 프로젝트 파일이 다운로드 된다. inteliJ > open > 프로젝트 폴더 > build.gradle을 선택한다. "Open as Project"을 클릭한다. "Trust Project"버튼을 클릭한다. src > main > java > hello.hellospring > HelloSpringApplication 에서 main() 함수를 실행한다. localhost:8080 으로 접속하였을때 위 같은 에러 페이지가 나온다면 정상적으로 프로젝트 실행된 것 이다. ------------------------------------------------------------------------------------------------ *스프링 부트에서 가장 중요한 파일은 "build-gradle"이다. *본인이 gradle을 이용하여 프로젝트를 빌드하기로 설정했으므로 아래와 같은 파일이 생성된 것 이다. *gradle은 프로젝트를 실행을 도와주는 도구이다. *(프로젝트의)환경설정, 의존성, 플러그인 설정 등등을 관리하는 파일(빌드 구성 스크립트)이다.

[sql]case when then / union all

 https://gent.tistory.com/311 https://gent.tistory.com/383?category=360526 union : 중복제거 union all : 중복제거 하지 않음

임시저장

이미지
*sql editer의 font을 수정합니다. *쿼리 결과의 한글이 깨질 때 아래 옵션을 해제 합니다. 이미 정해진 JSON 포멧을 service에서 어떻게 해석하느야에 따라 요청하는 json포멧도 달라진다.

주인ㄴ... 이 아니라 시노님!!

https://coding-factory.tistory.com/421

[sql] MERGE INTO

*기존 데이터가 존재하다면 UPDATE(or DELETE)  기존 데이터가 존재하지 않다면 INSERT 을 수행할 수 있는 쿼리 명령문 이다. *MERGE INTO 쿼리 명령문을 사용하는 기본 틀은 다음과 같다.   MERGE INTO [목적지 테이블]   USING [조건을 확인하는 테이블]       ON [조건]   WHEN MATCHED THEN  ["[조건을 확인하는 테이블 및 조건]"에 MATCH되었을 때 수행하는 쿼리]   WHEN NOT MATCHED THEN  ["[조건을 확인하는 테이블 및 조건]"]에 MATCH되지 않았을 때 수행하는 쿼리] *MERGE INTO 쿼리 명령문의 사용 예제          MERGE INTO XRMFT_SHIPTO_MST A         USING DUAL          -- *만약 하나의 테이블에서 MERGE INTO을 사용하였을때에는              USING에 "DUAL"테이블을 사용한다.               ON ( A.column= @value)         WHEN MATCHED THEN                 UPDATE SET A.column= TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')                          , A.column= -2     ...

[sql]TABLE - CREATE

*새로운 테이블을 생성하고자 합니다.  아래 코드는 테이블을 생성하는 예제입니다.      CREATE TABLE [ 테이블 이름 ](          [컬럼 이름]     [컬럼 데이터 타입](데이터 크기)     [옵션]      );     CREATE TABLE employees(          employee_id           VARCHAR2(100)     NOT NULL,    --무조건 입력해야 합니다.          employee_name    VARCHAR2(100)     NOT NULL,          employee_tel         NUMBER(13)`                                 --무조건 입력하지 않아도 됩니다.      ); *TABLESPACE  1. 테이블이 저장될 테이블스페이스를 지정하는 절이다.  2. 테이블스페이스(Tablespace)는 데이터베이스 오브젝트 내 실제 데이터를 저장하는     공간이다. 이것은 데이터베이스의 물리적인 부분이며, 세그먼트로 관리되는 모든     DBMS에 대해 저장소(세그먼트)를 할당한다.     CREATE TABLE ...

[sql]PL/SQL - CURSOR

 .... 아니 이게 뭐야 *문장(SQL query)수행 결과를 저장하는 공간의 위치를 저장한다   그래서 cursor(커서)을 참조하면 처리결과의 집합에 접근할 수 있다. *커서의 종류 1. 공유 커서 2. 세션 커서 

용어 정리

* 트랜젝션 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산 * 트랜젝션의 특징 1. 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위 2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의            작업단위           3. 하나의 트랜잭션은 커밋(commit) 되거나 Rollback 된다. * set up 1. 초기화, 셋업  2. initialize, init 등과 같은 의미로 사용된다. *column level     1 

[sql]PL/SQL - 함수(FUNCTION)

 *얼핏보면 프로시저(PROCEDURE)과 유사하지만, 아래와 같은 특징을 가지고 있다. 1.  보통 값을 계산하고 결과  값을 반환하기 위해서 함수를 많이 사용  한다. 2.  대부분 구성이 프로시저와 유사 하지만   IN 파라미터만 사용  할 수 있다. 3. 반드시 PL/SQL 블록내에서 RETURN으로 (데이터를)반환 해야 한다. *함수를 사용하는 예는 다음과 같다. CREATE OR REPLACE FUNCTION func_name(  name  IN VARCAHR2 )          RETURN datatype;                     --리턴할 변수의 자료형을 정의합니다. IS           ----- LOCAL 변수선언 -------         v_sal  TB_MGR_EMP. val%TYPE;     BEGIN          SELECT sal             INTO v_sal                        --SELECT 문에 있는 column 데이터를 v_sal에 대입합니다.             FROM TB_MGR_EMP         WHERE TB_MGR_EMP.NAME = name;    ...

[sql]PL/SQL - 프로시저(PROCEDURE)

*PROCEDURE은 "이름있는"블록이라고 생각하면 편한다. *다음은 PROCEDURE의 기본형태이다. CREATE TO REPLACE PROCEDURE name(  IN argument /  OUT argument /  IN OUT    argument ) IS      ----LOCAL변수 선언 위치----     BEGIN     END;   1. IS 로 PL/SQL의 블록을 시작 한다. 2. LOCAL 변수는 IS 와 BEGIN 사이에 선언 한다. *다음은 PROCEDURE의 사용 예이다. CREATE OR REPLACE PROCEDURE p_update_member_age ( v_member_id IN NUMBER )   IS     ----LOCAL변수 선언 위치----      BEGIN           UPDATE TB_MGR_MEMBER                   SET AGE = 'man'            WHERE MEMBER_ID =  v_member_id;          COMMIT;                                                          ...

[sql]PL/SQL - BASIC

이미지
* PL/SQL는 "절차적 언어을 SQL으로 확장한다" 라는 뜻으로    Oracle's Procedual Langauge Extension to SQL의 약자이다. * 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원 하며,   오라클 자체에 내장되어 있는 Procedure Language 이다. java : if, for, while PL/SQL : IF, LOOP, WHILE, FOR * DECLARE 문을 이용하여 정의되며, 선언문 의 사용은 선택 사항 이다. declare : 선언, 선언하다.. .뭐 이런뜻임 ㅋㅋ  *PL/SQL의 기본구조는 다음과 같다. 선언부, 실행부, 예외처리부, 종결 -> 선 , 실 , 예 , 종 (뭐 학교이름이냐??) ( DECLARE , BEGIN , EXCEPTION , END; ) *PL/SQL의 블럭의 종류 3가지 1. 익병 블록 BEGIN END; 2. 프로시저 블록 PROCEDURE     name IS      BEGIN      END; 3. 함수 블록 FUNCTION     name RETURN          datatype IS     BEGIN          RETURN value;     END;

[sql] partition / index - 작성중..

 *Range 파티셔닝 1. 파티션 키 값의 범위(Range)로 분할 2.파티셔닝의 가장 일반적인 형태이며, 주로 날짜 칼럼을 기준 으로 함예) 판매 데이터를 월별로 분할 *Hash 파티셔닝 *List 파티셔닝 *composite 파티셔닝

[sql] NVL / NVL2 / DECODE

 *NVL( NVL"1"이라고 생각하면 뇌에 바로 기억될까..?? ) 데이터가 NULL이면 지정된 값으로 출력하고, 아니면 그대로 출력한다. NVL( 데이터, 지정된 값 ) SELECT NVL( A.PHONENUMBER, '없음' )    FROM TB_MEMBER A WHERE  A.NAME = '홍길동'; --> A.PHONENUMBER 가 NULL이면 '없음' 출력       A.PHONENUMBER 가 NULL이 아니면 그대로 출력 *NVL2 데이터가 NULL이면 지정된 값2, NULL이 아니면 지정된 값1을 출력한다 NVL2( 데이터, 지정된 값1, 지정된 값2 ) SELECT NVL2( A.CONFRIM, 'Y', 'N' )    FROM TB_MEMBER A WHERE  A.NAME = '홍길동'; --> A.CONFRIM가 NULL이면 'N"을 출력       A.CONFIRMr가 NULL이 아니면 'Y'을 출력 *DECODE 데이터가 조건값과 같을 경우 지정된 값1을 출력하고, 아닐 경우 지정된 값 2을 출력한다 DECODE( 데이터, 조건값, 지정된 값1, 지정된 값2 ) SELECT DECODE( A.GENDER, 'M', '남자','여자' )    FROM TB_MEMBER A WHERE  A.NAME = '홍길동'; --> A.GENDER가 'M' 경우 '남자'을 출력       A.GENDER가 'M'가 아닐 경우 '여자'을 출력

[sql]GROUP BY / HAVING

*GROUP BY *참고중인 사이트에 왜 "집계함수"부터 설명하는지 처음에는이해하지 못했다..    근데 공부해보니 그 이유를 알겠다.. *아래 "집계함수"는 자주 사용하는 것임으로 기본적으로 알아두자... 1. COUNT(*)               : NULL데이터를 포함하여 row데이터의 갯수를 구한다. 2. COUNT(표현식)   : NULL데이터를 제외한 row데이터의 갯수를 구한다.                                  (예) SELECT( HEIGHT ) ------------------------------------------------------------------------ 여기서부터는  "집계함수( DISTINCT | ALL 표현식)"형태로 사용할 수 있습니다. *DISTINCT : 중복 row을 제거합니다. *ALL : 중복 row을 제거 하지 않습니다( 아마도 default...?? ) ------------------------------------------------------------------------ 3. SUM() : NULL데이터를 제외한 row의 합계를 구한다. 4. AVG() : NULL데이터를 제외한 row의 평균을 구한다. 5. MIN, MAX() : NULL데이터를 제외한 row의 최소값, 최대값을 구한다. *GROUP BY절 1. GROUP BY절에서 그룹 단위를 표시 해 주어야 SELECT절에서 그룹 단위의 칼럼과     집계 함수를 사용할 수 있다. 2.  GROUP BY 절을 통해 소그룹별 기준 을 정한 후, SELECT 절에 집계 함수를 사용 3.  집계 함수의 통계 정...

[sql]ORDER BY

1. ORDER BY 절에 칼럼(Column)명 대신에 SELECT 절에서 사용한 ALIAS 명이나 칼럼 순서를 나타내는 정수도 사용 가능 하다. 2. ASC(Ascending) : 조회한 데이터를 오름차순으로 정렬(기본 DEFAULT:생략가능) 😂 DESC(Descending): 조회한 데이터를 내림차순으로 정렬 SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버 FROM PLAYER ORDER BY 포지션 ASC; --(이름으로 내림차순정렬) --ORDER BY 2 --ORDER BY POSITION 3. SQL 문장의 제일 마지막*에 위치한다. 4. ??? Case3. 칼럼 순서번호 + ALIAS 명 사용 ORDER BY 절 사용 SELECT DNAME , LOC AREA , DEPTNO FROM DEPT ORDER BY 1, AREA, 3 DESC; 5. SELECT 문장 실행 순서 *GROUP BY 절과 ORDER BY가 같이 사용될 때 SELECT 문장은 6개의 절로 구성 1. FROM 테이블명 2. WHERE 조건식 3. GROUP BY 칼럼(Column)이나 표현식 4. HAVING 그룹조건식 ------------------------------------------------------ 5. SELECT 칼럼명 [ALIAS명] 6. ORDER BY 칼럼(Column)이나 표현식; 🙄 3. 행들을 소그룹화 한다. (GROUP BY) 4. 그룹핑된 값의 조건에 맞는 것만을 출력한다. (HAVING) 6. 데이터를 정렬한다. (ORDER BY) 🙄 *ORDER BY 절에는 SELECT 목록에 나타나지 않은 문자형 항목이 포함될 수 있다. 단, SELECT DISTINCT를 지정하거나 SQL 문장에 GROUP BY 절이 있거나 또는 SELEC...

[sql]subquery - select //1=1부분 추가 수정 필요

이미지
1. 스칼라 서브쿼리는 한 행, 한 칼럼(1 Row 1 Column)만을 반환 하는 서브쿼리를 말한다. 2. 예시 SELECT PLAYER_NAME 선수명      , HEIGHT 키      , ( SELECT AVG(HEIGHT)             FROM PLAYER X            WHERE X.TEAM_ID = P.TEAM_ID) 팀평균키    FROM PLAYER P; * 메인 쿼리에서 추출되는 데이터 건 수 만큼 수행 되기 때문에   조인으로 수행 될 때보다 수행회수가 적을 수 있다. *일치하는 값이 없는 경우 NULL 을 반환 한다. *코드성 테이블에서 코드값을 조회 할 때, 불필요한 조인을 하지 않기 위해 많이 사용한다. -- 직업이 ‘MANAGER’인 사원의 사원명, 부서명을 조회하는 예제 SELECT ename,         ( SELECT dname           FROM dept d             WHERE d.deptno = e.deptno ) deptno FROM emp e WHERE job = 'MANAGER' ;   ENAME      DEPTNO ---------- -------------- JONES      RESEARCH BLAKE      SALES CLARK      ACCOUNTING -- Scalar Subquery는 일치하는 값...