Учебники

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

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

  • Предикаты
  • объяснять
  • Присоединиться

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

Предикаты

Предикат – это выражение, которое используется для оценки значений true / false и UNKNOWN. Предикаты используются в условии поиска предложений WHERE, предложений HAVING и других конструкций, где требуется логическое значение.

Предикат IN

Определяет, соответствует ли значение выражения для проверки какому-либо значению в подзапросе или списке. Подзапрос – это обычный оператор SELECT с результирующим набором из одного столбца и одной или нескольких строк. Этот столбец или все выражения в списке должны иметь тот же тип данных, что и выражение для проверки.

Синтаксис

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

запрос

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

Результат

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

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

Запрос возвращает записи из mytable для студентов с номерами 2,3 и 4.

запрос

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

Результат

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

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

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

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

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

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

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

Синтаксис

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

запрос

select * from mytable where name like A%'; 

Результат

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

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

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

запрос

select * from mytable where name like _a%'; 

Результат

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

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 

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

Использование значения NULL в условиях поиска

Давайте теперь разберемся, как использовать NULL Value в условиях поиска.

Синтаксис

Predicate  
IS [NOT] NULL 

запрос

select name from mytable where name is not null; 

Результат

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

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

Здесь результат равен true, поэтому он возвращает все имена из таблицы.

запрос

Теперь давайте проверим запрос с условием NULL.

default> select name from mytable where name is null; 

Результат

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

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

объяснять

Объяснение используется для получения плана выполнения запроса. Он показывает логическое и глобальное выполнение плана оператора.

Логический план Query

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)
   }

Результат

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

объяснять

Результат запроса показывает формат логического плана для данной таблицы. Логический план возвращает следующие три результата –

  • Целевой список
  • Вне схемы
  • В схеме

Глобальный план запроса

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) 

Результат

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

Глобальный план

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

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

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

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

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

Таблица 1 – Клиенты

Я бы название Адрес Возраст
1 Клиент 1 23 Олд Стрит 21
2 Клиент 2 12 New Street 23
3 Клиент 3 10 Экспресс Авеню 22
4 Клиент 4 15 Экспресс Авеню 22
5 Клиент 5 20 Garden Street 33
6 Клиент 6 21 Северная улица 25

Table2 – customer_order

Я бы Номер заказа Emp Id
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

Давайте теперь продолжим и выполним операции объединения SQL над двумя приведенными выше таблицами.

Внутреннее соединение

Внутреннее объединение выбирает все строки из обеих таблиц, когда есть совпадение между столбцами в обеих таблицах.

Синтаксис

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

запрос

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

Результат

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

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

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

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

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

запрос

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

Результат

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

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

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

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

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

запрос

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

Результат

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

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

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

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

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

запрос

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

Результат

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

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

Запрос возвращает все совпадающие и несовпадающие строки из таблиц customer и customer_order.

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

Это возвращает декартово произведение наборов записей из двух или более объединенных таблиц.

Синтаксис

SELECT *  FROM table1  CROSS JOIN table2;

запрос

select orderid,name,address from customers,customer_order;

Результат

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

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

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

Natural Join

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

Синтаксис

SELECT * FROM table1 NATURAL JOIN table2;

запрос

select * from customers natural join customer_order; 

Результат

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

Natural Join

Здесь существует один общий идентификатор столбца, который существует между двумя таблицами. Используя этот общий столбец, Natural Join объединяет обе таблицы.

Самостоятельное присоединение

SQL SELF JOIN используется для соединения таблицы с самим собой, как если бы эта таблица была двумя таблицами, временно переименовывая хотя бы одну таблицу в операторе SQL.

Синтаксис

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

запрос

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

Результат

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

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

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