From 4389521449f006b5a3b28f09d8ecb1d64fdcf12e Mon Sep 17 00:00:00 2001 From: mikirzh Date: Fri, 24 Apr 2020 23:32:59 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=97=20=D0=BA=205=20=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HoweWork_Lesson-5.sql | 133 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 HoweWork_Lesson-5.sql diff --git a/HoweWork_Lesson-5.sql b/HoweWork_Lesson-5.sql new file mode 100644 index 0000000..1e61499 --- /dev/null +++ b/HoweWork_Lesson-5.sql @@ -0,0 +1,133 @@ +-- Пусть в таблице users поля created_at и updated_at оказались незаполненными. +-- Заполните их текущими датой и временем. + +DROP TABLE IF EXISTS users; +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) COMMENT 'Имя покупателя', + birthday_at DATE COMMENT 'Дата рождения', + created_at DATETIME, + updated_at DATETIME +) COMMENT = 'Покупатели'; + +INSERT INTO + users (name, birthday_at, created_at, updated_at) +VALUES + ('Геннадий', '1990-10-05', NULL, NULL), + ('Наталья', '1984-11-12', NULL, NULL), + ('Александр', '1985-05-20', NULL, NULL), + ('Сергей', '1988-02-14', NULL, NULL), + ('Иван', '1998-01-12', NULL, NULL), + ('Мария', '2006-08-29', NULL, NULL); + +UPDATE + users +SET + created_at = NOW(), + updated_at = NOW(); + + +-- Таблица users была неудачно спроектирована. +-- Записи created_at и updated_at были заданы типом VARCHAR и в них долгое время помещались +-- значения в формате "20.10.2017 8:10". +-- Необходимо преобразовать поля к типу DATETIME, сохранив введеные ранее значения. + + DROP TABLE IF EXISTS users; +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) COMMENT 'Имя покупателя', + birthday_at DATE COMMENT 'Дата рождения', + created_at VARCHAR(255), + updated_at VARCHAR(255) +) COMMENT = 'Покупатели'; + +INSERT INTO + users (name, birthday_at, created_at, updated_at) +VALUES + ('Геннадий', '1990-10-05', '07.01.2016 12:05', '07.01.2016 12:05'), + ('Наталья', '1984-11-12', '20.05.2016 16:32', '20.05.2016 16:32'), + ('Александр', '1985-05-20', '14.08.2016 20:10', '14.08.2016 20:10'), + ('Сергей', '1988-02-14', '21.10.2016 9:14', '21.10.2016 9:14'), + ('Иван', '1998-01-12', '15.12.2016 12:45', '15.12.2016 12:45'), + ('Мария', '2006-08-29', '12.01.2017 8:56', '12.01.2017 8:56'); + +UPDATE + users +SET + created_at = STR_TO_DATE(created_at, '%d.%m.%Y %k:%i'), + updated_at = STR_TO_DATE(updated_at, '%d.%m.%Y %k:%i'); + +ALTER TABLE + users +CHANGE + created_at created_at DATETIME DEFAULT CURRENT_TIMESTAMP; + +ALTER TABLE + users +CHANGE + updated_at updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; + +DESCRIBE users; + + +-- В таблице складских запасов storehouses_products в поле value могут встречаться самые +-- разные цифры: 0, если товар закончился и выше нуля, если на складе имеются запасы. +-- Необходимо отсортировать записи таким образом, чтобы они выводились в порядке увеличения +-- значения value. Однако, нулевые запасы должны выводиться в конце, после всех записей. + +DROP TABLE IF EXISTS storehouses_products; +CREATE TABLE storehouses_products ( + id SERIAL PRIMARY KEY, + storehouse_id INT UNSIGNED, + product_id INT UNSIGNED, + value INT UNSIGNED COMMENT 'Запас товарной позиции на складе', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) COMMENT = 'Запасы на складе'; + +INSERT INTO + storehouses_products (storehouse_id, product_id, value) +VALUES + (1, 543, 0), + (1, 789, 2500), + (1, 3432, 0), + (1, 826, 30), + (1, 719, 500), + (1, 638, 1); + +SELECT + * +FROM + storehouses_products +ORDER BY + IF(value > 0, 0, 1), + value; + + +SELECT + * +FROM + storehouses_products +ORDER BY + value = 0, value; + + +-- Подсчитайте средний возраст пользователей в таблице users + + SELECT + AVG(TIMESTAMPDIFF(YEAR, birthday_at, NOW())) AS age +FROM + users; + + +-- Подсчитайте количество дней рождения, которые приходятся на каждый из дней недели. +-- Следует учесть, что необходимы дни недели текущего года, а не года рождения. +SELECT + DATE_FORMAT(DATE(CONCAT_WS('-', YEAR(NOW()), MONTH(birthday_at), DAY(birthday_at))), '%W') AS day, + COUNT(*) AS total +FROM + users +GROUP BY + day +ORDER BY + total DESC; \ No newline at end of file