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

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

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

 

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

 

MySQL SELECT, выборка из таблиц 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 выполняется по условиям, которые  могут быть простыми как в примере выше или могут состоять из нескольких частей. Может проверяться как полное соответствие значению в ячейке таблицы, так и численное значение в представлении «больше»/»меньше»/»равно» и их комбинации

 

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 будут рассмотрены в следующем материале из цикла. Они используются не менее редко, чем шаблоны