메뉴 건너뛰기

infra

4차 강의분-SQL

박영식2002.07.20 19:23조회 수 1453댓글 0

    • 글자 크기
1.
Database 시스템 이란?



데이터베이스 시스템이란 전산화된
데이터 파일의 저장 장치라고 보시면 됩니다. 즉, 정보를 유지하고,
이 정보를 이용 가능하게 하는 시스템을 말합니다. 그리고 다음과 같은
파일 연산을 제공합니다.




새로운 파일을 데이터베이스가
추가할 수 있는 연산

새로운 데이터를 기존의 파일에
삽입할 수 있는 연산

기존의 파일에서 데이터를 검색할
수 있는 연산

기존의 파일에 있는 데이터를
갱신할 수 있는 연산

기존의 파일로부터 데이터를
삭제할 수 있는 연산

데이터베이스에서 기존의 파일을
제거할 수 있는 연산



그런데 데이터베이스에서 사용하는
단어들에 대해 주의해야 할 사항이 있습니다. 저장파일은 파일로써 보다는
테이블(Table)로 취급합니다. 테이블의 각 행은 파일의 레코드를 표현합니다.
SELECT, INSERT, UPDATE와 DELETE 연산은 SQL(Structured Query Language)
데이터베이스의 문장입니다. 그리고 SQL은 하나의 프로그래밍 언어라고
보시면 되겠네요.
그럼 데이터베이스의 장점은 무엇일까요?




중복성(Redundancy)이 감소된다.


불일치(Inconsistency)를 피할
수 있다.

데이터의 공유성(Shared)

표준화(Standard)가 가능하다.


보안(Security)을 유지할 수
있다.

무결성(Integrity)을 유지할
수 있다.

요구사항들의 충돌이 해결될
수 있다.

데이터의 독립성(Data Independence)




여기에서 가장 중요한 것이 데이터의
독립성이라고 할 수 있습니다. 데이터 독립성의 목적은 "저장구조(Storage
Structure)와 액세스 전략(Access Strategy)으로부터 응용을 분리시키는
것"으로 정의할 수 있습니다. 여기서 응용이란 특정 저장구조나
액세스 전략에 의존하지 않는 것을 의미합니다. 쉽게 얘기하자면 어떤
속성에 대해 수행한 변경이 동일한 관계를 위한 다른 속성들에게 어떠한
인지가능한 영향도 주지 않는다는 것을 의미합니다.



그럼 관계형 시스템과 다른 시스템의
차이는 무엇일까요? 요새 개발되고 있는 모든 데이터베이스 시스템을
관계형 시스템이라고 보시면 됩니다. 관계형 시스템에서는 데이터를
테이블(Table)로써 받아들이고, 사용자가 제시한 연산자는 새로운 테이블을
만들어내는 연산자라고 보시면 됩니다. 그럼 관계형 데이터베이스 시스템은
다음과 같은 특성이 있습니다.




모든 엔티티는 그 엔티티의
인스턴스를 독특하게 정의하는 일련의 속성들을 갖고 있는데, 이
속성 집합을 기본
키(Primary Key)라고 부릅니다.


기본 키는 어떠한 부분도 face="Verdana" size="2" color="#8000FF">널(Null) face="Verdana" size="2">이 될 수 없다.

모든 엔티티는 엔티티 내의
각 행을 독특하게 식별하는 일련의 속성들을 갖고 있습니다. 그리고
어떠한 복제 행도 테이블 내에 존재할 수 없죠. 어떻게 보면 이것은
모든 테이블이 기본 키를 갖고 있어야 한다는 말입니다. 이러한
개념을 데이터
무결성(Data Integrity)라고
부르죠.

각각의 테이블들은 외부 키를
통해서 서로 관계를 맺습니다. 외부 키는 가능한 값의 집합이 두
번째 테이블의 기본 키에서 발견되는 목적인 한 개의 테이블 열입니다.
그래야 테이블들을 Join해서 사용하기가 쉽죠. size="2" color="#8000FF">참조 무결성 size="2">은 어떤 외부 키 열 내에 있는 값(Value)들이 그것이
참조하는 키본 키나 널(Null) 값으로 제한될 때 성취됩니다.

행의 순서는
자발적입니다. 관계형 데이터베이스에서는
테이블에 함축된 순서가 없습니다. 여러분이 순서를 지정하지 않으면
테이블에서 행이 검색될 순서를 알 수가 없죠. 프로그래밍을 하다보면
ORDER BY의 문구로 순서를 정해줄 수 있습니다.

열의 순서도
자발적입니다. 행의 경우처럼
함축된 순서가 없습니다.



데이터베이스 시스템의 구조는 내부,
외부, 개념의 세 단계로 나누어집니다. 내부단계(Internal Level)는
물리적인 기억장소와 가장 가까운 단계로 데이터가 실제로 저장되는
방법과 관련이 있습니다. 외부단계(External Level)은 사용자와 가장
가까운 단계죠. 사용자 개개인이 보는 자료에 대한 관점과 관련이 있습니다.
그리고 개념단계(Conceptual Level)는 내부단계와 외부단계 사이에 위치하는
간접(Indirection)단계죠.



데이터베이스를 접하다 보면 DBA라는
말을 많이 듣게 됩니다. 그럼 데이터베이스 관리자(Database Administrator
: DBA)에 대해서 알아보죠. 데이터베이스 관리자는 전체 시스템을 모두
제어하는 개인이나 그룹입니다. DBA의 책임은 다음과 같은 것들이 있죠.





데이터베이스의 정보 내용 결정.
즉 어떤 정보가 데이터베이스에 포함되어야 하는지 정확하게 결정하는
것이 DBA의 일입니다.

기억장치 구조와 액세스 전략
결정. DBA는 데이터베이스 안에서 데이터가 어떻게 표현되는지 결정해야
하고 기억장소 구조 정의를 작성함으로써 그 표현을 정의해야 합니다.
또한 내부적 단계와 개념적 단계 사이에 관련된 사상을 정리해야
합니다.

사용자와의 연락. 사용자가
요구한 데이터가 유용함을 보장하고, 필요한 외부 스키마를 응용
가능한 외부 DDL을 사용하여 기록할 수 있도록 해 준다.

보안 검사와 무결성 검사 정의.


예비조치와 회복에 대한 전략
정의. 사용자의 오류나 하드웨어 또는 운영체계 시스템의 실수로
데이터베이스의 임의의 부분에서 오류가 발생했을 때 최소한의 지연시간과
가능한 한 남은 시스템에 영향이 없도록 해서 데이터를 복구해야
합니다. DBA는 적절한 회복전략을 정의하고 구현해야 합니다.

변화하는 요구에 대한 적응과
성능향상에 대한 감시. DBA는 기업을 위한 최상의 실행 결과를 얻도록
시스템을 구성해야 합니다. 그리고 변화하는 요구에 적절한 조절을
해 주어야 합니다.



데이터베이스 관리 시스템(Database
Management System : DBMS)은 데이터베이스의 모든 액세스를 처리하는
소프트웨어입니다. 개념적으로 다음과 같은 작업이 발생합니다.




사용자가 특수한 데이터 종속언어(SQL
같은)를 사용하여 액세스를 요구한다.

DBMS가 이 요구를 받아서 분석한다.


DBMS가 이 사용자의 외부 스키마와
외부적/개념적 사상, 개념 스키마, 개념적/내부적 사상, 기억장소
구조 정의를 차례대로 검토한다.

DBMS가 저장된 데이터베이스에서
필요한 연산을 수행한다.



끝내기 전에 간단히 SQL이 무엇인가
살펴보도록 하죠. SQL은 보통 "시이퀄"이라고 발음합니다.
SQL은 구조화 질의 언어라고 부르는데, SQL을 이용해서 여러분은 데이터베이스와
통신을 할 수 있습니다. SQL은 비 프로시저 언어입니다. 데이터에 접근하여
조작하는 방법을 정확히 기술해야 하는 C 언어나 COBOL 언어와는 달리
SQL은 해야 할 것을 지정합니다. SQL은 내부적으로 요구한 것을 수행하는
방법을 결정합니다. SQL의 산업기준은 ANSI입니다. ORACLE의 SQL은 무결성
향상 기능(Integrity Enhancement Feature)을 완전히 실행하는 ANSI
X3.135-1989/ISO 9075-1989 기준의 레벨 2를 준수한다고 하네요. 뭔지
모르지만..
2.1 DATABASE의 구조

여기서는 SQL에 대한 기초적인 내용을 소개합니다. 우선 SQL의 특성에 대해서 간단히 알아보죠.

Segment

Segment라는 것은 이름을 갖고 있는 저장 공간의 최소 단위입니다. 일반적으로 우리들이 부르는 Table, Index, Rollback은 Segment의 종류이죠.
여기서 설명한 Segment(Table, Index, Rollback)은 OS상의 File System에서는 그 실체를 확인할 수는 없습니다. ORACLE의 경우는 Data Directory를 이용해서 알 수 있죠.

Tablespace

Tablespace는 Segment가 들어있는 공간을 말합니다.

Tablespace는 논리적인 공간으로 File System 상에 존재하는 것으로 Data File들로 구성됩니다. File System상에 물리적인 Disk 공간 즉, Data File을 확보하여 이 공간 내에 하나 이상의 Segment를 두게 됩니다.

물리적인 Disk 공간인 Data File은 하나 이상이 모여 Tablespace를 이루게 됩니다. 즉, Tablespace 하나가 여러 개의 Data File로 구성될 수 있다는 것이죠.

일반적으로 Data File을 확장자는 .dbf로 나타냅니다.

Database

Database는 여러개의 Tablespace가 모여 하나의 DB를 이루게 합니다

위에서 설명한 Database 구조에서 Tablespace를 이루는 Data File만 실제를 확인 할 수 있으며 나머지는 Database 내부에서 관련된 정보를 갖고 있습니다.

하나의 Database를 이루는 Tablespace가 몇 개이며(즉, Tablespace는 Disk상에 Phisical하게 존재하지만, Database와 Segment는 Logical하게 존재하는 것입니다.) Tablespace를 이루고 있는 Data File은 ORACLE의 경우 내부에 있는 v$datafile을 확인해 보면 됩니다.

SELECT * FROM v$datafile ;



2.2 OBJECT의 이해

ORACLE DATABASE에는 여러 가지의 Object가 있으며 이중 대표적인 Object는 Table, View, Synonym, Index, Sequence 등이 있습니다.

테이블(TABLE)

기존의 파일시스템에서 데이터를 저장하는 곳은 파일이지만 데이터베이스에서는 테이블이라는 데이터베이스 구조에 데이터를 저장하게 됩니다. 모든 테이블은 이름으로(예, STUDENT) 구분되며 데이터는 행(Row)이나 열(Column) 단위로 저장됩니다.

하나의 열(Column)은 이름(예, NAME, AGE, SCORE), 데이터 타입(CHAR, NUMBER, DATE), 길이로 구성되며 열(Column)들이 모여 하나의 행(Row)를 구성합니다.

데이터의 정확성을 보장하기 위해서 테이블을 생성할 때 각각의 열(Column)에 제약사항을 지정할 수 있습니다. 파일시스템에서처럼 NUMBER 데이터 타입에 CHARACTER형태의 Data가 들어갈 수 없는 것 외에도 Null 값 체크, 일정한 값만 들어가도록 할 수도 있습니다.

인덱스(INDEX)

테이블 내의 데이터를 조회하고자 할 때, 속도의 향상을 위해서 조건을 주고자 하는 열을 순서적으로 정렬하여 실 데이터가 있는 곳의 주소를 연결시켜 놓은 데이터베이스 구조를 인덱스라 합니다. 대량의 데이터에서 하나의 행을 찾고자 할 때는 굉장히 빠른 속도를 보장하지만, 데이터를 테이블로 삽입을 할 때는 데이터의 삽입과 동시에 인덱스를 재정렬해야 합니다.

뷰(VIEW)

뷰는 기본이 되는 Table안에 저장되어 있는 Data를 다음과 같은 이유에서 열(Column)의 이름, 열의 개수, 행의 개수 또는 보는 사용자에 따라서 다른 형태로 보게 하므로 실제로 Data를 저장하는 구조는 아닙니다.

필요한 행과 열만을 사용자에게 보여주고자 할 때 (Security)
복잡한 조건을 매번 주지 않고자 할 때 (Convenience)
열의 이름을 테이블에 영향을 주지 않고 바꾸고자 할 때 (Perspective)
추후에 테이블의 열이 추가되어도 프로그램 변경을 하지 않기 위해
동의어(SYNONYM)

테이블을 편리하게 다른 이름으로 참조를 하고자 할 때 생성합니다. STUDENT라는 테이블을 "학생"이라는 이름으로 동의어를 만들어서 사용할 수 있습니다.

시퀀스(SEQUENCE)

학생의 번호, 반 번호처럼 순차적으로 증가하거나 감소하는 번호를 부여하기 위해 생성하는 데이터베이스 구조입니다.

여기서 설명한 Object중 Tablespace내에 영역을 차지하는 Table과 Index는 Segment이나 View, Synonym, Sequence는 Data를 저장하는 것이 아닌 Object이므로 Segment가 아닙니다.
. SQL의 기초 (I)

여기서는 SQL에 대한 기초적인 내용을 소개합니다. 우선 SQL의 특성에 대해서 간단히 알아보죠.

SQL은 비프로시저 언어이다. 여러분은 SQL을 이용하여 검색할 데이터가 무엇인지를 DATABASE에 알려주거나 또는 그것이 어떻게 해야할 것인지를 알려주지 않고 변경을 수행합니다.
SQL은 어떠한 제어 흐름 프로그래밍 구조도 제공하지 않는다. SQL은 함수 정의문, 반복문, if문 등을 이용할 수 없습니다.
SQL은 공정된 데이터타입과 집합을 제공한다. 이건 사용자가 새로운 데이터타입을 정의할 수 없다는 뜻입니다. C 언어 같은 것은 특정 목적을 위해서 데이터타입을 정의할 수 있지만, SQL은 어떤 열을 작성하거나 변경할 때 일련의 사전정의 데이터타입으로부터 항목을 선택하도록 요구합니다.
1) 테이블은 행과 열이다.

앞서 말씀드린 것 같이 관계형 이론의 중심에는 테이블이란 개념이 있습니다. 테이블은 일련의 속성이나 열과 0개 이상의 행으로 구성되어 있으며, 각 행은 속성 값의 집합입니다.

관계형 데이터베이스가 나오기 전에는 계층적 유형(Hierarchial) 또는 네트워크 유형(Network)으로 분류되었던 데이터베이스 관리 시스템에 의존했습니다. 이 두가지 유형은 단점이 하나 있었는데, 기존 데이터 요소의 일부를 변경하거나 새로운 데이터 요소를 추가하려면 기존의 프로그램을 광범위하게 수정해야 했습니다. 그러나 관계형 데이터베이스에서는 데이터 요소(열)를 변경하는 것의 효과는 미세합니다. 관계형 데이터베이스에서, 열의 크기의 증감은 테이블 내의 다른 열로부터 독립적이기 때문이죠. 그만큼 소프트웨어 유지/관리 비용이 감소한다는 얘기가 됩니다.

관계형 이론의 규칙 중 하나는 열의 순서가 중요하지 않다는 점입니다. 이 말은 사실 개념적인 수준에서 테이블의 열이 여러분이 원하는 순서로 검색될 수 있다는 것을 의미합니다. 물론 물리적인 순서는 존재를 하겠죠.

관계형 이론의 또다른 규칙은 행의 순서가 중요하지 않다는 점이죠. 행이 어떤 특정 순서로 저장되지 않는다는 뜻이 아니라 행이 테이블로부터 검색될 방식에 있어서 함축적인 순서가 없다는 것을 의미합니다. 따라서 어떤 테이블의 행이 특정 순서로 복귀되기를 원한다면, 그 순서를 지정해 주어야 합니다.

2) 데이터 검색 및 변경

SQL문은 다음 세 가지 영역으로 크게 분류할 수 있습니다.

DML(Data Manipulation Language) 데이터를 검색하거나 변경하는 데이터 조작 언어
DDL(Data Definition Language) 데이터의 구조를 정의하는 데이터 정의 언어
DCL(Data Control Language) 데이터베이스 사용자에게 부여한 특권을 정의하는 데이터 제어 언어
DML에는 다음 네 가지 기본 문장이 있습니다.

SELECT 문 : 테이블로부터 행 검색
INSERT 문 : 테이블에 행 추가
UPDATE 문 : 테이블 내의 기존 행 변경
DELETE 문 : 테이블에서 행 제거
다음은 SQL의 특성이라고 할 수 있습니다.

모든 SQL 문은 세미콜론(;)에 의해 종료된다.
SQL 문은 명료성을 위해 한 개 라인의 중앙에 위치시키거나 여러 라인으로 분할할 수 있다.
SQL은 대소문자를 구별하지 않는다.
3) SELECT 문의 구문

SELECT문은 네 개의 DML문 중에서 가장 많이 쓰이는 구문입니다. 그리고 UPDATE, INSERT, DELETE 문 내에서 서브 쿼리로써 존재할 수 있습니다. SELECT 문은 최소한 다음의 두 요소로 구성됩니다.

SELECT LIST : 검색될 열의 LIST
FROM 구 : 행을 검색하기 위한 TABLE
그럼 간단한 예를 보죠. 다음은 학생(Student)이란 Table에서 이름(name)을 검색하는 쿼리입니다.

SELECT name FROM student;

결과는 다음과 같이 나오겠죠.

NAME
----------
박상욱
배효일
이원희
윤면용
최인희
신관호
...
구교락

학생의 이름과 나이를 알고 싶으면 희망하는 순서로 열을 나열하면 됩니다.

SELECT name, age FROM student;

결과는 다음과 같이 나옵니다.

NAME AGE
---------- ----
박상욱 29
배효일 26
이원희 50
윤면용 28
최인희 27
신관호 28
...
구교락 28

테이블의 모든 열을 검색하려면 *을 사용하면 됩니다.

SELECT * FROM student;

NAME AGE ENG_SCORE KOR_SCORE ... AVR_SCORE
---------- --- ---------- ---------- ... ----------
박상욱 29 90 85 ... 93
배효일 26 70 90 ... 80
이원희 50 30 10 ... 15
윤면용 28 100 100 ... 100
최인희 27 90 90 ... 94
신관호 28 85 100 ... 96
... ... ... ... ... ...
구교락 28 0 10 5

참! ORACLE에서는 DUAL이라는 유틸리티 TABLE을 사용해서 산술연산이나 현재시간 등을 알 수 있어요.

SELECT 3.14159*20 FROM DUAL;

3.14159*20
----------
62.8318

SELECT SYSDATE FROM DUAL;

SYSDATE
---------
05-JUN-98

모든 SELECT 문에 의해서 복귀된 결과는 임시 테이블을 구성합니다. 각 검색된 레코드는 이 임시 테이블 내에서 하나의 행이고 선택 리스트의 각 요소는 하나의 열입니다. 만약 쿼리가 어떠한 레코드도 복귀시키지 않는다면 임시 테이블은 빈 것으로 생각할 수 있죠. 이 기능은 관계형 모델의 근본 원칙입니다.

그리고 위에서 열을 지정한 것처럼 선택 리스트 네에서 표현식을 지정할 수 있습니다. 표현식은 열과 동일한 데이터타입 (문자, 수치, 날짜)에 속합니다. 여러분은 연산자, 내장함수, 그리고 상수를 이용하여 여러분의 APPLICATION의 필요를 만족시킬 수 있는 복잡한 표현식도 작성할 수 있습니다. 그리고 표현식이 다수의 열을 참조할 지라도 ORACLE이 선택 리스트 내에 있는 각 요소를 독립된 열로 간주한다는 것을 기억하세요.

SQL에서 사용되는 산술 연산자는 C 언어에서 사용되는 산술 연산자와 동일합니다. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)... 모두 똑~ 같죠?

다음은 학생들의 영어 성적과 국어 성적을 평균내는 것입니다.

SELECT name, eng_score, kor_score, (eng_score+kor_score)/2 FROM student ;

NAME ENG_SCORE KOR_SCORE (ENG_SCORE+KOR_SCORE)/2
---------- --------- ---------- -----------------------
박상욱 90 85 87.5
배효일 70 90 80
이원희 30 10 20
윤면용 100 100 100
최인희 90 90 90
신관호 85 100 87.5
... ... ... ...
구교락 0 10 5

SQL에서 사용되는 문자열 연산자(String Operator) 중 가장 중요한 것이 연결 연산자(Concatenation Operator) 입니다. 이 연산자는 둘 이상의 문자열을 함께 연결할 수 있게 합니다.

SELECT name || ', ' || city FROM student;

NAME||','||CITY
----------------
박상욱, 부산
배효일, 진주
이원희, 서울
윤면용, 수원
최인희, 수원
신관호, 서울
...
구교락, 부산

어떤 경우에 문자열을 연결할까요?

쿼리에 의해서 복귀된 값 곳에 문자열을 내장하기 위해서
문자열을 조합하기 위해서
어떤 열에 할당할 수 있는 새로운 값을 작성하기 위해서
여러분은 두 개 이상의 문자열로 연결 연산자를 사용할 수 있습니다. ', '는 문자열을 콤마(,)와 공백으로 연결할 수 있도록 사용된 것입니다.
. SQL의 기초 (2)

이제 내장함수에 관해 알아볼까요? ORACLE사는 다양한 데이터 타입을 조작하고 변환하기 위해서 많은 내장함수를 제공합니다.

문자함수
숫자함수
날짜함수
변환함수
그룹함수
잡함수(Miscellaneous Function)
일단 여기서는 이런 종류가 있다는 것만 알고 넘어가죠.

SQL은 레코드를 검색하는데 이용할 수 있는 기준을 지정하는 WHERE 구를 제공합니다. 어떤 테이블이 많은 행을 가지고 있을 경우, 그 행들을 모두 검색하면 참 불편하겠죠? WHERE 구는 쿼리에 의해 검색되는 행을 위해서 만족되어야 하는 한 개 이상의 조건문으로 구성되어 있습니다.

만약 여러분이 서울에 사는 학생들의 List만 원한다면 아래와 같이 할 수 있겠죠.

SELECT name, eng_score, kor_score FROM student WHERE city='서울';

NAME ENG_SCORE KOR_SCORE
---------- --------- ----------
이원희 30 10
신관호 85 100

WHERE문을 사용할 때 AND 와 OR 키워드로 조건문을 조합할 수도 있습니다. 서울이나 수원에 살고 영어 성적이 80점 이상인 학생만 보는 예를 들어보죠.

SELECT * FROM student
WHERE city='서울' OR city='수원' AND eng_score>=80;

NAME AGE ENG_SCORE KOR_SCORE ... AVR_SCORE
---------- --- ---------- ---------- ... ----------
윤면용 28 100 100 ... 100
최인희 27 90 90 ... 94
신관호 28 85 100 ... 96


그럼 데이터를 소트(Sort)시켜서 쿼리하는 법을 볼까요? 여러분은 ORDER BY 구를 이용해서 쿼리되는 데이터를 소트시킬 수 있습니다. ORDER BY 구는 쿼리가 복귀시키는 행의 순서를 매기는데 사용되어야 하는 열을 지정하는데 사용됩니다.

SELECT name, age FROM student
ORDER BY name;

NAME AGE
---------- ---
구교락 28
박상욱 29
배효일 26
신관호 28
윤면용 28
이원희 50
...
최인희 27


순서를 정리할 때 오라클의 경우는 아무런 옵션이 없을 경우, 행을 오름차순(ASC)으로 순서를 정합니다. 열의 순서를 내림차순으로 정리하려면 열의 이름 뒤에 DESC 키워드를 추가해야 합니다.

SELECT name, age FROM student
ORDER BY name DESC;

NAME AGE
---------- ---
최인희 27
이원희 50
윤면용 28
신관호 28
배효일 26
박상욱 29
...

구교락 28

그런데 가끔은 내가 찾고자 하는 데이터나 행이 얼마나 되는지 알고 싶을 때가 있죠? 그때는 COUNT라는 함수를 사용합니다. COUNT 함수는 지정된 기준을 만족시키는 행의 수를 복귀시킵니다.

SELECT count(*) FROM student
WHERE eng_score>=80;

COUNT(*)
--------
4

그러면 서브쿼리는 어떻게 사용하는지 볼까요? 서브쿼리는 다른 DML(SELECT, UPDATE, DELETE, INSERT) 문으로 정의됩니다. 만약에 영어성적에 대해서 전체 평균보다 점수가 낮은 학생을 조회하고 싶다면 다음과 같이 사용하면 됩니다. avg()는 ORALCE이 제공하는 평균을 내는 함수죠.

SELECT name, eng_score FROM student
WHERE eng_score <
(SELECT avg(eng_score) FROM student);

서브쿼리를 사용할 경우, 다음의 내용을 주의하세요.

서브쿼리는 괄호로 묶어야 한다.
서브쿼리에 의해서 복귀된 행의 수는 함수 또는 연산자가 기대하는 값의 수와 일치해야 한다.
ORDER BY 구는 서브쿼리 문에서 사용할 수 없다.
또 SELECT 문으로 새로운 테이블을 만들 수도 있어요. 다음과 같이 CREAT TABLE 문과 SELECT 문을 함께 사용하면 됩니다. WHERE 문을 주어서 원하는 조건만으로 테이블을 만들 수도 있겠죠.

CREATE TABLE new_table_name
AS
select_statement;

CREATE TABLE eng_score_table
AS
SELECT name, age, eng_score
FROM student;

여러분은 선택 리스트 내에서 복잡한 표현 문을 지정할 때 그것에게 앨이어스를 할당함으로써 결과 값의 문서를 보기 좋게 할 수 있습니다. 다음 두 가지 예를 볼까요?

SELECT name, eng_score, kor_score, (eng_score+kor_score)/2 FROM student;

NAME ENG_SCORE KOR_SCORE (ENG_SCORE+KOR_SCORE)/2
---------- --------- ---------- -----------------------
박상욱 90 85 87.5
배효일 70 90 80
이원희 30 10 20
윤면용 100 100 100
최인희 90 90 90
신관호 85 100 87.5
... ... ... ...
구교락 0 10 5

SELECT name, eng_score, kor_score, (eng_score+kor_score)/2 AVERAGE FROM student;

NAME ENG_SCORE KOR_SCORE AVERAGE
---------- --------- ---------- --------
박상욱 90 85 87.5
배효일 70 90 80
이원희 30 10 20
윤면용 100 100 100
최인희 90 90 90
신관호 85 100 87.5
... ... ... ...
구교락 0 10 5

첫 번째 예와 두 번째 예를 비교해보면 두 번째 예가 훨씬 깔끔하죠? 이것을 표현식 (eng_score+kor_score)/2에 앨이어스 AVERAGE를 할당한다고 하며, 여기서 두 가지 이익을 얻을 수 있습니다.

표현식을 정확히 기술하는 이름을 갖는다.
ORDER BY 구 내에서 앨리어스를 참조할 수 있다.
내용이 HTML하고 비교해서 좀 어렵나요?
. SQL의 기초 (3)

관계형 데이터베이스 시스템(RDBMS) 기술과 비관계형 데이터베이스 시스템(DBMS) 기술 사이의 한 가지 주요 차이점은 널(Null) 값의 개념입니다. 비관계형 데이터베이스 시스템에서, 어떤 문자 또는 수치 필드에 어떤 값이 없다는 것은 어떤 특별한 값에 의해서 표시됩니다.

관계형 데이터베이스에서는 어떤 열을 위한 널(Null) 값은 다양한 이유로 나타납니다.

이 열을 위한 값은 문제의 행에 적용되지 않는다.
이 열은 아직 값을 할당받지 못했다.
그럼 열 값으로 널(Null)을 갖고 있는 행을 찾아볼까요?

SELECT name, eng_score, kor_score FROM student
WHERE phone_no is Null;

NAME ENG_SCORE KOR_SCORE
---------- --------- ----------
배효일 70 90
이원희 30 10
... ... ...
구교락 0 10

어떤 값이 Null인 이유를 이해하는 것이 중요합니다. 전화번호와 같은 것은 Null이 될 수도 있죠. 왜냐하면 효일이는 자취하고, 원희는 새로 이사했는데 전화를 놓지 않았고, 교락이는 집에서 쫓겨났기 때문에.. 후후.. 그냥 WHERE 절을 이용해서 Null 값을 찾을 수 있다는 것만 기억하세요.

그리고 NOT 연산자를 이용해서 Null이 아닌 행을 검색할 수도 있습니다. 예를 들어서 전화번호를 메모한 학생들의 전화번호를 알고 싶으면 다음과 같이 하면 되지요.

SELECT name, eng_score, kor_score FROM student
WHERE phone_no is Not Null;

NAME ENG_SCORE KOR_SCORE
---------- --------- ----------
박상욱 90 85
윤면용 100 100
최인희 90 90
신관호 85 100
... ... ...


그럼 이제 연산자에 대해서 간단히 알아봅시다. 연산자에는 LIKE, BETWEEN, IN 등의 연산자가 있어요.

LIKE 연산자는 찾아내고자 하는 항목을 위한 정확한 철자를 모를 때 테이블을 검색하는데 이용하게 됩니다. 문법은 다음과 같아요.

SELECT name, eng_score FROM student
WHERE name like '%원

NAME ENG_SCORE
---------- ---------
이원희 30

BETWEEN 연산자는 AND 와 함께 사용되어 연결되는 두 개의 조건문과 같이 작용합니다.

SELECT name, eng_score FROM student
WHERE eng_name BETWEEN 85 AND 95;

위의 문장은 아래의 문장과 동일한 문장입니다.

SELECT name, eng_score FROM student
WHERE eng_score >= 85 AND eng_score <= 95;

NAME ENG_SCORE
---------- ---------
박상욱 90
윤면용 100
최인희 90
신관호 85

마지막으로 이제 IN 연산자에 대해 알아보죠. IN 연산자는 열 또는 표현식의 값을 가능한 값들의 리스트를 비교하는데 사용됩니다. 그리고 IN 연산자는 Boolean 값을 복귀시키죠.

표현식이 표현식 리스트에 있는 모든 값 중 하나와 같으면 TRUE
표현식이 표현식 리스트에 있는 모든 값 중 같은게 없으면 FALSE
SELECT name FROM student
WHERE city IN ('Suwon', 'Seoul');

NAME
----------
윤면용
최인희
신관호

위의 내용과 반대의 내용이 나타나도록 NOT 키워드를 사용할 수도 있죠.

SELECT name FROM student
WHERE city NOT IN ('Suwon', 'Seoul');

NAME AGE
---------- ---
구교락 28
박상욱 29
배효일 26
이원희 50
...

박영식 (비회원)
    • 글자 크기
3차 강의분 php 번역 보기 (by 박영식) 4차 강의분-MYSQL (by 박영식)

댓글 달기

첨부 (0)
위로