1. SELECT 구문


1.1 SELECT

     ▼ 아랑고에서는 SQL을 AQL 이라 명명합니다. 사용해본 느낌은 AQL이 더 RDB보다 직관적인 문법이란 생각이 들더군요
     - Filter : where 이며 TSQL과 똑같은 방법으로 비교 연산자가 가능
     - Sort  : 정렬이며 TSQL과 똑같은 방법으로 정렬 가능
     - Limit : Mysql에 Limit와 사용법이 같다. Mysql로 같은 방법에 페이징이 가능 (좋은소식)
     - Return : select 절 Aliases 된 콜렉션을 사용해 컬럼을 지정하는 방식 또한 TSQL과 같습니다.

FOR cur IN col
   FILTER cur.gender == "m"
or cur.gender == "f"   /* where  */
   
SORT cur.age desc, cur.name asc                /* order by  */
   
Limit 1,10                                     /* Limit (Top) , (몇번째부터, 몇개까지)  */
   
RETURN {                                       /* select */
       
name:cur.name,
        gender:cur.gender,
        age:cur.age
}

/* select *  AQL JSON 형태 그대로 노출한다.*/
FOR cur IN col
RETURN cur


     - select 된 데이터 화면은 아래와 같습니다.
     - Json 형식에 데이터와, 테이블 구조의 데이터 두가지 방식으로 볼수 있습니다. 




2. INSERT 구문


2.1 인터페이스에 메뉴 구성

     - COLLECTIONS  메뉴 : 테이블과 같은 역할을 하는 부분
     - QUERIES 메뉴 ;  질의 작성기 부분
     - INSERT를 하기 위해 COLLECTIONS  메뉴에 접근


2.2 COLLECTIONS 생성
     
     ▼ 컬렉션(테이블)을 작성을 해보겠습니다.  name에 원하는 명을 넣고 Type은 document를 설정합니다.
     - 그러면 JSON 형태의 데이터를 저장하는 NO-SQL 콜렉션이 create 됩니다.
     

     ▼ 잠깐 데이터를 생성해보자 컬렉션 상세 페이지에 오른쪽 위에 (+)를 누르면 _key를 입력하는 창이 나옵니다.
     - 해당 키는 자동으로 DB에서 고유한 PK를 생성해주지만 임의적으로 생성할수 있다. 숫자+스트링 조합도 가능합니다.
     - 논클러스터 INDEX 이기도 합니다.



     - 데이터는 이처럼 빈값이더라도 키만 있으면 존재하는 특징이 있습니다. (NO-SQL은 역시)


2.3 INSERT 

     ▼ QUERIES 창을 열어 아래 INSERT 구문 입력 예제를 입력해보자
     - JSON처럼 키와 값으로 입력하는 특징이 보이네요.
/* 여러개의 INSERT Query AQL */
FOR cur IN [    /* "cur" RDB ALIAS(as)와 비슷한 역할을 한다. 추후에 inner join 등에 쓰일때 다시 알아보자 */
            {name: "GV", gender: "m", age: 13}, /* colunm : data 식으로 키와 쌍으로 이루어진 Json 그대로 입력 */
            {name: "HIRE",gender: "f" ,age: 15},
            {name: "RAEBU",gender: "m" ,age: 19}
]
INSERT cur INTO col

/* 한개의 data  INSERT AQL*/
INSERT { name: "GV", gender: "m", age:13 }
INTO col
    

     - 컬렉션에서 Col을 확인해보면 해당처럼 Json 형태로 데이터가 입력되어 있습니다.. 
     - 클릭해보면 데이터의 상세화면이 나오고 -, +를 통해 데이터를 편집할 수 있다.


2.4 INSERT SELECT 

     ▼ AQL은 셀렉트 인설트롤 지원합니다. 기존 return 자리에 insert를 넣으면 select insert 문이 됩니다.
     - 고유 PK (_key)값도 같이 복사되기 때문에 반복 입력하게 되면 unique constraint violated 오류가 발생합니다.
FOR cur IN col
  FILTER
( cur.gender == "m" or cur.age > 10 ) and  /* TSQL과 같은 비교 연산자 가능 */
           cur.name like "G%"                       /* LIKE 방식으로 사용 */
/*   RETURN cur    리턴 자리에 insert into를 쓰면  insert select */
INSERT cur INTO backup /* col as cur에 데이터를 backup에 넣는다. */
 

     
2.5 변수를 활용한 루프 INSERT

     ▼ For문으로 반복하여 insert 하는 방법을 기술 했습니다.
     - 기존 TSQL에서 쓰던 함수인 FOR을 사용 가능하네요
     - concat : 문자열을 합치는 함수다.
     - 삼항연산이 가능하다. 
     - CEIL : 올림 함수 소수점 상관없이 무조건 올림
     - RAND() : 랜덤함수로 숫자를 무작위로 추출한다.      
FOR i IN 1..1000  /* 반복문 루프될 숫자만 정해주면 된다.*/
 
INSERT {
   
name: CONCAT("name_", i),         /* CONCAT 문자열 연결 */
    gender: (i % 2 == 0 ? "f" : "m"), /* 삼항연산 가능 */
    age : CEIL(RAND() * 30)          /* 랜덤으로 1~30까지 */
  }
  INTO col




3. INNER JOIN


1-1. Inner join 문 
     - TSQL과 마찬가지로 테이블에 관계 있는 컬럼과 컬럼으로 컬렉션과 inner join 할 수 있습니다. 
     - 간단하고 익숙한 방법으로 noSQL 에 inner join을 제공됩니다.


FOR cur1 IN argdb
 
FOR cur2 IN argdb_addr            /* join할 테이블*/
  
FILTER cur1.name == cur2.name    /* 여기서 On 을 하면 된다. */
  
SORT cur1.age desc               /* 여기서 부터 기존과 똑같은 select 방법으로  */
      
RETURN {   
          
name:cur1.name 
           ,age:cur1.age   
           ,age:cur1.age   
           ,favorites:cur1.favorites
           ,addr:cur2.addr          
/* 명명자로 구분해서 TSQL이랑 상당히 흡사 */
}





마무리

욕심이 과했는지 이번 강의에 많은걸 담아 냈습니다. 매력 넘치는 AQL문에 빠져보시죠


댓글을 달아 주세요