В этой главе рассказывается о следующих важных запросах.
- Предикаты
- объяснять
- Присоединиться
Давайте продолжим и выполним запросы.
Предикаты
Предикат — это выражение, которое используется для оценки значений 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 объединяет обе таблицы.
Самостоятельное присоединение
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
Запрос присоединяет таблицу клиентов к себе.