вторник, 29 марта 2011 г.

Основы SQL – DML – SELECT – Часть II

В прошлый раз в этой серии статей я рассказал об операторе “SELECT” в самом простом его проявлении – запросы к одной таблице, без сложных фильтров. Теперь я расскажу о более интересной, но сложной теме – многотабличных запросах.

Также, в завершении статьи, я дам несколько полезных рекомендаций, предотвращающих превращение поддержки многотабличных запросов в постоянную головную боль.

Многотабличные запросы без JOIN

Хотя в более ранних версиях Microsoft SQL Server многотабличные запросы без “JOIN” были более распространены, теперь они используются все реже и реже. И это, с моей точки зрения, правильно. Использование “JOIN” приводит, как минимум, к более структурированному и читаемому коду (что мы увидим чуть позже), а на символах в исходном коде я никогда не экономил :)

Самый простой вариант многотабличного запроса – это двухтабличные запрос без условия соединения таблиц или декартово произведение таблиц. И это, пожалуй, единственный вариант, когда от отсутствия “JOIN” не страдает наглядность:

SELECT * FROM Persons, Phones

суббота, 19 марта 2011 г.

Основы SQL – DML – SELECT – Часть I

Продолжаю серию статей “Основы SQL”. В этой статье я расскажу про сравнительно простые варианты применения самого сложного оператора DML – SELECT. Если в начале статьи дать полный синтаксис SELECT – это будет серьезным поводом загрустить и не читать статью дальше, поэтому я буду рассказывать про возможности этого оператора постепенно :)

Простейший случай

Позволю себе немного дополнить статью MSDN о SELECT тем, что данный оператор может использоваться не только для "выборки одной или нескольких строк или столбцов из одной или нескольких таблиц", но и для получения набора данных, не имеющего в своей основе ни одной таблицы:

SELECT 1 AS ID, 'Test 1' AS Name

Разумеется, в итоге результат выглядит как выборка из некоторой таблицы (если мы не будем использовать специальные конструкции для получения результата в виде XML).

Если одной строки недостаточно, можно использовать несколько запросов, объединенных с помощью UNION ALL. Если не использовать “ALL” в этой конструкции, в результате гарантированно не будет дублирующихся строк. Это тоже бывает полезно, но, если вы точно знаете, что дубликатов и так не будет, лучше использовать “UNION ALL”, чтобы уменьшить накладные расходы.

понедельник, 14 марта 2011 г.

Облачные хранилища файлов – личный опыт

Решил, для разнообразия, написать на тему организации рабочего места. Наверняка у многих есть потребность в хранении и синхронизации файлов с помощью, как это модно сейчас говорить, облачного хранилища. Речь не про Azure и иже с ним, а про такие сервисы хранения файлов как DropBox, SkyDrive и т.п.

Лично я использую их для синхронизации своих заметок, паролей (естественно, зашифрованных), полезных SQL-скриптов и т.п. Удобно иметь актуальные версии и дома, и на работе и в смартфоне.

В этой короткой статье расскажу про свой местами многолетний, а местами практически нулевой опыт работы с некоторыми из них.  Если кто-то дополнит пробелы в моих знаниях, буду премного благодарен.

пятница, 28 января 2011 г.

Основы SQL – DML – DELETE

Продолжаю серию статей “Основы SQL”. В предыдущих сериях:
В этой статье я завершу рассказ про операторы DML, изменяющие данные - речь пойдет про DELETE – оператор, с помощью которого можно удалить одну или много строк в таблице, или много строк во многих таблицах… главное – не слишком увлекаться :)

Удаление строк

Удаление строк более простая операция чем все остальные в DML, по большому счету, все сказанное относительно UPDATE применимо и к DELETE, с той лишь разницей, что данные удаляются, а не модифицируются, и синтаксис немного другой:
DELETE Phones WHERE PersonID = 1 AND Phone = '100-1'
В этом примере происходит удаление одной строки (если такая есть), потому что, как вы помните, “PersonID” и “Phone” являются составным первичным ключом.

четверг, 27 января 2011 г.

Основы SQL – DML – UPDATE

Продолжаю серию статей “Основы SQL”. В предыдущих сериях:
В прошлый раз я немного рассказал про оператор INSERT (куда же без него – без первоначальных данных применять остальные операторы DML не имеет смысла).
Сейчас речь пойдет про UPDATE – оператор, позволяющий модифицировать существующие данные.

Модификация одной строки

Если для оператора INSERT существует разный синтаксис для вставки одной строки и множества строк, то для UPDATE синтаксис одинаковый и в простейшем случае выглядит так:
UPDATE Persons SET LastName = 'Петров' WHERE PersonID = 1

воскресенье, 16 января 2011 г.

Основы SQL – DML – INSERT и другие

Ранее в этой серии статей мы поговорили об SQL вообще и нормальных формах, в частности. Затем продолжили разговор о DDL и нескольких вариантах рефакторинга, с ним связанных. В этой статье речь пойдет о DML (Data Manipulation Language), то есть о тех базовых возможностях, которые предоставляет SQL (строго говоря, Transact-SQL) для обработки данных.

Когда-то давно, на университетском курсе по “Базам данных”, на котором нам немного рассказывали про FoxPro (я же говорил, что давно :)), преподаватель рассказывал про способы получения данных и их обработки. Как сейчас помню, он сказал фразу “а еще есть мощный язык для обработки данных, он называется SQL” и, после эффектной паузы, добавил – “там есть четыре инструкции – SELECT, INSERT, UPDATE и DELETE, но рассказать что-то еще у меня не хватит времени”.

Честно говоря, только через пару лет, на первой работе, я понял две вещи:
  1. На этом курсе я практически ничего полезного так и не узнал.
  2. Программирование БД может быть не менее увлекательным, чем программирование на высокоуровневых языках.
Зато сейчас у меня немного больше времени, чем у моего преподавателя, и я постараюсь рассказать про DML более подробно и, в то же время, доступно.

суббота, 8 января 2011 г.

Основы SQL - DDL и рефакторинг БД

Это вторая статья в серии статей “Основы SQL”. В ней я продолжу разговор о DDL. Также я покажу, каким образом может выглядеть рефакторинг БД (как с точки зрения нормализации, так и с точки зрения денормализации). Да, лично я считаю, что рефакторинг (можно назвать это модным словом continuous design) вполне применим к БД.

Конечно, в нашем распоряжении (пока) нет инструментов для рефакторинга SQL столь же мощных, как для C# или Java. Однако, в большинстве случаев, рефакторинг БД случается редко. Поэтому часто достаточно скриптов, написанных вручную или немного сгенерированных.
Но сначала немного о том, что делает мои трудовые будни несколько комфортнее, когда речь идет об обновлениях БД (повторюсь, речь, как и ранее, идет о MS SQL Server, хотя принципы могут быть применимы и к другим СУБД).

четверг, 6 января 2011 г.

Основы SQL - первое знакомство

Вступление

Этой статьей я начинаю серию о SQL (Structured Query Language) для разработчиков, которые еще не начали или недавно начали осваивать SQL как средство работы с БД (базой данных). Сразу хочу сказать, что эта статья будет наполнена, в основном, базовыми понятиями, историей и немного философией, а разбор конкретных задач, проблем и решений будет далее.

Основная причина, по которой мне захотелось начать подобную серию статей – часто встречающиеся ошибки, которые допускают даже опытные разработчики на высокоуровневых языках программирования, когда начинают использовать SQL.

Как вам, например, такой подход – чтобы получить первые 100 записей, сначала несколько сотен тысяч записей считываются в DataSet (или объектную модель), а потом на экран в цикле выводятся первые 100? И речь здесь, к сожалению, не о выдуманной ситуации, а о реальном коде. Причем авторы кода не любимые многими абстрактные “индусы”, а, в том числе, наши соотечественники. Скажу по секрету, приходилось сталкиваться с исходным кодом многих проектов разных контор – проблемы с ним мало зависят от национальности разработчиков, скорее от уровня и ответственности конкретных исполнителей и отношения к качеству внутри компании.