'SQL'에 해당되는 글 4건

  1. 2010.01.07 SQL 쿼리 프로파일링
  2. 2009.02.26 서브(Sub) 쿼리 (4)
  3. 2009.02.23 조인(Join) 쿼리
  4. 2006.12.13 SQL command
심심 풀이로 쿼리를 '발'로 짜다 보니 이중 삼중의 조인쿼리와 서브쿼리가 한데 어우러진 아주 복잡 미묘한 쿼리를 만들게 되었습니다.

암튼 중요한 것은 바롤 짠 쿼리가 아니라 이 쿼리가 과연 정상적인 성능을 낼 수 있을까 하는 의문이 들더군요.

MySQL을 대상으로 만들긴 했지만, MySQL에서 사실 쿼리가 어떤 순서로 실행 되는지도 모르고(쿼리 계획 이라고 하는 것 같던데..) 내부 구조에도 아는 바가 없어 고민하며 프로파일링 툴을 찾다가 몇 가지 재미있는 링크들을 찾아 간만에 포스팅을 하나 올립니다.


일단 explain 이라는 쿼리 플랜을 보여주는 명령어가 있더군요. SQL 표준이 아닌지라, MySQL에서는 select 절만 지원한다고 하는데, 오라클이나 좀 빵빵한 DB들은 explain update, delete까지 지원하지 않을까 싶습니다.

 

쿼리 플랜이란 쿼리가 실행 되는 순서 정도라고 생각하시면 될 듯합니다.

 

해당 정보를 보시면 특정 테이블에 몇 번 접근 했는지, index를 이용했는지 그냥 쌩으로 리스트를 쭉 훑었는지 등등 튜팅에 도움이 될만한 정보를 많이 보여주더군요.

 * MySQL - Explain 정보보는법
(, MySQL에서는 select 밖에 지원이 안됩니다..ㅠㅠ)

 

그리고 MySQL 5.0 버전 부터는 프로파일러가 붙어서 따라 나오더군요. 사용법은 http://niflheim.tistory.com/56 에 보시면 한글로 아주 친철하게 설명이 되어 있습니다만…쿼리 브라우져로 붙어서 하면 안 나오더군요, 꼭 콘솔로 하셔야만 합니다.

쿼리의 성능
, 실제 쿼리가 실행 되는데 걸리는 시간, 테이블 접근에 걸리는 시간 등의 시간정보들을 얻을 수 있습니다.

 

Posted by kukuta

댓글을 달아 주세요

서브쿼리란?
하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 것입니다. 예를 들어 A라는 테이블에서 검색해 나온 결과만을 대상으로 다시 한번 더 쿼리를 날린다는 것입니다. 참고로 하나 이상의 테이블을 연결하여 검색하는 기능은 조인(Join) 쿼리라고 합니다.

기본 문법

SELECT coulmn_name FROM table_name WHERE column_name = (
    SELECT column_name FROM table_name WHERE column_name = some_value
);

생각 보다 간단하지 않나요? 기본적인 것은 일반 쿼리와 동일 합니다. 다만, where 에 조건으로 오는 것이 일반 컬럼이 아니라 또 다른 쿼리라는 것이 차이점 입니다. 실행 순서는 괄호 안에 있는 쿼리를 먼저 실행 하고 해당 쿼리에서 나오는 결과를 이용해 괄호 바깥쪽의 쿼리를 실행 합니다. 물론, 서브 쿼리 안에 또 다른 서브 쿼리를 얼마든지 중첩해서 쓸 수 있습니다. 다만 쿼리가 좀 복잡 해지겠지요

예를 들어 볼까요?
professor라는 테이블이 있다고 생각 해 봅시다. 이 테이블에는 교수의 지위(정교수, 부교수, 시간강사, 전임강사 등등..)와 각 교수들의 이름이 들어 있습니다. 이 테이블을 대상으로 'kukuta'라는 사람의 지위와 같은 위치에 있는 사람들을 검색하고 싶다..라고 상황을 만들어 봅시다. 만일 서브 쿼리가 없다면 아래와 같이 쿼리를 두 번 작성 하겠지요 :

SQL> SELECT position  FROM professor  WHERE name = 'kukuta';

POSITION
--------------------
전임강사

SQL> SELECT name  FROM professor  WHERE position = '전임강사';

NAME
----------
kukuta
염일웅
전은지
백미선

사람이 직접 한다면야 눈으로 보고 첫 번째 쿼리의 결과를 기억했다가 두 번째 쿼리를 만들면 됩니다만...프로그램(C/C++ API 같은..)을 이용 한다면 첫번째 결과를 어딘가에 저장했다가 두 번째 쿼리를 만들 때 넣어 줘야만 합니다. 마냥 불편 하지요.
하지만 서브 쿼리가 있다면 다음 처럼 한번의 쿼리로 모든 것을 해결 할 수 있습니다 :

 SQL> SELECT name  FROM professor  WHERE position = (
                 SELECT position  FROM professor WHERE name = 'kukuta'
          );

NAME
----------
kukuta
염일웅
전은지
백미선

보다 더 간단해 지지요? 프로그램을 짤 때는 이것만큼 고마운게 없답니다.

'진리는어디에' 카테고리의 다른 글

C++ #line은 뭐지?  (0) 2010.02.02
WideCharToMultiByte()  (0) 2009.03.20
서브(Sub) 쿼리  (4) 2009.02.26
조인(Join) 쿼리  (0) 2009.02.23
fcntl() 함수를 이용한 File locking  (0) 2009.02.22
MySQL - Commmands out of sync  (0) 2009.02.17
Posted by kukuta
TAG Database, SQL

댓글을 달아 주세요

  1. 추종자 2009.02.26 10:32  댓글주소  수정/삭제  댓글쓰기

    SELECT a.name
    FROM professor a, professor b
    WHERE a.position = b.position
    and b.name = 'kukuta'
    ..................................
    간혹 서브쿼리 가 안먹는 DB가 있었던듯...

  2. Favicon of http://rhea.pe.kr BlogIcon Rhea君 2009.03.12 00:30  댓글주소  수정/삭제  댓글쓰기

    Delete * FROM USER WHERE id = 'kukuta'

    이것만 있으면 됩니다... .

  3. sjhong 2013.05.23 17:11  댓글주소  수정/삭제  댓글쓰기

    명료한 설명 감사합니다.

조인(Join)의 개념
여러개의 테이블을 결합하여 데이터를 검색 하는 것입니다. 예를 들어 A와 B라는 테이블을 따로 select하는 것이 아니라 동시에 select를 한다고 생각하시면 됩니다. 그 결과 중 특정 컬럼들의 값을 비교해서 같은 것들(혹은 다른 것들)만 select한다던지 하는 것을 조인이라고 합니다. where 절로 구분 하는 방법에 따라 여러가지 이름으로 불리고 있지만 간단한 개념이 이렇다는 것입니다.

조인(Join)의 종류
EQUI JOIN, NON-EQUI JOIN, OUTER JOIN, SELF JOIN 등 여러가지 조인이 있지만, 여기서는 Equi Join에 대해서만 다루도록 하겠습니다(제가 DB쪽 일을 하는게 아니라서 그런지 다른 Join은 잘 안쓰더군요..-0-)

EQUI JOIN
조인 대상 테이블에서 공통 칼럼을 '=' 비교를 통해, 같은 값을 가지는 행을 연결하여 결과를 생성하는 조인 방법 입니다. 

예를 들기 이전에 설명의 편의를 위해 EQUI JOIN에서 테이블 간의 연결 고리가 되는 공통 칼럼을 Join Attribute라고 정의 하겠습니다. 이 Join Attribute는 참조 무결성을 가져야 하며 한쪽 컬럼의 값이 NULL일경우 조인 결과에서 제외 됩니다.

SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;

주목 할것은 : 

  • column 이름 앞에 테이블 이름으로 컬럼의 스코프를 지정 줘 스코프를 구분 했다는 것.
  • FROM 절에서 테이블이 하나가 아니라 두 개(사실 N개도 가능)를 썼다는 것.
  • WHERE에서 서로 다른 두 테이블의 컬럼을 비교 하고 있다는 것.

정도 입니다.

참고로 말씀드리면, 꼭 다른 테이블에 있는 컬럼끼리 조인 쿼리의 대상이 될 필요는 없다는 것입니다. 동일한 테이블의 컬럼들 내에서도 조인은 가능 합니다. 보통 이런 것을 Self join이라고도 하더군요.

'진리는어디에' 카테고리의 다른 글

WideCharToMultiByte()  (0) 2009.03.20
서브(Sub) 쿼리  (4) 2009.02.26
조인(Join) 쿼리  (0) 2009.02.23
fcntl() 함수를 이용한 File locking  (0) 2009.02.22
MySQL - Commmands out of sync  (0) 2009.02.17
구조체 비트 단위 멤버  (1) 2009.02.14
Posted by kukuta
TAG Database, SQL

댓글을 달아 주세요

SQL command

진리는어디에 2006. 12. 13. 13:27

CREATE DATABASE <Database Name>

새로운 데이터베이스를 생성

CREATE TABLE <Table Name>( schema.. )

새로운 테이블을 생성
ex) CREATE TABLE tab (val INT);

INSERT INTO <Table Name> [(field Name, ... )] VALUES (data, ...)

CREATE문으로 생성된 테이블에 데이터를 저장

UPDATE <Table Name> SET <field Name>=<New Data> WHERE expr

UPDATE 문은 INSERT 문으로 저장되어 있는 데이터 수정

DELETE FROM <Table Name> WHERE expr

테이블에 있는 데이터를 삭제 할때 사용하는 쿼리문
테이블 자체를 삭제하는 DROP과 구분 되어야 한다.

ALTER TABLE <Table Name> ADD <Field Name>

테이블에 새로운 필드 추가
ex) ALTER TABLE tableName ADD newFieldName varchar(30);

ALTER TABLE <Table Name> DROP <Field Name>

테이블에 기존의 필드 삭제

ALTER TABLE <Table Name> MODIFY <Field Name>

테이블의 기존의 필드 수정
ex) ALTER TABLE tableName MODIFY exsistFieldName varchar(25) not null;

'진리는어디에' 카테고리의 다른 글

const vs mutable  (4) 2006.12.21
PHP - 문자열 취급하기  (0) 2006.12.14
가변인자를 이용한 함수(va_list)  (10) 2006.12.13
SQL command  (0) 2006.12.13
Writing a Windows Service Program  (8) 2006.12.11
Python 정규 표현식  (1) 2006.12.11
Posted by kukuta
TAG Database, SQL

댓글을 달아 주세요