Продолжаем изучать MySQL-запросы. Это вторая часть серии статей для начинающих по запросам MySQL. Здесь будут представлены примеры использования команд, функций и выражений, таких как IN, NOT IN, AS, COUNT, CONCAT, GROUP BY и HAVING.
WHERE — применение IN и NOT IN
Использование IN
— выбираем клиентов из таблицы clients
, у которых возраст равен 30, 40 или 50 лет (например, если вы хотите проверить, у кого из них юбилей):
SELECT * FROM `clients` WHERE `age` IN (30,40,50)
Использование NOT IN
— например выбираем всех клиентов из таблицы clients
, НЕ проживающих в России, Беларуси, Украине:
SELECT * FROM `clients` WHERE `country` NOT IN ("Россия", "Беларусь", "Украина")
Можно использовать еще и вложенные запросы — здесь показан пример, когда нужно выбрать всех клиентов из таблицы clients
, проживающих в странах, входящих в СНГ:
SELECT * FROM `clients` WHERE `country` IN (SELECT `country` FROM `regions` WHERE `name` = "СНГ")
Заметьте, что во вложенном запросе используется уже другая таблица базы данных — regions
.
Для условий IN
и NOT IN
должны использоваться только значения столбцов таблиц (или просто какие-то конкретные значения), но никак не имена столбцов!
CONCAT — склеивание (конкатенация) значений в одну строку
Функция CONCAT
нередко применяется в команде SELECT
, и с ее помощью можно получить одну строку из нескольких значений, либо из обычных текстовых строк, либо полученных из значений столбцов, либо комбинируя оба варианта. Вот несколько MySQL-запросов для примера:
SELECT id, CONCAT(name, ' из ', city) AS NAME, `country` FROM `clients`;
этот запрос нам вернет примерно такие строки:
*----------------------------------* | id | name | country | *----------------------------------* | 123 | Иванов из Москвы | Россия | | 124 | Петров из Самары | Россия | *----------------------------------*
SELECT CONCAT('Сотрудник', ' ', 'Петров', ' ', 'вернулся из', ' ', 'командировки');
этот MySQL-запрос вернет нам такую строку:
Сотрудник Петров вернулся из командировки
Однако при использовании функции CONCAT
следует помнить, что если в ее параметрах попадет хотя бы одно значение NULL
, то функция вернет только NULL (то есть ничего), причем независимо от того, каким по порядку был параметр, равный значению NULL
. Следующий запрос вернет значение NULL
, а не строку:
SELECT CONCAT('Сотрудник', NULL, 'вернулся из', ' ', 'командировки');
И еще, числовые параметры, передаваемые функции CONCAT
без кавычек автоматически преобразуются в строки:
SELECT CONCAT(100, '500', 9); SELECT CONCAT(5.99);
эти запросы вернут строковые значения «1005009» и «5.99» соответственно.
Использование функции COUNT()
Функция COUNT() используется для подсчета количества записей в таблице базы данных. Например, чтобы узнать количество всех строк из таблицы clients
, достаточно выполнить такой запрос:
SELECT COUNT(*) FROM clients;
Применение функции COUNT() совместно с командой группирования GROUP BY
В этом примере мы применим группировку записей по странам при помощи команды GROUP BY
, чтобы получить из таблицы clients
количество клиентов в каждой стране:
SELECT country, COUNT(*) FROM clients GROUP BY country;
Результат будет примерно таким:
*----------------------* | country | COUNT(*) | *----------------------* | Россия | 50 | | Беларусь | 23 | | Казахстан | 31 | *----------------------*
Совместно с командой GROUP BY
можно применять не только функцию COUNT(*)
, но и другие схожие по назначению функции. Например следующий SQL-запрос подсчитает средний возраст клиентов, сгруппированный по полу:
SELECT sex, AVG(age) FROM clients GROUP BY sex;
Результат получим примерно такой:
*--------------------* | sex | AVG(age) | *--------------------* | мужчина | 28 | | женщина | 25 | *--------------------*
Использование выражения HAVING вместе с GROUP BY
Выражение HAVING
используется для определения условия, решающего какие строки будут выводиться в результат запроса, а какие нет. Как пример, следующий SQL-запрос выдаст нам количество клиентов в каждой стране, но только в тех странах, где количество клиентов больше 10:
SELECT country, COUNT(*) AS CNT FROM clients GROUP BY country HAVING CNT > 10
Имейте ввиду, что выражение HAVING
должно быть расположено только после всех выражений GROUP BY, но ни в коем случае не должно использоваться вместо WHERE
.
Определение псевдонимов, используя «AS»
Имена столбцов таблиц базы данных можно заменять собственными псевдонимами, используя для этого ключевое слово AS
и придуманное вами собственное имя. Вот пример применения псевдонимов и ключевого слова AS
:
SELECT clientname AS name, country AS strana, age AS vozrast FROM clients
В результате запроса мы получим такие заголовки столбцов:
*----------------------------* | name | strana | vozrast | *----------------------------* | Иван | Россия | 35 | | Серж | Франция | 44 | *----------------------------*
Использование псевдонимов применяется очень часто, например, чтобы сократить длину строки запроса, заменить в результатах запроса имена столбцов на более удобные для чтения и т.д.
—
На этом вторая часть обзора SQL запросов для новичков завершается. Продолжение следует.
Другие статьи из этой серии:
Первая часть
Третья часть
Четвертая часть
Хорошее продолжение статей для начинающих изучать MySql. Сам я в мускуле не силен, в основном специализируюсь на T-SQL. Было бы интересно почитать, как в MySql реализованы такие возможности sql, как join (если они конечно есть). С удовольствием почитаю следующую статью.
Из вашей второй статьи я понял, что надо более подробно изучить MySql, я раньше и не думал, что это может быть интересной темой. У меня с MySql были просто сбои, я базу данных рассматривал поверхностно, на уровне пользователя.
Интересная тема! Скажите, если насчет чистки базы от мусора, так выражусь, я поставил плагин WP-OPTIMIZE, он также отлично оптимизирует базу данных!? Вы знакомы с этим плагином?
Знаком с этим плагином, он вполне нормально и адекватно работает, но сам я не пользуюсь плагинами для оптимизации баз данных, а использую свои скрипты и запросы для разных манипуляций с БД.
Добрый день! Я вообщем попробовал вроде все получилось. Хотя раньше были сбои и я впервые попробовал. Спасибо Я буду следить за Вашими статьями!
Только прочитал этот пост, и могу сразу сказать о полезности этой информации, теперь для меня решены многие вопросы.
И ведь мало того, что ничего не теряете, так еще и приобретаете.