Я не думаю, что кто-то сможет открыть для себя новые операторы в этой статье. «Трюки», представленные здесь, для большинства не должны показаться новыми, но кому-то они будут полезны. Это не инновационные открытия в мире SQL, это весьма простые вещи, которые должен придерживаться каждый разработчик, работающий с большими БД. Статья предназначена, в первую очередь, для новичков в SQL.
#1 — Обновление данных для одной таблицы, для соответствия другой на основе общего поля
Таблица 1 employees:
id name since 211 Bob 2009 212 George 2008 213 Tyrion 2005 214 Christina 2011 .... more data
Таблица 2 employees_new:
id name jobtitle oldid since 341 Bob consultant NULL NULL 342 Josh developer NULL NULL 343 Tyrion Manager NULL NULL 344 Christina developer NULL NULL .... more data
В этом примере, у вас есть таблица, которую вы всегда использовали для вывода информации. Теперь стало доступно много новой информации, но ID все не верные, нужно это исправить. Вы можете объединить эти таблицы примерно так:
UPDATE employees_new SET employees_new.id = eold.id, employees_new.since = eold.since FROM employees_new enew INNER JOIN employees eold ON eold.name LIKE enew.name WHERE enew.id > 20
Этот запрос, на основе совпадения имен, вставляет в новую таблицу данные из предыдущей, включая старый ID, для себя мы предположили, что первые 20 сотрудников уже обновлены (отсюда и последнее условие). Теперь таблица 2 будет выглядеть так:
id name jobtitle oldid since 341 Bob consultant 211 2009 342 Josh developer 294 NULL 343 Tyrion Manager 212 2005 344 Christina developer 213 2011
Таким образом, можно спокойно использовать FROM
и INNER JOIN
в операторе UPDATE
. С таким же успехом их можно использовать и в DELETE
:
DELETE mytable FROM mytable TN INNER JOIN JoinTable JN ON JN.col1=TN.col2 WHERE JN.col3 > 10
#2 — Получение имен всех столбцов в базе данных и генерация SQL-запроса
Допустим, у вас есть таблица, содержащая 50 или, скажем, 100 полей.
Но вы, например, должны обновить их все или проверить, содержит ли какое-то поле null или еще что-то. Этот прием позволит вам написать отличный SQL-запрос.
Следующий пример — в специфичном MSSQL формате:
DECLARE @tb NVARCHAR(255) = N'dbo.[table]'; DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM ' + @tb + ' WHERE 1 = 0'; SELECT @sql += N' OR ' + QUOTENAME(name) + ' IS NULL' FROM sys.columns WHERE [object_id] = OBJECT_ID(@tb); EXEC sp_executesql @sql;
Это будет, например, проверять ваше таблицу «table», на факт наличия в каком-либо столбце значения NULL, а затем выбирать его.
Вы можете заменить
EXEC sp_executesql @sql;
на:
SELECT @sql;
Теперь, на экран будет выведет сгенерированный запрос:
SELECT * FROM dbo.[employees_new] WHERE 1 = 0 OR [id] IS NULL OR [name] IS NULL OR [jobtitle] IS NULL OR [oldid] IS NULL OR [since] IS NULL
#3 — Подзапросы
Операторы подзапросов SQL могут быть очень полезными в определенных ситуациях.
SELECT p.product_name FROM product p WHERE p.product_id = (SELECT o.product_id FROM order_items o WHERE o.product_id = p.product_id);
Это позволяет вам выбрать несколько значений, которые возможны для одного значения в первой таблице.
#4 — Функция IN()
Функция IN может быть весьма полезной, т.к. позволяет проверить список возможных значений, которые могли быть использованы в столбце.
SELECT * FROM citizens WHERE Nation IN ('United States', 'Germany', 'France', 'United Kingdom', 'Norway', 'Sweden', 'Turkey');
#5 — Оператор LIKE
Если у вас есть таблица с большим количеством данных, то вы можете искать определенные слова, которые содержаться в ней.
SELECT * FROM countries WHERE Nation LIKE '%United%'
Будет выбрано: ‘United Kingdom’, ‘United States’, ‘United Arab Emirates’,…
LIKE 'Untited%'
работал бы в данном примере таким же образом. Знак % обозначает, что после United могут идти любые символы. Соответственно LIKE '%United'
означающий страны, заканчивающиеся на United, вернул бы null.
ссылка на оригинал статьи http://habrahabr.ru/post/182446/
Добавить комментарий