XML 쿼리 언어
XE는 다양한 DB를 지원하기 위해 SQL 쿼리를 그대로 사용하지 않고 XML로 작성합니다.
XML 쿼리는 모듈과 애드온, 위젯 등에서 다음과 같이 사용할 수 있습니다.
$args->name = "zero";
$output = executeQuery("member.getMemberInfo", $args);
executeQuery() 함수는 ./classes/db/DB.classs.php에 있는 DB::executeQuery() 함수의 별칭(alias)입니다. 이 함수는 실제 DB 데이터를 조작하고 사용된 DB에 따라 XML 쿼리가 네이티브 SQL로 파싱된 후에 결과를 수신합니다.
function executeQuery($xml_query_name, $args = null);
- 첫 번째 파라미터는 실행될 XML 쿼리의 이름입니다. 값은 "모듈이름.쿼리ID"입니다.
- 두 번째 파라미터는 stdClass의 타입으로서, 데이터를 쿼리에 전달하는 데 사용됩니다. 이 파라미터는 널(null)이 될 수 있습니다.
- 결과값은 Object 클래스의 객체로 반환됩니다.
- $output->toBool()이 FALSE이면 쿼리 실패를 의미하며, $output->toBool()이 TRUE이면 쿼리가 정상적으로 실행되었다는 뜻입니다.
- select문의 결과는 $output->data 변수에 넣어 반환됩니다.
<query id="query_id" action="select|update|delete|insert">
<tables>
<table name="tableName" alias="alias" />
</tables>
<columns>
<column name="columnName" alias="alias" />
</columns>
<conditions>
<condition operation="doSomething" column="column1" var="variable" filter="filterType" default="default" notnull="notnull" minlength="minimumLength" maxlength="maximumLength" pipe="TheConcatenationOperator "/>
<group pipe="pipe">
<condition operation="anotherOperation" column="column" var="variable" filter="filterType" default="default" notnull="notnull" minlength ="minimumLength" maxlength="maximumLength" pipe="TheConcatenationOperator"/>
</group>
</conditions>
<navigation>
<index var="var" default="default" order="desc|asc" />
<list_count var="var" default="default" />
<page_count var="var" default="default" />
<page var="var" default="default" />
</navigation>
<groups>
<group column="GroupBy daesang" />
</groups>
</query>
XML 쿼리에 사용되는 XML 요소와 속성은 다음과 같습니다.
|
요소 |
속성 |
설명 |
|---|---|---|
|
<query> |
쿼리 XML의 최상위 요소 |
|
|
id |
쿼리 검색을 위한 아이디. module.query_id를 사용해서 쿼리 XML 파일을 검색하고 사용합니다. |
|
|
|
action |
액션은 select, update, delete, insert 이렇게 네 가지 타입입니다. |
|
alias |
서브쿼리를 사용할 때 쿼리문의 alias명입니다. |
|
|
<tables> |
쿼리에 사용될 테이블의 모음 |
|
|
<table> |
테이블 요소 |
|
|
name |
원래 테이블 이름(XE의 접두어는 무시) |
|
|
|
alias |
열 지정이나 검색 등에서 사용할 테이블 별칭 |
|
<columns> |
|
쿼리에 사용될 열 모음 |
|
<column> |
열 요소 |
|
|
|
name |
열 이름 |
|
|
alias |
원래 열의 이름을 변경할 때 사용 |
|
<conditions> |
|
조건문을 만들 때 사용. <group> 요소를 사용해서 조건문을 여러 그룹으로 구분할 수 있습니다. |
|
<group> ... </group> |
조건문이 그룹으로 사용될 때 pipe="and|or"를 사용해서 그룹 간 조건을 지정할 수 있습니다. |
|
|
<condition> |
조건문 |
|
|
|
operation |
다음과 같은 연산자로 처리할 수 있습니다.
|
|
column |
열 이름을 지정합니다. |
|
|
var |
executeQuery(Array)() 함수의 두 번째 파라미터인 stdClass의 키값을 지정합니다. |
|
|
filter |
var값의 조건 필터링. 지원되는 필터는 다음과 같습니다.
|
|
|
default |
var값이 널이면 기본값으로 대체. 기본값은 일반 문자열, 숫자 모두사용 가능하며, 아래와 같은 함수를 사용할 수도 있습니다.
|
|
|
notnull |
널인지 확인. 지정하면 반드시 var의 값이 있어야 합니다. |
|
|
minlength |
최소 길이 확인 |
|
|
maxlength |
최대 길이 확인 |
|
|
pipe |
and|or 같은 조건 지정 |
|
|
<navigation> |
|
정렬 순서나 페이징을 지원 |
|
<index> |
|
정렬될 열과 정렬 방식 지정 |
|
var |
열 이름이 값인 변수 이름 |
|
|
default |
var값이 지정되지 않은 경우 사용되는 기본으로 정렬된 열 이름 |
|
|
order |
정렬 방식. asc|desc가 아닌 변수의 이름을 사용하면, 변수의 값에 따라 정렬됩니다. 단, 변수의 값은 asc|desc로 전달되어야 합니다(오름차순 "asc", 내림차순 "desc") |
|
|
<list_count> |
페이징 결과를 수신할 수 있게 합니다. |
|
|
var |
행의 개수가 값인 변수 이름 |
|
|
default |
var값이 지정되지 않으면 사용되는 행의 개수 기본값 |
|
|
<page_count> |
페이징을 계산할 때 내비게이션 개수 지정 |
|
|
var |
페이징 내비게이션의 개수가 값인 변수 이름 |
|
|
default |
var값이 지정되지 않으면 사용되는 기본 페이징 내비게이션의 개수 |
|
|
<page> |
|
현재 페이지 번호 지정 |
|
var |
현재 페이지 번호를 값으로 가지는 변수 이름 |
|
|
default |
var값이 지정되지 않으면 사용되는 기본 페이지 번호 |
|
|
<groups> |
|
조건문에 따라 그룹을 사용할 수 있게 합니다. group by절 사용 시 작성 |
|
column |
group by 기준 열 이름 |
XE 1.5 버전부터 서브쿼리를 작성할 수 있습니다. 아래는 서브쿼리 타입별 작성 예입니다.
- Select절 사용
SQL 사용 예
select *,
(select count(*) as "count"
from "xe_documents" as "documents"
where "documents"."user_id" = "member"."user_id"
) as "totaldocumentcount"
from "xe_member" as "member"
where "user_id" = 7
XML 서브쿼리 작성 예
<query id="getStatistics" action="select">
<tables>
<table name="member" alias="member" />
</tables>
<columns>
<column name="*" />
<query id="getMemberDocumentCount" alias="totalDocumentCount">
<tables>
<table name="documents" alias="documents" />
</tables>
<columns>
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="documents.user_id" default="member.user_id" />
</conditions>
</query>
</columns>
<conditions>
<condition operation="equal" column="user_id" var="user_id" notnull="notnull" />
</conditions>
</query>
- Where절 사용
SQL 사용 예
SELECT *
FROM xe_member as member
WHERE regdate = (SELECT MAX(regdate) as regdate
FROM xe_documents as documents
WHERE documents.user_id = member.user_id)
XML 서브쿼리 작성 예
<query id="getMemberInfo" action="select">
<tables>
<table name="member" alias="member" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<query operation="equal" column="regdate" notnull="notnull" alias="documentMaxRegdate">
<tables>
<table name="documents" alias="documents" />
</tables>
<columns>
<column name="max(regdate)" alias="maxregdate" />
</columns>
<conditions>
<condition operation="equal" column="documents.user_id" var="member.user_id" notnull="notnull" />
</conditions>
</query>
</conditions>
</query>
- From절 사용
SQL 사용 예
SELECT m.member_srl, m.nickname, m.regdate, a.count
FROM (
SELECT documents.member_srl as member_srl, count(*) as count
FROM xe_documents as documents
GROUP BY documents.member_srl) a
INNER JOIN xe_members m on m.member_srl = a.member_srl
XML 서브쿼리 작성 예
<query id="getMemberInfo" action="select">
<tables>
<table query=”true” alias="a">
<table>
<table name="documents" alias="documents" />
</table>
<columns>
<column name="member_srl" alias="member_srl" />
<column name="count(*)" alias="count" />
</columns>
<groups>
<group column="member_srl" />
</groups>
</table>
<table name="member" alias="m" type="inner join">
<conditions>
<condition operation="equal" column="m.member" default="a.member_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="m.member_srl" />
<column name="m.nickname" />
<column name="m.regdate" />
<column name="a.count" />
</columns>
</query>