Урок 10: CASE и order BY. Урок 11: числа и еще чутка о select. Таблица «sales»: select * FROM sales;. Таблица «users»: select * FROM users;
Урок 10: CASE и ORDER BY
В этой серии мы с вами поговорим о том, как расширить ключевое слово UPDATE используя выражение CASE, а также вы узнаете, как сортировать вывод команды SELECT в алфавитном порядке.
Начнем с расширения команды UPDATE. Можно использовать для уточнения различных условий выражения CASE. По прежнему я использую БД users_db и давайте посмотрим содержимое моей таблицы в этой БД.
mysql> SELECT * FROM users;
|
|
id
| fnames_list
| lnames_list
| reputation
|
| Peter
| Yan
|
|
| Lola
| Vin
|
|
| Jimmy
| Voode
|
|
| Грег
| Эйтсон
|
|
| Майк
| Гайден
|
|
Итак, что нам нужно сделать? Чтобы выучить выражение CASE, мы можем добавить 1 поле, которое будет называться «ранг пользователя». И в дальнейшем, будем присваивать ему этот ранг.
Давайте же попробуем.
Естественно, нам нужно добавить поле, поэтому мы пишем
mysql> ALTER TABLE users
ADD COLUMN rank VARCHAR(20) NOT NULL;
|
|
id
| fnames_list
| lnames_list
| reputation
| rank
|
| Peter
| Yan
|
|
|
| Lola
| Vin
|
|
|
| Jimmy
| Voode
|
|
|
| Грег
| Эйтсон
|
|
|
| Майк
| Гайден
|
|
|
Сейчас самое время изучить новое расширение команды UPDATE. Чтобы мы делали, если бы не использовали выражение CASE? А очень просто. Мы бы с вами писали выражения такого типа:
mysql> UPDATE users SET rank = 'новичок'
WHERE reputation > 500;
| Нам пришлось бы писать, как минимум, 5 таких команд.
|
Поэтому давайте изучим конструкцию CASE. Итак, поехали.
mysql> UPDATE users SET rank =
CASE
WHEN reputation > 350 THEN 'Элита'
WHEN reputation > 100 THEN 'Популярный'
WHEN reputation > 0 THEN 'Пользователь'
WHEN reputation = 0 THEN 'Новичок'
ELSE 'Нуб'
END;
| Что тут происходит? У нас начинается обработка каждой записи в таблице users, и просматривается репутация. Каждый раз алгоритм ищет, какое-бы значение присвоить полю rank. Смотрит первую запись и видит репутацию 500 и он начинает по всем условиям.
По поводу else: Он нужен, потому что бывают ситуации, когда значение не совпадает ни с одним из условий WHEN.
|
id
| fnames_list
| lnames_list
| reputation
| rank
|
| Peter
| Yan
|
| Элита
|
| Lola
| Vin
|
| Популярный
|
| Jimmy
| Voode
|
| Пользователь
|
| Грег
| Эйтсон
|
| Новичок
|
| Майк
| Гайден
|
| Пользователь
|
Но это еще не все. Теперь рассмотрим сортировку. Иногда это бывает очень полезно, потому что мы часто любим сортировать, особенно это любят делать магазины. Давайте рассмотрим, как это выглядит.
Вывод в алфавитном порядке: ORDER BY поле, поле…;
Вывод в обратном алфавитном порядке: ORDER BY поле, поле… DESC;
Нам нужно вывести имена и репутацию вместе с рангом в алфавитном порядке.
mysql> SELECT fnames_list, reputation, rank FROM users ORDER BY fnames_list;
|
Мы получаем отсортированную по именам таблицу
fnames_list
| reputation
| rank
|
Jimmy
|
| Пользователь
|
Lola
|
| Популярный
|
Peter
|
| Элита
|
Грег
|
| Новичок
|
Майк
|
| Пользователь
|
Но это еще не все. Если мне например, нужно отсортировать в обратном алфавитном порядке, то для этого мы пишем:
mysql> SELECT fnames_list, reputation, rank FROM users ORDER BY reputation DESC;
|
Теперь у нас есть вывод, который отсортирован по репутации.
NB: Порядок сортировки:
NULL, цифры, спецсимволы, текстовые символы
fnames_list
| reputation
| rank
|
Peter
|
| Элита
|
Lola
|
| Популярный
|
Jimmy
|
| Пользователь
|
Майк
|
| Пользователь
|
Грег
|
| Новичок
|
Урок 11: Числа и еще чутка о SELECT
Рассмотрим полезные функции для работы с числами в SQL.
Допустим у нас есть числовая последовательность: 30 31 32 82 999
- SUM(поле) – выводит сумму всех чисел -> 1174
- MIN/MAX(поле) – выводит мин/макс число -> 30/999
- COUNT(поле) – выводит количество записей -> 5
- AVG(поле) – выводит ср. арифметическое -> 234
mysql> USE users_db;
|
|
mysql> SHOW TABLES;
| Tables_in_users_db
| sales
| users
|
|
Таблица «sales»: SELECT * FROM sales;
id
| fnames_list
| lnames_list
| s_product
| price
|
| Петр
| Радько
| Хлеб
|
|
| Петр
| Радько
| Нарезной хлеб
|
|
| Петр
| Радько
| Молоко
|
|
| Николай
| Нивида
| Кола
|
|
| Николай
| Нивида
| Чипсы
|
|
| Аня
| Комарова
| Колбаса
|
|
| Аня
| Комарова
| Арбуз
|
|
| Аня
| Комарова
| Торт
|
|
| Аня
| Комарова
| Жвачка
|
|
Таблица «users»: SELECT * FROM users;
id
| fnames_list
| lnames_list
| reputation
| rank
|
| Peter
| Yan
|
| Элита
|
| Lola
| Vin
|
| Популярный
|
| Jimmy
| Voode
|
| Пользователь
|
| Грег
| Эйтсон
|
| Новичок
|
| Майк
| Гайден
|
| Пользователь
|
mysql> SELECT SUM(price) FROM sales;
| Предположим я хочу узнать, сколько всего заработал денег наш магазин. Для этого нужна функция SUM.
|
mysql> SELECT MAX(price) FROM sales;
| Также вы можете узнать, какой продукт самый дорогой.
|
mysql> SELECT fnames_list, lnames_list, s_product FROM sales
WHERE price = (SELECT MAX(price) FROM sales);
ИЛИ
mysql> SELECT fnames_list, lnames_list, s_product FROM sales
ORDER BY price;
| Мы узнали самый дорогой продукт выше, а какой это продукт???
это бестолковая конструкция, можно сделать проще.
|
Идем дальше…
mysql> SELECT COUNT(price) FROM sales;
| Функция COUNT выведет количество записей нашего поля. Однако, следует отметить, что NULL считаться не будет.
|
mysql> SELECT AVG(price) FROM sales;
|
|
Чтобы совсем закрыть эту тему и перейти к большому количеству таблиц в БД, связанных друг с другом, мы должны пройти парочку оставшихся ключевых слов.
Воспользуйтесь поиском по сайту: