Apache Tajo - SQL-запросы

В этой главе рассказывается о следующих важных запросах.

  • Predicates
  • Explain
  • Join

Давайте продолжим и выполним запросы.

Предикаты

Предикат - это выражение, которое используется для оценки истинных / ложных значений и НЕИЗВЕСТНО. Предикаты используются в условии поиска предложений WHERE и HAVING и других конструкций, где требуется логическое значение.

Предикат IN

Определяет, соответствует ли значение проверяемого выражения любому значению в подзапросе или списке. Подзапрос - это обычный оператор 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 сравнивает строку, указанную в первом выражении, для вычисления строкового значения, на которое ссылаются как на значение для проверки, с шаблоном, который определен во втором выражении для вычисления строкового значения.

Шаблон может содержать любую комбинацию подстановочных знаков, например -

  • Символ подчеркивания (_), который можно использовать вместо любого отдельного символа в проверяемом значении.

  • Знак процента (%), который заменяет любую строку из нуля или более символов в проверяемом значении.

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

Запрос возвращает записи из моей таблицы тех студентов, имена которых начинаются с буквы «А».

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 тех студентов, чьи имена начинаются с буквы «а» в качестве второго символа.

Использование значения 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

Вышеупомянутый запрос даст следующий результат.

Здесь Глобальный план показывает идентификатор блока выполнения, порядок выполнения и его информацию.

Присоединяется

Соединения SQL используются для объединения строк из двух или более таблиц. Ниже приведены различные типы соединений SQL.

  • Внутреннее соединение
  • {LEFT | ВПРАВО | ПОЛНОЕ} ВНЕШНЕЕ СОЕДИНЕНИЕ
  • Перекрестное соединение
  • Самостоятельное присоединение
  • Естественное соединение

Рассмотрим следующие две таблицы для выполнения операций объединения.

Таблица1 - Заказчики

Мне бы название Адрес Возраст
1 Клиент 1 23 Old Street 21 год
2 Клиент 2 12 Нью-Стрит 23
3 Клиент 3 10 Express Avenue 22
4 Клиент 4 15 Express Avenue 22
5 Клиент 5 20 Garden Street 33
6 Клиент 6 21 Северная улица 25

Таблица2 - customer_order

Мне бы Номер заказа Emp Id
1 1 101
2 2 102
3 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

Запрос соответствует пяти строкам из обеих таблиц. Следовательно, он возвращает возраст совпавших строк из первой таблицы.

Левое внешнее соединение

Левое внешнее соединение сохраняет все строки «левой» таблицы, независимо от того, есть ли строка в «правой» таблице или нет.

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,

Здесь левое внешнее соединение возвращает строки столбцов имен из таблицы клиентов (слева) и очищает строки с соответствующими столбцами из таблицы customer_order (справа).

Правое внешнее соединение

Правое внешнее соединение сохраняет все строки «правой» таблицы, независимо от того, есть ли строка, совпадающая с «левой» таблицей.

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

Здесь правое внешнее объединение возвращает строки empid из таблицы customer_order (справа) и строки столбца имен из таблицы клиентов.

Полное внешнее соединение

Полное внешнее объединение сохраняет все строки как из левой, так и из правой таблицы.

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

Вышеупомянутый запрос даст следующий результат.

Приведенный выше запрос возвращает декартово произведение таблицы.

Естественное соединение

Естественное соединение не использует никаких операторов сравнения. Он не объединяет, как декартово произведение. Мы можем выполнить естественное соединение, только если между двумя отношениями существует хотя бы один общий атрибут.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

Вышеупомянутый запрос даст следующий результат.

Здесь есть один общий идентификатор столбца, который существует между двумя таблицами. Используя этот общий столбец,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

Запрос присоединяет к себе таблицу клиентов.