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
Запрос присоединяет к себе таблицу клиентов.