Основы языка запросов sql
Содержание:
- Anvisoft PC PLUS
- SQL запрос Union (объединение)
- SQL Учебник
- Пример — два условия в операторе WHERE (условие OR)
- Режим ведения журналаLogging Behavior
- Как написать электронное письмо (email) на английском
- Пример выборки всех полей из одной таблицы
- Правовая информация
- SQL Учебник
- Что такое язык SQL и оператор SELECT
- Select and Filter Data With MySQLi
- Сеть видеокамер в Стамбуле распознаёт 15 000 лиц в секунду
- См. также:See Also
- Ключевые слова SQL SOME | ANY и ALL
- SELECT – оператор выборки данных
- Логический порядок обработки инструкции SELECTLogical Processing Order of the SELECT statement
- Практическое упражнение №3
- Раздел WHERE
- Соединения (джойны)
- 5. Агрегирование
- 6. Подзапросы
Anvisoft PC PLUS
Anvisoft — универсальный и бесплатный вариант, с помощью которого можно исправить различные неполадки.
Anvisoft PC PLUS умеет:
- Устранять проблемы с графическими файлами на рабочем столе, связанные с перемещением, копированием, выделением цвета;
- Исправлять ошибки системы, например, когда отсутствует динамически подключаемая библиотека;
- Исправлять ошибки сетевых подключений;
- Чистить временные файлы;
- Устранять ошибки в играх;
- Выявлять ошибки ОС и предупреждать о них;
- Поддерживать пользователей 24 часа в сутки (правда, менеджеры говорят на английском языке).
Скачать Anvisoft PC PLUS (бесплатно) можно на странице официального сайта разработчика.
SQL запрос Union (объединение)
Над множеством можно выполнять операции объединения, разности и декартова произведения. Те же операции можно использовать и в sql запросах (выполнять операции с запросами).
Использование оператора требует выполнения нескольких условий:
- количество выходных столбцов каждого из запросов должно быть одинаковым;
- выходные столбцы каждого из запросов должны быть сравнимы между собой по типам данных (в порядке их очередности);
- в итоговом наборе используются имена столбцов, заданные в первом запросе;
- может быть использовано только в конце составного запроса, так как оно применяетя к результату объединения.
Пример: Вывести цены на компьютеры и ноутбуки, а также их номера (т.е. произвести выгрузку из двух разных таблиц в одном запросе)
Решение:
1 2 3 4 5 6 |
SELECT `Номер` , `Цена` FROM pc UNION SELECT `Номер` , `Цена` FROM notebook ORDER BY `Цена` |
Результат:
Рассмотрим более сложный пример с объединением inner join:
Пример: Найти тип продукции, номер и цену компьютеров и ноутбуков
Решение:
1 2 3 4 5 6 7 8 |
SELECT product.`Тип` , pc.`Номер` , `Цена` FROM pc INNER JOIN product ON pc.`Номер` = product.`Номер` UNION SELECT product.`Тип` , notebook.`Номер` , `Цена` FROM notebook INNER JOIN product ON notebook.`Номер` = product.`Номер` ORDER BY `Цена` |
Результат:
SQL Union 1. Найти производителя, номер и цену всех ноутбуков и принтеров
SQL Union 2. Найти номера и цены всех продуктов, выпущенных производителем Россия
SQL Учебник
SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии
Пример — два условия в операторе WHERE (условие OR)
Вы можете использовать условие OR в операторе WHERE, чтобы протестировать несколько условий, при которых возвращается запись, если выполняется любое из условий. В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Теперь введите следующий SQL оператор.
PgSQL
SELECT *
FROM products
WHERE product_name = ‘Pear’
OR product_name = ‘Apple’;
1 2 3 4 |
SELECT* FROMproducts WHEREproduct_name=’Pear’ ORproduct_name=’Apple’; |
Будет выбрано записи. Вот результаты, которые вы должны получить.
Режим ведения журналаLogging Behavior
Объем информации, записываемой в журнал для операции , зависит от модели восстановления, действующей для базы данных.The amount of logging for depends on the recovery model in effect for the database. В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются.Under the simple recovery model or bulk-logged recovery model, bulk operations are minimally logged. При минимальном ведении журнала использование инструкции может оказаться более эффективным, чем создание таблицы и заполнение ее инструкцией INSERT.With minimal logging, using the statement can be more efficient than creating a table and then populating the table with an INSERT statement. Дополнительные сведения см. в статье Журнал транзакций (SQL Server).For more information, see The Transaction Log (SQL Server).
Инструкции , содержащие определяемые пользователем функции (UDF), являются полностью протоколируемыми операциями. statements that contain user-defined functions (UDFs) are fully logged operations. Если определяемые пользователем функции, используемые в инструкции , не выполняют никакие операции доступа к данным, для таких функций можно указать предложение SCHEMABINDING, которое будет устанавливать для производного свойства UserDataAccess значение 0.If the user-defined functions that are used in the statement don’t perform any data access operations, you can specify the SCHEMABINDING clause for the user-defined functions, which will set the derived UserDataAccess property for those user-defined functions to 0. После этого изменения инструкции будут протоколироваться на минимальном уровне.After this change, statements will be minimally logged. Если инструкция ссылается хотя бы на одну определяемую пользователем функцию, для которой это свойство имеет значение 1, операция полностью протоколируется.If the statement still references at least one user-defined function that has this property set to 1, the operation is fully logged.
Как написать электронное письмо (email) на английском
Пример выборки всех полей из одной таблицы
Правовая информация
SQL Учебник
SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии
Что такое язык SQL и оператор SELECT
SQL – это язык запросов, который служит для манипуляции (управления) данными в реляционных базах данных. Имеет широкую популярность и поэтому любой уважающий себя IT-к должен знать основы этого языка, так как базы данных есть практически в каждой компании.
SELECT – оператор языка SQL, относится к группе операторов манипуляции данными (Data Manipulation Language, DML) и служит для выборки данных из базы данных.
Примечание! Для того чтобы изучать язык SQL и базы данных существуют специальные бесплатные редакции крупных СУБД, например в SQL Server от компании Microsoft есть редакция Express. Как установить данную СУБД можете почитать в материале — Описание установки Microsoft SQL Server 2016 Express.
Вот самый простой пример использования оператора SELECT.
SELECT * FROM Table
где,
- * — показать все данные;
- FROM — из источника;
- Table — название источника (в нашем случае таблица).
Но, на практике, зачастую нам нужны не все данные из таблицы, а иногда только некоторые колонки, для этого просто указываем вместо * название нужной колонки (или колонок), например:
SELECT Price FROM Table
где, Price и есть название колонки.
Примечание! В качестве примера мы используем простую таблицу с перечислением моделей компьютеров, их ценой и названием.
Если Вам нужно указать несколько колонок, то просто перечисляйте их через запятую после оператора SELECT, например
SELECT price, name, model FROM Table
где, price, name, model это колонки из таблицы Table.
Select and Filter Data With MySQLi
The following example selects the id, firstname and lastname columns from the MyGuests
table where the lastname is «Doe», and displays it on the page:
Example (MySQLi Object-oriented)
<?php$servername = «localhost»;$username = «username»;$password = «password»;$dbname = «myDB»;// Create connection$conn = new mysqli($servername, $username, $password, $dbname);// Check connectionif ($conn->connect_error) { die(«Connection failed: » . $conn->connect_error);
} $sql = «SELECT id, firstname, lastname FROM MyGuests WHERE
lastname=’Doe'»;$result = $conn->query($sql);if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo «id: » . $row. » — Name: » . $row. » » . $row. «<br>»;
}} else { echo «0 results»;}
$conn->close();
?>
Code lines to explain from the example above:
First, we set up the SQL query that selects the id, firstname and lastname columns from the MyGuests
table where the lastname is «Doe». The next line of code runs the query and puts the resulting data into a
variable called $result.
Then, the checks if there are more than zero
rows returned.
If there are more than zero rows returned, the
function puts all the results into an associative array that we can loop
through. The loop loops through the result set and outputs the data from
the id, firstname and lastname columns.
The following example shows the same as the example above, in the MySQLi procedural way:
Example (MySQLi Procedural)
<?php$servername = «localhost»;$username = «username»;$password = «password»;$dbname = «myDB»;// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die(«Connection failed: » . mysqli_connect_error());}$sql = «SELECT id, firstname, lastname FROM MyGuests
WHERE lastname=’Doe'»;$result = mysqli_query($conn, $sql);if (mysqli_num_rows($result) > 0) { // output data of each row
while($row = mysqli_fetch_assoc($result)) { echo «id: » . $row. » — Name: » . $row. » » . $row. «<br>»;
}} else { echo «0 results»;}mysqli_close($conn);
?>
You can also put the result in an HTML table:
Example (MySQLi Object-oriented)
<?php$servername = «localhost»;$username = «username»;$password = «password»;$dbname = «myDB»;// Create connection$conn = new mysqli($servername, $username, $password, $dbname);// Check connectionif ($conn->connect_error) { die(«Connection failed: » . $conn->connect_error);
} $sql = «SELECT id, firstname, lastname FROM MyGuests WHERE
lastname=’Doe'»;$result = $conn->query($sql);if ($result->num_rows > 0) { echo «<table><tr><th>ID</th><th>Name</th></tr>»;
// output data of each row while($row = $result->fetch_assoc()) { echo «<tr><td>».$row.»</td><td>».$row.» «.$row.»</td></tr>»;
} echo «</table>»;} else { echo «0 results»;}
$conn->close();
?>
Сеть видеокамер в Стамбуле распознаёт 15 000 лиц в секунду
См. также:See Also
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL) CREATE VIEW (Transact-SQL) CREATE VIEW (Transact-SQL) DELETE (Transact-SQL) DELETE (Transact-SQL) EXECUTE (Transact-SQL) EXECUTE (Transact-SQL) Выражения (Transact-SQL) Expressions (Transact-SQL) INSERT (Transact-SQL) INSERT (Transact-SQL) LIKE (Transact-SQL) LIKE (Transact-SQL) UNION (Transact-SQL) UNION (Transact-SQL) EXCEPT и INTERSECT (Transact-SQL) EXCEPT and INTERSECT (Transact-SQL) UPDATE (Transact-SQL) UPDATE (Transact-SQL) WHERE (Transact-SQL) WHERE (Transact-SQL) PathName (Transact-SQL) PathName (Transact-SQL) Предложение INTO (Transact-SQL)INTO Clause (Transact-SQL)
Ключевые слова SQL SOME | ANY и ALL
Пример: Найти поставщиков компьютеров, у которых номера отсутствуют в продаже (т.е. отсутствуют в таблице )
Решение:
Исходные данные таблиц:
Таблица product: | |
Таблица pc: |
Решение:
1 2 3 4 5 6 7 |
SELECT DISTINCT Производитель FROM product WHERE Тип = "Компьютер" AND NOT Номер = ANY( SELECT Номер FROM pc ) |
Результат:
В примере предикат вернет в том случае значение TRUE, когда Номер из основного запроса найдется в списке Номеров таблицы (возвращаемом подзапросом). Кроме того, используется . Результирующий набор будет состоять из одного столбца — Производитель. Чтобы один производитель не выводился несколько раз, введено служебное слово .
Теперь рассмотрим использование ключевого слова ALL:
Пример: Найти номера и цены ноутбуков, стоимость которых превышает стоимость любого компьютера
Решение:
1 2 3 4 5 6 7 |
SELECT DISTINCT Номер, Цена FROM notebook WHERE Цена > ALL ( SELECT цена FROM pc ) |
Результат:
Важно: Стоит заметить, что в общем случае запрос с возвращает множество значений. Поэтому использование подзапроса в предложении без операторов , , и , которые дают булево значение (логическое), может привести к ошибке времени выполнения запроса
Пример: Найти номера и цены компьютеров, стоимость которых превышает минимальную стоимость ноутбуков. Решение:
Решение:
1 2 3 4 5 |
SELECT DISTINCT `Номер` , `Цена` FROM `pc` WHERE `Цена` > ( SELECT MIN(`Цена`) FROM notebook) |
Этот запрос корректен по той причине, что скалярное выражение сравнивается с подзапросом, который возвращает единственное значение
SELECT – оператор выборки данных
ID | Name | Birthday | PositionID | DepartmentID | HireDate | ManagerID | |
---|---|---|---|---|---|---|---|
1000 | Иванов И.И. | 1955-02-19 | i.ivanov@test.tt | 2 | 1 | 2015-04-08 | NULL |
1001 | Петров П.П. | 1983-12-03 | p.petrov@test.tt | 3 | 3 | 2015-04-08 | 1003 |
1002 | Сидоров С.С. | 1976-06-07 | s.sidorov@test.tt | 1 | 2 | 2015-04-08 | 1000 |
1003 | Андреев А.А. | 1982-04-17 | a.andreev@test.tt | 4 | 3 | 2015-04-08 | 1000 |
(No column name) | (No column name) | (No column name) |
---|---|---|
825 | 2015-04-11 12:12:36.0406743 | 1 |
- Целое / Целое = Целое (т.е. в данном случае происходит целочисленное деление)
- Вещественное / Целое = Вещественное
- Целое / Вещественное = Вещественное
ID | (No column name) | (No column name) | (No column name) | (No column name) |
---|---|---|---|---|
1000 | 10 | 10 | 10 | 10.000000 |
1001 | 10 | 10.01 | 10.01 | 10.010000 |
1002 | 10 | 10.02 | 10.02 | 10.020000 |
1003 | 10 | 10.03 | 10.03 | 10.030000 |
ID | Name |
---|---|
1003 | Андреев А.А. |
1000 | Иванов И.И. |
1001 | Петров П.П. |
1002 | Сидоров С.С. |
Логический порядок обработки инструкции SELECTLogical Processing Order of the SELECT statement
Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. Например, если обработчик запросов можно привязать (для доступа) к таблицам или представлениям, определенным в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов.For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производных столбцов, определенные в этом предложении, не могут быть объектом для ссылки предыдущих предложений.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Вместе с тем к ним могут обращаться последующие предложения, например предложение ORDER BY.However, they can be referenced by subsequent clauses such as the ORDER BY clause. Фактическое физическое выполнение инструкции определяется обработчиком запросов и порядок из этого списка может значительно отличаться.The actual physical execution of the statement is determined by the query processor and the order may vary from this list.
- FROMFROM
- ONON
- JOINJOIN
- WHEREWHERE
- GROUP BYGROUP BY
- WITH CUBE или WITH ROLLUPWITH CUBE or WITH ROLLUP
- HAVINGHAVING
- SELECTSELECT
- DISTINCTDISTINCT
- ORDER BYORDER BY
- В началоTOP
Предупреждение
Как правило, применяется предыдущая последовательность.The preceding sequence is usually true. Однако в редких случаях может быть указана другая последовательность.However, there are uncommon cases where the sequence may differ.
Например, предположим, что в представлении есть кластеризованный индекс и представление исключает некоторые строки таблицы, а для списка столбцов SELECT представления используется инструкция CONVERT, которая изменяет тип данных с varchar на integer .For example, suppose you have a clustered index on a view, and the view excludes some table rows, and the view’s SELECT column list uses a CONVERT that changes a data type from varchar to integer . В этом случае CONVERT может выполняться до выполнения предложения WHERE.In this situation, the CONVERT may execute before the WHERE clause executes. Это нестандартное поведение.Uncommon indeed. Если это имеет значение в вашем случае, можно изменить представление, чтобы исключить использование другой последовательности.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.
Практическое упражнение №3
На основании таблиц suppliers и orders ниже, выберите поля supplier_id и supplier_name из таблицы suppliers, и выберите поле order_date из таблицы orders, где значение поля supplier_id в таблице suppliers соответствует значению поля supplier_id в таблице orders. Сортировать результаты по supplier_id в порядке убывания.
Oracle PL/SQL
—создаем таблицу suppliers
CREATE TABLE suppliers
( supplier_id int NOT NULL,
supplier_name char(50) NOT NULL,
city char(50),
state char(25),
CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);
—вставляем записи в таблицу suppliers
insert into suppliers values (1,’Mari’,’Houston’,’Texas’);
insert into suppliers values (2,’Frida’,’ Melbourne’, ‘Florida’);
insert into suppliers values (3,’Madlen’,’Phoenix’,’Arizona’);
insert into suppliers values (4,’Valentina’,’San Diego’,’California’);
insert into suppliers values (5,’Amba’,’Jacksonville’,’Florida’);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
—создаем таблицу suppliers CREATETABLEsuppliers supplier_namechar(50)NOTNULL, citychar(50), statechar(25), CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id) insertintosuppliersvalues(1,’Mari’,’Houston’,’Texas’); insertintosuppliersvalues(2,’Frida’,’ Melbourne’,’Florida’); insertintosuppliersvalues(3,’Madlen’,’Phoenix’,’Arizona’); insertintosuppliersvalues(4,’Valentina’,’San Diego’,’California’); insertintosuppliersvalues(5,’Amba’,’Jacksonville’,’Florida’); |
Содержимое таблицы suppliers:
supplier_id | supplier_name | city | state |
---|---|---|---|
1 | Mari | Houston | Texas |
2 | Frida | Philadelphia | Pennsylvania |
3 | Madlen | Phoenix | Arizona |
4 | Valentina | SanDiego | California |
5 | Amba | Jacksonville | Florida |
Oracle PL/SQL
—создаем таблицу orders
CREATE TABLE orders
( order_id int NOT NULL,
supplier_id int NOT NULL,
order_date date NOT NULL,
quantity int,
CONSTRAINT orders_pk PRIMARY KEY (order_id)
);
—вставляем записи в таблицу orders
insert into orders values (1,1,’05.05.2014′,100);
insert into orders values (2,3,’12.02.2015′,300);
insert into orders values (3,5,’12.01.2016′,500);
1 2 3 4 5 6 7 8 9 10 11 12 |
—создаем таблицу orders CREATETABLEorders supplier_idintNOTNULL, order_datedateNOTNULL, quantityint, CONSTRAINTorders_pkPRIMARYKEY(order_id) insertintoordersvalues(1,1,’05.05.2014′,100); insertintoordersvalues(2,3,’12.02.2015′,300); insertintoordersvalues(3,5,’12.01.2016′,500); |
Содержимое таблицы orders:
order_id | supplier_id | order_date | quantity |
---|---|---|---|
1 | 1 | 05.05.2014 | 100 |
2 | 3 | 12.02.2015 | 300 |
3 | 5 | 12.01.2016 | 500 |
Раздел WHERE
Если в табличном выражении присутствует раздел WHERE, то следующим вычисляется он.
Условие, следующее за ключевым словом WHERE, может включать предикат условия поиска, булевские операторы AND (и), OR (или) и NOT(нет) и скобки, указывающие требуемый порядок вычислений.
Вычисление раздела WHERE производится по следующим правилам: Пусть R — результат вычисления раздела FROM. Тогда условие поиска применяется ко всем строкам R, и результатом раздела WHERE является таблица SQL, состоящая из тех строк R, для которого результатом вычисления условия поиска является true. Если условие выборки включает подзапросы, то каждый подзапрос вычисляется для каждого кортежа таблицы R (в стандарте используется термин “effectively” в том смысле, что результат должен быть таким, как если бы каждый подзапрос действительно вычислялся заново для каждого кортежа R).
Среди предикатов условия поиска в соответствии со стандартом могут находиться следующие предикаты: предикат сравнения, предикат between, предикат in, предикат like, предикат null, предикат с квантором и предикат exists.
При проверке условия выборки числа сравниваются алгебраически: отрицательные числа считаются меньше, чем положительные, независимо от их абсолютной величины. Строки сравниваются в соответствии с их представлением в коде ANSI. При сравнении двух строк, имеющих разные длины, предварительно более короткая строка дополняется справа пробелами для того, чтобы обе строки имели одинаковую длину.
Предикат сравнения с выражениями или результатами подзапроса. Условие определяется из двух выражений, разделенных одним из знаков операции отношения: =, <>(не равно), >, >=, < и <=.
Арифметические выражения левой и правой частей предиката сравнения строятся по общим правилам построения арифметических выражений и могут включать в общем случае имена столбцов таблиц из раздела FROM и константы. Типы данных арифметических выражений должны быть сравнимыми (например, если тип столбца a таблицы A является типом символьных строк, то предикат “a = 5” недопустим).
Если правый операнд операции сравнения задается подзапросом, то дополнительным ограничением является то, что мощность результата подзапроса должна быть не более единицы. Если хотя бы один из операндов операции сравнения имеет неопределенное значение, или если правый операнд является подзапросом с пустым результатом, то значение предиката сравнения равно unknown.
Для обеспечения переносимости прикладных программ нужно внимательно оценивать специфику работы с неопределенными значениями в конкретной СУБД.
Примеры выборки SELECT с разделом WHERE
Выборка кода и фамилии покупателей, проживающих в Москве.
Выборка из таблицы emp данных по служащим отдела с номером 40:
Извлечение из таблицы записи с полями имя, должность, размер оклада и номер отдела для всех служащих за исключением продавцов из отдела с номером 30:
Соединения (джойны)
Теперь мы хотим увидеть названия (не обязательно уникальные) всех книг Дэна Брауна, которые были взяты из библиотеки, и когда эти книги нужно вернуть:
Результат:
Title | Return Date |
---|---|
The Lost Symbol | 2016-03-23 00:00:00 |
Inferno | 2016-04-13 00:00:00 |
The Lost Symbol | 2016-04-19 00:00:00 |
По большей части запрос похож на предыдущий за исключением секции . Это означает, что мы запрашиваем данные из другой таблицы. Мы не обращаемся ни к таблице “books”, ни к таблице “borrowings”. Вместо этого мы обращаемся к новой таблице, которая создалась соединением этих двух таблиц.
— это, считай, новая таблица, которая была сформирована комбинированием всех записей из таблиц «books» и «borrowings», в которых значения совпадают. Результатом такого слияния будет:
А потом мы делаем запрос к этой таблице так же, как в примере выше. Это значит, что при соединении таблиц нужно заботиться только о том, как провести это соединение. А потом запрос становится таким же понятным, как в случае с «простым запросом» из пункта 3.
Давайте попробуем чуть более сложное соединение с двумя таблицами.
Теперь мы хотим получить имена и фамилии людей, которые взяли из библиотеки книги автора “Dan Brown”.
На этот раз давайте пойдем снизу вверх:
Шаг Step 1 — откуда берем данные? Чтобы получить нужный нам результат, нужно соединить таблицы “member” и “books” с таблицей “borrowings”. Секция JOIN будет выглядеть так:
Шаг 2 — какие данные показываем? Нас интересуют только те данные, где автор книги — “Dan Brown”
Шаг 3 — как показываем данные? Теперь, когда данные получены, нужно просто вывести имя и фамилию тех, кто взял книги:
Супер! Осталось лишь объединить три составные части и сделать нужный нам запрос:
Что даст нам:
First Name | Last Name |
---|---|
Mike | Willis |
Ellen | Horton |
Ellen | Horton |
Отлично! Но имена повторяются (они не уникальны). Мы скоро это исправим.
5. Агрегирование
Грубо говоря, агрегирования нужны для конвертации нескольких строк в одну. При этом, во время агрегирования для разных колонок используется разная логика.
Давайте продолжим наш пример, в котором появляются повторяющиеся имена. Видно, что Ellen Horton взяла больше одной книги, но это не самый лучший способ показать эту информацию. Можно сделать другой запрос:
Что даст нам нужный результат:
First Name | Last Name | Number of books borrowed |
---|---|---|
Mike | Willis | 1 |
Ellen | Horton | 2 |
Почти все агрегации идут вместе с выражением . Эта штука превращает таблицу, которую можно было бы получить запросом, в группы таблиц. Каждая группа соответствует уникальному значению (или группе значений) колонки, которую мы указали в . В нашем примере мы конвертируем результат из прошлого упражнения в группу строк. Мы также проводим агрегирование с , которая конвертирует несколько строк в целое значение (в нашем случае это количество строк). Потом это значение приписывается каждой группе.
Каждая строка в результате представляет собой результат агрегирования каждой группы.
Можно прийти к логическому выводу, что все поля в результате должны быть или указаны в , или по ним должно производиться агрегирование. Потому что все другие поля могут отличаться друг от друга в разных строках, и если выбирать их ‘ом, то непонятно, какие из возможных значений нужно брать.
В примере выше функция обрабатывала все строки (так как мы считали количество строк). Другие функции вроде или обрабатывают только указанные строки. Например, если мы хотим узнать количество книг, написанных каждым автором, то нужен такой запрос:
Результат:
author | sum |
---|---|
Robin Sharma | 4 |
Dan Brown | 6 |
John Green | 3 |
Amish Tripathi | 2 |
Здесь функция обрабатывает только колонку и считает сумму всех значений в каждой группе.
6. Подзапросы
Подзапросы это обычные SQL-запросы, встроенные в более крупные запросы. Они делятся на три вида по типу возвращаемого результата.