Contents
10.3.3.1 создавать запросы, используя извлеченные данные (SQL ) |
10.3.3.1 создавать запросы, используя извлеченные данные (SQL ) |
Как вы думаете, что такое запросы?
Запрос – это важнейший инструмент для извлечения информации из одной или нескольких таблиц БД. Посредством запроса можно вносить изменения в саму БД. Запрос может служить источником данных для форм, отчетов и страниц доступа к данным.
SQL (Structure Query Language) – язык запросов. SQL используется в каждом запросе.
SQL – это язык структурированных запросов. Он дает возможность создавать и управлять реляционной базой данных и связанной информацией, которые хранятся в таблице. SQL поддерживается лидерами в области реляционной технологии БД и является стандартным языком, поскольку он не зависит от компьютерных технологий. Поэтому каждый пользователь, желающий научиться работать с любой базой данных, должен знать SQL язык. Стандарт SQL был принят ANSI (American National Standards Institute), а в настоящее время он принят ISO (Международная организация по стандартизации).
http://old.code.mu/sql/limit.html

Структура языка SQL. SQL предназначена для выполнения сложных действий в реляционных базах данных, для определения структуры базы данных и доступа к данным в общедоступных средах.
В отличие от других языков SQL предназначен только для управления базой данных. Вы можете с помощью SQL-запросов сделать запрос в базе данных.
https://1c-md.com/stati/sql-zaprosy.html
1.SELECT – определяет поля, содержащие требуемые данные.
2.FROM – определяет таблицы, содержащие поля, указанные в SELECT.
3.WHERE – определяет условие отбора полей, которые должны соответствовать всем записям, содержащимся в результатах.
4.ORDER BY – определяет порядок сортировки результатов.
SELECT * FROM characters
Результатом данного запроса будет таблица со всеми данными в таблице characters. Знак звёздочки (*) означает то, что мы хотим показать все столбцы из таблицы без исключений. Так как в базе данных обычно больше одной таблицы, нам необходимо указывать название таблицы, данные из которой мы хотим посмотреть. Сделать это мы можем, используя ключевое слово FROM.
Когда вам нужны лишь некоторые столбцы из таблицы, то вы можете указать их имена через запятую вместо звёздочки.
SELECT name, weapon FROM characters
Также иногда нам нужно отсортировать выводимые данные. Для этого мы используем ORDER BY “название столбца”. ORDER BY имеет два модификатора: ASC (по возрастанию) (по умолчанию) и DESC (по убыванию).
SELECT name, weapon FROM characters ORDER BY name DESC
Команда LIMIT задает ограничение на количество записей, выбираемых из базы данных.
Данная команда может использоваться совместно с командой SELECT, командой DELETE, и командой UPDATE.
Давайте выберем последние 3 записи.
Для этого отсортируем их с помощью ORDER BY по убыванию id и возьмем 3 записи с помощью LIMIT
Они и будут искомыми последними записями, так как LIMIT сработает после сортировки и будет браться по уже отсортированной таблице.
SELECT * FROM workers WHERE id>0 ORDER BY id LIMIT 3
Например, когда вам нужные не все данные, а скажем только первые 10 строк.
Для этого существует конструкция LIMIT и давайте попробуем вывести 5
самых дорогих товаров.
SELECT * FROM products ORDER BY price DESC LIMIT 5LIMIT можно использовать совместно с конструкций WHERE.
Например если мы хотим получить самые дорогие товары, которые есть
на складе, то нужно после products добавить WHERE count > 0:
SELECT * FROM products WHERE count > 0 ORDER BY price DESCLIMIT 5;
Обратите внимание на порядок следования блоков запроса:
1. Сперва идет SELECT FROM — выбрать ИЗ;
2. Затем блок условие WHERE;
3. После сортировка ORDER BY;
4. И завершает ограничение LIMIT.
Команда UPDATE редактирует записи в базе данных.
Какие записи для редактирования задаются с помощью команды WHERE.
Команда WHERE не является обязательной, если ее не указать - будут обновлены все записи в таблице. Будьте внимательны - так случайно можно уничтожить все данные.
См. также команды select, insert, delete, которые отвечают за получение, вставку и удаление записей.
UPDATE имя_таблицы SET поле1=значение1, поле2=значение2, поле3=значение3...
WHERE условие_по_которому_следует_выбрать_строкиВсе примеры будут по этой таблице workers, если не сказано иное:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 23 | 400 |
| 2 | Петя | 24 | 500 |
| 3 | Вася | 25 | 600 |
В данном примере работнику с id, равным 1 (то есть Диме), устанавливается
возраст 30 и зарплата 1000:
UPDATE workers SET age=30, salary=1000 WHERE id=1Таблица workers станет выглядеть так:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 30 | 1000 |
| 2 | Петя | 24 | 500 |
| 3 | Вася | 25 | 600 |
Команда DELETE удаляет записи из базы данных.
Записи для удаления задаются с помощью команды where.
Команда where не является обязательной, если ее не указать - будут удалены все записи в таблице. Будьте внимательны - так случайно можно уничтожить все данные.
См. также команды select, insert, update, которые отвечают за получение, вставку и редактирование записей.
DELETE FROM имя_таблицы WHERE условиеВсе примеры будут по этой таблице workers, если не сказано иное:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 23 | 400 |
| 2 | Петя | 25 | 500 |
| 3 | Вася | 23 | 500 |
Удалим пользователя с id, равным 2:
DELETE FROM workers WHERE id=2Таблица workers станет выглядеть так:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 23 | 400 |
| 3 | Вася | 23 | 500 |
Where
Теперь мы знаем, как показать только конкретные столбцы, но что если мы хотим включить в вывод лишь некоторые конкретные строки? Для этого мы используем WHERE. Данное ключевое слово позволяет нам фильтровать данные по определённому условию.
В следующем запросе мы выведем только тех персонажей, которые в качестве оружия используют пистолет.
SELECT *FROM characters WHERE weapon = ‘pistol’;
И/или
Условия в WHERE могут быть написаны с использованием логических операторов (AND/OR) и математические операторы сравнения (=, <, >, <=, >=, <>).
К примеру, у нас есть табличка, в которой записаны данные о 4 самых продаваемых музыкальных альбомах всех времён. Давайте выведем только те, жанром которых является рок, а продажи были меньше, чем 50 миллионов копий.
SELECT *FROM albums WHERE genre = ‘rock’ AND sales_in_millions <= 50 ORDER BY released
В SQL также есть инверсия. Для примера, попробуйте самостоятельно написать NOT перед любым логическим выражением в условии (NOT BETWEEN и так далее).
Функции
В SQL полно встроенных функций для выполнения разных операций. Мы же покажем вам только наиболее часто используемые:
COUNT() — возвращает число строк
SUM() — возвращает сумму всех полей с числовыми значениями в них
AVG() — возвращает среднее значение среди строк
MIN()/MAX() — возвращает минимальное/максимальное значение среди строк
In/Between/Like
Условия в WHERE могут быть записаны с использованием ещё нескольких команд, которыми являются:
IN — сравнивает значение в столбце с несколькими возможными значениями и возвращает true, если значение совпадает хотя бы с одним значением
Команда IN выбирает записи из базы данных по определенным значениям поля.
К примеру, можно выбрать записи, у которых id имеет значение 1, 3, 7, 14, 28. Это будет выглядеть так: WHERE id IN (1, 3, 7, 14, 28).
Или же все записи, у которых поле name имеет значение 'Дима', 'Вася' или 'Коля'. Это будет выглядеть так: WHERE id IN ('Дима', 'Вася', 'Коля').
В принципе, для таких вещей можно пользоваться и командой or, тогда первый пример будет выглядеть так: WHERE id=1 OR id=3 OR id=7 OR id=14 OR id=28. Вариант с IN все-таки выглядит проще и изящнее.
SELECT * FROM имя_таблицы WHERE поле IN (значение1, значение2...)К примеру, мы можем сделать запрос для вывода данных об альбомах в жанре pop или soul:
SELECT * FROM albums WHERE genre IN (‘pop’,‘soul’);
BETWEEN — проверяет, находится ли значение в каком-то промежутке
Команда BETWEEN задает диапазон значений, по которому выбираются записи из базы данных.
К примеру, можно выбрать записи для поля id от 3 до 10-ти.
См. также команду not, которая делает отрицание (к примеру, так: not between).
См. также команду in, которая выбирает записи по указанным значениям.
SELECT * FROM имя_таблицы WHERE поле BETWEEN от AND до
Если мы хотим вывести все альбомы, которые были выпущены в промежутке между 1975 и 1985 годом, мы можем использовать следующую запись:
SELECT * FROM albums WHERE released BETWEEN 1975 AND 1985;
Также, если мы хотим вывести все альбомы, в названии которых есть буква ‘R’, мы можем использовать следующую запись:
SELECT * FROM albums WHERE album LIKE ‘%R%’;
Знак % означает любую последовательность символов (0 символов тоже считается за последовательность).
Если мы хотим вывести все альбомы, первая буква в названии которых — ‘R’, то запись слегка изменится:
SELECT * FROM albums WHERE album LIKE 'R%';
С помощью оператора SQL LIKE вывести записи университетов, доменное имя сайта которых содержит 4 символа (за исключением домена .ru):
С помощью оператора SQL LIKE вывести записи университетов, первая буква доменного имени сайта которых содержит буквы из диапазона [k-o]:
С помощью оператора SQL LIKE вывести записи университетов, вторая буква названия города которых, не входит в диапазон [e-o]:
Команда NOT задает отрицание для других команд: вместо IN можно написать NOT IN, вместо BETWEEN - NOT BETWEEN и так далее.
Как это работает: возьмем, для примера, команду IN и с ее помощью выберем записи, у которых id имеет значение 1, 3, 7, 14, 28. Это будет выглядеть так: WHERE id IN (1, 3, 7, 14, 28).
А теперь воспользуемся отрицанием not и выберем все записи, у которых id НЕ равен 1, 3, 7, 14, 28 таким образом: WHERE id NOT IN (1, 3, 7, 14, 28).
См. также команду is null, которая проверяет поле на NULL.
См. также команду is not null, которая проверяет поле на не NULL.
NOT IN (значение1, значение2...)NOT BETWEEN значение1 AND значение2NOT LIKE шаблонВсе примеры будут по этой таблице workers, если не сказано иное:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 23 | 400 |
| 2 | Петя | 25 | 500 |
| 3 | Вася | 23 | 500 |
| 4 | Коля | 30 | 1000 |
| 5 | Иван | 27 | 500 |
| 6 | Кирилл | 28 | 1000 |
Давайте выберем записи с id, НЕ равным 1, 3 и 5:
SELECT * FROM workers WHERE id NOT IN (1, 3, 5)SQL запрос выберет следующие строки:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 2 | Петя | 25 | 500 |
| 4 | Коля | 30 | 1000 |
| 6 | Кирилл | 28 | 1000 |
Команда IS NOT NULL проверяет поле на не NULL.
Все примеры будут по этой таблице workers, если не сказано иное:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 23 | 400 |
| 2 | Петя | 24 | NULL |
| 3 | Вася | 25 | NULL |
Давайте выберем записи, у которых зарплата не равна NULL:
SELECT * FROM workers WHERE salary IS NOT NULLКоманда IS NULL проверяет поле на NULL.
Все примеры будут по этой таблице workers, если не сказано иное:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Дима | 23 | 400 |
| 2 | Петя | 24 | NULL |
| 3 | Вася | 25 | NULL |
Давайте выберем записи, у которых зарплата равна NULL:
SELECT * FROM workers WHERE salary IS NULLКоманда OR является логическим 'ИЛИ', которое позволяет комбинировать условия в команде where.
В данном примере выбираются записи, у которых зарплата равна 400 или возраст 23 (хотя бы одно и них):
SELECT * FROM workers WHERE id=3 OR salary=400Команда AND является логическим 'И', которое позволяет комбинировать условия в команде where.
В данном примере выбираются записи, у которых поле id больше 2-х и меньше 4-х:
SELECT * FROM workers WHERE id>=2 AND id<=4Функция COUNT подсчитывает количество записей в таблице.
Условие, по которому будут выбираться записи, задается с помощью команды where.
Команда where не является обязательной, если ее не указать - будут подсчитаны все записи в таблице.
См. также команду distinct, которая позволяет подсчитывать только уникальные значения поля.
См. также команду group by, которая позволяет группировать записи и затем с помощью count подсчитывать количество в группах.
Подсчет всех записей:
SELECT COUNT(*) FROM имя_таблицы WHERE условиеПодсчет всех записей, где заданное поле не равно NULL:
SELECT COUNT(поле) FROM имя_таблицы WHERE условиеТолько уникальные значения поля:
SELECT COUNT(DISTINCT поле) FROM имя_таблицы WHERE условиеВсе примеры будут по этой таблице workers, если не сказано иное:
| id айди | name имя | age возраст | salary зарплата |
|---|---|---|---|
| 1 | Ерлан | 16 | 4000000 |
| 2 | Диас | 15 | 50000000 |
| 3 | Гаухар | 15 | 5000000 |
| 4 | Сергей | 16 | 10000000 |
| 5 | Жангир | 16 | 5000000 |
| 6 | Ильяс | 15 | 1000000 |
Давайте подсчитаем всех работников с возрастом 23 года:
SELECT COUNT(*) as count FROM workers WHERE age=23Результат выполнения SQL запроса:
| count результат подсчета |
|---|
| 2 |
Чтобы вывести год выпуска самого старого альбома, в таблице можно использовать следующий запрос:
SELECT MAX(released) FROM albums;
Обратите внимание, что если вы напишете запрос, в котором вам, к примеру, нужно будет вывести имя и среднее значение чего-либо, то вы получите ошибку на выводе.
Допустим, вы пишете такой запрос:
SELECT name, avg(age) FROM students;
Чтобы избежать ошибки, вам следует добавить следующую строку:
GROUP BY name
Причиной тому является, что запись avg(age) является совокупной (aggregated), и вам необходимо группировать значения по имени.
Вложенные Select
В предыдущих шагах мы изучили, как делать простые вычисления с данными. Если мы хотим использовать результат данных вычислений, то часто нам необходимо использовать так называемые вложенные запросы. Допустим, нам необходимо вывести артиста, альбом и год выпуска самого старого альбома в таблице.
Вывести эти столбцы можно, используя следующий запрос:
SELECT artist, album, released FROM albums;
Также мы знаем, как получить самый ранний год из имеющихся:
SELECT MIN(released) FROM album;
Объединить эти запросы можно в WHERE:
SELECT artist,album,released
FROM albums
WHERE released = (
SELECT MIN(released) FROM albums
);
Присоединение таблиц
В сложных базах данных чаще всего у нас есть несколько связанных таблиц. К примеру, у нас есть две таблицы: про видеоигры и про разработчиков.
В таблице video_games есть столбец developer_id, в данном случае он является так называемым foreign_key. Чтобы было проще понять, developer_id — это связывающее звено между двумя таблицами.
Если мы хотим вывести всю информацию об игре, включая информацию о её разработчике, нам необходимо подключить вторую таблицу. Чтобы это сделать, можно использовать INNER JOIN:
SELECT video_games.name, video_games.genre, game_developers.name, game_developers.country
FROM video_games
INNER JOIN game_developers
ON video_games.developer_id = game_developers.id;
Это, наверное, самый простой пример использования JOIN. Есть ещё несколько вариантов его использования.
Update
Зачастую нам нужно изменить данные в таблице. В SQL это делается с помощью UPDATE.
Использование UPDATE включает в себя:
выбор таблицы, в которой находится поле, которое мы хотим изменить
запись нового значения
использование WHERE, чтобы обозначить конкретное место в таблице
Предположим, у нас есть таблица с самыми высокооценёнными сериалами всех времён. Однако у нас есть проблема: «Игра Престолов» обозначена как комедия и нам определённо нужно это изменить:
UPDATE tv_series SET genre = ‘drama’
WHERE name = ‘Game of Thrones’;
Удаление записей из таблицы
Удаление записи из таблицы через SQL — очень простая операция. Всё, что нужно — это обозначить, что именно мы хотим удалить.
DELETE FROM tv_series WHERE id = 4;
Примечание: убедитесь, что используете WHERE, когда удаляете запись из таблицы. Иначе вы удалите все записи из таблицы, сами того не желая.
Удаление таблиц
Если мы хотим удалить все данные из таблицы, но при этом оставить саму таблицу, нам следует использовать команду TRUNCATE:
TRUNCATE TABLE table_name;
В случае, если мы хотим удалить саму таблицу, то нам следует использовать команду DROP:
DROP TABLE table_name;
Пример.
CREATE TABLE EMPLOYEE (
empId INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
);
INSERT INTO EMPLOYEE VALUES (0001, 'Clark', 25);
INSERT INTO EMPLOYEE VALUES (0002, 'Dave', 34);
INSERT INTO EMPLOYEE VALUES (0003, 'Ava', 32);
INSERT INTO EMPLOYEE VALUES (0004, 'Евгений', 40);
.mode column
.headers on
SELECT * FROM EMPLOYEE ;
SELECT * FROM EMPLOYEE WHERE empId IN (1, 2);
SELECT * FROM EMPLOYEE WHERE age BETWEEN 34 AND 40;
SELECT * FROM EMPLOYEE WHERE name LIKE 'D%';
SELECT COUNT(*) as count FROM EMPLOYEE WHERE age=25;
SELECT MIN(age) FROM EMPLOYEE;
1.Каким инструментом обработки данных является SQL?
2.Каким языком является SQL?
3.Что является теоретической основой языка SQL?
4.Какой оператор языка SQL управляет доступом к БД?
5.Каковы функции операторов SELECT, INSERT, DELETE, UPDATE?
6.Какую функцию выполняет оператор BETWEEN?
7.Как работают критерии отбора WHERE?
8.Какова функция оператора ORDER BY?
Задание
запросы на:
1. or, and
2. in, and
3. between
4. (... or ...) and ...
5. сортировка по двум
ТЕСТ (просмотреть)
https://testua.ru/informatsionnye-tekhnologii/1182-testy-po-bazam-dannykh-sql-s-otvetami.html
Оператор LIKE используется в предложении WHERE для поиска заданного шаблона в столбце.
В сочетании с оператором LIKE используются два подстановочных знака:
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;| Выражение | Описание |
| WHERE name LIKE 'text%' | Находит любые значения, начинающиеся с "text" |
| WHERE name LIKE '%text' | Находит любые значения, заканчивающиеся на "text" |
| WHERE name LIKE '%text%' | Находит любые значения, которые имеют «text» в любой позиции |
| WHERE name LIKE '_text%' | Находит любые значения, которые имеют «text» во второй позиции |
| WHERE name LIKE 'text_%_%' | Находит любые значения, начинающиеся с «text» и длиной не менее 3 символов |
| WHERE name LIKE 'text%data' | Находит любые значения, начинающиеся с «text» и заканчивающиеся на «data» |
Следующий оператор SQL выбирает всех пользователей с именем name, начинающимся с «Т»:
Пример:
SELECT * FROM users
WHERE name LIKE 'Т%';Следующий оператор SQL выбирает всех пользователей с именем name, заканчивающимся на «м»:
Пример:
SELECT * FROM users
WHERE name LIKE '%м';Следующий оператор SQL выбирает всех пользователем с именем name, которое имеет «text» в любой позиции:
Пример:
SELECT * FROM users
WHERE name LIKE '%text%';Следующий оператор SQL выбирает всех пользователей с именем name, которое имеет «text» во второй позиции:
Пример:
SELECT * FROM users
WHERE name LIKE '_text%';Следующий оператор SQL выбирает всех пользователей с именем name, начинающимся с «Т» и длиной не менее 3 символов:
Пример:
SELECT * FROM users
WHERE name LIKE 'Т_%_%';Следующий оператор SQL выбирает всех пользователей с именем name, которое начинается с «Т» и заканчивается на «м»:
Пример:
SELECT * FROM users
WHERE name LIKE 'Т%м';Следующий оператор SQL выбирает всех пользователей с именем name, которое НЕ начинается с «Т»:
Пример:
SELECT * FROM users
WHERE name NOT LIKE 'Т%';Фильтрация групп. HAVING
Оператор HAVING определяет, какие группы будут включены в выходной результат, то есть выполняет фильтрацию групп.
Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.
Например, найдем все группы товаров по производителям, для которых определено более 1 модели:
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
HAVING COUNT(*) > 1

При этом в одной команде мы можем использовать выражения WHERE и HAVING:
SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING COUNT(*) > 1
То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы - выбираются те группы, которые содержат больше 1 модели.
Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:
SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING SUM(ProductCount) > 2
ORDER BY Units DESC
В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.

Оператор SQL DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца. Оператор SQL DISTINCT нашел широкое применение в операторе SQL SELECT, для выборки уникальных значений. Так же используется в агрегатных функциях.
Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.
В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:
UPDATE таблица SET поле = значениеЗдесь, UPDATE – команда указывающая, что запрос на обновление данных;
таблица – название таблицы, в которой будет проводиться изменения;
SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;
поле – поле таблицы, в которое будет внесено изменение;
значение – новое значение, которое будет внесено в поле.
Например, если необходимо задать полю во всех строках таблицы значение равное нулю, можно выполнить такой запрос:
UPDATE goods SET price = 0В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.
Изменение значения всех полей в таблице необходимо крайне редко. Чаще всего необходимо поменять значение какой-то конкретной записи. Для этого в завершении строки с командой UPDATE будет добавлена директива WHERE, в которой указывается условие, определяющее с какой именно строкой нужно выполнить операцию обновления.
Имеется таблица:
| num (номер товара) | title (название) | price (цена) |
| 1 | Чайник | 300 |
| 2 | Чашка | 100 |
| 3 | Ложка | 25 |
| 4 | Тарелка | 100 |
Для примера, нужно обновить стоимость товара с известным нам его значением num. Для этого, выполним следующий запрос:
UPDATE goods SET price = 150 WHERE num = 2Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.
Если вспомнить все многообразие условий в запросе, можно представить себе насколько разнообразными могут быть выборки. Поэтому и запросы на обновления могут выполняться либо с одной строкой, либо с группой строк, либо со всеми строками таблицы. Все зависит от стоящей перед вами задачи, а так же с какими строками таблицы нужно выполнять операции обновления.
Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:
UPDATE goods SET price = price / 2 WHERE price >= 100Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.
price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.
В результате выполнения такого запроса получим таблицу с измененными записями:
| num (номер товара) | title (название) | price (цена) |
| 1 | Чайник | 150 |
| 2 | Чашка | 50 |
| 3 | Ложка | 25 |
| 4 | Тарелка | 50 |
При необходимости обновлять сразу несколько полей, все поля с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:
UPDATE goods SET title = "утюг", price = 300 WHERE num = 2Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.
ТЕСТ
NEW TABLE
CREATE TABLE
MAKE TABLE
structured query language
strict question line
strong question language
SELECT ALL Persons
SELECT * FROM Persons
SELECT .[Persons]
SELECT DISCINCT
SELECT DIFFERENT
SELECT UNIQUE
COUNT ROW IN Persons
SELECT COUNT(*) FROM Persons
SELECT ROWS FROM Persons
Все записи из таблицы «Students»
Рассчитанное суммарное количество записей в таблице «Students»
Внутреннюю структуру таблицы «Students»
INTO, IN
FROM, IN
FROM, BETWEEN
SUM
AVG
COUNT
SELECT * FROM Users LIMIT 14
SELECT * LIMIT 14 FROM Users
SELECT * FROM USERS
*, Customers
NULL, Customers
Name, Customers
SELECT * FROM Countries EXP ID=8
SELECT * FROM Countries WHERE ID !=8
SELECT ALL FROM Countries LIMIT 8
SELECT * FROM Customers WHERE City=”Almaty”
SELECT City=”Almaty” FROM Customers
SELECT Customers WHERE City=”Almaty”
SELECT FirstName, LastName, BirthDate from Employees WHERE LastName=“se”
SELECT * from Employees WHERE LastName like “_se_”
SELECT FirstName, LastName, BirthDate from Employees WHERE LastName like “%se%”
TOP
UPPER
UP
RENAME LastName into Surname FROM Employees
ALTER TABLE Employees CHANGE LastName Surname varchar(50)
ALTER TABLE Surname(LastName) FROM Employees
SET Salary=2500 FROM Salary=2000 FOR ID=7 FROM Employees
ALTER TABLE Employees Salary=2500 FOR ID=7
UPDATE Employees SET Salary=2500 WHERE ID=7
Полное удаление базы данных «Users»
Удаление таблицы «Users» из текущей базы данных
SELECT %fox age FROM Animals
SELECT age FROM Animals WHERE Animal LIKE «%fox»
SELECT age FROM %Fox.Animals
SELECT Moscow, Tbilisi, Lvov FROM Customers
SELECT * FROM Customers WHERE City IN (‘Moscow’, ‘Tbilisi’, ‘Lvov’)
SELECT City IN (‘Moscow’, ‘Tbilisi’, ‘Lvov’) FROM Customers
SELECT * FROM Countries WHERE ID=”City”
SELECT City FROM Countries
SELECT City.Countries
1, 4, 2, 3
4, 2, 3, 1
4, 3, 2, 1
WITHIN
IN
BETWEEN
JOIN, в переводе означает "объединять", то есть собирать из нескольких кусочков единое целое. В базе данных MySQL такими "кусочками" служат столбцы таблиц, которые можно объединять при выборке.
Объединения позволяют извлекать данные из нескольких таблиц без создания временных таблиц и за один запрос.
Таблица с наименованием товаров (я назову её nomenclature), будет хранить номер товара (id) и краткое название (name).
Код - Описание таблицы nomenclature |
mysql> SELECT * FROM nomenclature; +----+-----------+ | id | name | +----+-----------+ | 1 | Книга | | 2 | Табуретка | | 3 | Карандаш | +----+-----------+ 3 rows in set (0.00 sec) |
Содержание таблицы с описанием товаров (пусть будет description):
Код - Содержимое таблицы description |
mysql> SELECT * FROM description; +----+---------------------+ | id | description | +----+---------------------+ | 1 | Замечательная книга | | 3 | Красный карандаш | | 5 | Зелёная машинка | +----+---------------------+ 3 rows in set (0.00 sec) |
Исходные данные определены, добавлю ещё Несколько слов о структуре базы. Таблица nomenclature содержит перечень всех товаров, которые есть в базе. Таблица описаний description, напротив, содержит лишь неполный перечень описаний для товаров, которые необязательно присутствуют в базе. Чтобы однозначно привязать описание к товару, в таблицах присутствует столбец id, который содержит уникальный номер товара. В обеих таблицах id является первичным ключом, что соответствует связи один-к-одному.
Таблицы определены и заполнены, настало время делать выборку. Но если приглядеться к данным, которые находятся в таблицах, то можно заметить, что они не в полной мере соответствуют друг другу. Так в таблице nomenclature присутствует товар под номером 2 (Табуретка), для которого нет описания. И в таблице description присутствует описание для товара номер 5 (Зелёная машинка), которого нет в таблице номенклатур .
В зависимости от требований к результату, MySQL позволяет производить три разных типа объединения:
INNER JOIN (CROSS JOIN) - внутреннее (перекрёстное) объединениеLEFT JOIN - левостороннее внешнее объединениеRIGHT JOIN - правостороннее внешнее объединениеЭтот тип объединения позволяет извлекать строки, которые обязательно присутствуют во всех объединяемых таблицах.
В простейшем случае (без указания условий отбора), выборка вернёт т.н. декартово произведение, в котором каждая строка одной таблицы будет сопоставлена с каждой строкой другой таблицы:
Код - Внутреннее объединение таблиц (декартово произведение) |
mysql> SELECT * FROM nomenclature INNER JOIN description; +----+-----------+----+---------------------+ | id | name | id | description | +----+-----------+----+---------------------+ | 1 | Книга | 1 | Замечательная книга | | 2 | Табуретка | 1 | Замечательная книга | | 3 | Карандаш | 1 | Замечательная книга | | 1 | Книга | 3 | Красный карандаш | | 2 | Табуретка | 3 | Красный карандаш | | 3 | Карандаш | 3 | Красный карандаш | | 1 | Книга | 5 | Зелёная машинка | | 2 | Табуретка | 5 | Зелёная машинка | | 3 | Карандаш | 5 | Зелёная машинка | +----+-----------+----+---------------------+ 9 rows in set (0.00 sec) |
Как правило, декартово произведение таблиц требуется нечасто, чаще требуется выбрать только те записи, которые сопоставлены друг другу. Сделать это можно, если задать условие отбора, используя ON или USING.
Код - внутреннее объединение |
mysql> SELECT * FROM nomenclature INNER JOIN description using(id); +----+----------+---------------------+ | id | name | description | +----+----------+---------------------+ | 1 | Книга | Замечательная книга | | 3 | Карандаш | Красный карандаш | +----+----------+---------------------+ 2 rows in set (0.01 sec) |
Запрос вернул только две записи, поскольку именно столько строк имеют одинаковые идентификаторы в обеих таблицах.
Использование USING обусловлено тем, что в таблицах ключевой столбец имеет одно и тоже имя - id. В противном случае, надо было бы использовать ON.
Помимо конструкции INNER JOIN внутреннее объединение можно объявить так же через CROSS JOIN, JOIN и запятую в объявлении FROM. Следующие четыре запроса вернут одинаковый результат:
Код - Разные формы объявления внутреннего объединения | |
1 | SELECT * FROM nomenclature INNER JOIN description; SELECT * FROM nomenclature CROSS JOIN description; SELECT * FROM nomenclature JOIN description; SELECT * FROM nomenclature, description; |
Если объединять таблицы через запятую, то нельзя использовать конструкции ON и USING, поэтому условие может быть задано только в конструкции WHERE. Например, это может выглядеть так:
Код - пример использования внутреннего объединения |
mysql> SELECT * FROM nomenclature, description WHERE nomenclature.id = description.id; +----+----------+----+---------------------+ | id | name | id | description | +----+----------+----+---------------------+ | 1 | Книга | 1 | Замечательная книга | | 3 | Карандаш | 3 | Красный карандаш | +----+----------+----+---------------------+ 2 rows in set (0.00 sec) |
Поскольку поле id не является однозначным, приходится доуточнять в каком контексте оно используется через указание имени таблицы.
И так, внутреннее объединение можно задать следующими способами:
Код - способы объявления внутреннего объединения таблиц | |
1 | SELECT * FROM Таблица1, Таблица2[, Таблица3, ...] [WHERE Условие1 [Условие2 ...] SELECT * FROM Таблица1 [INNER | CROSS] JOIN Таблица2 [(ON Условие1 [Условие2 ...]) | (USING(Поле))] |
Результатом будет декартово произведение всех таблиц, на которое можно накладывать условия выборки, используя ON, USING и WHERE.
Левосторонние объединения позволяют извлекать данные из таблицы, дополняя их по возможности данными из другой таблицы.
К примеру, чтобы получить полный список наименований товаров вместе с их описанием, нужно выполнить следующий запрос:
Код - внешнее левостороннее объединение |
mysql> SELECT * FROM nomenclature LEFT JOIN description USING(id); +----+-----------+---------------------+ | id | name | description | +----+-----------+---------------------+ | 1 | Книга | Замечательная книга | | 2 | Табуретка | NULL | | 3 | Карандаш | Красный карандаш | +----+-----------+---------------------+ 3 rows in set (0.01 sec) |
Поскольку для наименования Табуретка в таблице описаний нет подходящей записи, то в поле description подставился NULL. Это справедливо для всех записей, у которых нет подходящей пары.
Если дополнить предыдущий запрос условием на проверку несуществования описания, то можно получить список записей, которые не имеют пары в таблице описаний:
Код - выборка наименований без описаний |
mysql> SELECT id, name FROM nomenclature LEFT JOIN description USING(id) WHERE description IS NULL; +----+-----------+ | id | name | +----+-----------+ | 2 | Табуретка | +----+-----------+ 1 row in set (0.00 sec) |
По сути это и есть основное назначение внешних запросов - показывать расхождение данных двух таблиц.
Кроме того, при таком объединении обязательным является условие, которое задаётся через ON или USING. Без него запрос будет выдавать ошибку.
Этот вид объединений практически ничем не отличается от левостороннего объединения, за тем исключением, что данные берутся из второй таблицы, которая находится справа от конструкции JOIN, и сравниваются с данными, которые находятся в таблице, указанной перед конструкцией.
Код - правосторонняя выборка |
mysql> SELECT * FROM nomenclature RIGHT JOIN description USING(id); +----+---------------------+----------+ | id | description | name | +----+---------------------+----------+ | 1 | Замечательная книга | Книга | | 3 | Красный карандаш | Карандаш | | 5 | Зелёная машинка | NULL | +----+---------------------+----------+ 3 rows in set (0.00 sec) |
Как видно, теперь уже поле name содержит нулевые значения. Также поменялся и порядок расположения столбцов.
Однако, во всех случаях использования правосторонних объединений, запрос можно переписать, используя левостороннее объединение, просто поменяв таблицы местами, и наоборот. Следующие два запроса равнозначны:
Код - запросы на выборку | |
1 | SELECT * FROM nomenclature LEFT JOIN description USING(id); SELECT * FROM description RIGHT JOIN nomenclature USING(id); |