MySQL 5.0. Библиотека программиста
Шрифт:
SELECT * FROM Orders
WHERE amount = (SELECT MAX(amount) FROM Orders)
UNION
SELECT * FROM Orders
WHERE amount = (SELECT MIN(amount) FROM Orders)
ORDER BY 1;Результатом выполнения этого запроса будет следующий набор данных (табл. 2.16). Таблица 2.16. Результат выполнения запроса
Первый запрос возвращает строку таблицы Orders, в которой значение поля amount максимально (это строка с id = 1013), второй – строку, в которой значение поля amount минимально (это
Итак, мы рассмотрели основные возможности поиска и отбора данных, предоставляемые командой SELECT. Далее рассмотрим, как выгружать результат запроса в файл.
Выгрузка данных в файл
Чтобы результат запроса был сохранен в файл, добавьте в команду SELECT выражениеINTO OUTFILE \'Путь и имя файла\' [FILEDS …] [LINES …]
В этой команде нужно указать полный путь к файлу, в который будут выгружены данные (этот файл должен быть новым, не существующим на момент выгрузки). При задании пути к файлу необходимо использовать прямую косую черту вместо принятой в Windows обратной косой черты. Указанный файл создается на компьютере, на котором работает сервер MySQL. Данные выгружаются в той кодировке, в которой они хранятся в базе данных.
При необходимости вы можете также задать параметры FILEDS и LINES, которые имеют тот же смысл, что и параметры FILEDS и LINES команды LOAD DATA (см. подраздел «Загрузка данных из файла»). Если впоследствии файл будет загружаться в базу данных MySQL с помощью команды LOAD DATA, то в команде LOAD DATA нужно будет указать те же самые значения параметров FILEDS и LINES, которые использовались при выгрузке.
Команды SELECT… INTO OUTFILE и LOAD DATA можно использовать для резервного копирования таблиц или для переноса данных на другой сервер MySQL. Например, данные из таблицы Customers (Клиенты), сохраненные в файл с помощью командыSELECT * from Customers INTO OUTFILE \'C:/data/Customers.txt\
можно загрузить в таблицу Customers_copy (имеющую такую же структуру, что и таблица Customers) с помощью команды
LOAD DATA INFILE \'C:/data/Customers.txt\' INTO TABLE Customers_copy;
Внимание!
В случае выгрузки и последующей загрузки символьных данных в кодировке UTF-8 могут возникнуть проблемы, связанные с переменным количеством байтов на символ в этой кодировке. Если вы выгрузили данные из таблицы с кодировкой UTF-8, рекомендуем перед загрузкой преобразовать файл в какую-либо однобайтовую кодировку. Например, откроем файл с помощью программы Блокнот (Пуск → Все программы → Стандартные → Блокнот), в меню Файл выберите команду Сохранить как, а затем в стандартном окне Windows Сохранить как в поле Кодировка выберите из списка значение «ANSI» и нажмите кнопку Сохранить. При загрузке преобразованного файла укажите в команде LOAD DATA параметр CHARACTER SET cp1251 (см. подраздел «Вставка отдельных строк»).
Итак, вы освоили команду SELECT, которая предоставляет широкие возможности поиска и отбора данных. Последняя операция, которую мы обсудим в этой главе, – редактирование данных в таблицах.
2.6. Изменение данных
В этом разделе вы познакомитесь с командами изменения, замещения и удаления строк таблицы. Начнем с рассмотрения команды UPDATE, которая позволяет установить новые значения в одной или нескольких строках, например, следующим образом:
UPDATE <Имя таблицы>
SET <Имя столбца 1> = <Значение 1>,
…,
<Имя столбца N> = <Значение N>
[WHERE <Условие отбора>]
[ORDER BY <Имя столбца> [ASC или DESC]]
[LIMIT <Количество строк>];Например, если у клиента по фамилии Крылов изменился номер телефона, то обновить информацию в базе данных можно с помощью команды
UPDATE Customers SET phone = \'444-25-27\' WHERE id = 536;
В команде UPDATE используются следующие основные параметры:
• имя редактируемой таблицы;
• SET <ИмяUPDATE Customers SET rating = rating*2;
• WHERE <Условие отбора> – укажите условие отбора, чтобы изменения были применены только к тем строкам таблицы, которые удовлетворяют этому условию. Если условие отбора не задано, изменения будут применены ко всем строкам таблицы. Условия отбора мы рассматривали в подразделе «Условия отбора». В условиях отбора можно использовать вложенный запрос (см. подраздел «Вложенные запросы»), который не должен обращаться к самой модифицируемой таблице.
• ORDER BY <Имя столбца> [ASC или DESC] – при необходимости вы можете указать, в каком порядке применять изменения к строкам таблицы. Обычно порядок применения изменений не влияет на результат выполнения операции. Однако в некоторых случаях последовательность действий может быть важна. Например, если вы установили предельное количество изменяемых строк (см. следующий пункт), то некоторые строки, удовлетворяющие условию отбора, могут остаться неизменными, а какие именно это будут строки – зависит от последовательности применения изменений. Другим подобным случаем является обновление значений первичного ключа или уникального индекса, которые не должны содержать повторяющихся значений, а наличие или отсутствие повторяющихся значений в столбце может зависеть от порядка применения изменений.
• LIMIT <Количество строк> – при необходимости вы можете указать максимальное количество строк таблицы, которые могут быть изменены командой UPDATE. Если это количество измененных строк достигнуто, операция завершается, даже если в таблице еще остались строки, которые удовлетворяют условию отбора и не были изменены.Примечание
При обновлении значения первичного ключа в родительской таблице выполняются проверки целостности данных (см. описание параметров внешнего ключа в пункте «Ключевые столбцы и индексы»).
Следующая команда, которую мы рассмотрим, – это команда REPLACE, осуществляющая либо добавление, либо замещение строк таблицы. Она имеет те же параметры, что и команда INSERT (см. подраздел «Вставка отдельных строк»):
REPLACE [INTO] <Имя таблицы>
[(<Список столбцов>)]
VALUES
(<Список значений 1>),
(<Список значений 2>),
…
(<Список значений N>);Если в строке, вставляемой в таблицу с помощью команды REPLACE, значение первичного ключа или уникального индекса не совпадает ни с одним из уже существующих значений, то эта команда работает так же, как команда INSERT (если в таблице нет ни первичного ключа, ни уникального индекса, то команда REPLACE всегда работает как команда INSERT). Если же в таблице есть строка с таким же значением первичного ключа или уникального индекса, то перед добавлением новой строки прежняя строка удаляется. Например, выполнив команду
REPLACE INTO Products
VALUES
(3,\'Соковыжималка Мосбытприбор СШ-800\',
\'Цвет: кремовый. Мощность: 350 Вт\',1299.99);мы тем самым заменим в таблице Products (Товары) прежнюю строку с идентификатором 3, содержавшую информацию о кофеварке (см. листинг 2.5 выше), новой строкой, также имеющей идентификатор 3, но содержащей информацию о соковыжималке.
Отмечу, что в команде REPLACE, в отличие от команды UPDATE, нельзя задавать новые значения с помощью выражений, вычисляемых с использованием прежних значений, хранившихся в строке. Если вы укажете в команде REPLACE такое выражение, то вместо прежнего значения будет подставлено значение данного столбца по умолчанию.
И, наконец, последняя команда, которую мы рассмотрим, – команда удаления строк таблицы: