Apache Tajo-SQL 쿼리

이 장에서는 다음과 같은 중요한 쿼리에 대해 설명합니다.

  • Predicates
  • Explain
  • Join

계속해서 쿼리를 수행하겠습니다.

술어

술어는 참 / 거짓 값과 UNKNOWN을 평가하는 데 사용되는 표현식입니다. 술어는 WHERE 절과 HAVING 절의 검색 조건 및 부울 값이 필요한 기타 구성에 사용됩니다.

IN 술어

테스트 할 expression의 값이 하위 쿼리 또는 목록의 값과 일치하는지 여부를 확인합니다. 하위 쿼리는 하나의 열과 하나 이상의 행으로 구성된 결과 집합이있는 일반 SELECT 문입니다. 목록의이 열 또는 모든 표현식은 테스트 할 표현식과 동일한 데이터 유형을 가져야합니다.

Syntax

IN::= 
<expression to test> [NOT] IN (<subquery>) 
| (<expression1>,...)

Query

select id,name,address from mytable where id in(2,3,4);

Result

위의 쿼리는 다음 결과를 생성합니다.

id,  name,   address 
------------------------------- 
2,  Amit,  12 old street 
3,  Bob,   10 cross street 
4,  David, 15 express avenue

쿼리는 다음에서 레코드를 반환합니다. mytable 학생 ID 2,3 및 4의 경우

Query

select id,name,address from mytable where id not in(2,3,4);

Result

위의 쿼리는 다음 결과를 생성합니다.

id,  name,  address 
------------------------------- 
1,  Adam,   23 new street 
5,  Esha,   20 garden street 
6,  Ganga,  25 north street 
7,  Jack,   2 park street 
8,  Leena,  24 south street 
9,  Mary,   5 west street 
10, Peter,  16 park avenue

위의 쿼리는 mytable 학생들은 2,3,4에 있지 않습니다.

술어처럼

LIKE 술어는 테스트 할 값으로 참조되는 문자열 값을 계산하기 위해 첫 번째 표현식에 지정된 문자열을 문자열 값을 계산하기 위해 두 번째 표현식에 정의 된 패턴과 비교합니다.

패턴에는 다음과 같은 와일드 카드 조합이 포함될 수 있습니다.

  • 테스트 할 값에서 단일 문자 대신 사용할 수있는 밑줄 기호 (_).

  • 테스트 할 값에서 0 개 이상의 문자로 구성된 문자열을 대체하는 백분율 기호 (%).

Syntax

LIKE::= 
<expression for calculating the string value> 
[NOT] LIKE 
<expression for calculating the string value> 
[ESCAPE <symbol>]

Query

select * from mytable where name like ‘A%';

Result

위의 쿼리는 다음 결과를 생성합니다.

id,  name,  address,     age,  mark 
------------------------------- 
1,  Adam,  23 new street,  12,  90 
2,  Amit,  12 old street,  13,  95

쿼리는 이름이 'A'로 시작하는 학생의 mytable에서 레코드를 반환합니다.

Query

select * from mytable where name like ‘_a%';

Result

위의 쿼리는 다음 결과를 생성합니다.

id,  name,  address,    age,  mark 
——————————————————————————————————————- 
4,  David,  15 express avenue,  12,  85 
6,  Ganga,  25 north street,    12,  55 
7,  Jack,  2 park street,       12,  60 
9,  Mary,  5 west street,       12,  75

쿼리는 다음에서 레코드를 반환합니다. mytable 두 번째 문자로 'a'로 시작하는 이름을 가진 학생들의.

검색 조건에서 NULL 값 사용

이제 검색 조건에서 NULL 값을 사용하는 방법을 이해하겠습니다.

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

위의 쿼리는 다음 결과를 생성합니다.

name 
------------------------------- 
Adam 
Amit 
Bob 
David 
Esha 
Ganga 
Jack 
Leena 
Mary 
Peter  
(10 rows, 0.076 sec, 163 B selected)

여기서 결과는 참이므로 테이블의 모든 이름을 반환합니다.

Query

이제 NULL 조건으로 쿼리를 확인하겠습니다.

default> select name from mytable where name is null;

Result

위의 쿼리는 다음 결과를 생성합니다.

name 
------------------------------- 
(0 rows, 0.068 sec, 0 B selected)

설명

Explain쿼리 실행 계획을 얻는 데 사용됩니다. 명령문의 논리적 및 글로벌 계획 실행을 보여줍니다.

논리적 계획 쿼리

explain select * from mytable;  
explain 
-------------------------------  
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT), 
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4) 
   
   => out schema: {
   (5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   } 
   
   => in schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }

Result

위의 쿼리는 다음 결과를 생성합니다.

쿼리 결과는 주어진 테이블에 대한 논리적 계획 형식을 보여줍니다. 논리 계획은 다음 세 가지 결과를 반환합니다.

  • 대상 목록
  • 아웃 스키마
  • 스키마에서

글로벌 계획 쿼리

explain global select * from mytable;  
explain 
------------------------------- 
------------------------------------------------------------------------------- 
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002) 
------------------------------------------------------------------------------- 
|-eb_0000000000000_0000_000002 
   |-eb_0000000000000_0000_000001 
------------------------------------------------------------------------------- 
Order of Execution 
------------------------------------------------------------------------------- 
1: eb_0000000000000_0000_000001 
2: eb_0000000000000_0000_000002 
-------------------------------------------------------------------------------  
======================================================= 
Block Id: eb_0000000000000_0000_000001 [ROOT] 
=======================================================  
SCAN(0) on default.mytable 
   
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT), 
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4) 
   
   => out schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   } 
   
   => in schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }  
======================================================= 
Block Id: eb_0000000000000_0000_000002 [TERMINAL] 
======================================================= 
(24 rows, 0.065 sec, 0 B selected)

Result

위의 쿼리는 다음 결과를 생성합니다.

여기서 글로벌 플랜은 실행 블록 ID, 실행 순서 및 정보를 보여줍니다.

조인

SQL 조인은 둘 이상의 테이블에서 행을 결합하는 데 사용됩니다. 다음은 SQL 조인의 다른 유형입니다-

  • 내부 조인
  • {왼쪽 | 오른쪽 | 전체} 외부 조인
  • 교차 결합
  • 셀프 조인
  • 자연스러운 결합

조인 작업을 수행하려면 다음 두 테이블을 고려하십시오.

표 1-고객

신분증 이름 주소 나이
1 고객 1 23 올드 스트리트 21
2 고객 2 12 뉴 스트리트 23
3 고객 3 10 익스프레스 애비뉴 22
4 고객 4 15 Express Avenue 22
5 고객 5 20 가든 스트리트 33
6 고객 6 21 노스 스트리트 25

표 2-customer_order

신분증 주문 아이디 Emp ID
1 1 101
2 2 102
3 103
4 4 104
5 5 105

이제 계속해서 위의 두 테이블에서 SQL 조인 작업을 수행하겠습니다.

내부 조인

내부 조인은 두 테이블의 열이 일치하는 경우 두 테이블의 모든 행을 선택합니다.

Syntax

SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Query

default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;

Result

위의 쿼리는 다음 결과를 생성합니다.

age,  empid 
------------------------------- 
21,  101 
23,  102 
22,  103 
22,  104 
33,  105

쿼리는 두 테이블의 5 개 행과 일치합니다. 따라서 첫 번째 테이블에서 일치하는 행 수명을 반환합니다.

왼쪽 외부 결합

왼쪽 외부 조인은 "오른쪽"테이블과 일치하는 행이 있는지 여부에 관계없이 "왼쪽"테이블의 모든 행을 유지합니다.

Query

select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;

Result

위의 쿼리는 다음 결과를 생성합니다.

name,       empid 
------------------------------- 
customer1,  101 
customer2,  102 
customer3,  103 
customer4,  104 
customer5,  105 
customer6,

여기서 왼쪽 외부 조인은 customers (left) 테이블에서 이름 열 행을 반환하고 customer_order (right) 테이블에서 empid 열 일치 행을 반환합니다.

오른쪽 외부 결합

오른쪽 외부 조인은 "왼쪽"테이블에 일치하는 행이 있는지 여부에 관계없이 "오른쪽"테이블의 모든 행을 유지합니다.

Query

select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;

Result

위의 쿼리는 다음 결과를 생성합니다.

name,      empid 
------------------------------- 
customer1,  101 
customer2,  102 
customer3,  103 
customer4,  104 
customer5,  105

여기서 Right Outer Join은 customer_order (right) 테이블의 empid 행과 customers 테이블의 행과 일치하는 이름 열을 반환합니다.

전체 외부 결합

완전 외부 조인은 왼쪽 및 오른쪽 테이블의 모든 행을 유지합니다.

Query

select * from customers c full outer join customer_order c1 on c.id = c1.id;

Result

위의 쿼리는 다음 결과를 생성합니다.

쿼리는 customers 및 customer_order 테이블 모두에서 일치하는 행과 일치하지 않는 행을 모두 반환합니다.

교차 결합

두 개 이상의 조인 된 테이블에서 레코드 집합의 데카르트 곱을 반환합니다.

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

위의 쿼리는 다음 결과를 생성합니다.

위 쿼리는 테이블의 카티 전 곱을 반환합니다.

자연 조인

Natural Join은 비교 연산자를 사용하지 않습니다. 데카르트 곱이하는 방식을 연결하지 않습니다. 두 관계 사이에 하나 이상의 공통 속성이있는 경우에만 자연 조인을 수행 할 수 있습니다.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

위의 쿼리는 다음 결과를 생성합니다.

여기에는 두 테이블 사이에 존재하는 하나의 공통 열 ID가 있습니다. 공통 열을 사용하여Natural Join 두 테이블을 조인합니다.

셀프 조인

SQL SELF JOIN은 테이블이 두 테이블 인 것처럼 테이블을 자신에 조인하는 데 사용되어 SQL 문에서 하나 이상의 테이블 이름을 일시적으로 변경합니다.

Syntax

SELECT a.column_name, b.column_name...  
FROM table1 a, table1 b  
WHERE a.common_filed = b.common_field

Query

default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;

Result

위의 쿼리는 다음 결과를 생성합니다.

id,   name 
------------------------------- 
1,   customer1 
2,   customer2 
3,   customer3 
4,   customer4 
5,   customer5 
6,   customer6

쿼리는 고객 테이블을 자신에 조인합니다.