Последнее обновление: 13.07.2017
Для добавления данных применяется команда INSERT , которая имеет следующий формальный синтаксис:
INSERT имя_таблицы [(список_столбцов)] VALUES (значение1, значение2, ... значениеN)
Вначале идет выражение INSERT INTO , затем в скобках можно указать список столбцов через запятую, в которые надо добавлять данные, и в конце после слова VALUES скобках перечисляют добавляемые для столбцов значения.
Например, пусть ранее была создана следующая база данных:
CREATE DATABASE productsdb; GO USE productsdb; CREATE TABLE Products (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL)
Добавим в нее одну строку с помощью команды INSERT:
INSERT Products VALUES ("iPhone 7", "Apple", 5, 52000)
После удачного выполнения в SQL Server Management Studio в поле сообщений должно появиться сообщение "1 row(s) affected":
Стоит учитывать, что значения для столбцов в скобках после ключевого слова VALUES передаются по порядку их объявления. Например, в выражении CREATE TABLE выше можно увидеть, что первым столбцом идет Id. Но так как для него задан атрибут IDENTITY, то значение этого столбца автоматически генерируется, и его можно не указывать. Второй столбец представляет ProductName, поэтому первое значение - строка "iPhone 7" будет передано именно этому столбцу. Второе значение - строка "Apple" будет передана третьему столбцу Manufacturer и так далее. То есть значения передаются столбцам следующим образом:
ProductName: "iPhone 7"
Manufacturer: "Apple"
Также при вводе значений можно указать непосредственные столбцы, в которые будут добавляться значения:
INSERT INTO Products (ProductName, Price, Manufacturer) VALUES ("iPhone 6S", 41000, "Apple")
Здесь значение указывается только для трех столбцов. Причем теперь значения передаются в порядке следования столбцов:
ProductName: "iPhone 6S"
Manufacturer: "Apple"
Для неуказанных столбцов (в данном случае ProductCount) будет добавляться значение по умолчанию, если задан атрибут DEFAULT, или значение NULL. При этом неуказанные столбцы должны допускать значение NULL или иметь атрибут DEFAULT.
Также мы можем добавить сразу несколько строк:
INSERT INTO Products VALUES ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)
В данном случае в таблицу будут добавлены три строки.
Также при добавлении мы можем указать, чтобы для столбца использовалось значение по умолчанию с помощью ключевого слова DEFAULT или значение NULL:
INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price) VALUES ("Mi6", "Xiaomi", DEFAULT, 28000)
В данном случае для столбца ProductCount будет использовано значение по умолчанию (если оно установлено, если его нет - то NULL).
Если все столбцы имеют атрибут DEFAULT, определяющий значение по умолчанию, или допускают значение NULL, то можно для всех столбцов вставить значения по умолчанию:
INSERT INTO Products DEFAULT VALUES
Но если брать таблицу Products, то подобная команда завершится с ошибкой, так как несколько полей не имеют атрибута DEFAULT и при этом не допускают значение NULL.
Удаление записей
Для удаления записей из таблицы применяется оператор DELETE:
DELETE FROM имяТаблицы WHERE условие;
Данный оператор удаляет из указанной таблицы записи (а не отдельные значения столбцов), которые удовлетворяют указанному условию. Условие - это логическое выражение, различные конструкции которого были рассмотрены в предыдущих лабораторных занятиях.
Следующий запрос удаляет записи из таблицы Customer, в которой значение столбца LName равно "Иванов":
DELETE FROM Customer
WHERE LName = "Иванов"
Если таблица содержатся сведения о нескольких клиентах с фамилией Иванов, то все они будут удалены.
В операторе WHERE может находиться подзапрос на выборку данных (оператор SELECT). Подзапросы в операторе DELETE работают точно так же, как и в операторе SELECT. Следующий запрос удаляет всех клиентов из города Москва, при этом уникальный идентификатор города возвращается с помощью подзапроса.
DELETE FROM Customer
WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName = "Москва" )
Transact-SQL расширяет стандартный SQL, позволяя использовать в инструкции DELETE еще одно предложение FROM. Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк. Оно позволяет задавать данные из второго FROM и удалять соответствующие строки из таблицы в первом предложении FROM. В частности предыдущий запрос может быть переписан следующим образом
DELETE FROM Customer
FROM Customer k INNER JOIN
Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае семантических (но не синтаксических) ошибок при формулировке SQL-выражения. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рассмотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку.
SELECT *
FROM Customer k INNER JOIN
City c ON k.IdCity = c.IdCity AND c.CityName = "Москва"
Для удаления всех записей из таблицы достаточно использовать оператор DELETE без ключевого слова WHERE. При этом сама таблица со всеми определенными в ней столбцами сохраняется и готова для вставки новых записей. Например, следующий запрос удаляет записи обо всех товарах.
DELETE FROM Product
Задание для самостоятельной работы: Сформулируйте на языке SQL запрос на удаление всех заказов, не имеющих в составе ни одного товара (т. е. все пустые заказы).
Запросы на изменение используются для добавления (INSERT INTO), удаления (DELETE) и обновления (UPDATE) записей в таблицах.
Команда INSERT INTO может быть использована для добавления одной или нескольких записей в конец таблицы.
Синтаксис команды INSERT INTO имеет следующий вид:
INSERT INTO Название_Таблицы [(Название_Полей)] VALUES (Значения_данных);
Например, поместим в таблицу "Группы" запись, содержащую данные (1, БФ-16а, 1, 1) в соответствующие столбцы (КодГруппы, Название, Курс, Семестр).
Для этого запрос в формате:
INSERT INTO Группы (КодГруппы, Название, Курс, Семестр) VALUES (1, БФ-16а, 1, 1);
введем на бланке запроса, выполнив команду "Конструктор запросов" на вкладке "Создание", в режиме "Режим SQL" из меню Вид.
Сохраняем запрос с именем "Добав_1_записи". В результате в «Области переходов» появится несвязанный объект - «Добав_1_записи» (Рис.1.).
Рис. 1.
После сохранения запроса необходимо выполнить этот запрос, щелкая на пиктограмме «Выполнить». В результате выполнения команды «Добав_1_записи» в пустой таблице появится первая запись (Рис. 2.)
Рис. 2.
Команда UPDATE предназначена для изменения уже существующих записей в столбцах таблицы, что позволяет обновлять значения в заданных столбцах таблицы.
Синтаксис команды UPDATE имеет следующий вид:
UPDATE Название_Таблицы SET Название_Столбца = Новое_Значение WHERE Условие_Отбора;
В предложении SET указываются имена столбцов, данные в которых надо изменить. Оператор WHERE не является обязательным, но при его помощи можно указать только на те строки столбцов (таблиц), которые необходимо обновить.
Создадим запрос на изменение записи в таблице "Группы" базы данных sql_training_st.mdb.
Например, изменим уже существующую запись для первого ключевого поля id в столбце "Название" таблицы "Группы".
Запрос в формате:
UPDATE Группы SET Название ="БФ-16б" WHERE ID=1;
Сохраняем запрос с именем "Изменение_записи_1". В результате в «Области переходов» появится объект - «Изменение_записи_1» (Рис. 3.).
Рис. 3.
После сохранения запроса необходимо выполнить этот запрос, щелкая на пиктограмме «Выполнить». В результате выполнения команды «Изменение_записи_1» появится окно диалога, в котором необходимо ввести значение параметра ID=1 и нажать кнопку ОК. После этих действий в таблице "Группы" изменится запись в поле "Название" с БФ-16а на БФ-16б (Рис. 4.).
Рис. 4.
Команда DELETE предназначена для удаления записей из таблицы.
Формат запроса на удаление записей:
DELETE FROM Название_Таблицы WHERE Условие_Отбора;
Создадим запрос на изменение записи в таблице "Группы" базы данных sql_training_st.mdb.
Например, удалим существующую запись для первого ключевого поля id во всех столбцах (полях) таблицы "Группы".
Для этого запрос в формате:
DELETE FROM Группы WHERE ID=1;
создаем на бланке запроса, выполнив команду "Конструктор запросов" на вкладке "Создание", в режиме "Режим SQL" из меню Вид.
Сохраняем запрос с именем "Удаление_записи_1". В результате в «Области переходов» появится объект - «Удаление_записи_1» (Рис. 5.).
Рис. 5.
После сохранения запроса необходимо выполнить этот запрос, щелкая на пиктограмме «Выполнить». В результате выполнения команды «Удаление_записи_1» появится окно диалога, в котором необходимо ввести значение параметра ID=1 и нажать кнопку ОК. После этих действий откроется окно диалога "Подтвердите удаление записей". После подтверждения в таблице "Группы" будет удалены данные во всех полях, т.е. удалена запись (Рис. 6.).
Рис. 6.
Следует отметить, что для удаления данных в конкретных полях таблицы целесообразно воспользоваться командой UPDATE и заменить значения в требуемых полях на Null. Если необходимо удалить таблицу в целом, то следует использовать оператор DROP TABLE (синтаксис оператора: DROP TABLE Название_Таблицы;).
Восстановим первую запись в таблице "Группы", выполнив команду «Добав_1_записи», в результате восстановим первую запись (Рис. 7.).
Рис. 7.
Общий синтаксис:
а) вставка одной новой строки в таблицу:
INSERT <таблица> [(столбцы)]
VALUES (значения)
б) Вставка в таблицу одной или более строк, взятых из источника, указанного в подзапросе:
INSERT <таблица> [(столбцы)]
Правила:
Количество элементов в разделе «Столбцы» должно совпадать с количеством элементов в разделе «Значения»; типы данных должны совпадать либо допускать неявное преобразование;
В случае, когда раздел «Столбцы» отсутствует, раздел «Значения» должен содержать столько же значений, сколько всего столбцов в редактируемой таблице, кроме того, значения должны перечисляться в том же порядке, в каком объявлены столбцы таблицы; поэтому рекомендуется всегда явно указывать список столбцов, в которые будут добавляться новые значения;
В случае использования синтаксиса (б) подзапрос SELECT может быть адресован либо к этой же таблице, либо к другой таблице базы данных, либо к другой базе данных на сервере;
Если для некоторого столбца таблицы задано значение по умолчанию, и требуется в добавляемой записи использовать именно это значение, то в разделе «Значения» для этого столбца необходимо написать ключевое слово DEFAULT.
Примеры :
INSERT INTO detail (detail_name)
VALUES ("Подшипник")
INSERT INTO supply (supplier_id, supply_quantity, supply_cost,
supply_date, detail_id)
VALUES (4, 177, 453.45, "25.09.2009", 1)
INSERT supplier (supplier_type, supplier_name)
VALUES (DEFAULT, "Смирнов С. С.")
Общий синтаксис:
UPDATE <таблица>
SET <столбец> = <значение> [, <столбец> = <значение>]
Примеры :
SET weight = 210
SET material_name = "Олово"
WHERE material_id = 2
SET department_id = NULL,
delivery_date = delivery_date + 1 /*увеличение даты поставки на день
WHERE delivery_id = 1 OR department_id > 3
SET detail_name = detail_name + "!!!"
WHERE detail_name LIKE "_а%" AND weight BETWEEN 6 AND 10
Общий синтаксис:
DELETE<таблица>
<условие>
Примеры :
WHERE detail_id IN (2, 5, 8)
WHERE weight IS NULL
Задание:
Заполните базу данных средствами ManagementStudio. Для этого следует воспользоваться командой «Открыть таблицу» контекстного меню таблицы в «Обозревателе объектов» (рис. 4.1).
SELECT <список столбцов>
FROM <таблица(-ы) источник>
Разделы SELECT и FROM обязательно должны присутствовать в каждом запросе; остальные разделы могут отсутствовать или присутствовать частично.
Наиболее простые запросы:
1. Выбрать название и вес деталей
Рис. 5.1. Результаты выполнения запроса №1
2. Выбрать всю информацию из таблицы материалов
Рис. 5.2. Результаты выполнения запроса №2
Уникальность DISTINCT
3. Выбрать уникальные коды поставщиков из таблицы поставок
Рис. 5.3. Результаты выполнения запроса №3
Ограничение WHERE
4. Выбрать количество и даты поставки детали с кодом 1
Рис. 5.4. Результаты выполнения запроса №4
5. Выбрать названия поставщиков с кодами 1, 4 и 6
Рис. 5.5. Результаты выполнения запроса №5
6. Выбрать всю информацию о поставках, сделанных до 1.10.2009
Рис. 5.6. Результаты выполнения запроса №6
7. Выбрать всю информацию о деталях, не начинающихся на букву «В» (в любом регистре) и чей вес меньше 50
Рис. 5.7. Результаты выполнения запроса №7
8. Выбрать название и код материала для деталей с весом от 5 до 10 г или имеющих в названии букву «н» в третьей позиции
Рис. 5.8. Результаты выполнения запроса №8
9. Выбрать названия поставщиков длиной не больше 15-и символов
Рис. 5.9. Результаты выполнения запроса №9
10. Выбрать месяца и годы поставок деталей
Рис. 5.10. Результаты выполнения запроса №10
Сортировка ORDER BY
11. Упорядочить поставки сначала по коду поставщика, а затем по дате поставки
Рис. 5.11. Результаты выполнения запроса №11
12. Выбрать названия поставщиков с кодами 4, 6, 8, 9, упорядоченных по алфавиту в обратном порядке
Рис. 5.12. Результаты выполнения запроса №12
Агрегация и группировка GROUP BY
Рис. 5.13. Результаты выполнения запроса №13
14. Определить средний вес деталей из материала с кодом 2
Рис. 5.14. Результаты выполнения запроса №2
15. Из поставок, совершенных до 1.10.2009, выбрать самую крупную поставку и самую мелкую
Рис. 5.15. Результаты выполнения запроса №15
16. Для поставщиков с кодами в диапазоне 5 - 8 посчитать суммарное количество поставленных ими деталей
Рис. 5.16. Результаты выполнения запроса №16
Рис. 5.17. Результаты выполнения запроса №17
Ограничение на группировки HAVING
18. Выбрать материалы, для которых суммарный вес выполненных из них деталей не больше 20
Рис. 5.18. Результаты выполнения запроса №18
19. Из поставок 2008-го года выбрать детали, поставлявшиеся более одного раза
Рис. 5.19. Результаты выполнения запроса №19
Преобразование типов CAST
20. Получить сведения о датах поставок в текстовом виде
Рис. 5.20. Результаты выполнения запроса №20
21. Получить сведения из таблицы деталей в виде строк «Деталь X имеет вес Y»
Рис. 5.21. Результаты выполнения запроса №21
Альтернативы CASE
22. Разделить детали на легкие (весом до 20), средние (между 20 и 50) и тяжелые
Рис. 5.22. Результаты выполнения запроса №22
Обработка NULL-значений
23. Получить сведения о деталях и их весах, причем если у детали вес не задан, то вместо NULL написать -100
Рис. 5.23. Результаты выполнения запроса №23
Функция существования EXISTS
24. Выбрать название и код материала только тех деталей, которые когда-либо поставлялись
Рис. 5.24. Результаты выполнения запроса №24
25. Выбрать названия тех материалов, из которых не изготовлена ни одна деталь
Рис. 5.25. Результаты выполнения запроса №25
Подзапросы
26. Получить сведения о самой последней (по дате) поставке
Рис. 5.26. Результаты выполнения запроса №26
27. Получить все поставки деталей из материала с кодом 2
Рис. 5.27. Результаты выполнения запроса №27
28. Для каждого поставщика получить сведения о самой первой (по дате) его поставке
Рис. 5.28. Результаты выполнения запроса №28
29. Для каждого поставщика получить его имя и дату последнего заказа
Рис. 5.29. Результаты выполнения запроса №29
Объединение таблиц JOIN
30. Получить таблицу вида: название детали, название материала, из которого выполнена эта деталь
Рис. 5.30. Результаты выполнения запроса №30
31. Получить таблицу вида: поставщик, название детали, количество и дата поставки для деталей, у которых задан вес
Рис. 5.31. Результаты выполнения запроса №31
32. Выбрать всю информацию о тех деталях, которые когда-либо поставлялись
Рис. 5.32. Результаты выполнения запроса №32
Рис. 5.33. Результаты выполнения запроса №33
34. Выбрать названия материалов и сделанных из них деталей
Рис. 5.34. Результаты выполнения запроса №34
35. Получить все данные о поставщиках, поставках и деталях
Рис. 5.35. Результаты выполнения запроса №35
Объединение таблиц UNION
36. Получить таблицу названий и весов деталей, причем последняя строка таблицы должна содержать итоги в виде суммарного веса всех деталей
Рис. 5.36. Результаты выполнения запроса №36
37. Получить таблицу из двух полей, где первое поле – название детали, материала, поставщика или дата поставки, а второе поле – длина строки из первого поля
Рис. 5.37. Результаты выполнения запроса №37
Данная же статья посвящена наполнению таблиц БД данными, то есть будем изучать SQL-команды для вставки новых записей. Следует сказать, что запись в таблицу можно сделать двумя способами:
Способ №1.
Попробуем внести запись о новой стране в таблицу countries. Синтаксис добавления будет следующим:
INSERT INTO имя_таблицы (поле_1, поле_2, …) VALUES (Значение_1, Значение_2, …);
Исходя из нашей структуры таблицы, SQL-запрос будет таким:
INSERT INTO countries (country_name, acronym_name) VALUES ("Russia", "RU");
Вот так мы внесли в нашу таблицу запись о стране «Россия». Здесь должно быть все понятно и просто, главное внимательно смотреть какие поля указываете в первых скобках, и в таком же порядке прописывать значения во вторых.
Способ №2.
Второй способ, на мой взгляд, немного проще, поскольку вы видите что, и какому полю присваиваете. Поверьте, если в таблице огромное количество столбцов, то очень просто перепутать или недосмотреть порядок полей в первых, и порядок значений во вторых скобках. Синтаксис второго метода такой:
INSERT INTO имя_таблицы SET поле_1 = Значение_1, поле_2 = Значение_2, … ;
Давайте на данном примере внесем какую-нибудь информацию в табличку persons
, поскольку там побольше полей, и сразу будет чувствоваться преимущество второго способа:
INSERT INTO persons SET first_name="Ivan", last_name="Dulin", registration_date="2012-06-14", country="1";
Теперь в нашей табличке есть такие данные:
Вы, наверное, заметили, что мы не указали значение для age, а оно оказалось заполненным... Все правильно – для данного поля мы устанавливали значение по умолчанию как 25. Так что теперь наш Ivan Dulin числиться в базе с возрастом 25 лет. Возможно, не самый удачный пример делать значение по умолчанию для поля возраста, но можно такие свойства устанавливать к таким полям, как, к примеру, рейтинг пользователя сайта, или количество просмотров страницы. Для них изначально ставится значение 0.
Следует еще обратить внимание на формат даты в MySQL: YYYY-MM-DD. Если его не придерживаться, то ваши записи просто не будут внесены в таблицу.
Как видим, поле profession заполнено как NULL, это пустое значение. Для данного поля мы задавали свойство «не обязательное к заполнению (NULL)» .
Как дополнение, рассмотрим еще такую команду:
LOAD DATA LOCAL INFILE "D:\zapros.txt" INTO TABLE persons;
Как вы думаете, что мы сейчас сделали?! А сделали мы следующее: добавили данные в таблицу persons
из файла zapros.txt
, который находится на диске D. Информация в файле должна быть следующей структуры:
Таблица professions:
Таблица persons:
first_name | last_name | age | registration_date | country | profession |
Leonid | Bilak | 45 | 2012-06-20 | 2 | 1 |
Yuri | Nazarov | 22 | 2012-06-21 | 3 | 1 |
Alla | Savenko | 25 | 2012-06-22 | 2 | 3 |
Irina | Nikolaeva | 31 | 2012-06-22 | 1 | 3 |