MySQL запросы для начинающих — часть третья

Представляю вам третью часть серии статей для начинающих по SQL запросам к базам данных MySQL. В этой части будут рассмотрены примеры команд, использование функций и выражений, таких как ORDER BY, LIMIT, DISTINCT, LEFT JOIN и другие.
MySQL запросы для начинающих — часть третья

ORDER BY — сортировка записей

Выражение ORDER BY позволяет сортировать результаты SQL-запроса. Например следующий запрос выведет значения для всех клиентов, отсортированных по имени (по столбцу `name`):

SELECT * FROM clients ORDER BY name;
или 
SELECT * FROM clients ORDER BY name ASC;

По умолчанию сортировка производится в порядке возрастания, поэтому параметр ASC можно не указывать. Например в нашем случае первыми будут выведены клиенты, чьи имена начинаются с буквы «A», а последними будут начинающиеся с буквы «Z».

Если требуется сортировка по убыванию, то к запросу нужно добавить параметр DESC:

SELECT * FROM clients ORDER BY name DESC;

Также можно упорядочивать (сортировать) записи по нескольким столбцам таблицы, например так:

SELECT * FROM clients ORDER BY name, age DESC;

LIMIT — ограничение количества выводимых записей

Для того, чтобы в результаты SQL-запроса попали не все записи, а только ограниченное их количество, нужно использовать выражение LIMIT. Формат выражения LIMIT следующий:

LIMIT порядковый_номер_стартовой_записи, количество_выводимых_записей

Имейте ввиду, что нумерация записей (строк) в таблицах MySQL начинается с «0». В этом примере результатом запроса будут 5 самых первых строк таблицы:

SELECT * FROM clients LIMIT 0,5;

и то же самое будет, если первый параметр выражения LIMIT пропущен:

SELECT * FROM clients LIMIT 5;

А вот уже в этом примере в результат попадут 5 строк таблицы, начиная с третьей (т.к. нумерация начинается с «0»):

SELECT * FROM clients LIMIT 2,5;

Есть еще один способ ограничения количества выводимых записей с использованием OFFSET (смещение). Формат для этого используется такой:

LIMIT количество_записей OFFSET начальная_запись

Следующий SQL-запрос выведет пять записей из таблицы clients начиная со второй по счету (не забываем, что нумерация записей начинается с «0»):

SELECT * FROM clients LIMIT 5 OFFSET 1

DISTINCT — уникальные значения в столбце таблицы

Для того, чтобы получить только уникальные (не повторяющиеся) значения из столбца таблицы, нужно использовать запрос с параметром DISTINCT:

SELECT DISTINCT name FROM clients;

Этот запрос выведет только уникальные имена клиентов из столбца name таблицы clients (имена в полученном списке повторяться не будут).

Функция SUM()

Для того, чтобы вычислить сумму всех численных значений из столбца таблицы, нужно использовать функцию SUM():

SELECT SUM(cost) FROM clients WHERE country = 'Россия';

Данный SQL запрос выдаст нам общую сумму стоимости всех товаров, купленных клиентами из России.

Функция AVG()

Для того, чтобы получить среднее значение численных значений столбца, используйте функцию AVG():

SELECT country, AVG(age) FROM clients GROUP BY country;

Этот запрос выведет список стран и средний возраст клиентов для каждой из них, и результат будет примерно такой:

+------------+----------+
| country    | avg(age) |
+------------+----------+
| Россия     | 37       |
| Беларусь   | 32       |
| Казахстан  | 34       |
+------------+----------+

SELECT внутри SELECT

Нередко встречаются запросы, выполняемые командой SELECT, внутри которых выполняется еще один запрос (или несколько запросов) с использованием той же команды SELECT:

SELECT DISTINCT cl FROM tl WHERE tl.cl IN (SELECT cl FROM t2);

В этом примере запрос должен выбрать уникальные значения столбца cl из таблицы t1, но только те значения, которые будут присутствовать в списке результатов вложенного запроса (SELECT cl FROM t2). Заметьте, что вложенный SELECT-запрос делает выборку уже из другой таблицы t2.

Не забывайте, что все вложенные запросы (подзапросы) всегда должны быть заключены в круглые скобки.

LEFT JOIN в команде SELECT

LEFT JOIN используется с целью соединения двух таблиц для последующей обработки связанных данных, например:

SELECT tl.* FROM tl LEFT JOIN t2 ON tl.cost=t2.cost WHERE t2.cost > 999;

Этот SQL-запрос находит все строки таблицы tl, но только те, для которых связанные значения столбца cost из таблицы t2 больше 999. Обе таблицы связаны в данном примере по столбцу cost.

Нередко можно встретить запись вида LEFT OUTER JOIN для соединения таблиц. В обоих вариантах важен порядок таблиц для оператора, поскольку оператор является НЕ-симметричным, из-за указания слова LEFT. В результат выполнения запроса попадут объединенные заголовки соединяемых таблиц. Рассмотрим еще один пример:

SELECT * FROM `Clients` LEFT OUTER JOIN `Region` ON Clients.RegionId = Region.Id

При выполнении этого SQL запроса в результат попадут записи из обоих таблиц, которые удовлетворяют условию ON, а затем из левой таблицы еще добавятся те записи, которые не попали под условие ранее, но уже для этих (добавляемых) записей поля, которые соответствуют полям из правой таблицы, будут иметь значения NULL. Вот таким примерно будет результат:

+--------------+------------------+-----------+-------------+
| Clients.Name | Clients.RegionId | Region.Id | Region.Name |
+--------------+------------------+-----------+-------------+
| Иванов       | 1                | 1         | Москва      |
| Петров       | 2                | 2         | Хабаровск   |
| Сидоров      | 1                | 1         | Москва      |
| Титов        | 5                | NULL      | NULL        |
+--------------+------------------+-----------+-------------+

Выбор случайных записей из таблицы

При помощи функции RAND() и выражения сортировки ORDER BY можно выбирать из таблицы строки случайным образом. Например, каждый раз этот запрос будет возвращать одну строку, выбранную из таблицы clients случайным образом (при большом количестве записей в таблице clients в большинстве случаев будут возвращаться абсолютно разные строки):

SELECT * FROM clients ORDER BY RAND() LIMIT 1

Можно немного усилить уникальность генерации случайных чисел (порядковых номеров строк таблицы) и добавить в функцию RAND() параметр, «случайное» начальное значение, например функцию получения даты и времени NOW():

SELECT * FROM clients ORDER BY RAND(NOW()) LIMIT 1

Запись результатов SQL запроса в файл

Результаты выполнения SQL-запросов можно сохранять в файле. Для этого используется команда INTO OUTFILE:

SELECT * INTO OUTFILE '/tmp/clients-res.log' FROM clients;

В результате выполнения приведенного в пример запроса будет создан файл ‘/tmp/clients-res.log’, в котором будет примерно следующее содержимое:

1   Иванов   Москва   25
2   Петров   Самара   55
3   Сидоров  Омск     33 \N

На UNIX-сервере этот файл можно открыть для просмотра например такой командой:

# cat /tmp/clients-res.log

Есть еще вариант для вывода в файл, когда значения столбцов в строках будут разделаться заранее определяемым символом. Это достигается применением выражения FIELDS TERMINATED BY:

SELECT * INTO OUTFILE '/tmp/clients-res.log' FIELDS TERMINATED BY ',' FROM clients;

Результат выполнения этого запроса будет записан в файл так, что значения в строках будукт разделяться запятыми:

1,Иванов,Москва,25
2,Петров,Самара,55
3,Сидоров,Омск,33 \N


Третья часть обзора MySQL запросов для новичков на этом завершается. Продолжение следует.
Предыдущие статьи из этой серии:
Первая часть
Вторая часть
Четвертая часть

Метки: EXPLAIN, Left Join, mysql, ORDER BY, база данных, запросы

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

14 комментариев к “MySQL запросы для начинающих — часть третья”

  1. Алексей:

    Здравствуйте! Я модератор группы на subscribe «Простые советы для начинающих веб-мастеров«. Попал на ваш блог, он достоин уважения. Сам не занимаюсь MySQL, но речь не об этом.

    Я буду читать ваш блог, так как можно многое почерпнуть от Ваших статей. Приходите ко мне на блог, может тоже, что-то интересное возьмете.

    Следуйте правилам группы и возможно мы сработаемся.

    Ответить
    • Александр:

      Спасибо я дочитал Ваши посты по SQL, познавательно.
      Алексей, мне Ваш блог так же понравился, спасибо!

      Ответить
  2. Василий:

    Хорошо описаны команды для работы с базами, скажите мне пожалуйста, как и для чего на практике они мне нужны будут? Благодарю!

    Ответить
    • Василий, примеры применения многих из этих команд могут понадобиться, если вы захотите самостоятельно что-то делать с таблицами БД или писать скрипты, обрабатывающие различную информацию из базы данных.

      Ответить
      • Василий:

        Благодарю Владимир, теперь понятно)
        Информацию принял, но пока наверное некуда мне ее внедрять. У вас много полезной информации на сайте, которую я смогу применить.

        Ответить
  3. Андрис:

    До ваших статей по MySQL я просто считал, что MySQL — это база данных, где хранится информация о сайте. Лишний раз влезать в нее я не собирался, просто старался не забывать делать бекап, хотя бы раз в неделю. Теперь я вижу, что MySQL сложнее, чем я о ней думал и стоит более пристального изучения!

    Ответить
  4. Developer:

    Здравствуйте! Интересный для новичка пост. От себе хочу добавить, что в MySQL в подзапросах нельзя использовать limit — сам на этот камень напоролся при оптимизации своих кодов. Например:
    select * from post where in (select post_id from cat limit 2);
    приведет к ошибке.

    Ответить
  5. Юрий:

    А какие книги вы можете рекомендовать прочитать для изучения MySQL выше уровня «начинающий»?

    Ответить
    • Из свежих изданий я бы порекомендовал книгу «Руководство по MySQL» 2013г. (авторы: Сейед Тахагхогхи, Хью Вильямс). Ну а для высоко-профессионального уровня по моему мнению лучше использовать сам сайт MySQL ну и соответствующие русско-язычные ресурсы. В книгах ведь все новшества появляются весьма с большим опозданием.

      Ответить
  6. Позитив:

    А почему везде select * ??? Лучшеб сразу учили делать определенный выборки, например select id from /…

    Ответить
    • Ну почему же «везде»? Для DISTINCT и функции AVG() примеры как раз с указанием имен столбцов :)

      Ответить
  7. Вано:

    Да, уж. Я вот только начал изучать все премудрости сайтостроения. MySQL что-то мне так тяжело дается. за книжку «Руководство по MySQL» 2013г. спасибо, уже нашел, буду читать.

    Ответить
  8. Кирилл:

    Сам только начинаю осваивать WordPress и создание СДЛ. Время свободное есть. Буду учить и MySQL чтоб потом не платить фрилансерам=)

    Ответить
  9. Feanor184:

    Встал тут вопрос, может ли команда INTO OUTFILE: — записывать в файл на примонтированном диске или на FTP ресурс ( например по //test1/test2/ )?

    Ответить

Оставить комментарий

Уважаемые посетители, пожалуйста, пишите осмысленные и исчерпывающие комментарии. Короткие фразы типа «спасибо автору», «возьму на заметку», «мне помогло» и т.п. будут удаляться. Исключение, когда Вы отвечаете на чей-то вопрос или благодарите за помощь.

Ссылки на Ваш сайт получат статус DoFollow после третьего комментария.

Для вставки кода в комментарии можно использовать BB-коды:
[text] [/text], [php] [/php], [html] [/html]

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

4remind.ru - персональный блог вебмастера



Наверх
Наверх