MySQL SELECT, выборка из таблиц MySQL


SELECT является самым популярным запросом к серверу баз данных. На SELECT-ы в веб-проектах часто приходится до 90% всех запросов потому, что многие пользовательские действие с информацией на сайте предполагают запросы к БД. Обновляется и удаляется информация значительно реже. В MySQL SELECT — это выборка из таблиц MySQL и представление результатов пользователю.

Такие запросы чаще всего приходится оптимизировать.


Цикл по принципам работы с MySQL, более ранние материалы:

  1. Вводная статья цикла
  2. Начало работы с MySQL и основные команды

Все SELECT запросы строятся по одному шаблону:


выборка из таблиц MySQL


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



Продолжаем работать с базой данных REAL_ESTATE_AGENCY и первой таблицей REAL_ESTATE.



Уже приводившаяся команда со * выведет все содержимое таблицы:

SELECT * FROM REAL_ESTATE;



Теперь немного усложним запрос добавив условие, по которому производится выборка. В частности выведем все записи для которых в качестве значения колонки city задано Moskow

SELECT * FROM REAL_ESTATE WHERE city='Moskow';

+————+———+————+————+————-+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+———+————+————+————-+————+——-+
| Appartment | Moskow | 56 | Center | Tverskaya | Rent | 50000 |
| Appartment | Moskow | 42 | Himki | Bolshaya | Rent | 18000 |
| Appartment | Moskow | 36 | Hamovniki | Sportivnaya | Rent | 15000 |
+————+———+————+————+————-+————+——-+
3 rows in set (0.00 sec)



На этом этапе замечаем, что в названии российской столицы опечатка — обновляем значение трех записей, затем продолжаем разбираться с SELECT запросами

UPDATE REAL_ESTATE SET city='Moscow' WHERE city='Moskow';

Query OK, 3 rows affected (0.01 sec)
Rows matched: 3 Changed: 3 Warnings: 0



SELECT * FROM REAL_ESTATE WHERE city='Moscow';

+————+———+————+————+————-+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+———+————+————+————-+————+——-+
| Appartment | Moscow | 56 | Center | Tverskaya | Rent | 50000 |
| Appartment | Moscow | 42 | Himki | Bolshaya | Rent | 18000 |
| Appartment | Moscow | 36 | Hamovniki | Sportivnaya | Rent | 15000 |
+————+———+————+————+————-+————+——-+
3 rows in set (0.00 sec)



Операторы AND и OR  в запросах SELECT, которыми производится выборка из таблиц MySQL


Выборка из таблиц MySQL выполняется по условиям, которые  могут быть простыми как в примере выше или могут состоять из нескольких частей.



Может проверяться как полное соответствие значению в ячейке таблицы, так и численное значение в представлении больше/меньше/равно и их комбинации

SELECT * FROM REAL_ESTATE WHERE rentorsale='Rent' and PRICE >='25000';

+————+———+————+———-+————+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+———+————+———-+————+————+——-+
| Appartment | Moscow | 56 | Center | Tverskaya | Rent | 50000 |
+————+———+————+———-+————+————+——-+
1 row in set (0.00 sec)



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



Усложним запрос добавив в подходящие нам результаты объекты, в поле 'PRICE' для которых указано 15000, также ограничимся городом Краснодаром.

SELECT * FROM REAL_ESTATE WHERE rentorsale='Rent' AND (PRICE >='25000' OR PRICE ='15000') AND city='Krasnodar';

+————+————+————+————+————+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+————+————+————+————+————+——-+
| Appartment | Krasnodar | 44 | Leninskiy | Atamannaya | Rent | 15000 |
+————+————+————+————+————+————+——-+
1 row in set (0.00 sec)



Объекты выборки в MySQL


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



Для примера получим площадь квартиры в Краснодаре, которая сдается в аренду и стоимость в базе для которой равна 15000 или больше 25000.

SELECT floorspace FROM REAL_ESTATE WHERE rentorsale='Rent' AND (PRICE >='25000' OR PRICE ='15000') AND city='Krasnodar';

+————+
| floorspace |
+————+
| 44 |
+————+
1 row in set (0.00 sec)



Здесь также допустимо любое количество значений — выберем по тем же условиям площадь объекта недвижимости и улицу, на которой он расположен

SELECT floorspace, street FROM REAL_ESTATE WHERE rentorsale='Rent' AND (PRICE >='25000' OR PRICE ='15000') AND city='Krasnodar';

+————+————+
| floorspace | street |
+————+————+
| 44 | Atamannaya |
+————+————+
1 row in set (0.00 sec)



 SELECT DISTINCT и выборка из таблиц MySQL


Часто возникает необходимость избавится от дублирующихся значений в результатах, дубли могут появиться например в результате такого запроса

SELECT floorspace FROM REAL_ESTATE WHERE city='Yekaterinburg' AND PRICE ='15000';

+————+
| floorspace |
+————+
| 44 |
| 44 |
+————+
2 rows in set (0.00 sec)



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


Чтобы избавиться от дублей нужно использовать DISTINCT, с которым SELECT будет работать до первого найденного совпадения

SELECT DISTINCT floorspace FROM REAL_ESTATE WHERE city='Yekaterinburg' AND PRICE ='15000';

+————+
| floorspace |
+————+
| 44 |
+————+
1 row in set (0.00 sec)



Сортировка при выборке из таблиц


Сортировка в MySQL производится при помощи директивы ORDER BY

SELECT * FROM REAL_ESTATE WHERE city='Moscow' ORDER BY PRICE;

+————+———+————+————+————-+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+———+————+————+————-+————+——-+
| Appartment | Moscow | 36 | Hamovniki | Sportivnaya | Rent | 15000 |
| Appartment | Moscow | 42 | Himki | Bolshaya | Rent | 18000 |
| Appartment | Moscow | 56 | Center | Tverskaya | Rent | 50000 |
+————+———+————+————+————-+————+——-+
3 rows in set (0.00 sec)


По умолчанию производится сортировка по возрастанию



Добавив в запрос DESC можно получить сортировку по возрастанию

SELECT * FROM REAL_ESTATE WHERE city='Moscow' ORDER BY PRICE DESC;

+————+———+————+————+————-+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+———+————+————+————-+————+——-+
| Appartment | Moscow | 56 | Center | Tverskaya | Rent | 50000 |
| Appartment | Moscow | 42 | Himki | Bolshaya | Rent | 18000 |
| Appartment | Moscow | 36 | Hamovniki | Sportivnaya | Rent | 15000 |
+————+———+————+————+————-+————+——-+
3 rows in set (0.00 sec)



Шаблоны в запросах на выборку данных


Выборка из таблиц MySQL часто требует не точного совпадения, а совпадения по определенной маске


Поиск частичного совпадения производится SELECT запросом с оператором LIKE

SELECT * FROM REAL_ESTATE WHERE street LIKE 'B%';

+————+————-+————+————-+————+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+————-+————+————-+————+————+——-+
| Appartment | Novosibirsk | 33 | Oktabriskiy | Belinskogo | Rent | 17000 |
| Appartment | Moscow | 42 | Himki | Bolshaya | Rent | 18000 |
+————+————-+————+————-+————+————+——-+
2 rows in set (0.00 sec)



LIKE может работать с регулярными выражениями, в качестве любого количества символов используется '%', для одного произвольного символа '_'

SELECT * FROM REAL_ESTATE WHERE street LIKE 'B_l_n%';

+————+————-+————+————-+————+————+——-+
| type | city | floorspace | district | street | rentorsale | PRICE |
+————+————-+————+————-+————+————+——-+
| Appartment | Novosibirsk | 33 | Oktabriskiy | Belinskogo | Rent | 17000 |
+————+————-+————+————-+————+————+——-+
1 row in set (0.00 sec)



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

Сказать спасибо