Skip to content

Глава 1. Общая информация

]]>Печать]]> E-mail
Оглавление
Глава 1. Общая информация
1.1. Об этом руководстве
1.2. Соглашения, используемые в данном руководстве
1.3. О русском переводе руководства
1.3.1. Список терминов, принятых в русском переводе
1.4. Что представляет собой MySQL?
1.4.1. История MySQL
1.4.2. Основные возможности MySQL
1.4.3. Насколько стабильным является MySQL?
1.4.4. Насколько большими могут быть таблицы в MySQL?
1.4.5. Вопросы, связанные с Проблемой-2000
1.5. Что представляет собой компания MySQL AB?
1.5.1. Бизнес-модель и услуги, оказываемые компанией MySQL AB
1.5.1.1. Поддержка
1.5.1.2. Обучение и сертификация
1.5.1.3. Консультации
1.5.1.4. Коммерческие лицензии
1.5.1.5. О нашей программе партнерства
1.5.1.6. О рекламе
1.5.2. Как с нами связаться
1.6. Лицензии и поддержка MySQL
1.6.1. Поддержка, предлагаемая компанией MySQL AB
1.6.2. Авторские права и лицензии на MySQL
1.6.3. Лицензии на ПО MySQL
1.6.3.1. Использование ПО MySQL под коммерческой лицензией
1.6.3.2. Бесплатное использование ПО MySQL по лицензии GPL
1.6.4. Логотипы и торговые марки MySQL AB
1.6.4.1. Оригинальный логотип MySQL
1.6.4.2. Логотипы MySQL, которые могут использоваться без письменного разрешения
1.6.4.3. В каком случае для использования логотипов необходимо письменное разрешение?
1.6.4.4. Партнерские логотипы MySQL AB
1.6.4.5. Использование слова MySQL в текстовых документах и презентациях
1.6.4.6. Использование слова MySQL в названиях компаний и продуктов
1.7. Кратко о MySQL 4.x
1.7.1. Поэтапный выпуск
1.7.2. Можно использовать уже прямо сейчас
1.7.3. Встроенный MySQL
1.7.4. Другие функции, доступные в MySQL 4.0
1.7.5. Функции MySQL 4.x, которые будут добавлены в будущем
1.7.6. MySQL 4.1, следующая ветка в разработке
1.8. Источники информации по MySQL
1.8.1. Списки рассылки MySQL
1.8.1.1. Списки рассылки MySQL
1.8.1.2. Как задавать вопросы и направлять сообщения об ошибках
1.8.1.3. Как отправлять отчеты об ошибках или проблемах
1.8.1.4. Рекомендации по ответам на вопросы, направляемые в список рассылки
1.8.2. Пользователи MySQL на IRC
1.9. Насколько MySQL соответствует стандартам?
1.9.1. Каким стандартам соответствует MySQL ?
1.9.2. Запуск MySQL в режиме ANSI
1.9.3. Расширения MySQL к ANSI SQL92
1.9.4. Отличия MySQL от ANSI SQL92
1.9.4.1. Вложенные SELECTы
1.9.4.2. Оператор SELECT INTO TABLE
1.9.4.3. Транзакции и атомарные операции
1.9.4.4. Хранимые процедуры и триггеры
1.9.4.5. Внешние ключи
1.9.4.6. Представления
1.9.4.7. Символы «--» как начало комментария
1.9.5. Известные ошибки и недостатки проектирования в MySQL
1.9.5.1. Ошибки, известные в 3.23 и исправленные в более поздних версиях MySQL
1.9.5.2. Открытые ошибки / особенности строения MySQL
1.10. MySQL и будущее (что предстоит сделать)
1.10.1. Что планируется реализовать в версии 4.0
1.10.2. Что планируется реализовать в версии 4.1
1.10.3. Что планируется реализовать в версии 5.0
1.10.4. Что должно быть сделано в ближайшем будущем
1.10.5. То, что надо сделать когда-нибудь
1.10.6. То, чего не планируется делать

1.9.4.1. Вложенные SELECTы

В сервер MySQL поддерживает вложенные запросы вида INSERT ... SELECT ... и REPLACE ... SELECT .... В других контекстах можно использовать и функцию IN().

Вложенные операции выборки реализованы в версии 4.1.

Между тем, во многих случаях можно переписать запрос, чтобы не использовать вложенную выборку. Например, запрос:

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

можно переписать следующим образом:

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;

Запросы:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
WHERE table1.id=table2.id);

эквивалентны следующему:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;

Для более сложных подзапросов часто можно создать временные таблицы, содержащие данный подзапрос. Иногда, однако, этот способ не годится, чаще всего для команд DELETE, для которых в стандарте SQL не поддерживаются объединения (за исключением вложенных выборок). В этой ситуации возможны два временных (пока вложенные запросы не поддерживаются сервером MySQL) варианта решения проблемы.

Первый вариант следующий: при помощи какого-либо процедурно-ориентированного языка программирования (такого как Perl или PHP) делается запрос SELECT для получения первичных ключей тех записей, которые должны быть удалены, а затем полученные величины используются для составления команды DELETE (DELETE FROM ... WHERE ... IN (key1, key2, ...)).

Второй вариант предполагает применение диалогового SQL для автоматического создания набора команд DELETE с использованием расширения MySQL CONCAT() (вместо стандартного оператора ||). Например:

SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';')
FROM tab1, tab2
WHERE tab1.col1 = tab2.col2;

Можно поместить этот запрос в файл скрипта, перенаправить стандартный вход клиента командной строки с этого файла, а стандартный выход - на еще один экземпляр клиента командной строки:

shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb

Сервер версии MySQL 4.0 поддерживает многотабличные удаления - эту функцию можно использовать для эффективного удаления строк как из одной таблицы, так и из нескольких одновременно



Просмотров 7756