Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions HoweWork_Lesson-5.sql
Original file line number Diff line number Diff line change
@@ -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;