Я много лет страстно увлечен базами данных и программированием на языке SQL. Поверьте, это просто и увлекательно, к тому же высокооплачиваемое умение.
Отвлекитесь ненадолго и полистайте мои практические беседы без теоретической шелухи. Пусть вас не удивляет нумерация разделов - я постарался изложить материал в наиболее полезной последовательности.
Содержание беседы #2:
Тема 2. Язык структурированных запросов
Раздел 2.1. Понятие Стандарта ANSI-SQL
Пункт 2.1.2. Основные команды языка
(Where, Order By, Group By и Having (базовое знакомство) )
Оператор Where. В данном разделе должен быть перечислен набор логических условий. Для каждой строки, получаемой из раздела From проверяется весь набор условий. Для каждой строки мы однозначно решаем: либо выполняется весь набор условия, либо нет. Т.е. достаточно одного из многих условий, которое не выполнится для строки – и она не будет показана пользователю.
Логическое условие в принципе может быть трех видов:
1) Поле1 условие Поле2
2) Поле1 условие Константа
3) Константа условие Константа
Рассмотрим подробнее:
1) Эти логические условия обычно используется для связи таблиц, т.е. в разделе From:
… From Table1 Join Table2 On Table1.column1 = Table2.column1
2) Это типичные условия для раздела Where:
… Where name = ‘Андрей’
3) Это баловство, но такая конструкция тоже используется в рабочих запросах (для эстетики):
… Where 1 = 1
Отсюда следует, что условие вида:
… From Table1
Join Table2 On Table1.column1 = Table2.column1
and Table1.name = ‘Андрей’
Хоть и является синтаксически верным, но в теории может медленнее выполняться, и по сути нарушает логику построения запроса. Если вы еще не эксперт, то так делать не стоит.
Сам знак условия – это один из следующих знаков:
1. = равны
2. <> неравно
3. >= больше или равно
4. <= меньше или равно
5. in значение входит в указанный список
6. is используется только для проверки на Null значение.
Есть еще одна логическая конструкция, но ее будем рассматривать в пункте «Виды запроса»:
7. exists(…) существует
И последняя
8. between … and … от такого-то значения до такого-то
Условий может быть сколько угодно, но между всеми ними должны стоять либо And либо Or. Что нужно понимать: почти всегда используется And. Когда мы выбираем покупку, мы можем сказать продавцу: я хочу смартфон Samsung, и чтобы он был черный, и чтобы диагональ экрана была не меньше 5 дюймов, а объем памяти или 16 или 32.
Получаем запрос:
…
Where model = ‘Samsung’
and Color = ‘Черный’
and DiagonaL > 5
and Obem in (16, 32)
Что нужно знать про Or. Его следует избегать, пока нет четкого понимания.
Там где Or, там и пара скобок ( ).
Например, вместо Самсунга с конкретными характеристиками, если его нет в продаже, мы согласны на любой Philips:
…
Where ( model = ‘Samsung’
and Color = ‘Черный’
and DiagonaL > 5
and Obem in (16, 32) )
or ( model = ‘Philips’ )
Раздел Select. Он изначально создан только для того, чтобы указать какие именно из полей нас интересуют, чтобы визуально не загромождать экран информацией. Если предыдущие разделы команды (From и Where) – это указание серверу что и откуда достать, то раздел Select отвечает за «На сколько красиво и удобно вам это показать» (самая хипстерская команда языка).
Чаще всего красота не важна, важно просто вернуть все данные, для этого есть специальный символ звездочка *
Select * From …
Иначе мы должны перечислить конкретные названия столбцов.
В этом разделе не может быть логических выражений. Простое перечисление столбцов.
Также есть часто используемая опция по устранению дубликатов (т.е. именно визуальному устранению, опять же чисто для наглядности пользователя).
Допустим, есть таблица с графиком уборки квартиры (name, month). Можете поставить своё имя и имя подруги:
Андрей январь
Андрей февраль
Люба март
А нам нужен список жильцов, то мы делаем так:
Select distinct name From Kvartira
Получаем готовый список (без повторения имени):
Андрей
Люба
Осталось добавить, что во всех трех разделах (и в Select, и во From, и в Where) можно вместо существующего столбца использовать вычислимое значение. Обычно оно нужно для наведения «красоты» и не несет логической нагрузки.
Желаем дописать год к месяцу (допустим, в базе хранится только месяц), чтобы было красивее.
Select name, ‘ – ’ + month + ‘ – 2018 г.’ From Kvartira
Результат:
Андрей – январь 2018 г.
Андрей – февраль 2018 г.
Люба – март 2018 г.
В вычислимом значении мы можем для изменения значения столбца или константы использовать: для цифр математические операции сложить (+), вычесть (-), умножить (*), разделить (/), для строк объединение строк (+). Плюсик для чисел и текста выглядит одинаково, но сервер различает их как две разные команды. Программисту об этом думать не нужно.
Раздел Order By. Когда мы определились что, откуда и в какой форме желаем достать, теперь самое время задуматься о сортировке.
Здесь все просто. Всего два момента. Сортировка бывает прямая (от 0 к 9, от А к Я) или обратная (от 9 к 0, от Я к А). По умолчанию считается, что используется прямая сортировка. Задать обратную сортировку можно указав после столбца слово desc.
Второй момент – можно указывать название столбца или же его порядковый номер в таблице – как удобно. И еще важный момент, иногда не упоминаемый в книгах – можно использовать смешанную сортировку:
Select * From Kvartira Order by 1
Андрей январь
Андрей февраль
Люба март
Здесь первая сортировка обратная по первому полю, вторая – прямая по второму полю. Если бы вторую сортировку не указали – строки для Андрея с январем и февралем были бы выведены в случайном порядке.
Select * From Kvartira Order by 1 desc, month
Люба март
Андрей январь
Андрей февраль
Теперь рассмотрим раздел группировок. Group by и если нужно Having.
За простотой синтаксиса здесь скрывается немного не тривиальное назначение этого раздела. Однако продвинутого хипстера такой ерундой не напугать.
Суть: мы указываем одно или несколько полей, по которым группируем избыточность данных, также как с select distinct…, но после того как количество строк уменьшилось (они стали уникальными), мы имеем возможность еще и получить дополнительную информацию по каждой группе: сумма, максимальное, минимальное или среднее значение или просто количество строк в каждой группе.
Функции отвечающие за получение дополнительной информации называются агрегатами, агрегирующими функциями: sum(), max(), min(), avg(), count().
Ниже приведены запросы, демонстрирующие разные цели при использовании разных агрегатов в двух разных секциях запроса.
Select name, min(month), max(month), count(month)
From Kvartira
Group by name
Результат:
Люба март март 1
Андрей февраль январь 2
Чтобы понять использование Having зададим вопрос: Кто убирался больше одного месяца?
Select name, count(month)
From Kvartira
Group by name
Having count(month) > 1
Результат:
Андрей 2
Если вы усвоили вторую беседу, то можете вознаградить себя волшебным латте из любимой кофейни, ведь вы на пути к своей будущей, интересной и ненапряжной профессии. Хотите большего - читайте следующие беседы.
Спасибо, что дочитали до конца! Любите друг друга... и базы данных)
Автор: Щукин Андрей (vk.com/faustonly), Санкт-Петербург. Дата публикации: 22.02.2018