Запрос MySQL SELECT. Описание, применение и функции
MySQL select самая востребованная конструкция языка SQL во всех его диалектах на всех вычислительных платформах и операционных системах. Умение правильно формулировать мысли на SQL упрощает мышление, придаёт ему системность и логичность.
MySQL select – это не обязательно реальный запрос. Это может быть вычисление арифметического выражения или формирование значения переменной. MySQL не ограничивает разработчика в том, как использовать конструкции языка SQL. Он предлагает только синтаксис и функционал.
Формальный синтаксис конструкции SELECT
Практически все источники о MySQL select декларируют официальный синтаксис. Принято все ключевые слова языка SQL писать заглавными буквами, но это не является общим правилом. Кому как нравится, но очень важно понимать: редко смесь строчных и прописных букв приводит к правильному результату.
Чёткость и строгое соблюдение синтаксиса (1) – самое важное условие правильного, безопасного и надёжного программирования, стабильная работоспособность кода. В отношении MySQL, который допускает (2) использование букв любого регистра, важно понимать:
- select distinct `first_name` from `ex_workers` where `first_name` like '%иго%'"
- select distinct `first_name` from `ex_workers` where `First_name` like '%иго%'"
– это не одно и то же. Если писать ключевые слова можно так, как заблагорассудится, то вольности в изменении имен таблиц и переменных в одном запросе могут создать серьёзные проблемы.
Практичный синтаксис, простые таблицы
Вариант синтаксиса (2) – это реальная практика, которая оформляет любой запрос в виде процедуры, в которую поступает только:
- что нужно выбрать;
- откуда выбрать;
- на каком условии.
Результат процедуры (в данном случае: iLineSel) – обычный массив всех выбранных строк. Этот синтаксис – частность, но далеко не всегда нужны группировки, сортировки и сложные объединения по join.
Чем проще таблицы в базе данных, тем проще и быстрее работает MySQL query select. Чем чаще используется join, чем больше условий в одном запросе, тем хуже. Ситуация особенно усложняется, если запрос направлен на несколько больших таблиц.
Если запрос сформулирован правильно, MySQL select сработает как надо. Но сколько это займёт времени? Посетитель сайта может не дождаться результата. Нужно не только знать, что сказать, но и оценить,3 сколько времени займёт ответ!
Правильный запрос и учёт кодировки
Прежде чем сказать, что MySQL плох и обнаружен очередной баг, следует проверить формулировку запроса, правильность алгоритма и кодировку символов.
История и блестящая практика показывает, что MySQL в 99% случаев – это идеальный инструмент для успешной работы с информацией. Если что-то не даёт нужного результата, значит где-то допущена ошибка. Внимательно проверив содержание запроса, убедившись в том, что кодировка страницы правильная, можно попытаться переформулировать запрос.
При работе с MySQL никогда не следует забывать, что кодировка, локализация и условия хостинга могут быть разные. Хорошая практика: всегда проверять рабочую среду перед тем, как приступать к работе.
Простейшие конструкции SQL
Редко, когда разработчик решит использовать MySQL как арифмометр, но общая логика программирования соблюдена: PHP & MySQL select одинаково выполнят выражение:
- 1 + 2 * 3.
Значение result будет 7. Приоритеты операций и логика операций языка MySQL выполнена по общим правилам программирования. Это касается и выражений, и условий.
В данном примере в секции 1 приведено арифметическое выражение в конструкции MySQL select, а в секции 2 три массива, из которых случайным образом построена таблица сотрудников компании:
Имя, фамилия и должность сотрудника формировались случайным образом из массивов доступных имен, фамилий и должностей. Время принятия на работу и время прихода на работу умышленно записаны с ошибками:
- синтаксическими;
- смысловыми.
На данном наборе записей допустимы следующие простейшие запросы:
- select `first_name`, `last_name`, `w_status` from `ex_workers`;
- select distinct `w_status` from `ex_workers`;
- select distinct `start_timestamp` from `ex_workers` where `start_timestamp`!= '0000-00-00 00:00:00';
- select distinct `start_timestamp` from `ex_workers` where (`start_timestamp`!= '0000-00-00 00:00:00') and start_timestamp > '2017-12-05 09:00:00'.
Первый запрос формирует список всех сотрудников компании. Естественно, результат этого запроса будет содержать всё количество записей таблицы.
Второй запрос выбирает все действующие должности на предприятии, используя ключевое слово 'distinct', чтобы в выборке не было дубликатов.
Третий запрос выбирает все правильные даты о приёме на работу, то есть такие, которые содержат реальную информацию, а не нули.
Четвёртый запрос позволяет определить, что только две записи в таблице имеют смысл, то есть в них содержится информация, заполненная в рабочее время. Но в данном конкретном четвёртом запросе этот смысл не учитывает количества удовлетворяющих ему сотрудников: на самом деле правильных записей четыре.
Построение правильных запросов
Логика построения запросов развивается в процессе их разработки. Трудно сразу сформулировать правильное решение. В частности, таблица может содержать записи о сотрудниках, но если дата приёма на работу не верна, то, скорее всего, она была внесена некорректно.
Если дата приёма человека на работу – это ночное время, выходной день или, в общем случае, она была создана во внерабочее время, то она ошибочна или таблица была подвержена вирусной атаке.
На основании сказанного правильно было бы составить такой запрос:
Этот запрос также не идеал, можно предусмотреть время обеда отдела кадров, время окончания рабочего дня. Но важна здесь вовсе не правильность запроса на выборку текущего состояния штатного расписания, а функционал его формирования.
В данном случае ошибки на этапе проектирования таблицы штатного расписания вынуждают разработчика составлять сложные и непонятные запросы.
В реальной практике крайне редко конструкция MySQL query select # from * where & будет содержать в позиции "#" должность, в позиции "*" только одну таблицу, а в условии "&" проверку рабочего времени. Всё это нонсенс, такого принципиально быть не должно. Все должности – это отдельная таблица, все записи всегда содержат правильную дату приёма на работу.
Правильная база данных, правильные запросы
Конструкция select может быть использована для определения используемой базы данных. В результате исполнения запроса MySQL "select database()" будет получено имя текущей базы данных.
Обычная практика – база данных проектируется таким образом, чтобы:
- обеспечить безопасное хранение и эффективное использование данных;
- сформировать систематизированное представление о структуре информации;
- обеспечить простой доступ к данным, универсальную конструкцию по всем запросам.
Это не единственные критерии, но даже их соблюдение позволит построить хорошее приложение, стабильно работающий веб-ресурс.
Хорошее правило: прежде чем начинать работу, проверить рабочую среду и состояние базы данных.
При использовании систем управления сайтами это важно. Например, можно очистить кэш или просмотреть, сколько пользователей уже работают с сайтом и перестроить запросы с целью их оптимизации. Интересным решением может быть динамика запроса, когда в MySQL select table – это переменная. В любом случае query – это строка символов. Но нет никакой причины делать эту строку статичной.
Если структура запроса формируется в процессе работы веб-ресурса, это позволяет динамично переключать таблицы. Например, посетители сайта начинают работу с одним комплектом таблиц базы данных, а после регистрации продолжают на другом. Динамика запроса позволяет оптимизировать работу сервера MySQL.
Запросы с сортировкой записей
Сортировка сортировке рознь, особенно, когда речь идёт о русском языке. Но иногда удобно использовать функционал языка PHP над MySQL select order by. Идеально, когда в результате запроса получается финальный результат, не требующий доработки конструкциями PHP, но обычно основная выборка сопровождается оформлением страницы, которое вынуждает разработчика уточнять содержимое управляющих элементов.
Например, выбрав штатное расписание, сайт должен предоставить администратору ресурса один функционал, работнику отдела кадров другой, а самому работнику третий. В первом случае, администратор анализирует и контролирует компанию в части ее социальной составляющей, во втором случае допускаются только операции изменения и добавления записей (сотрудников). В третьем случае сотрудник работает со своим планом: отмечает исполненное и планирует, что делать дальше.
Основной запрос требует адекватного исполнения вспомогательных запросов в контексте того, по какой причине он был исполнен.
Во всех случаях сортировка order by позволяет держать все записи в конкретном порядке. Это важно всегда, поскольку ускоряет процесс ориентации в сотрудниках, в задачах, в датах исполнения работ.
Обычно наименования должностей очень редко меняются, и их можно записать в сортированном порядке изначально. При изменении списка должностей можно однократно пересортировать его и внести изменения в штатное расписание, поскольку поменяется порядок ключей.
В этом контексте потребность сортировки остаётся только на тех таблицах, которые меняются динамически в процессе работы.
Запросы с группировкой записей
Группировка записей часто не менее важна, чем сортировка, но иногда это взаимоисключающие операции.
Группировку выгодно использовать для целей подсчёта записей, их систематизации, анализа. Например, можно использовать конструкцию group by для запросов типа MySQL select users, clients, visits, open pages. Это может работать в целях безопасности для предотвращения несанкционированного подключения или мониторинга рабочих процессов компании.
Условие запроса: идеально, когда его нет
Так уж сложилось, конструкция MySQL select & where – единое целое. Хотя при использовании различных вариантов объединения таблиц посредством join его вовсе может и не быть.
Но к тому, что where – неизменная составляющая всех MySQL select, начинающий разработчик начинает привыкать с самого начала. Примеры учат, нужно знать:
- что выбирается;
- из какой таблицы;
- по какому критерию.
Только после этого начинается обучение новобранца основам левого и правого объединения таблиц, логике мудрёного сленга: эта таблица сидит на вот этой, а данные выбирает вообще из третьего источника.
Практика – это всегда просто. Если база данных так построена, что без объединения (join) таблиц никак не получается составить запрос, то что-то в базе сделано не так. Если нужны условия за пределами task = 'value' или var > 0, то есть необходимы более сложные условные конструкции – это повод пересмотреть концепцию базы и логику необходимого спектра запросов к ней.
Нельзя рассматривать строительство базы данных вне запросов к ней. База данных – это информационная структура, забота которой отвечать на вопросы (запросы) максимально быстро и просто.
Объекты базы данных и запросы к ней
Реляционные отношения – это вполне конкретная структура базы данных и представление о запросах к ней. Если этот привычный концепт немного изменить: есть объекты (не таблицы) и есть методы объектов (свойства, а не запросы), то реляционные отношения и собственно запросы исчезают в телах объектов.
Так, штатное расписание – объект, взаимодействующий с объектами:
- сотрудник;
- должность;
- рабочее задание.
Сотрудник может быть директором, администратором, работником. Для штатного расписания это имеет значение, но в пределах соответствующего экземпляра объекта сотрудник. Аналогично, объект должность может быть совершенно любым. Но в выборке штатного расписания он будет строкой символов, а в контексте работы администратора он будет селектором для выборки нужной должности из числа доступных.
Строгое следование правилам синтаксиса MySQL select – хорошее правило: практично, безопасно, эффективно. Но если ограничиться его применением на уровне каждого объекта базы данных, а работать непосредственно с этими объектами по их методам (их правилам) эффективность повысится во много раз.