|
@@ -6,57 +6,49 @@
|
|
|
<a href="../articles/sql_import.md">Создание базы данных. Импорт данных.
|
|
<a href="../articles/sql_import.md">Создание базы данных. Импорт данных.
|
|
|
</a></td><tr></table>
|
|
</a></td><tr></table>
|
|
|
|
|
|
|
|
-# Основы SQL
|
|
|
|
|
|
|
+# Основы SQL (синтаксис MySQL)
|
|
|
|
|
|
|
|
<!-- добавтить count и функции работы со временем (between) -->
|
|
<!-- добавтить count и функции работы со временем (between) -->
|
|
|
|
|
|
|
|
**Structured Query Language (SQL)** — язык структурированных запросов, с помощью него пишутся специальные запросы (SQL инструкции) к базе данных с целью получения этих данных из базы и для манипулирования этими данными.
|
|
**Structured Query Language (SQL)** — язык структурированных запросов, с помощью него пишутся специальные запросы (SQL инструкции) к базе данных с целью получения этих данных из базы и для манипулирования этими данными.
|
|
|
|
|
|
|
|
-С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются **DDL**, **DML**, **DCL** и **TCL**.
|
|
|
|
|
|
|
+С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются **DDL**, **DML**, **DCL** и **TCL**:
|
|
|
|
|
|
|
|
-## DDL – Data Definition Language
|
|
|
|
|
|
|
+* **Data Definition Language (DDL)** – это группа операторов **определения** данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их.
|
|
|
|
|
|
|
|
-**Data Definition Language (DDL)** – это группа операторов **определения** данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их.
|
|
|
|
|
|
|
+ В эту группу входят следующие операторы:
|
|
|
|
|
|
|
|
-В эту группу входят следующие операторы:
|
|
|
|
|
|
|
+ * **CREATE** – используется для создания объектов базы данных;
|
|
|
|
|
+ * **ALTER** – используется для изменения объектов базы данных;
|
|
|
|
|
+ * **DROP** – используется для удаления объектов базы данных.
|
|
|
|
|
|
|
|
-* **CREATE** – используется для создания объектов базы данных;
|
|
|
|
|
-* **ALTER** – используется для изменения объектов базы данных;
|
|
|
|
|
-* **DROP** – используется для удаления объектов базы данных.
|
|
|
|
|
|
|
+* **Data Manipulation Language (DML)** – это группа операторов для манипуляции данными. С помощью этих операторов мы можем добавлять, изменять, удалять и выгружать данные из базы, т.е. манипулировать ими.
|
|
|
|
|
|
|
|
-## DML – Data Manipulation Language
|
|
|
|
|
|
|
+ В эту группу входят самые распространённые операторы языка SQL:
|
|
|
|
|
|
|
|
-**Data Manipulation Language (DML)** – это группа операторов для манипуляции данными. С помощью этих операторов мы можем добавлять, изменять, удалять и выгружать данные из базы, т.е. манипулировать ими.
|
|
|
|
|
|
|
+ * **SELECT** – осуществляет выборку данных;
|
|
|
|
|
+ * **INSERT** – добавляет новые данные;
|
|
|
|
|
+ * **UPDATE** – изменяет существующие данные;
|
|
|
|
|
+ * **DELETE** – удаляет данные.
|
|
|
|
|
|
|
|
-В эту группу входят самые распространённые операторы языка SQL:
|
|
|
|
|
|
|
+* **Data Control Language (DCL)** – группа операторов определения доступа к данным. Иными словами, это операторы для управления разрешениями, с помощью них мы можем разрешать или запрещать выполнение определенных операций над объектами базы данных.
|
|
|
|
|
|
|
|
-* **SELECT** – осуществляет выборку данных;
|
|
|
|
|
-* **INSERT** – добавляет новые данные;
|
|
|
|
|
-* **UPDATE** – изменяет существующие данные;
|
|
|
|
|
-* **DELETE** – удаляет данные.
|
|
|
|
|
-
|
|
|
|
|
-## DCL – Data Control Language
|
|
|
|
|
-
|
|
|
|
|
-**Data Control Language (DCL)** – группа операторов определения доступа к данным. Иными словами, это операторы для управления разрешениями, с помощью них мы можем разрешать или запрещать выполнение определенных операций над объектами базы данных.
|
|
|
|
|
-
|
|
|
|
|
-## TCL – Transaction Control Language
|
|
|
|
|
-
|
|
|
|
|
-**Transaction Control Language (TCL)** – группа операторов для управления транзакциями. Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены.
|
|
|
|
|
|
|
+* **Transaction Control Language (TCL)** – группа операторов для управления транзакциями. Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены.
|
|
|
|
|
|
|
|
## Базовый синтаксис SQL команды SELECT
|
|
## Базовый синтаксис SQL команды SELECT
|
|
|
|
|
|
|
|
Одна из основных функций SQL — получение данных из СУБД. Для построения всевозможных запросов к базе данных используется оператор **SELECT**. Он позволяет выполнять сложные проверки и обработку данных.
|
|
Одна из основных функций SQL — получение данных из СУБД. Для построения всевозможных запросов к базе данных используется оператор **SELECT**. Он позволяет выполнять сложные проверки и обработку данных.
|
|
|
|
|
|
|
|
-Общая структура запроса
|
|
|
|
|
|
|
+Общая структура запроса:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT [DISTINCT | ALL] поля_таблиц
|
|
SELECT [DISTINCT | ALL] поля_таблиц
|
|
|
-[FROM список_таблиц]
|
|
|
|
|
-[WHERE условия_на_ограничения_строк]
|
|
|
|
|
-[GROUP BY условия_группировки]
|
|
|
|
|
-[HAVING условия_на_ограничения_строк_после_группировки]
|
|
|
|
|
-[ORDER BY порядок_сортировки [ASC | DESC]]
|
|
|
|
|
-[LIMIT ограничение_количества_записей]
|
|
|
|
|
|
|
+ [FROM список_таблиц]
|
|
|
|
|
+ [WHERE условия_на_ограничения_строк]
|
|
|
|
|
+ [GROUP BY условия_группировки]
|
|
|
|
|
+ [HAVING условия_на_ограничения_строк_после_группировки]
|
|
|
|
|
+ [ORDER BY порядок_сортировки [ASC | DESC]]
|
|
|
|
|
+ [LIMIT ограничение_количества_записей]
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
|
|
В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
|
|
@@ -78,27 +70,27 @@ SELECT [DISTINCT | ALL] поля_таблиц
|
|
|
|
|
|
|
|
Псевдонимы используются для представления столбцов или таблиц с именем отличным от оригинального. Это может быть полезно для улучшения читабельности имён и создания более короткого наименования столбца или таблицы.
|
|
Псевдонимы используются для представления столбцов или таблиц с именем отличным от оригинального. Это может быть полезно для улучшения читабельности имён и создания более короткого наименования столбца или таблицы.
|
|
|
|
|
|
|
|
-Например, если в вашей таблице есть столбец **good_type_id**, вы можете переименовать его просто в **id**, для того, чтобы сделать его более коротким и удобным в использовании в будущем.
|
|
|
|
|
|
|
+Например, если в вашей таблице есть столбец **goodTypeId**, вы можете переименовать его просто в **id**, для того, чтобы сделать его более коротким и удобным в использовании в будущем.
|
|
|
|
|
|
|
|
Для создания псевдонимов используется оператор AS:
|
|
Для создания псевдонимов используется оператор AS:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- good_type_id AS id
|
|
|
|
|
|
|
+ goodTypeId AS id
|
|
|
FROM
|
|
FROM
|
|
|
GoodTypes;
|
|
GoodTypes;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### Примеры использования
|
|
### Примеры использования
|
|
|
|
|
|
|
|
-Вы можете выводить любые строки и числа вместо столбцов:
|
|
|
|
|
|
|
+Вы можете выводить любые строки и числа (литералы) вместо столбцов:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
"Hello world", 1;
|
|
"Hello world", 1;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Для того, чтобы вывести **все данные** из таблицы Company, вы можете использовать символ «*», который буквально означает «все столбцы»:
|
|
|
|
|
|
|
+Для того, чтобы вывести **все данные** из таблицы **Company**, вы можете использовать символ «*», который буквально означает «все столбцы»:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
@@ -107,11 +99,11 @@ FROM
|
|
|
Company;
|
|
Company;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Вы можете вывести любой столбец, определённый в таблице, например, town_to из таблицы Trip:
|
|
|
|
|
|
|
+Вы можете вывести любой столбец, определённый в таблице, например, townTo из таблицы Trip:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- town_to
|
|
|
|
|
|
|
+ townTo
|
|
|
FROM
|
|
FROM
|
|
|
Trip;
|
|
Trip;
|
|
|
```
|
|
```
|
|
@@ -120,57 +112,62 @@ FROM
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- member_name, status
|
|
|
|
|
|
|
+ memberName, `status`
|
|
|
FROM
|
|
FROM
|
|
|
FamilyMembers;
|
|
FamilyMembers;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Иногда возникают ситуации, в которых нужно получить только уникальные записи. Для этого вы можете использовать DISTINCT. Например, выведем список городов без повторений, в которые летали самолеты:
|
|
|
|
|
|
|
+>Поле **status** подсвечивается как зарезервированное слово SQL - экранируем его обратными кавычками.
|
|
|
|
|
+
|
|
|
|
|
+### Distinct - выбор уникальных значений
|
|
|
|
|
+
|
|
|
|
|
+Иногда возникают ситуации, в которых нужно получить только уникальные записи. Для этого вы можете использовать **DISTINCT**. Например, выведем список городов без повторений, в которые летали самолеты:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- DISTINCT town_to
|
|
|
|
|
|
|
+ DISTINCT townTo
|
|
|
FROM
|
|
FROM
|
|
|
Trip;
|
|
Trip;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Эта конструкция используется для формирования словарей, примеры рассмотрим в главе про команду **INSERT**
|
|
Эта конструкция используется для формирования словарей, примеры рассмотрим в главе про команду **INSERT**
|
|
|
|
|
|
|
|
-## Условный оператор WHERE
|
|
|
|
|
|
|
+### Условный оператор WHERE
|
|
|
|
|
|
|
|
Ситуация, когда требуется сделать выборку по определенному условию, встречается очень часто. Для этого в операторе **SELECT** существует параметр **WHERE**, после которого следует условие для ограничения строк. Если запись удовлетворяет этому условию, то попадает в результат, иначе отбрасывается.
|
|
Ситуация, когда требуется сделать выборку по определенному условию, встречается очень часто. Для этого в операторе **SELECT** существует параметр **WHERE**, после которого следует условие для ограничения строк. Если запись удовлетворяет этому условию, то попадает в результат, иначе отбрасывается.
|
|
|
|
|
|
|
|
Общая структура запроса с оператором WHERE
|
|
Общая структура запроса с оператором WHERE
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-SELECT поля_таблиц FROM список_таблиц
|
|
|
|
|
-WHERE условия_на_ограничения_строк
|
|
|
|
|
-[логический_оператор другое_условия_на_ограничения_строк];
|
|
|
|
|
|
|
+SELECT поля_таблиц
|
|
|
|
|
+ FROM список_таблиц
|
|
|
|
|
+ WHERE условия_на_ограничения_строк
|
|
|
|
|
+ [логический_оператор другое_условия_на_ограничения_строк];
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
|
|
В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
|
|
|
|
|
|
|
|
В условном операторе применяются операторы сравнения, специальные и логические операторы.
|
|
В условном операторе применяются операторы сравнения, специальные и логические операторы.
|
|
|
|
|
|
|
|
-### Операторы сравнения
|
|
|
|
|
|
|
+#### Операторы сравнения
|
|
|
|
|
|
|
|
-Операторы сравнения служат для сравнения 2 выражений, их результатом может являться ИСТИНА (1), ЛОЖЬ (0) и NULL.
|
|
|
|
|
|
|
+Операторы сравнения служат для сравнения 2 выражений, их результатом может являться **ИСТИНА (1)**, **ЛОЖЬ (0)** и **NULL**.
|
|
|
|
|
|
|
|
>Результат сравнения с NULL является NULL. Исключением является оператор эквивалентности.
|
|
>Результат сравнения с NULL является NULL. Исключением является оператор эквивалентности.
|
|
|
|
|
|
|
|
Оператор | Описание
|
|
Оператор | Описание
|
|
|
:--:|---
|
|
:--:|---
|
|
|
-\= | Оператор равенство
|
|
|
|
|
-\<\=\> | Оператор эквивалентность<br/>Аналогичный оператору равенства, с одним лишь исключением: в отличие от него, оператор эквивалентности вернет ИСТИНУ при сравнении NULL <=> NULL
|
|
|
|
|
-\<\><br/>или<br/>!= | Оператор неравенство
|
|
|
|
|
-\< | Оператор меньше
|
|
|
|
|
-\<\= | Оператор меньше или равно
|
|
|
|
|
-\> | Оператор больше
|
|
|
|
|
-\>\= | Оператор больше или равно
|
|
|
|
|
|
|
+`=` | Оператор равенство
|
|
|
|
|
+`<=>` | Оператор эквивалентность<br/>Аналогичный оператору равенства, с одним лишь исключением: в отличие от него, оператор эквивалентности вернет ИСТИНУ при сравнении NULL `<=>` NULL
|
|
|
|
|
+`<>`<br/>или<br/>`!=` | Оператор неравенство
|
|
|
|
|
+`<` | Оператор меньше
|
|
|
|
|
+`<=` | Оператор меньше или равно
|
|
|
|
|
+`>` | Оператор больше
|
|
|
|
|
+`>=` | Оператор больше или равно
|
|
|
|
|
|
|
|
-### Специальные операторы
|
|
|
|
|
|
|
+#### Специальные операторы
|
|
|
|
|
|
|
|
-1. `IS [NOT] NULL` — позволяет узнать равно ли проверяемое значение NULL.
|
|
|
|
|
|
|
+1. `IS [NOT] NULL` — позволяет узнать равно (не равно) ли проверяемое значение NULL.
|
|
|
|
|
|
|
|
Для примера выведем всех членов семьи, у которых статус в семье не равен NULL:
|
|
Для примера выведем всех членов семьи, у которых статус в семье не равен NULL:
|
|
|
|
|
|
|
@@ -180,10 +177,10 @@ WHERE условия_на_ограничения_строк
|
|
|
FROM
|
|
FROM
|
|
|
FamilyMembers
|
|
FamilyMembers
|
|
|
WHERE
|
|
WHERE
|
|
|
- status IS NOT NULL;
|
|
|
|
|
|
|
+ `status` IS NOT NULL;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-2. `[NOT] BETWEEN min AND max` — позволяет узнать расположено ли проверяемое значение столбца в интервале между min и max.
|
|
|
|
|
|
|
+2. `[NOT] BETWEEN min AND max` — позволяет узнать расположено ли проверяемое значение столбца в интервале между **min** и **max**.
|
|
|
|
|
|
|
|
Выведем все данные о покупках с ценой от 100 до 500 рублей из таблицы Payments:
|
|
Выведем все данные о покупках с ценой от 100 до 500 рублей из таблицы Payments:
|
|
|
|
|
|
|
@@ -193,57 +190,57 @@ WHERE условия_на_ограничения_строк
|
|
|
FROM
|
|
FROM
|
|
|
Payments
|
|
Payments
|
|
|
WHERE
|
|
WHERE
|
|
|
- unit_price BETWEEN 100 AND 500;
|
|
|
|
|
|
|
+ unitPrice BETWEEN 100 AND 500;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-3. `[NOT] IN` — позволяет узнать входит ли проверяемое значение столбца в список определённых значений.
|
|
|
|
|
|
|
+3. `[NOT] IN` — позволяет узнать входит (не входит) ли проверяемое значение столбца в список определённых значений.
|
|
|
|
|
|
|
|
Выведем имена членов семьи, чей статус равен «father» или «mother»:
|
|
Выведем имена членов семьи, чей статус равен «father» или «mother»:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- member_name
|
|
|
|
|
|
|
+ memberName
|
|
|
FROM
|
|
FROM
|
|
|
FamilyMembers
|
|
FamilyMembers
|
|
|
WHERE
|
|
WHERE
|
|
|
- status IN ('father', 'mother');
|
|
|
|
|
|
|
+ `status` IN ('father', 'mother');
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-4. `[NOT] LIKE шаблон [ESCAPE символ]` — позволяет узнать соответствует ли строка определённому шаблону.
|
|
|
|
|
|
|
+4. `[NOT] LIKE шаблон [ESCAPE символ]` — позволяет узнать соответствует ли строка определённому шаблону. **ESCAPE символ** - это так называемый трафаретный символ, вместо которого может быть что один (`_`) или несколько (`%`) любых символов.
|
|
|
|
|
|
|
|
Например, выведем всех людей с фамилией «Quincey»:
|
|
Например, выведем всех людей с фамилией «Quincey»:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- member_name
|
|
|
|
|
|
|
+ memberName
|
|
|
FROM
|
|
FROM
|
|
|
FamilyMembers
|
|
FamilyMembers
|
|
|
WHERE
|
|
WHERE
|
|
|
- member_name LIKE '% Quincey';
|
|
|
|
|
|
|
+ memberName LIKE '% Quincey';
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### Трафаретные символы
|
|
|
|
|
|
|
+#### Трафаретные символы
|
|
|
|
|
|
|
|
В шаблоне разрешается использовать два трафаретных символа:
|
|
В шаблоне разрешается использовать два трафаретных символа:
|
|
|
|
|
|
|
|
-* символ подчеркивания (_), который можно применять вместо любого единичного символа в проверяемом значении
|
|
|
|
|
-* символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.
|
|
|
|
|
|
|
+* символ подчеркивания (`_`), который можно применять вместо любого единичного символа в проверяемом значении
|
|
|
|
|
+* символ процента (`%`) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.
|
|
|
|
|
|
|
|
Шаблон | Описание
|
|
Шаблон | Описание
|
|
|
:--:|--
|
|
:--:|--
|
|
|
-never% | Сопоставляется любым строкам, начинающимся на «never».
|
|
|
|
|
-%ing | Сопоставляется любым строкам, заканчивающимся на «ing».
|
|
|
|
|
-_ing | Сопоставляется строкам, имеющим длину 4 символа, при этом 3 последних обязательно должны быть «ing». Например, слова «sing» и «wing».
|
|
|
|
|
|
|
+never`%` | Сопоставляется любым строкам, начинающимся на «never».
|
|
|
|
|
+`%`ing | Сопоставляется любым строкам, заканчивающимся на «ing».
|
|
|
|
|
+`_`ing | Сопоставляется строкам, имеющим длину 4 символа, при этом 3 последних обязательно должны быть «ing». Например, слова «sing» и «wing».
|
|
|
|
|
|
|
|
-### ESCAPE-символ
|
|
|
|
|
|
|
+#### ESCAPE-символ
|
|
|
|
|
|
|
|
ESCAPE-символ используется для экранирования трафаретных символов. В случае если вам нужно найти строки, содержащие проценты (а процент — это зарезервированный символ), вы можете использовать ESCAPE-символ.
|
|
ESCAPE-символ используется для экранирования трафаретных символов. В случае если вам нужно найти строки, содержащие проценты (а процент — это зарезервированный символ), вы можете использовать ESCAPE-символ.
|
|
|
|
|
|
|
|
-Например, вы хотите получить идентификаторы задач, прогресс которых равен 3%:
|
|
|
|
|
|
|
+Например, вы хотите получить идентификаторы задач, прогресс которых равен `3%`:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
|
- job_id
|
|
|
|
|
|
|
+ jobId
|
|
|
FROM
|
|
FROM
|
|
|
Jobs
|
|
Jobs
|
|
|
WHERE
|
|
WHERE
|
|
@@ -253,7 +250,7 @@ ESCAPE '!';
|
|
|
|
|
|
|
|
Если бы мы не экранировали трафаретный символ, то в выборку попало бы всё, что начинается на 3.
|
|
Если бы мы не экранировали трафаретный символ, то в выборку попало бы всё, что начинается на 3.
|
|
|
|
|
|
|
|
-### Логические операторы
|
|
|
|
|
|
|
+#### Логические операторы
|
|
|
|
|
|
|
|
Логические операторы необходимы для связывания нескольких условий ограничения строк.
|
|
Логические операторы необходимы для связывания нескольких условий ограничения строк.
|
|
|
|
|
|
|
@@ -270,10 +267,10 @@ SELECT
|
|
|
FROM
|
|
FROM
|
|
|
Trip
|
|
Trip
|
|
|
WHERE
|
|
WHERE
|
|
|
- plane = 'Boeing' AND NOT town_from = 'London';
|
|
|
|
|
|
|
+ plane = 'Boeing' AND NOT townFrom = 'London';
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-## Выборка сводных данных (из двух и более таблиц)
|
|
|
|
|
|
|
+### Выборка сводных данных (из двух и более таблиц)
|
|
|
|
|
|
|
|
При формировании сводной выборки данные беруться из нескольких таблиц. В операторе **FROM** исходные таблицы перечисляются через запятую. Также им могут быть присвоены алиасы. Синтаксис запроса выглядит следующийм образом:
|
|
При формировании сводной выборки данные беруться из нескольких таблиц. В операторе **FROM** исходные таблицы перечисляются через запятую. Также им могут быть присвоены алиасы. Синтаксис запроса выглядит следующийм образом:
|
|
|
|
|
|
|
@@ -288,12 +285,12 @@ FROM
|
|
|
|
|
|
|
|
При выборке сводных таблиц нужно учитывать, что исходные таблицы перемножаются. Т.е. если на входе у нас были таблицы:
|
|
При выборке сводных таблиц нужно учитывать, что исходные таблицы перемножаются. Т.е. если на входе у нас были таблицы:
|
|
|
|
|
|
|
|
-id | Name
|
|
|
|
|
|
|
+id | name
|
|
|
:-:|--
|
|
:-:|--
|
|
|
1 | Иванов
|
|
1 | Иванов
|
|
|
2 | Петров
|
|
2 | Петров
|
|
|
|
|
|
|
|
-id | Name | Phone
|
|
|
|
|
|
|
+id | name | phone
|
|
|
:-:|------|-----
|
|
:-:|------|-----
|
|
|
1 | Иванов | 322223
|
|
1 | Иванов | 322223
|
|
|
2 | Петров | 111111
|
|
2 | Петров | 111111
|
|
@@ -308,31 +305,31 @@ FROM
|
|
|
|
|
|
|
|
Получим примерно следующее:
|
|
Получим примерно следующее:
|
|
|
|
|
|
|
|
-id | Name | id2 | Name2 | Phone
|
|
|
|
|
-:-:|------|:---:|-------|------
|
|
|
|
|
-1 | Иванов| 1 | Иванов | 322223
|
|
|
|
|
-1 | Иванов| 2 | Петров | 111111
|
|
|
|
|
-2 | Петров| 1 | Иванов | 322223
|
|
|
|
|
-2 | Петров| 2 | Петров | 111111
|
|
|
|
|
|
|
+id | name | id2 | name2 | phone
|
|
|
|
|
+:-:|-------|:---:|--------|------
|
|
|
|
|
+1 | Иванов| 1 | Иванов | 322223
|
|
|
|
|
+1 | Иванов| 2 | Петров | 111111
|
|
|
|
|
+2 | Петров| 1 | Иванов | 322223
|
|
|
|
|
+2 | Петров| 2 | Петров | 111111
|
|
|
|
|
|
|
|
Чтобы выбрать уникальные значения, нам нужно использовать оператор **WHERE** для связи этих таблиц
|
|
Чтобы выбрать уникальные значения, нам нужно использовать оператор **WHERE** для связи этих таблиц
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-SELECT a.*, b.Phone
|
|
|
|
|
|
|
+SELECT a.*, b.phone
|
|
|
FROM
|
|
FROM
|
|
|
Table1 a, Table2 b
|
|
Table1 a, Table2 b
|
|
|
WHERE
|
|
WHERE
|
|
|
- a.Name=b.Name
|
|
|
|
|
|
|
+ a.name=b.name
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-id | Name | Phone
|
|
|
|
|
-:-:|------|------
|
|
|
|
|
|
|
+id | name | phone
|
|
|
|
|
+:-:|-------|------
|
|
|
1 | Иванов| 322223
|
|
1 | Иванов| 322223
|
|
|
2 | Петров| 111111
|
|
2 | Петров| 111111
|
|
|
|
|
|
|
|
-Сводные выборки нужны при импорте данных в базу. Сначала вы выделяете из таблиц импорта словари. А потом из таблиц импорта и словарей формируете запрос `INSERT ... SELECT` для записи данных в основную таблицу.
|
|
|
|
|
|
|
+>Сводные выборки нам понадобятся при импорте данных в базу. Сначала вы выделяете из таблиц импорта словари. А потом из таблиц импорта и словарей формируете запрос `INSERT ... SELECT` для записи данных в основную таблицу.
|
|
|
|
|
|
|
|
-## Вложенные SQL запросы
|
|
|
|
|
|
|
+### Вложенные SQL запросы
|
|
|
|
|
|
|
|
Вложенный запрос — это запрос на выборку, который используется внутри инструкции SELECT, INSERT, UPDATE или DELETE или внутри другого вложенного запроса. Подзапрос может быть использован везде, где разрешены выражения.
|
|
Вложенный запрос — это запрос на выборку, который используется внутри инструкции SELECT, INSERT, UPDATE или DELETE или внутри другого вложенного запроса. Подзапрос может быть использован везде, где разрешены выражения.
|
|
|
|
|
|
|
@@ -340,10 +337,10 @@ id | Name | Phone
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT поля_таблиц
|
|
SELECT поля_таблиц
|
|
|
-FROM список_таблиц
|
|
|
|
|
-WHERE конкретное_поле IN (
|
|
|
|
|
- SELECT поле_таблицы FROM таблица
|
|
|
|
|
-)
|
|
|
|
|
|
|
+ FROM список_таблиц
|
|
|
|
|
+ WHERE конкретное_поле IN (
|
|
|
|
|
+ SELECT поле_таблицы FROM таблица
|
|
|
|
|
+ )
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Здесь, `SELECT поля_таблиц FROM список_таблиц WHERE конкретное_поле IN (...)` — внешний запрос, а `SELECT поле_таблицы FROM таблица` — вложенный (внутренний) запрос.
|
|
Здесь, `SELECT поля_таблиц FROM список_таблиц WHERE конкретное_поле IN (...)` — внешний запрос, а `SELECT поле_таблицы FROM таблица` — вложенный (внутренний) запрос.
|
|
@@ -354,7 +351,7 @@ WHERE конкретное_поле IN (
|
|
|
|
|
|
|
|
Подзапрос может возвращать скаляр (одно значение), одну строку, один столбец или таблицу (одну или несколько строк из одного или нескольких столбцов). Они называются скалярными, столбцовыми, строковыми и табличными подзапросами.
|
|
Подзапрос может возвращать скаляр (одно значение), одну строку, один столбец или таблицу (одну или несколько строк из одного или нескольких столбцов). Они называются скалярными, столбцовыми, строковыми и табличными подзапросами.
|
|
|
|
|
|
|
|
-### Подзапрос как скалярный операнд
|
|
|
|
|
|
|
+#### Подзапрос как скалярный операнд
|
|
|
|
|
|
|
|
Скалярный подзапрос — запрос, возвращающий единственное скалярное значение (строку, число и т.д.).
|
|
Скалярный подзапрос — запрос, возвращающий единственное скалярное значение (строку, число и т.д.).
|
|
|
|
|
|
|
@@ -378,35 +375,35 @@ SELECT
|
|
|
FROM
|
|
FROM
|
|
|
FamilyMembers
|
|
FamilyMembers
|
|
|
WHERE
|
|
WHERE
|
|
|
- birthday = (
|
|
|
|
|
|
|
+ birthDay = (
|
|
|
SELECT
|
|
SELECT
|
|
|
- MAX(birthday)
|
|
|
|
|
|
|
+ MAX(birthDay)
|
|
|
FROM
|
|
FROM
|
|
|
FamilyMembers
|
|
FamilyMembers
|
|
|
);
|
|
);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-С помощью данного запроса возможно получить самого младшего члена семьи. Здесь используется подзапрос для получения максимальной даты рождения, которая затем используется для фильтрации строк.
|
|
|
|
|
|
|
+С помощью данного запроса возможно получить самого старшего члена семьи. Здесь используется подзапрос для получения максимальной даты рождения, которая затем используется для фильтрации строк.
|
|
|
|
|
|
|
|
-### Подзапросы с ANY, IN, ALL
|
|
|
|
|
|
|
+#### Подзапросы с ANY, IN, ALL
|
|
|
|
|
|
|
|
-ANY — ключевое слово, которое должно следовать за операцией сравнения (>, <, <>, = и т.д.), возвращающее TRUE, если хотя бы одно из значений столбца подзапроса удовлетворяет обозначенному условию.
|
|
|
|
|
|
|
+**ANY** — ключевое слово, которое должно следовать за операцией сравнения (>, <, <>, = и т.д.), возвращающее TRUE, если хотя бы одно из значений столбца подзапроса удовлетворяет обозначенному условию.
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT поля_таблицы_1
|
|
SELECT поля_таблицы_1
|
|
|
-FROM таблица_1
|
|
|
|
|
-WHERE поле_таблицы_1 <= ANY (SELECT поле_таблицы_2 FROM таблица_2);
|
|
|
|
|
|
|
+ FROM таблица_1
|
|
|
|
|
+ WHERE поле_таблицы_1 <= ANY (SELECT поле_таблицы_2 FROM таблица_2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-ALL — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию.
|
|
|
|
|
|
|
+**ALL** — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию.
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT поля_таблицы_1
|
|
SELECT поля_таблицы_1
|
|
|
-FROM таблица_1
|
|
|
|
|
-WHERE поле_таблицы_1 > ALL (SELECT поле_таблицы_2 FROM таблица_2);
|
|
|
|
|
|
|
+ FROM таблица_1
|
|
|
|
|
+ WHERE поле_таблицы_1 > ALL (SELECT поле_таблицы_2 FROM таблица_2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-IN — ключевое слово, являющееся псевдонимом ключевому слову ANY с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны:
|
|
|
|
|
|
|
+**IN** — ключевое слово, являющееся псевдонимом ключевому слову **ANY** с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
...
|
|
...
|
|
@@ -418,14 +415,14 @@ WHERE поле_таблицы_1 = ANY (SELECT поле_таблицы_2 FROM т
|
|
|
WHERE поле_таблицы_1 IN (SELECT поле_таблицы_2 FROM таблица_2);
|
|
WHERE поле_таблицы_1 IN (SELECT поле_таблицы_2 FROM таблица_2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### Строковые подзапросы
|
|
|
|
|
|
|
+#### Строковые подзапросы
|
|
|
|
|
|
|
|
Строковый подзапрос — это подзапрос, возвращающий единственную строку с более чем одной колонкой. Например, следующий запрос получает в подзапросе единственную строку, после чего по порядку попарно сравнивает полученные значения со значениями во внешнем запросе.
|
|
Строковый подзапрос — это подзапрос, возвращающий единственную строку с более чем одной колонкой. Например, следующий запрос получает в подзапросе единственную строку, после чего по порядку попарно сравнивает полученные значения со значениями во внешнем запросе.
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT поля_таблицы_1
|
|
SELECT поля_таблицы_1
|
|
|
-FROM таблица_1
|
|
|
|
|
-WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) =
|
|
|
|
|
|
|
+ FROM таблица_1
|
|
|
|
|
+ WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) =
|
|
|
(
|
|
(
|
|
|
SELECT первое_поле_таблицы_2, второе_поле_таблицы_2
|
|
SELECT первое_поле_таблицы_2, второе_поле_таблицы_2
|
|
|
FROM таблица_2
|
|
FROM таблица_2
|
|
@@ -436,70 +433,80 @@ WHERE (первое_поле_таблицы_1, второе_поле_табли
|
|
|
Данную конструкцию удобно использовать для замены логических операторов. Так, следующие два запроса полностью эквивалентны:
|
|
Данную конструкцию удобно использовать для замены логических операторов. Так, следующие два запроса полностью эквивалентны:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-SELECT поля_таблицы_1 FROM таблица_1 WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = (1, 1);
|
|
|
|
|
-SELECT поля_таблицы_1 FROM таблица_1 WHERE первое_поле_таблицы_1 = 1 AND второе_поле_таблицы_1 = 1;
|
|
|
|
|
|
|
+SELECT поля_таблицы_1
|
|
|
|
|
+ FROM таблица_1
|
|
|
|
|
+ WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = (1, 1);
|
|
|
|
|
+
|
|
|
|
|
+SELECT поля_таблицы_1
|
|
|
|
|
+ FROM таблица_1
|
|
|
|
|
+ WHERE первое_поле_таблицы_1 = 1 AND второе_поле_таблицы_1 = 1;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### Связанные подзапросы
|
|
|
|
|
|
|
+#### Связанные подзапросы
|
|
|
|
|
|
|
|
Связанным подзапросом является подзапрос, который содержит ссылку на таблицу, которая была объявлена во внешнем запросе. Здесь вложенный запрос ссылается на внешюю таблицу "таблица_1":
|
|
Связанным подзапросом является подзапрос, который содержит ссылку на таблицу, которая была объявлена во внешнем запросе. Здесь вложенный запрос ссылается на внешюю таблицу "таблица_1":
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT поля_таблицы_1 FROM таблица_1
|
|
SELECT поля_таблицы_1 FROM таблица_1
|
|
|
-WHERE поле_таблицы_1 IN
|
|
|
|
|
|
|
+ WHERE поле_таблицы_1 IN
|
|
|
(
|
|
(
|
|
|
SELECT поле_таблицы_2 FROM таблица_2
|
|
SELECT поле_таблицы_2 FROM таблица_2
|
|
|
WHERE таблица_2.поле_таблицы_2 = таблица_1.поле_таблицы_1
|
|
WHERE таблица_2.поле_таблицы_2 = таблица_1.поле_таблицы_1
|
|
|
);
|
|
);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### Подзапросы как производные таблицы
|
|
|
|
|
|
|
+#### Подзапросы как производные таблицы
|
|
|
|
|
|
|
|
-Производная таблица — выражение, которое генерирует временную таблицу в предложении FROM, которая работает так же, как и обычные таблицы, которые вы указываете через запятую. Так выглядит общий синтаксис запроса с использованием производных таблиц:
|
|
|
|
|
|
|
+Производная таблица — выражение, которое генерирует временную таблицу в предложении **FROM**, которая работает так же, как и обычные таблицы, которые вы указываете через запятую. Так выглядит общий синтаксис запроса с использованием производных таблиц:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-SELECT поля_таблицы_1 FROM (подзапрос) [AS] псевдоним_производной_таблицы
|
|
|
|
|
|
|
+SELECT поля_таблицы_1
|
|
|
|
|
+ FROM (подзапрос) [AS] псевдоним_производной_таблицы
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
Обратите внимание на то, что для производной таблицы обязательно должен указываться её псевдоним, для того, чтобы имелась возможность обратиться к ней в других частях запроса.
|
|
Обратите внимание на то, что для производной таблицы обязательно должен указываться её псевдоним, для того, чтобы имелась возможность обратиться к ней в других частях запроса.
|
|
|
|
|
|
|
|
-### Обработка вложенных запросов
|
|
|
|
|
|
|
+#### Обработка вложенных запросов
|
|
|
|
|
|
|
|
Вложенные подзапросы обрабатываются «снизу вверх». То есть сначала обрабатывается вложенный запрос самого нижнего уровня. Далее значения, полученные по результату его выполнения, передаются и используются при реализации подзапроса более высокого уровня и т.д.
|
|
Вложенные подзапросы обрабатываются «снизу вверх». То есть сначала обрабатывается вложенный запрос самого нижнего уровня. Далее значения, полученные по результату его выполнения, передаются и используются при реализации подзапроса более высокого уровня и т.д.
|
|
|
|
|
|
|
|
## Добавление данных, оператор INSERT
|
|
## Добавление данных, оператор INSERT
|
|
|
|
|
|
|
|
-Для добавления новых записей в таблицу предназначен оператор INSERT.
|
|
|
|
|
|
|
+Для добавления новых записей в таблицу предназначен оператор **INSERT**.
|
|
|
|
|
|
|
|
-Общая структура запроса с оператором INSERT
|
|
|
|
|
|
|
+Общая структура запроса с оператором **INSERT**
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
INSERT INTO имя_таблицы [(поле_таблицы, ...)]
|
|
INSERT INTO имя_таблицы [(поле_таблицы, ...)]
|
|
|
-VALUES (значение_поля_таблицы, ...)
|
|
|
|
|
-| SELECT поле_таблицы, ... FROM имя_таблицы ...
|
|
|
|
|
|
|
+ VALUES (значение_поля_таблицы, ...)
|
|
|
|
|
+ | SELECT поле_таблицы, ... FROM имя_таблицы ...
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Вертикальной чертой обозначен альтернативный синтаксис.
|
|
|
|
|
|
|
+>В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Вертикальной чертой обозначен альтернативный синтаксис.
|
|
|
|
|
+
|
|
|
|
|
+>Список полей таблицы не обязателен, но только если заполняются все имеющиеся поля. Можно не заполнять не обязательные поля, но в этом случае список нужно указывать и порядок полей должен соответсвовать значениям.
|
|
|
|
|
|
|
|
-Значения можно вставлять перечислением с помощью слова values, перечислив их в круглых скобках через запятую или c помощью оператора select. Таким образом, добавить новые записей можно следующими способами:
|
|
|
|
|
|
|
+Значения можно вставлять перечислением с помощью слова **VALUES**, перечислив их в круглых скобках через запятую или c помощью оператора **SELECT**. Таким образом, добавить новые записей можно следующими способами:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-INSERT INTO Goods (good_id, good_name, type)
|
|
|
|
|
-VALUES (5, 'Table', 2);
|
|
|
|
|
|
|
+INSERT INTO Goods (goodId, goodName, `type`)
|
|
|
|
|
+ VALUES (5, 'Table', 2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-INSERT INTO Goods VALUES (5, 'Table', 2);
|
|
|
|
|
|
|
+-- заполняются все поля в таблице
|
|
|
|
|
+INSERT INTO Goods
|
|
|
|
|
+ VALUES (5, 'Table', 2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
```SQL
|
|
```SQL
|
|
|
INSERT INTO Goods
|
|
INSERT INTO Goods
|
|
|
-SELECT
|
|
|
|
|
- good_id, good_name, type
|
|
|
|
|
-FROM
|
|
|
|
|
- Goods
|
|
|
|
|
-where
|
|
|
|
|
- good_name = 2;
|
|
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ goodId, goodName, `type`
|
|
|
|
|
+ FROM
|
|
|
|
|
+ Goods
|
|
|
|
|
+ where
|
|
|
|
|
+ `type` = 2;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### Первичный ключ при добавлении новой записи
|
|
### Первичный ключ при добавлении новой записи
|
|
@@ -510,26 +517,107 @@ where
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
INSERT INTO Goods
|
|
INSERT INTO Goods
|
|
|
-SELECT
|
|
|
|
|
- COUNT(*) + 1, 'Table', 2
|
|
|
|
|
-FROM
|
|
|
|
|
- Goods;
|
|
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ COUNT(*) + 1, 'Table', 2
|
|
|
|
|
+ FROM
|
|
|
|
|
+ Goods;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-В SQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ good_id атрибутом AUTO_INCREMENT. Тогда при создании новой записи в качестве значения good_id достаточно передать NULL или 0 — поле автоматически получит значение, равное максимальному значению столбца good_id, плюс единица.
|
|
|
|
|
|
|
+В SQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ goodId атрибутом **AUTO_INCREMENT**. Тогда при создании новой записи в качестве значения goodId достаточно передать **NULL** или **0** — поле автоматически получит значение, равное максимальному значению столбца goodId, плюс единица.
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
CREATE TABLE Goods (
|
|
CREATE TABLE Goods (
|
|
|
- good_id INT NOT NULL AUTO_INCREMENT
|
|
|
|
|
|
|
+ goodId INT NOT NULL AUTO_INCREMENT
|
|
|
...
|
|
...
|
|
|
);
|
|
);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
-INSERT INTO Goods VALUES (NULL, 'Table', 2);
|
|
|
|
|
|
|
+INSERT INTO Goods
|
|
|
|
|
+ VALUES (NULL, 'Table', 2);
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## Редактирование данных, команда UPDATE
|
|
|
|
|
+
|
|
|
|
|
+Команда **UPDATE** применяется для обновления уже имеющихся строк. Она имеет следующий формальный синтаксис:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+UPDATE имя_таблицы
|
|
|
|
|
+ SET столбец1 = значение1, столбец2 = значение2, ... столбецN = значениеN
|
|
|
|
|
+ [WHERE условие_обновления]
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Например, увеличим у всех товаров цену на 3000:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+UPDATE Products
|
|
|
|
|
+SET Price = Price + 3000;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Однако при выполнении данного запроса в MySQL Workbench мы можем столкнуться с ошибкой "You are using safe update..."
|
|
|
|
|
+
|
|
|
|
|
+Ошибка говорит о том, что мы находимся в *безопасном режиме*. И чтобы его отключить, в **MySQL Workbench** надо перейти в меню **Edit -> Preferences** и в открывшемся окне перейти к пункту **SQL Editor**:
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+В открывшейся вкладке в самом низу надо снять флажок с поля "Safe Updates (reject UPDATEs and DELETEs with no restrictions)" и затем сохранить изменения, нажав на кнопку OK. После этого надо переподключиться к серверу.
|
|
|
|
|
+
|
|
|
|
|
+Используем выражение **WHERE** и изменим название производителя с "Samsung" на "Samsung Inc.":
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+UPDATE Products
|
|
|
|
|
+ SET Manufacturer = 'Samsung Inc.'
|
|
|
|
|
+ WHERE Manufacturer = 'Samsung';
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Также можно обновлять сразу несколько столбцов:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+UPDATE Products
|
|
|
|
|
+ SET Manufacturer = 'Samsung',
|
|
|
|
|
+ ProductCount = ProductCount + 3
|
|
|
|
|
+ WHERE Manufacturer = 'Samsung Inc.';
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+При обновлении вместо конкретных значений и выражений мы можем использовать ключевые слова **DEFAULT** и **NULL** для установки соответственно значения по умолчанию или NULL:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+UPDATE Products
|
|
|
|
|
+ SET ProductCount= DEFAULT
|
|
|
|
|
+ WHERE Manufacturer = 'Huawei';
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## Удаление данных, команда DELETE
|
|
|
|
|
+
|
|
|
|
|
+Команда **DELETE** удаляет данные из БД. Она имеет следующий формальный синтаксис:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+DELETE FROM имя_таблицы
|
|
|
|
|
+ [WHERE условие_удаления]
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Например, удалим строки, у которых производитель - Huawei:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+DELETE FROM Products
|
|
|
|
|
+ WHERE Manufacturer='Huawei';
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Или удалим все товары, производителем которых является Apple и которые имеют цену меньше 60000:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+DELETE FROM Products
|
|
|
|
|
+ WHERE Manufacturer='Apple' AND Price < 60000;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Если необходимо вовсе удалить все строки вне зависимости от условия, то условие можно не указывать:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+DELETE FROM Products;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### Пример
|
|
|
|
|
|
|
+<!--
|
|
|
|
|
+## Импорт данных (старые скрины из MSSQL)
|
|
|
|
|
|
|
|
Теперь, зная синткасис команд INSERT и SELECT, можем разобраться как создать из исходного набора данных словари и загрузить данные в БД с учетом внешних ключей
|
|
Теперь, зная синткасис команд INSERT и SELECT, можем разобраться как создать из исходного набора данных словари и загрузить данные в БД с учетом внешних ключей
|
|
|
|
|
|
|
@@ -548,7 +636,7 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
|
|
|
|
|
|
|
|
Для добавления "типов агентов" в таблицу **AgentType** мы будем использовать альтернативный синтаксис `INSERT ... SELECT`
|
|
Для добавления "типов агентов" в таблицу **AgentType** мы будем использовать альтернативный синтаксис `INSERT ... SELECT`
|
|
|
|
|
|
|
|
-1. Пишем инструкцию SELECT, которая выбирает уникальные записи из *таблицы импорта*:
|
|
|
|
|
|
|
+1. Пишем инструкцию **SELECT**, которая выбирает уникальные записи из *таблицы импорта*:
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
SELECT
|
|
SELECT
|
|
@@ -573,9 +661,9 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
1. Поле **ID** можно пропустить, оно автоинкрементное и создастся само
|
|
1. Поле **ID** можно пропустить, оно автоинкрементное и создастся само
|
|
|
- 2. Количество и порядок вставляемых полей (Title) должно быть равным количеству выбираемых полей (Тип_агента)
|
|
|
|
|
|
|
+ 2. Количество и порядок вставляемых полей `(Title)` должно быть равным количеству выбираемых полей `(Тип_агента)`
|
|
|
|
|
|
|
|
- Если в таблице есть обязательные поля, а нем неоткуда взять для них данные, то мы можем в **SELECT** вставить фиксированные значения (в примере пустая строка):
|
|
|
|
|
|
|
+ Если в таблице есть обязательные поля, а нам неоткуда взять для них данные, то мы можем в **SELECT** вставить фиксированные значения (в примере пустая строка):
|
|
|
|
|
|
|
|
```sql
|
|
```sql
|
|
|
INSERT INTO AgentType (Title, Image)
|
|
INSERT INTO AgentType (Title, Image)
|
|
@@ -650,7 +738,7 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
|
|
|
WHERE
|
|
WHERE
|
|
|
asi.Тип_агента=att.Title
|
|
asi.Тип_агента=att.Title
|
|
|
```
|
|
```
|
|
|
-
|
|
|
|
|
|
|
+-->
|
|
|
|
|
|
|
|
<table style="width: 100%;"><tr><td style="width: 40%;">
|
|
<table style="width: 100%;"><tr><td style="width: 40%;">
|
|
|
<a href="../articles/5_1_1_1_erd_workbench.md">Создание ER-диаграммы в среде MySQL Workbench
|
|
<a href="../articles/5_1_1_1_erd_workbench.md">Создание ER-диаграммы в среде MySQL Workbench
|