commit 6deed0469a8c9967d6cf393a4907cbda9eca447e Author: Vitalii Litvinchuk Date: Mon May 4 23:15:09 2026 +0300 first commit diff --git a/data/Employees.csv b/data/Employees.csv new file mode 100644 index 0000000..533624b --- /dev/null +++ b/data/Employees.csv @@ -0,0 +1,9 @@ +EmployeeID,FullName,Role,Department +1,Seamus Hogan,Manager,Management +2,Thomas Eriksson,Assistant,Sales +3,Simon Tolo,Executive,Management +4,Francesca Soffia,Assistant,Human Resources +5,Emily Sierra,Accountant,Finance +6,Greta Galkina,Accountant,Finance +7,Maria Carter,Executive,Human Resources +8,Rick Griffin,Manager,Marketing \ No newline at end of file diff --git a/data/L_L.sql b/data/L_L.sql new file mode 100644 index 0000000..f1cf735 --- /dev/null +++ b/data/L_L.sql @@ -0,0 +1,102 @@ +-- MySQL dump 10.19 Distrib 10.3.38-MariaDB, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: L_L +-- ------------------------------------------------------ +-- Server version 10.3.38-MariaDB-0ubuntu0.20.04.1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `Bookings` +-- + +DROP TABLE IF EXISTS `Bookings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Bookings` ( + `BookingID` int(11) DEFAULT NULL, + `BookingDate` date DEFAULT NULL, + `TableNumber` int(11) DEFAULT NULL, + `NumberOfGuests` int(11) DEFAULT NULL, + `CustomerID` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Bookings` +-- + +LOCK TABLES `Bookings` WRITE; +/*!40000 ALTER TABLE `Bookings` DISABLE KEYS */; +INSERT INTO `Bookings` VALUES (10,'2021-11-10',7,5,1),(11,'2021-11-10',5,2,2),(12,'2021-11-10',3,2,4),(13,'2021-11-11',2,5,5),(14,'2021-11-11',5,2,6),(15,'2021-11-11',3,2,7),(16,'2021-11-11',3,5,1),(17,'2021-11-12',5,2,2),(18,'2021-11-12',3,2,4),(19,'2021-11-13',7,5,6),(20,'2021-11-14',5,2,3),(21,'2021-11-14',3,2,4); +/*!40000 ALTER TABLE `Bookings` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Courses` +-- + +DROP TABLE IF EXISTS `Courses`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Courses` ( + `CourseName` varchar(255) NOT NULL, + `Cost` decimal(4,2) DEFAULT NULL, + PRIMARY KEY (`CourseName`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Courses` +-- + +LOCK TABLES `Courses` WRITE; +/*!40000 ALTER TABLE `Courses` DISABLE KEYS */; +/*!40000 ALTER TABLE `Courses` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Customers` +-- + +DROP TABLE IF EXISTS `Customers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `Customers` ( + `CustomerID` int(11) NOT NULL, + `FullName` varchar(100) NOT NULL, + `PhoneNumber` int(11) NOT NULL, + PRIMARY KEY (`CustomerID`), + UNIQUE KEY `PhoneNumber` (`PhoneNumber`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Customers` +-- + +LOCK TABLES `Customers` WRITE; +/*!40000 ALTER TABLE `Customers` DISABLE KEYS */; +INSERT INTO `Customers` VALUES (1,'Vanessa McCarthy',757536378),(2,'Marcos Romero',757536379),(3,'Hiroki Yamane',757536376),(4,'Anna Iversen',757536375),(5,'Diana Pinto',757536374),(6,'Altay Ayhan',757636378),(7,'Jane Murphy',753536379),(8,'Laurina Delgado',754536376),(9,'Mike Edwards',757236375),(10,'Karl Pederson',757936374); +/*!40000 ALTER TABLE `Customers` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-05-15 11:51:03 diff --git a/data/courses.csv b/data/courses.csv new file mode 100644 index 0000000..d0ea69b --- /dev/null +++ b/data/courses.csv @@ -0,0 +1,12 @@ +CourseName,Cost, +Greek salad,15.5, +Bean soup,12.25, +Pizza,15, +Carbonara,12.5, +Kabasa,17, +Shwarma,11.3, +Вареники з картоплею,13.1, +Червоний борщ,12.45, +Пампушки з часником,11.45, +Деруни,12.12, +Млинці з сиром,13.5, \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..55179ce --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + db: + image: mysql:latest + container_name: mysql-container + restart: always + environment: + MYSQL_ROOT_PASSWORD: qwerty-1 + ports: + - "3306:3306" + volumes: + - mysql_data_1:/var/lib/mysql + - ./data:/var/lib/mysql-files + +volumes: + mysql_data_1: diff --git a/lab2-1/CarRental.sql b/lab2-1/CarRental.sql new file mode 100755 index 0000000..9e052b1 --- /dev/null +++ b/lab2-1/CarRental.sql @@ -0,0 +1,404 @@ +-- MySQL dump 10.13 Distrib 9.6.0, for Linux (x86_64) +-- +-- Host: localhost Database: CarRental +-- ------------------------------------------------------ +-- Server version 9.6.0 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; +SET @@SESSION.SQL_LOG_BIN= 0; + +-- +-- GTID state at the beginning of the backup +-- + +SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '8e6de61c-253f-11f1-be75-0242ac130002:1-141'; + +-- +-- Table structure for table `Car_Classes` +-- + +DROP TABLE IF EXISTS `Car_Classes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Car_Classes` ( + `id` int NOT NULL AUTO_INCREMENT, + `Class` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Car_Classes` +-- + +LOCK TABLES `Car_Classes` WRITE; +/*!40000 ALTER TABLE `Car_Classes` DISABLE KEYS */; +INSERT INTO `Car_Classes` VALUES (1,'Luxury'),(2,'Midsize'),(3,'Compact'),(4,'Compact'),(5,'SUV'); +/*!40000 ALTER TABLE `Car_Classes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Car_Infos` +-- + +DROP TABLE IF EXISTS `Car_Infos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Car_Infos` ( + `id` int NOT NULL AUTO_INCREMENT, + `Fuel` int DEFAULT NULL, + `Mileage` int DEFAULT NULL, + `Class` int DEFAULT NULL, + `Model` int DEFAULT NULL, + `Manufacturer` int DEFAULT NULL, + `Year` int DEFAULT NULL, + `VIN_code` varchar(255) DEFAULT NULL, + `Number` varchar(255) DEFAULT NULL, + `CoS` int DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `VIN_code` (`VIN_code`), + KEY `Fuel` (`Fuel`), + KEY `Class` (`Class`), + KEY `Model` (`Model`), + KEY `Manufacturer` (`Manufacturer`), + CONSTRAINT `Car_Infos_ibfk_1` FOREIGN KEY (`Fuel`) REFERENCES `FuelTypes` (`id`), + CONSTRAINT `Car_Infos_ibfk_2` FOREIGN KEY (`Class`) REFERENCES `Car_Classes` (`id`), + CONSTRAINT `Car_Infos_ibfk_3` FOREIGN KEY (`Model`) REFERENCES `Models` (`id`), + CONSTRAINT `Car_Infos_ibfk_4` FOREIGN KEY (`Manufacturer`) REFERENCES `Manufacturers` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Car_Infos` +-- + +LOCK TABLES `Car_Infos` WRITE; +/*!40000 ALTER TABLE `Car_Infos` DISABLE KEYS */; +INSERT INTO `Car_Infos` VALUES (1,1,10000,1,1,1,2022,'ABC123','12345',1),(2,2,20000,2,2,2,2021,'DEF456','67890',2),(3,3,30000,3,3,3,2020,'GHI789','ABCDE',3),(4,4,40000,4,4,4,2019,'JKL012','FGHIJ',4),(5,5,50000,5,5,5,2018,'MNO345','KLMNO',5); +/*!40000 ALTER TABLE `Car_Infos` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Cars` +-- + +DROP TABLE IF EXISTS `Cars`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Cars` ( + `id` int NOT NULL AUTO_INCREMENT, + `Owner_Id` int DEFAULT NULL, + `Name` varchar(255) DEFAULT NULL, + `Price` float DEFAULT NULL, + `Rating` int DEFAULT NULL, + `Number_Of_leases` int DEFAULT NULL, + `Car_info` int DEFAULT NULL, + `City` int DEFAULT NULL, + `Country` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `Rating` (`Rating`), + KEY `Car_info` (`Car_info`), + KEY `City` (`City`), + KEY `Country` (`Country`), + CONSTRAINT `Cars_ibfk_1` FOREIGN KEY (`Rating`) REFERENCES `Ratings` (`id`), + CONSTRAINT `Cars_ibfk_2` FOREIGN KEY (`Car_info`) REFERENCES `Car_Infos` (`id`), + CONSTRAINT `Cars_ibfk_3` FOREIGN KEY (`City`) REFERENCES `Cities` (`id`), + CONSTRAINT `Cars_ibfk_4` FOREIGN KEY (`Country`) REFERENCES `Countries` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Cars` +-- + +LOCK TABLES `Cars` WRITE; +/*!40000 ALTER TABLE `Cars` DISABLE KEYS */; +INSERT INTO `Cars` VALUES (1,1,'Mercedes A-Class',100,1,0,1,1,1),(2,2,'Toyota RAV4',150,2,0,2,2,2),(3,3,'BMW 3 Series',200,3,0,3,3,3),(4,4,'Ford Focus',250,4,0,4,4,4),(5,5,'Honda CR-V',300,5,0,5,5,5); +/*!40000 ALTER TABLE `Cars` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Cities` +-- + +DROP TABLE IF EXISTS `Cities`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Cities` ( + `id` int NOT NULL AUTO_INCREMENT, + `City` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Cities` +-- + +LOCK TABLES `Cities` WRITE; +/*!40000 ALTER TABLE `Cities` DISABLE KEYS */; +INSERT INTO `Cities` VALUES (1,'New York'),(2,'Tokyo'),(3,'Berlin'),(4,'Detroit'),(5,'Tokyo'); +/*!40000 ALTER TABLE `Cities` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Countries` +-- + +DROP TABLE IF EXISTS `Countries`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Countries` ( + `id` int NOT NULL AUTO_INCREMENT, + `Country` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Countries` +-- + +LOCK TABLES `Countries` WRITE; +/*!40000 ALTER TABLE `Countries` DISABLE KEYS */; +INSERT INTO `Countries` VALUES (1,'USA'),(2,'Japan'),(3,'Germany'),(4,'USA'),(5,'Japan'); +/*!40000 ALTER TABLE `Countries` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `CustomerRatings` +-- + +DROP TABLE IF EXISTS `CustomerRatings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CustomerRatings` ( + `id` int NOT NULL AUTO_INCREMENT, + `Customer_id` int DEFAULT NULL, + `Rating_id` int DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `Customer_id` (`Customer_id`,`Rating_id`), + KEY `Rating_id` (`Rating_id`), + CONSTRAINT `CustomerRatings_ibfk_1` FOREIGN KEY (`Customer_id`) REFERENCES `Customers` (`id`), + CONSTRAINT `CustomerRatings_ibfk_2` FOREIGN KEY (`Rating_id`) REFERENCES `Ratings` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `CustomerRatings` +-- + +LOCK TABLES `CustomerRatings` WRITE; +/*!40000 ALTER TABLE `CustomerRatings` DISABLE KEYS */; +INSERT INTO `CustomerRatings` VALUES (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5); +/*!40000 ALTER TABLE `CustomerRatings` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Customers` +-- + +DROP TABLE IF EXISTS `Customers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Customers` ( + `id` int NOT NULL AUTO_INCREMENT, + `Passport_id` varchar(255) DEFAULT NULL, + `F_Name` varchar(255) DEFAULT NULL, + `S_Name` varchar(255) DEFAULT NULL, + `Email` varchar(255) DEFAULT NULL, + `PhoneNumber` varchar(20) DEFAULT NULL, + `City` int DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `Passport_id` (`Passport_id`), + UNIQUE KEY `PhoneNumber` (`PhoneNumber`), + UNIQUE KEY `PhoneNumber_2` (`PhoneNumber`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Customers` +-- + +LOCK TABLES `Customers` WRITE; +/*!40000 ALTER TABLE `Customers` DISABLE KEYS */; +INSERT INTO `Customers` VALUES (1,'ID123','John','Doe','john.doe@email.com','1234567890',1),(2,'ID456','Jane','Smith','jane.smith@email.com','9876543210',2),(3,'ID789','Alice','Johnson','alice.johnson@email.com','5555555555',3),(4,'IDABC','Bob','Williams','bob.williams@email.com','1111111111',4),(5,'IDDEF','Eva','Brown','eva.brown@email.com','9999999999',5); +/*!40000 ALTER TABLE `Customers` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `FuelTypes` +-- + +DROP TABLE IF EXISTS `FuelTypes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `FuelTypes` ( + `id` int NOT NULL AUTO_INCREMENT, + `Type` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `FuelTypes` +-- + +LOCK TABLES `FuelTypes` WRITE; +/*!40000 ALTER TABLE `FuelTypes` DISABLE KEYS */; +INSERT INTO `FuelTypes` VALUES (1,'Gasoline'),(2,'Gasoline'),(3,'Diesel'),(4,'Gasoline'),(5,'Hybrid'); +/*!40000 ALTER TABLE `FuelTypes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Manufacturers` +-- + +DROP TABLE IF EXISTS `Manufacturers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Manufacturers` ( + `id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Manufacturers` +-- + +LOCK TABLES `Manufacturers` WRITE; +/*!40000 ALTER TABLE `Manufacturers` DISABLE KEYS */; +INSERT INTO `Manufacturers` VALUES (1,'Mercedes'),(2,'Toyota'),(3,'BMW'),(4,'Ford'),(5,'Honda'); +/*!40000 ALTER TABLE `Manufacturers` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Models` +-- + +DROP TABLE IF EXISTS `Models`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Models` ( + `id` int NOT NULL AUTO_INCREMENT, + `Model` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Models` +-- + +LOCK TABLES `Models` WRITE; +/*!40000 ALTER TABLE `Models` DISABLE KEYS */; +INSERT INTO `Models` VALUES (1,'S-Class'),(2,'Camry'),(3,'3 Series'),(4,'Focus'),(5,'CR-V'); +/*!40000 ALTER TABLE `Models` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Orders` +-- + +DROP TABLE IF EXISTS `Orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `StartDate` date DEFAULT NULL, + `EndDate` date DEFAULT NULL, + `Customers` int DEFAULT NULL, + `Car` int DEFAULT NULL, + `Status` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `Customers` (`Customers`), + KEY `Car` (`Car`), + KEY `Status` (`Status`), + CONSTRAINT `Orders_ibfk_1` FOREIGN KEY (`Customers`) REFERENCES `Customers` (`id`), + CONSTRAINT `Orders_ibfk_2` FOREIGN KEY (`Car`) REFERENCES `Cars` (`id`), + CONSTRAINT `Orders_ibfk_3` FOREIGN KEY (`Status`) REFERENCES `Statuses` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Orders` +-- + +LOCK TABLES `Orders` WRITE; +/*!40000 ALTER TABLE `Orders` DISABLE KEYS */; +INSERT INTO `Orders` VALUES (1,'2023-01-01','2023-01-10',1,1,1),(2,'2023-02-01','2023-02-15',2,2,2),(3,'2023-03-01','2023-03-20',3,3,3),(4,'2023-04-01','2023-04-25',4,4,4),(5,'2023-05-01','2023-05-30',5,5,5); +/*!40000 ALTER TABLE `Orders` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Ratings` +-- + +DROP TABLE IF EXISTS `Ratings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Ratings` ( + `id` int NOT NULL AUTO_INCREMENT, + `Rating` int DEFAULT NULL, + `DescriptionRate` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Ratings` +-- + +LOCK TABLES `Ratings` WRITE; +/*!40000 ALTER TABLE `Ratings` DISABLE KEYS */; +INSERT INTO `Ratings` VALUES (1,1,'Poor'),(2,2,'Fair'),(3,3,'Average'),(4,4,'Good'),(5,5,'Excellent'); +/*!40000 ALTER TABLE `Ratings` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Statuses` +-- + +DROP TABLE IF EXISTS `Statuses`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Statuses` ( + `id` int NOT NULL AUTO_INCREMENT, + `Type` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Statuses` +-- + +LOCK TABLES `Statuses` WRITE; +/*!40000 ALTER TABLE `Statuses` DISABLE KEYS */; +INSERT INTO `Statuses` VALUES (1,'Available'),(2,'Booked'),(3,'Rented'),(4,'In Maintenance'),(5,'Available'); +/*!40000 ALTER TABLE `Statuses` ENABLE KEYS */; +UNLOCK TABLES; +SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-03-25 14:38:18 diff --git a/lab2-1/backup/Dockerfile b/lab2-1/backup/Dockerfile new file mode 100755 index 0000000..68c22ee --- /dev/null +++ b/lab2-1/backup/Dockerfile @@ -0,0 +1,47 @@ +# Використовуємо стабільну Ubuntu 22.04 +FROM ubuntu:22.04 + +# Вимикаємо інтерактивні запити під час встановлення пакетів +ENV DEBIAN_FRONTEND=noninteractive + +# 1. Встановлюємо всі необхідні пакети одним шаром +# mysql-client - для дампу (сумісний з mysql:latest) +# lftp - для SFTP передачі +# msmtp - для надсилання пошти +# ca-certificates - критично для TLS/SSL (Gmail) +# cron - для автоматизації щохвилини +# openssh-client - для SSH-ключів +RUN apt-get update && apt-get install -y \ + mysql-client \ + lftp \ + msmtp \ + msmtp-mta \ + ca-certificates \ + cron \ + openssh-client \ + && rm -rf /var/lib/apt/lists/* + +# 2. Налаштовуємо SSH для роботи з ключами +RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh + +# 3. Копіюємо конфігураційні файли +# Файл налаштування пошти +COPY msmtprc /etc/msmtprc +RUN chmod 600 /etc/msmtprc + +# Скрипт бекапу +COPY backup.sh /usr/local/bin/backup.sh +RUN chmod +x /usr/local/bin/backup.sh + +# 4. Створюємо файли логів з правильними правами доступу +RUN touch /var/log/msmtp.log && chmod 666 /var/log/msmtp.log +RUN touch /var/log/backup.log && chmod 666 /var/log/backup.log + +# 5. Налаштовуємо Cron (запуск щохвилини) +# ВАЖЛИВО: додаємо ". /etc/environment;", щоб Cron бачив паролі з docker-compose +RUN echo "* * * * * . /etc/environment; /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1" | crontab - + +# 6. Команда запуску контейнера: +# - зберігаємо поточні змінні оточення в /etc/environment (щоб їх бачив Cron) +# - запускаємо демон cron у фоновому режимі (флаг -f) +CMD ["sh", "-c", "printenv > /etc/environment && cron -f"] \ No newline at end of file diff --git a/lab2-1/backup/backup.sh b/lab2-1/backup/backup.sh new file mode 100755 index 0000000..59ad047 --- /dev/null +++ b/lab2-1/backup/backup.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# --- НАЛАШТУВАННЯ --- +REMOTE_DIR="/Volumes/Just/sql advanced/lab2-1/backups" + +# Новий формат: рік-місяць-день_години-хвилини-секунди +DATE=$(date +%Y-%m-%d_%H-%M-%S) +FILENAME="OrdersDB_${DATE}.sql" +BACKUP_PATH="/tmp/$FILENAME" + +echo "Starting dump of OrdersDB ($DATE)..." + +# 1. Створення дампу бази даних +# Додано --set-gtid-purged=OFF для сумісності з mysql:latest +# Додано --single-transaction для уникнення помилок консистентності +mysqldump -h db -u root -p$MYSQL_ROOT_PASSWORD \ + --set-gtid-purged=OFF \ + --single-transaction \ + OrdersDB > $BACKUP_PATH + +if [ $? -eq 0 ]; then + echo "Dump created: $FILENAME. Uploading to Mac..." + + # 2. Завантаження через SFTP + lftp -u $SFTP_USER, sftp://$SFTP_HOST <&1) + + if [ $? -eq 0 ]; then + echo "Email sent!" + else + echo "Email error: $EMAIL_LOG" + fi + else + echo "SFTP Error!" + echo -e "Subject: Backup FAILED: SFTP Error ($DATE)\n\nПомилка передачі файлу $FILENAME на диск." | msmtp $EMAIL_TO + fi + + # Видаляємо тимчасовий файл + rm "$BACKUP_PATH" +else + echo "MySQL Dump Error!" + echo -e "Subject: Backup FAILED: SQL Error ($DATE)\n\nНе вдалося створити дамп бази OrdersDB. Перевірте логі контейнера." | msmtp $EMAIL_TO +fi \ No newline at end of file diff --git a/lab2-1/backup/msmtprc b/lab2-1/backup/msmtprc new file mode 100755 index 0000000..ea9ad54 --- /dev/null +++ b/lab2-1/backup/msmtprc @@ -0,0 +1,14 @@ +defaults +auth on +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +logfile /var/log/msmtp.log + +account oa_mail +host smtp.gmail.com +port 587 +from vitalii.litvinchuk@oa.edu.ua +user vitalii.litvinchuk@oa.edu.ua +password krkrvyobreydoenh + +account default : oa_mail \ No newline at end of file diff --git a/lab2-1/backup_setup.md b/lab2-1/backup_setup.md new file mode 100644 index 0000000..1bf5778 --- /dev/null +++ b/lab2-1/backup_setup.md @@ -0,0 +1,165 @@ +## 1. docker-compose.yml +Файл конфігурації контейнерів бази даних та сервісу бекапу. + +```yaml +services: + db: + image: mysql:latest + container_name: mysql-container-2 + restart: always + environment: + MYSQL_ROOT_PASSWORD: qwerty-1 + MYSQL_DATABASE: OrdersDB + ports: + - "3306:3306" + volumes: + - sqladvanced_mysql_data:/var/lib/mysql + + backup-service: + build: ./backup + container_name: mysql-backup-runner + environment: + MYSQL_ROOT_PASSWORD: qwerty-1 + SFTP_HOST: "192.168.3.142" + SFTP_USER: "vitaliilitvinchuk" + EMAIL_TO: "vitalii.litvinchuk@oa.edu.ua" + volumes: + - ~/.ssh/id_rsa_docker:/root/.ssh/id_rsa:ro + +volumes: + sqladvanced_mysql_data: + external: true +``` + +## 2. backup/Dockerfile +Інструкції для створення образу контейнера бекапу. + +```dockerfile +# Використовуємо стабільну Ubuntu 22.04 +FROM ubuntu:22.04 + +# Вимикаємо інтерактивні запити під час встановлення пакетів +ENV DEBIAN_FRONTEND=noninteractive + +# 1. Встановлюємо всі необхідні пакети одним шаром +# mysql-client - для дампу (сумісний з mysql:latest) +# lftp - для SFTP передачі +# msmtp - для надсилання пошти +# ca-certificates - критично для TLS/SSL (Gmail) +# cron - для автоматизації щохвилини +# openssh-client - для SSH-ключів +RUN apt-get update && apt-get install -y \ + mysql-client \ + lftp \ + msmtp \ + msmtp-mta \ + ca-certificates \ + cron \ + openssh-client \ + && rm -rf /var/lib/apt/lists/* + +# 2. Налаштовуємо SSH для роботи з ключами +RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh + +# 3. Копіюємо конфігураційні файли +# Файл налаштування пошти +COPY msmtprc /etc/msmtprc +RUN chmod 600 /etc/msmtprc + +# Скрипт бекапу +COPY backup.sh /usr/local/bin/backup.sh +RUN chmod +x /usr/local/bin/backup.sh + +# 4. Створюємо файли логів з правильними правами доступу +RUN touch /var/log/msmtp.log && chmod 666 /var/log/msmtp.log +RUN touch /var/log/backup.log && chmod 666 /var/log/backup.log + +# 5. Налаштовуємо Cron (запуск щохвилини) +# ВАЖЛИВО: додаємо ". /etc/environment;", щоб Cron бачив паролі з docker-compose +RUN echo "* * * * * . /etc/environment; /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1" | crontab - + +# 6. Команда запуску контейнера: +# - зберігаємо поточні змінні оточення в /etc/environment (щоб їх бачив Cron) +# - запускаємо демон cron у фоновому режимі (флаг -f) +CMD ["sh", "-c", "printenv > /etc/environment && cron -f"] +``` + +## 3. backup/backup.sh +Скрипт, який виконує створення дампу, завантаження на диск та надсилання пошти. + +```bash +#!/bin/bash + +# --- НАЛАШТУВАННЯ --- +REMOTE_DIR="/Volumes/Just/sql advanced/lab2-1/backups" + +# Новий формат: рік-місяць-день_години-хвилини-секунди +DATE=$(date +%Y-%m-%d_%H-%M-%S) +FILENAME="OrdersDB_${DATE}.sql" +BACKUP_PATH="/tmp/$FILENAME" + +echo "Starting dump of OrdersDB ($DATE)..." + +# 1. Створення дампу бази даних +# Додано --set-gtid-purged=OFF для сумісності з mysql:latest +# Додано --single-transaction для уникнення помилок консистентності +mysqldump -h db -u root -p$MYSQL_ROOT_PASSWORD \ + --set-gtid-purged=OFF \ + --single-transaction \ + OrdersDB > $BACKUP_PATH + +if [ $? -eq 0 ]; then + echo "Dump created: $FILENAME. Uploading to Mac..." + + # 2. Завантаження через SFTP + lftp -u $SFTP_USER, sftp://$SFTP_HOST <&1) + + if [ $? -eq 0 ]; then + echo "Email sent!" + else + echo "Email error: $EMAIL_LOG" + fi + else + echo "SFTP Error!" + echo -e "Subject: Backup FAILED: SFTP Error ($DATE)\n\nПомилка передачі файлу $FILENAME на диск." | msmtp $EMAIL_TO + fi + + # Видаляємо тимчасовий файл + rm "$BACKUP_PATH" +else + echo "MySQL Dump Error!" + echo -e "Subject: Backup FAILED: SQL Error ($DATE)\n\nНе вдалося створити дамп бази OrdersDB. Перевірте логі контейнера." | msmtp $EMAIL_TO +fi +``` + +## 4. backup/msmtprc +Налаштування SMTP сервера для надсилання пошти. + +```text +defaults +auth on +tls on +tls_trust_file /etc/ssl/certs/ca-certificates.crt +logfile /var/log/msmtp.log + +account oa_mail +host smtp.gmail.com +port 587 +from vitalii.litvinchuk@oa.edu.ua +user vitalii.litvinchuk@oa.edu.ua +password krkrvyobreydoenh + +account default : oa_mail +``` diff --git a/lab2-1/data_db.sql b/lab2-1/data_db.sql new file mode 100755 index 0000000..986cf24 --- /dev/null +++ b/lab2-1/data_db.sql @@ -0,0 +1,687 @@ +USE PortDB; + +INSERT INTO + Purposes (Name, Description) +VALUES ( + 'Перевезення сировини', + 'Перевезення різноманітних сировинних матеріалів на виробництво.' + ), + ( + 'Експорт товарів', + 'Вивезення готової продукції за кордон для продажу.' + ), + ( + 'Імпорт сировини', + 'Закупівля різноманітних сировинних матеріалів з-за кордону.' + ), + ( + 'Транспортування контейнерів', + 'Перевезення контейнерів із товаром між портами.' + ), + ( + 'Доставка харчових продуктів', + 'Перевезення продуктів харчування великими суднами.' + ), + ( + 'Енергетичні цілі', + 'Транспортування палива та енергетичних ресурсів морем.' + ), + ( + 'Будівельні матеріали', + 'Перевезення будівельних матеріалів для проектів на узбережжі.' + ), + ( + 'Масова перевезення', + 'Транспортування великих обсягів товарів для оптових партнерів.' + ), + ( + 'Транзитне сполучення', + 'Проходження через території кількох країн у маршруті доставки.' + ); + +INSERT INTO + CargoTypes (Name) +VALUES ('Контейнери'), + ('Рідини'), + ('Сипучі матеріали'), + ('Сталеві вироби'), + ('Деревинні матеріали'), + ('Харчові продукти'), + ('Технічне обладнання'), + ('Автомобілі'), + ('Товари загального вжитку'), + ('Спеціальні вантажі'); + +INSERT INTO + ShipTypes (Name) +VALUES ('Балкер'), + ('Контейнеровоз'), + ('Танкер'), + ('Ро-Ро (Roll-on/Roll-off)'), + ('Бункеровоз'), + ('Круїзний лайнер'), + ('Багатоцільовий корабель'), + ('Трал'), + ('Лінійний корабель'), + ( + 'Вантажівка-перевізник (Ferry)' + ), + ('Пасажирський корабель'); + +INSERT INTO + Country (Name) +VALUES ('Австралія'), + ('Австрія'), + ('Азербайджан'), + ('Албанія'), + ('Алжир'), + ('Ангола'), + ('Андорра'), + ('Аргентина'), + ('Арменія'), + ('Афганістан'), + ('Багамські Острови'), + ('Бангладеш'), + ('Барбадос'), + ('Бахрейн'), + ('Беліз'), + ('Бельгія'), + ('Бенін'), + ('Білорусь'), + ('Болгарія'), + ('Болівія'), + ('Боснія і Герцеговина'), + ('Ботсвана'), + ('Бразилія'), + ('Бруней'), + ('Буркіна-Фасо'), + ('Бурунді'), + ('Бутан'), + ('В\'єтнам'), + ('Габон'), + ('Гаїті'), + ('Гайана'), + ('Гамбія'), + ('Гана'), + ('Гваделупа'), + ('Гватемала'), + ('Гвінея'), + ('Гвінея - Бісау'), + ('Гондурас'), + ('Гренада'), + ('Греція'), + ('Грузія'), + ('Гренландія'), + ('Данія'), + ( + 'Демократична Республіка Конго' + ), + ('Джибуті'), + ('Домініка'), + ('Домініканська Республіка'), + ('Еквадор'), + ('Екваторіальна Гвінея'), + ('Еритрея'), + ('Есватіні'), + ('Естонія'), + ('Ефіопія'), + ('Єгипет'), + ('Ємен'), + ('Замбія'), + ('Західна Сахара'), + ('Зімбабве'), + ('Ізраїль'), + ('Індія'), + ('Індонезія'), + ('Ірак'), + ('Іран'), + ('Ірландія'), + ('Ісландія'), + ('Іспанія'), + ('Італія'), + ('Йорданія'), + ('Казахстан'), + ('Кайманові Острови'), + ('Камбоджа'), + ('Камерун'), + ('Канада'), + ('Катар'), + ('Кенія'), + ('Киргизстан'), + ('Кіпр'), + ('Кірібаті'), + ('Китай'), + ('Колумбія'), + ('Коморські Острови'), + ('Конго'), + ('Північна Корея'), + ('Південна Корея'), + ('Косово'), + ('Коста - Рика'), + ('Куба'), + ('Кувейт'), + ('Лаос'), + ('Латвія'), + ('Лесото'), + ('Литва'), + ('Ліберія'), + ('Ліван'), + ('Лівія'), + ('Ліхтенштейн'), + ('Люксембург'), + ('Маврикій'), + ('Мавританія'), + ('Мадагаскар'), + ('Македонія'), + ('Малаві'), + ('Малайзія'), + ('Малі'), + ('Мальдіви'), + ('Мальта'), + ('Марокко'), + ('Мартиніка'), + ('Маршаллові Острови'), + ('Мексика'), + ('Мозамбік'), + ('Молдова'), + ('Монако'), + ('Монголія'), + ('М\'янма (Бірма)'), + ('Намібія'), + ('Науру'), + ('Непал'), + ('Нігер'), + ('Нігерія'), + ('Нідерланди'), + ('Нікарагуа'), + ('Німеччина'), + ('Нова Зеландія'), + ('Норвегія'), + ('ОАЕ'), + ('Оман'), + ('Пакистан'), + ('Палау'), + ('Палестина'), + ('Панама'); + +INSERT INTO + Positions (Name) +VALUES ('Директор'), + ('Менеджер з логістики'), + ('Капітан корабля'), + ('Інженер-механік'), + ('Оператор порту'), + ('Фінансовий аналітик'), + ('Керівник вантажоперевезень'), + ( + 'Технік з обслуговування суден' + ), + ('Митний брокер'), + ('Логістичний асистент'); + +INSERT INTO + ContactTypes (Name) +VALUES ('Телефон'), + ('Електронна пошта'), + ('Факс'), + ('Поштова адреса'), + ('Skype'), + ('WhatsApp'), + ('Веб-сайт'), + ('Телеграм'); + +INSERT INTO + ServiceTypes (Name, Description) +VALUES ( + 'Технічний огляд', + 'Комплексне технічне обстеження та оцінка стану судна.' + ), + ( + 'Ремонт двигуна', + 'Виконання ремонтних робіт та технічного обслуговування суднового двигуна.' + ), + ( + 'Мальовничі роботи', + 'Фарбування та зовнішній оздоблювальний ремонт корпусу судна.' + ), + ( + 'Технічне обслуговування електроніки', + 'Проведення робіт з налаштування та ремонту електронних систем на судні.' + ), + ( + 'Заміна обладнання', + 'Встановлення нового суднового обладнання та видалення застарілого.' + ), + ( + 'Очищення та змазування', + 'Профілактичне очищення та змащення механізмів та обладнання судна.' + ); + +INSERT INTO + Voyages (CountryFromId, CountryToId) +SELECT ( + SELECT Id + FROM Country + ORDER BY RAND() + LIMIT 1 + ) as CountryFromId, ( + SELECT Id + FROM Country + ORDER BY RAND() + LIMIT 1 + ) as CountryToId +FROM ( + SELECT 1 + UNION + SELECT 2 + UNION + SELECT 3 + UNION + SELECT 4 + UNION + SELECT 5 + ) as Numbers; + +INSERT INTO + Persons ( + Passport, + FirstName, + LastName, + PositionId + ) +VALUES ( + 'AA123456', + 'Іван', + 'Петров', + 1 + ), + ( + 'BB789012', + 'Марія', + 'Іванова', + 2 + ), + ( + 'CC345678', + 'Олег', + 'Сидоров', + 3 + ), + ( + 'DD901234', + 'Наталія', + 'Коваленко', + 4 + ), + ( + 'EE567890', + 'Андрій', + 'Смирнов', + 5 + ), + ( + 'FF123890', + 'Тетяна', + 'Біліченко', + 6 + ), + ( + 'GG456789', + 'Дмитро', + 'Мельник', + 7 + ), + ( + 'HH678901', + 'Катерина', + 'Соколова', + 8 + ), + ( + 'II234567', + 'Валентин', + 'Жуков', + 9 + ), + ( + 'JJ890123', + 'Ольга', + 'Морозова', + 10 + ), + ( + 'KK345678', + 'Анна', + 'Кравченко', + 5 + ), + ( + 'LL901234', + 'Олександр', + 'Лисенко', + 8 + ), + ( + 'MM567890', + 'Євгенія', + 'Денисенко', + 2 + ); + +INSERT INTO + ContactInfo ( + Content, + PersonId, + ContactTypeId + ) +VALUES ('+123456789', 1, 1), + ('email@example.com', 2, 2), + ('123 Main Street', 3, 3), + ('SkypeID123', 4, 4), + ('WhatsAppNumber', 5, 5), + ( + 'http://www.example.com', + 6, + 6 + ), + ('TelegramUsername', 7, 7), + ('FaxNumber', 8, 8), + ('info@example.com', 9, 1), + ('555-1234', 10, 2), + ('456 Secondary Street', 11, 3), + ('SkypeID456', 12, 4), + ('TelegramUser567', 13, 7), + ('ViberNumber', 1, 5), + ( + 'http://www.example2.com', + 2, + 6 + ), + ('FaxNumber2', 3, 8); + +INSERT INTO + Users (Password, PersonId) +VALUES ('strongpassword1', 1), + ('securepass123', 2), + ('myp@ssw0rd', 3), + ('pass4you', 4), + ('secret123', 5); + +INSERT INTO + Docks (Name, MaxLength, MaxWidth) +VALUES ('Причал 1', 100, 20), + ('Причал 2', 120, 25), + ('Причал 3', 150, 30), + ('Причал 4', 90, 15), + ('Причал 5', 110, 18), + ('Причал 6', 130, 22), + ('Причал 7', 140, 28), + ('Причал 8', 160, 35), + ('Причал 9', 105, 17), + ('Причал 10', 125, 23), + ('Причал 11', 115, 19), + ('Причал 12', 95, 14), + ('Причал 13', 145, 27), + ('Причал 14', 155, 33), + ('Причал 15', 165, 38); + +INSERT INTO + Ships ( + Name, + Length, + Width, + Capacity, + ShipTypeId, + VoyageId, + DockId + ) +VALUES ( + 'Корабель 1', + 50.5, + 10.5, + 500, + 1, + 1, + 1 + ), + ( + 'Корабель 2', + 60.2, + 12.8, + 700, + 2, + 2, + 2 + ), + ( + 'Корабель 3', + 55.0, + 11.0, + 600, + 3, + 3, + 3 + ), + ( + 'Корабель 4', + 45.8, + 9.5, + 450, + 4, + 4, + 4 + ), + ( + 'Корабель 10', + 59.9, + 12.0, + 690, + 10, + 10, + 10 + ), + ( + 'Корабель 11', + 57.2, + 11.2, + 590, + 11, + 11, + 11 + ), + ( + 'Корабель 12', + 63.8, + 13.8, + 770, + 5, + 12, + 12 + ), + ( + 'Корабель 13', + 52.4, + 10.8, + 540, + 3, + 9, + 13 + ), + ( + 'Корабель 14', + 49.0, + 9.8, + 480, + 6, + 8, + 14 + ), + ( + 'Корабель 15', + 66.5, + 14.0, + 820, + 8, + 5, + 15 + ); + +INSERT INTO + Employees (PersonId) +SELECT id +FROM Persons +ORDER BY RAND() +LIMIT 5; + +INSERT INTO + Services ( + Date, + Done, + ShipId, + ServiceTypeId + ) +SELECT + NOW() - INTERVAL FLOOR(RAND() * 365) DAY AS Date, + ROUND(RAND()) AS Done, + ( + SELECT id + FROM Ships + ORDER BY RAND() + LIMIT 1 + ) AS ShipId, + ROUND(RAND() * 6) + 1 AS ServiceTypeId +FROM ( + SELECT id + FROM `ShipTypes` + LIMIT 5 + ) AS t; + +INSERT INTO + ServiceEmployee (EmployeeId, ServiceId) +SELECT ROUND(RAND() * 5) + 1 AS EmployeeId, ROUND(RAND() * 5) + 1 AS ServiceId +FROM ( + SELECT id + FROM Services + LIMIT 5 + ) AS t; + +INSERT INTO + DockEmplyee (DockId, EmployeeId) +VALUES (1, 1), + (2, 2), + (3, 3), + (4, 1), + (5, 5); + +INSERT INTO + CrewPersons (PersonId, ShipId) +SELECT ROUND(RAND() * (13 - 6) + 6) AS PersonId, ( + SELECT id + FROM Ships + ORDER BY RAND() + LIMIT 1 + ) AS ShipId +FROM ( + SELECT id + FROM `Ships` + LIMIT 10 + ) AS t; + +INSERT INTO + Cargoes ( + Quantity, + CargoTypeId, + ShipId, + PurposeId + ) +SELECT + ROUND(RAND() * 100) + 1 AS Quantity, + ( + SELECT id + FROM CargoTypes + ORDER BY RAND() + LIMIT 1 + ) AS CargoTypeId, + ( + SELECT id + FROM Ships + ORDER BY RAND() + LIMIT 1 + ) AS ShipId, + ( + SELECT id + FROM Purposes + ORDER BY RAND() + LIMIT 1 + ) AS PurposeId +FROM ( + SELECT id + FROM Ships + LIMIT 10 + ) AS t; + +SELECT Ships.Name, Voyages.CountryFromId +FROM Ships + JOIN Voyages ON Ships.VoyageId = Voyages.Id +WHERE + Voyages.CountryFromId = ( + SELECT id + FROM `Country` + ORDER BY RAND() + LIMIT 1 + ); + +-- Вибірка кількості кораблів, що перебувають в кожному причалі: + +SELECT Docks.Name AS DockName, COUNT(Ships.Id) AS ShipCount +FROM Docks + LEFT JOIN Ships ON Docks.Id = Ships.DockId +GROUP BY + Docks.Id; + +-- Знаходження найбільшого та найменшого корабля за місткістю + +SELECT MAX(Ships.Capacity) AS MaxCapacity, MIN(Ships.Capacity) AS MinCapacity +FROM Ships; + +-- Вибірка інформації про всі обслуговування, які ще не виконані + +SELECT + Services.Id, + Services.Date, + Ships.Name AS ShipName, + ServiceTypes.Name AS ServiceTypeName +FROM + Services + JOIN Ships ON Services.ShipId = Ships.Id + JOIN ServiceTypes ON Services.ServiceTypeId = ServiceTypes.Id +WHERE + Services.Done = 0; + +-- Список працівників та кількість обслуговувань, які вони виконали + +SELECT Employees.Id, Persons.FirstName, Persons.LastName, COUNT(ServiceEmployee.ServiceId) AS ServicesCount +FROM + Employees + JOIN Persons ON Employees.PersonId = Persons.Id + LEFT JOIN ServiceEmployee ON Employees.Id = ServiceEmployee.EmployeeId +GROUP BY + Employees.Id; + +-- Список вантажів разом із цілями та назвою корабля: + +SELECT Cargoes.Id, Purposes.Name AS PurposeName, Ships.Name AS ShipName, Cargoes.Quantity +FROM Cargoes + JOIN Purposes ON Cargoes.PurposeId = Purposes.Id + JOIN Ships ON Cargoes.ShipId = Ships.Id; + +-- Загальний кількість вантажів, що відправляється з кожної країни: + +SELECT Country.Name AS CountryName, SUM(Cargoes.Quantity) AS TotalCount +FROM + Voyages + JOIN Country ON Voyages.CountryFromId = Country.Id + JOIN Ships ON Voyages.Id = Ships.VoyageId + JOIN Cargoes ON Ships.Id = Cargoes.ShipId +GROUP BY + Country.Id; \ No newline at end of file diff --git a/lab2-1/db.sql b/lab2-1/db.sql new file mode 100755 index 0000000..f65a271 --- /dev/null +++ b/lab2-1/db.sql @@ -0,0 +1,185 @@ +create database PortDB character set utf8 collate utf8_bin; + +use PortDB; + +CREATE TABLE `Users` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Password` nvarchar (1000) NOT NULL COMMENT 'Пароль', + `PersonId` integer COMMENT 'Дані людини' +); + +CREATE TABLE `Positions` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва позиції' +); + +CREATE TABLE `ContactInfo` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Content` nvarchar (255) NOT NULL COMMENT 'Дані про контакт', + `PersonId` integer COMMENT 'Людина', + `ContactTypeId` integer COMMENT 'Тип контакту' +); + +CREATE TABLE `ContactTypes` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типи контакту' +); + +CREATE TABLE `Services` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Date` timestamp NOT NULL COMMENT 'Дата обслуговування', + `Done` boolean NOT NULL DEFAULT 0 COMMENT 'Виконане', + `ShipId` integer COMMENT 'Корабель', + `ServiceTypeId` integer COMMENT 'Тип обслуговування' +); + +CREATE TABLE `ServiceTypes` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типу', + `Description` nvarchar (255) NOT NULL COMMENT 'Опис обслуговування' +); + +CREATE TABLE `Ships` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) NOT NULL COMMENT 'Назва корабля', + `Length` decimal(10, 2) NOT NULL COMMENT 'Довжина корабля', + `Width` decimal(10, 2) NOT NULL COMMENT 'Ширина корабля', + `Capacity` integer NOT NULL COMMENT 'Місткість корабля (у тоннах)', + `ShipTypeId` integer COMMENT 'Тип корабля', + `VoyageId` integer COMMENT 'Інформація про рейс', + `DockId` integer COMMENT 'Причал' +); + +CREATE TABLE `ShipTypes` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типу' +); + +CREATE TABLE `Docks` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) NOT NULL COMMENT 'Назва причалу', + `MaxLength` integer NOT NULL COMMENT 'Максимальна довжина причалу', + `MaxWidth` integer NOT NULL COMMENT 'Максимальна ширина причалу' +); + +CREATE TABLE `Cargoes` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Quantity` integer NOT NULL COMMENT 'Кількість', + `CargoTypeId` integer COMMENT 'Тип вантажу', + `ShipId` integer COMMENT 'Корабель', + `PurposeId` integer COMMENT 'Ціль' +); + +CREATE TABLE `Purposes` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва цілі', + `Description` nvarchar (255) NOT NULL COMMENT 'Опис цілі' +); + +CREATE TABLE `CargoTypes` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (255) UNIQUE NOT NULL COMMENT 'Назва типу' +); + +CREATE TABLE `Persons` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Passport` nvarchar (1000) UNIQUE NOT NULL COMMENT 'Паспортні дані', + `FirstName` nvarchar (255) NOT NULL COMMENT 'Ім\'я', + `LastName` nvarchar (255) NOT NULL COMMENT 'Прізвище', + `PositionId` integer COMMENT 'Посада' +); + +CREATE TABLE `CrewPersons` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `PersonId` integer COMMENT 'Дані людини', + `ShipId` integer COMMENT 'Корабель' +); + +CREATE TABLE `Employees` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `PersonId` integer COMMENT 'Дані людини' +); + +CREATE TABLE `ServiceEmployee` ( + `EmployeeId` integer COMMENT 'Працівник', + `ServiceId` integer COMMENT 'Обслуговування' +); + +CREATE TABLE `Country` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `Name` nvarchar (50) UNIQUE NOT NULL COMMENT 'Назва країни' +); + +CREATE TABLE `DockEmplyee` ( + `DockId` integer COMMENT 'Причал', + `EmployeeId` integer COMMENT 'Працівник' +); + +CREATE TABLE `Voyages` ( + `Id` integer PRIMARY KEY AUTO_INCREMENT, + `CountryFromId` integer COMMENT 'Країна відправки', + `CountryToId` integer COMMENT 'Країна доставки' +); + +ALTER TABLE `Users` +ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`); + +ALTER TABLE `ContactInfo` +ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`); + +ALTER TABLE `ContactInfo` +ADD FOREIGN KEY (`ContactTypeId`) REFERENCES `ContactTypes` (`Id`); + +ALTER TABLE `Services` +ADD FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`); + +ALTER TABLE `Services` +ADD FOREIGN KEY (`ServiceTypeId`) REFERENCES `ServiceTypes` (`Id`); + +ALTER TABLE `Ships` +ADD FOREIGN KEY (`ShipTypeId`) REFERENCES `ShipTypes` (`Id`); + +ALTER TABLE `Ships` +ADD FOREIGN KEY (`VoyageId`) REFERENCES `Voyages` (`Id`); + +ALTER TABLE `Ships` +ADD FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`); + +ALTER TABLE `Cargoes` +ADD FOREIGN KEY (`CargoTypeId`) REFERENCES `CargoTypes` (`Id`); + +ALTER TABLE `Cargoes` +ADD FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`); + +ALTER TABLE `Cargoes` +ADD FOREIGN KEY (`PurposeId`) REFERENCES `Purposes` (`Id`); + +ALTER TABLE `Persons` +ADD FOREIGN KEY (`PositionId`) REFERENCES `Positions` (`Id`); + +ALTER TABLE `CrewPersons` +ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`); + +ALTER TABLE `CrewPersons` +ADD FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`); + +ALTER TABLE `Employees` +ADD FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`); + +ALTER TABLE `ServiceEmployee` +ADD FOREIGN KEY (`EmployeeId`) REFERENCES `Employees` (`Id`); + +ALTER TABLE `ServiceEmployee` +ADD FOREIGN KEY (`ServiceId`) REFERENCES `Services` (`Id`); + +ALTER TABLE `DockEmplyee` +ADD FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`); + +ALTER TABLE `DockEmplyee` +ADD FOREIGN KEY (`EmployeeId`) REFERENCES `Employees` (`Id`); + +ALTER TABLE `Voyages` +ADD FOREIGN KEY (`CountryFromId`) REFERENCES `Country` (`Id`); + +ALTER TABLE `Voyages` +ADD FOREIGN KEY (`CountryToId`) REFERENCES `Country` (`Id`); \ No newline at end of file diff --git a/lab2-1/docker-compose.yml b/lab2-1/docker-compose.yml new file mode 100755 index 0000000..e607728 --- /dev/null +++ b/lab2-1/docker-compose.yml @@ -0,0 +1,27 @@ +services: + db: + image: mysql:latest + container_name: mysql-container-2 + restart: always + environment: + MYSQL_ROOT_PASSWORD: qwerty-1 + MYSQL_DATABASE: OrdersDB + ports: + - "3306:3306" + volumes: + - sqladvanced_mysql_data:/var/lib/mysql + + backup-service: + build: ./backup + container_name: mysql-backup-runner + environment: + MYSQL_ROOT_PASSWORD: qwerty-1 + SFTP_HOST: "192.168.3.142" + SFTP_USER: "vitaliilitvinchuk" + EMAIL_TO: "vitalii.litvinchuk@oa.edu.ua" + volumes: + - ~/.ssh/id_rsa_docker:/root/.ssh/id_rsa:ro + +volumes: + sqladvanced_mysql_data: + external: true diff --git a/lab2-1/tmp.sql b/lab2-1/tmp.sql new file mode 100755 index 0000000..0655111 --- /dev/null +++ b/lab2-1/tmp.sql @@ -0,0 +1,568 @@ +-- MySQL dump 10.13 Distrib 9.6.0, for Linux (x86_64) +-- +-- Host: localhost Database: PortDB +-- ------------------------------------------------------ +-- Server version 9.6.0 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; +SET @@SESSION.SQL_LOG_BIN= 0; + +-- +-- GTID state at the beginning of the backup +-- + + +-- +-- Table structure for table `CargoTypes` +-- + +DROP TABLE IF EXISTS `CargoTypes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CargoTypes` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва типу', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `CargoTypes` +-- + +LOCK TABLES `CargoTypes` WRITE; +/*!40000 ALTER TABLE `CargoTypes` DISABLE KEYS */; +INSERT INTO `CargoTypes` VALUES (8,'Автомобілі'),(5,'Деревинні матеріали'),(1,'Контейнери'),(2,'Рідини'),(3,'Сипучі матеріали'),(10,'Спеціальні вантажі'),(4,'Сталеві вироби'),(7,'Технічне обладнання'),(9,'Товари загального вжитку'),(6,'Харчові продукти'); +/*!40000 ALTER TABLE `CargoTypes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Cargoes` +-- + +DROP TABLE IF EXISTS `Cargoes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Cargoes` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Quantity` int NOT NULL COMMENT 'Кількість', + `CargoTypeId` int DEFAULT NULL COMMENT 'Тип вантажу', + `ShipId` int DEFAULT NULL COMMENT 'Корабель', + `PurposeId` int DEFAULT NULL COMMENT 'Ціль', + PRIMARY KEY (`Id`), + KEY `CargoTypeId` (`CargoTypeId`), + KEY `ShipId` (`ShipId`), + KEY `PurposeId` (`PurposeId`), + CONSTRAINT `Cargoes_ibfk_1` FOREIGN KEY (`CargoTypeId`) REFERENCES `CargoTypes` (`Id`), + CONSTRAINT `Cargoes_ibfk_2` FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`), + CONSTRAINT `Cargoes_ibfk_3` FOREIGN KEY (`PurposeId`) REFERENCES `Purposes` (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Cargoes` +-- + +LOCK TABLES `Cargoes` WRITE; +/*!40000 ALTER TABLE `Cargoes` DISABLE KEYS */; +/*!40000 ALTER TABLE `Cargoes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `ContactInfo` +-- + +DROP TABLE IF EXISTS `ContactInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ContactInfo` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Content` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Дані про контакт', + `PersonId` int DEFAULT NULL COMMENT 'Людина', + `ContactTypeId` int DEFAULT NULL COMMENT 'Тип контакту', + PRIMARY KEY (`Id`), + KEY `PersonId` (`PersonId`), + KEY `ContactTypeId` (`ContactTypeId`), + CONSTRAINT `ContactInfo_ibfk_1` FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`), + CONSTRAINT `ContactInfo_ibfk_2` FOREIGN KEY (`ContactTypeId`) REFERENCES `ContactTypes` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `ContactInfo` +-- + +LOCK TABLES `ContactInfo` WRITE; +/*!40000 ALTER TABLE `ContactInfo` DISABLE KEYS */; +INSERT INTO `ContactInfo` VALUES (1,'+123456789',1,1),(2,'email@example.com',2,2),(3,'123 Main Street',3,3),(4,'SkypeID123',4,4),(5,'WhatsAppNumber',5,5),(6,'http://www.example.com',6,6),(7,'TelegramUsername',7,7),(8,'FaxNumber',8,8),(9,'info@example.com',9,1),(10,'555-1234',10,2),(11,'456 Secondary Street',11,3),(12,'SkypeID456',12,4),(13,'TelegramUser567',13,7),(14,'ViberNumber',1,5),(15,'http://www.example2.com',2,6),(16,'FaxNumber2',3,8),(17,'+123456789',1,1),(18,'email@example.com',2,2),(19,'123 Main Street',3,3),(20,'SkypeID123',4,4),(21,'WhatsAppNumber',5,5),(22,'http://www.example.com',6,6),(23,'TelegramUsername',7,7),(24,'FaxNumber',8,8),(25,'info@example.com',9,1),(26,'555-1234',10,2),(27,'456 Secondary Street',11,3),(28,'SkypeID456',12,4),(29,'TelegramUser567',13,7),(30,'ViberNumber',1,5),(31,'http://www.example2.com',2,6),(32,'FaxNumber2',3,8),(33,'+123456789',1,1),(34,'email@example.com',2,2),(35,'123 Main Street',3,3),(36,'SkypeID123',4,4),(37,'WhatsAppNumber',5,5),(38,'http://www.example.com',6,6),(39,'TelegramUsername',7,7),(40,'FaxNumber',8,8),(41,'info@example.com',9,1),(42,'555-1234',10,2),(43,'456 Secondary Street',11,3),(44,'SkypeID456',12,4),(45,'TelegramUser567',13,7),(46,'ViberNumber',1,5),(47,'http://www.example2.com',2,6),(48,'FaxNumber2',3,8); +/*!40000 ALTER TABLE `ContactInfo` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `ContactTypes` +-- + +DROP TABLE IF EXISTS `ContactTypes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ContactTypes` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва типи контакту', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `ContactTypes` +-- + +LOCK TABLES `ContactTypes` WRITE; +/*!40000 ALTER TABLE `ContactTypes` DISABLE KEYS */; +INSERT INTO `ContactTypes` VALUES (5,'Skype'),(6,'WhatsApp'),(7,'Веб-сайт'),(2,'Електронна пошта'),(4,'Поштова адреса'),(8,'Телеграм'),(1,'Телефон'),(3,'Факс'); +/*!40000 ALTER TABLE `ContactTypes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Country` +-- + +DROP TABLE IF EXISTS `Country`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Country` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва країни', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=263 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Country` +-- + +LOCK TABLES `Country` WRITE; +/*!40000 ALTER TABLE `Country` DISABLE KEYS */; +INSERT INTO `Country` VALUES (54,'Єгипет'),(55,'Ємен'),(59,'Ізраїль'),(60,'Індія'),(61,'Індонезія'),(62,'Ірак'),(63,'Іран'),(64,'Ірландія'),(65,'Ісландія'),(66,'Іспанія'),(67,'Італія'),(2,'Австрія'),(1,'Австралія'),(3,'Азербайджан'),(4,'Албанія'),(5,'Алжир'),(6,'Ангола'),(7,'Андорра'),(8,'Аргентина'),(9,'Арменія'),(10,'Афганістан'),(18,'Білорусь'),(11,'Багамські Острови'),(12,'Бангладеш'),(13,'Барбадос'),(14,'Бахрейн'),(15,'Беліз'),(16,'Бельгія'),(17,'Бенін'),(20,'Болівія'),(19,'Болгарія'),(21,'Боснія і Герцеговина'),(22,'Ботсвана'),(23,'Бразилія'),(24,'Бруней'),(25,'Буркіна-Фасо'),(26,'Бурунді'),(27,'Бутан'),(28,'В\'єтнам'),(30,'Гаїті'),(29,'Габон'),(31,'Гайана'),(32,'Гамбія'),(33,'Гана'),(36,'Гвінея'),(37,'Гвінея - Бісау'),(34,'Гваделупа'),(35,'Гватемала'),(38,'Гондурас'),(39,'Гренада'),(42,'Гренландія'),(40,'Греція'),(41,'Грузія'),(43,'Данія'),(44,'Демократична Республіка Конго'),(45,'Джибуті'),(46,'Домініка'),(47,'Домініканська Республіка'),(48,'Еквадор'),(49,'Екваторіальна Гвінея'),(50,'Еритрея'),(51,'Есватіні'),(52,'Естонія'),(53,'Ефіопія'),(58,'Зімбабве'),(56,'Замбія'),(57,'Західна Сахара'),(68,'Йорданія'),(77,'Кіпр'),(78,'Кірібаті'),(69,'Казахстан'),(70,'Кайманові Острови'),(71,'Камбоджа'),(72,'Камерун'),(73,'Канада'),(74,'Катар'),(75,'Кенія'),(76,'Киргизстан'),(79,'Китай'),(80,'Колумбія'),(81,'Коморські Острови'),(82,'Конго'),(85,'Косово'),(86,'Коста - Рика'),(87,'Куба'),(88,'Кувейт'),(93,'Ліберія'),(95,'Лівія'),(94,'Ліван'),(96,'Ліхтенштейн'),(89,'Лаос'),(90,'Латвія'),(91,'Лесото'),(92,'Литва'),(97,'Люксембург'),(115,'М\'янма (Бірма)'),(98,'Маврикій'),(99,'Мавританія'),(100,'Мадагаскар'),(101,'Македонія'),(104,'Малі'),(102,'Малаві'),(103,'Малайзія'),(105,'Мальдіви'),(106,'Мальта'),(107,'Марокко'),(108,'Мартиніка'),(109,'Маршаллові Острови'),(110,'Мексика'),(111,'Мозамбік'),(112,'Молдова'),(113,'Монако'),(114,'Монголія'),(119,'Нігер'),(120,'Нігерія'),(121,'Нідерланди'),(122,'Нікарагуа'),(123,'Німеччина'),(116,'Намібія'),(117,'Науру'),(118,'Непал'),(124,'Нова Зеландія'),(125,'Норвегія'),(126,'ОАЕ'),(127,'Оман'),(84,'Південна Корея'),(83,'Північна Корея'),(128,'Пакистан'),(129,'Палау'),(130,'Палестина'),(131,'Панама'); +/*!40000 ALTER TABLE `Country` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `CrewPersons` +-- + +DROP TABLE IF EXISTS `CrewPersons`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CrewPersons` ( + `Id` int NOT NULL AUTO_INCREMENT, + `PersonId` int DEFAULT NULL COMMENT 'Дані людини', + `ShipId` int DEFAULT NULL COMMENT 'Корабель', + PRIMARY KEY (`Id`), + KEY `PersonId` (`PersonId`), + KEY `ShipId` (`ShipId`), + CONSTRAINT `CrewPersons_ibfk_1` FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`), + CONSTRAINT `CrewPersons_ibfk_2` FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `CrewPersons` +-- + +LOCK TABLES `CrewPersons` WRITE; +/*!40000 ALTER TABLE `CrewPersons` DISABLE KEYS */; +/*!40000 ALTER TABLE `CrewPersons` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `DockEmplyee` +-- + +DROP TABLE IF EXISTS `DockEmplyee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `DockEmplyee` ( + `DockId` int DEFAULT NULL COMMENT 'Причал', + `EmployeeId` int DEFAULT NULL COMMENT 'Працівник', + KEY `DockId` (`DockId`), + KEY `EmployeeId` (`EmployeeId`), + CONSTRAINT `DockEmplyee_ibfk_1` FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`), + CONSTRAINT `DockEmplyee_ibfk_2` FOREIGN KEY (`EmployeeId`) REFERENCES `Employees` (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `DockEmplyee` +-- + +LOCK TABLES `DockEmplyee` WRITE; +/*!40000 ALTER TABLE `DockEmplyee` DISABLE KEYS */; +INSERT INTO `DockEmplyee` VALUES (1,1),(2,2),(3,3),(4,1),(5,5),(1,1),(2,2),(3,3),(4,1),(5,5); +/*!40000 ALTER TABLE `DockEmplyee` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Docks` +-- + +DROP TABLE IF EXISTS `Docks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Docks` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва причалу', + `MaxLength` int NOT NULL COMMENT 'Максимальна довжина причалу', + `MaxWidth` int NOT NULL COMMENT 'Максимальна ширина причалу', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Docks` +-- + +LOCK TABLES `Docks` WRITE; +/*!40000 ALTER TABLE `Docks` DISABLE KEYS */; +INSERT INTO `Docks` VALUES (1,'Причал 1',100,20),(2,'Причал 2',120,25),(3,'Причал 3',150,30),(4,'Причал 4',90,15),(5,'Причал 5',110,18),(6,'Причал 6',130,22),(7,'Причал 7',140,28),(8,'Причал 8',160,35),(9,'Причал 9',105,17),(10,'Причал 10',125,23),(11,'Причал 11',115,19),(12,'Причал 12',95,14),(13,'Причал 13',145,27),(14,'Причал 14',155,33),(15,'Причал 15',165,38),(16,'Причал 1',100,20),(17,'Причал 2',120,25),(18,'Причал 3',150,30),(19,'Причал 4',90,15),(20,'Причал 5',110,18),(21,'Причал 6',130,22),(22,'Причал 7',140,28),(23,'Причал 8',160,35),(24,'Причал 9',105,17),(25,'Причал 10',125,23),(26,'Причал 11',115,19),(27,'Причал 12',95,14),(28,'Причал 13',145,27),(29,'Причал 14',155,33),(30,'Причал 15',165,38),(31,'Причал 1',100,20),(32,'Причал 2',120,25),(33,'Причал 3',150,30),(34,'Причал 4',90,15),(35,'Причал 5',110,18),(36,'Причал 6',130,22),(37,'Причал 7',140,28),(38,'Причал 8',160,35),(39,'Причал 9',105,17),(40,'Причал 10',125,23),(41,'Причал 11',115,19),(42,'Причал 12',95,14),(43,'Причал 13',145,27),(44,'Причал 14',155,33),(45,'Причал 15',165,38); +/*!40000 ALTER TABLE `Docks` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Employees` +-- + +DROP TABLE IF EXISTS `Employees`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Employees` ( + `Id` int NOT NULL AUTO_INCREMENT, + `PersonId` int DEFAULT NULL COMMENT 'Дані людини', + PRIMARY KEY (`Id`), + KEY `PersonId` (`PersonId`), + CONSTRAINT `Employees_ibfk_1` FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Employees` +-- + +LOCK TABLES `Employees` WRITE; +/*!40000 ALTER TABLE `Employees` DISABLE KEYS */; +INSERT INTO `Employees` VALUES (1,1),(3,3),(2,8),(5,10),(4,13); +/*!40000 ALTER TABLE `Employees` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Persons` +-- + +DROP TABLE IF EXISTS `Persons`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Persons` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Passport` varchar(1000) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Паспортні дані', + `FirstName` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Ім''я', + `LastName` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Прізвище', + `PositionId` int DEFAULT NULL COMMENT 'Посада', + PRIMARY KEY (`Id`), + UNIQUE KEY `Passport` (`Passport`), + KEY `PositionId` (`PositionId`), + CONSTRAINT `Persons_ibfk_1` FOREIGN KEY (`PositionId`) REFERENCES `Positions` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Persons` +-- + +LOCK TABLES `Persons` WRITE; +/*!40000 ALTER TABLE `Persons` DISABLE KEYS */; +INSERT INTO `Persons` VALUES (1,'AA123456','Іван','Петров',1),(2,'BB789012','Марія','Іванова',2),(3,'CC345678','Олег','Сидоров',3),(4,'DD901234','Наталія','Коваленко',4),(5,'EE567890','Андрій','Смирнов',5),(6,'FF123890','Тетяна','Біліченко',6),(7,'GG456789','Дмитро','Мельник',7),(8,'HH678901','Катерина','Соколова',8),(9,'II234567','Валентин','Жуков',9),(10,'JJ890123','Ольга','Морозова',10),(11,'KK345678','Анна','Кравченко',5),(12,'LL901234','Олександр','Лисенко',8),(13,'MM567890','Євгенія','Денисенко',2); +/*!40000 ALTER TABLE `Persons` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Positions` +-- + +DROP TABLE IF EXISTS `Positions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Positions` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва позиції', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Positions` +-- + +LOCK TABLES `Positions` WRITE; +/*!40000 ALTER TABLE `Positions` DISABLE KEYS */; +INSERT INTO `Positions` VALUES (4,'Інженер-механік'),(1,'Директор'),(3,'Капітан корабля'),(7,'Керівник вантажоперевезень'),(10,'Логістичний асистент'),(2,'Менеджер з логістики'),(9,'Митний брокер'),(5,'Оператор порту'),(8,'Технік з обслуговування суден'),(6,'Фінансовий аналітик'); +/*!40000 ALTER TABLE `Positions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Purposes` +-- + +DROP TABLE IF EXISTS `Purposes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Purposes` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва цілі', + `Description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Опис цілі', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Purposes` +-- + +LOCK TABLES `Purposes` WRITE; +/*!40000 ALTER TABLE `Purposes` DISABLE KEYS */; +INSERT INTO `Purposes` VALUES (1,'Перевезення сировини','Перевезення різноманітних сировинних матеріалів на виробництво.'),(2,'Експорт товарів','Вивезення готової продукції за кордон для продажу.'),(3,'Імпорт сировини','Закупівля різноманітних сировинних матеріалів з-за кордону.'),(4,'Транспортування контейнерів','Перевезення контейнерів із товаром між портами.'),(5,'Доставка харчових продуктів','Перевезення продуктів харчування великими суднами.'),(6,'Енергетичні цілі','Транспортування палива та енергетичних ресурсів морем.'),(7,'Будівельні матеріали','Перевезення будівельних матеріалів для проектів на узбережжі.'),(8,'Масова перевезення','Транспортування великих обсягів товарів для оптових партнерів.'),(9,'Транзитне сполучення','Проходження через території кількох країн у маршруті доставки.'); +/*!40000 ALTER TABLE `Purposes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `ServiceEmployee` +-- + +DROP TABLE IF EXISTS `ServiceEmployee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ServiceEmployee` ( + `EmployeeId` int DEFAULT NULL COMMENT 'Працівник', + `ServiceId` int DEFAULT NULL COMMENT 'Обслуговування', + KEY `EmployeeId` (`EmployeeId`), + KEY `ServiceId` (`ServiceId`), + CONSTRAINT `ServiceEmployee_ibfk_1` FOREIGN KEY (`EmployeeId`) REFERENCES `Employees` (`Id`), + CONSTRAINT `ServiceEmployee_ibfk_2` FOREIGN KEY (`ServiceId`) REFERENCES `Services` (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `ServiceEmployee` +-- + +LOCK TABLES `ServiceEmployee` WRITE; +/*!40000 ALTER TABLE `ServiceEmployee` DISABLE KEYS */; +/*!40000 ALTER TABLE `ServiceEmployee` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `ServiceTypes` +-- + +DROP TABLE IF EXISTS `ServiceTypes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ServiceTypes` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва типу', + `Description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Опис обслуговування', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `ServiceTypes` +-- + +LOCK TABLES `ServiceTypes` WRITE; +/*!40000 ALTER TABLE `ServiceTypes` DISABLE KEYS */; +INSERT INTO `ServiceTypes` VALUES (1,'Технічний огляд','Комплексне технічне обстеження та оцінка стану судна.'),(2,'Ремонт двигуна','Виконання ремонтних робіт та технічного обслуговування суднового двигуна.'),(3,'Мальовничі роботи','Фарбування та зовнішній оздоблювальний ремонт корпусу судна.'),(4,'Технічне обслуговування електроніки','Проведення робіт з налаштування та ремонту електронних систем на судні.'),(5,'Заміна обладнання','Встановлення нового суднового обладнання та видалення застарілого.'),(6,'Очищення та змазування','Профілактичне очищення та змащення механізмів та обладнання судна.'); +/*!40000 ALTER TABLE `ServiceTypes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Services` +-- + +DROP TABLE IF EXISTS `Services`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Services` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Date` timestamp NOT NULL COMMENT 'Дата обслуговування', + `Done` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Виконане', + `ShipId` int DEFAULT NULL COMMENT 'Корабель', + `ServiceTypeId` int DEFAULT NULL COMMENT 'Тип обслуговування', + PRIMARY KEY (`Id`), + KEY `ShipId` (`ShipId`), + KEY `ServiceTypeId` (`ServiceTypeId`), + CONSTRAINT `Services_ibfk_1` FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`), + CONSTRAINT `Services_ibfk_2` FOREIGN KEY (`ServiceTypeId`) REFERENCES `ServiceTypes` (`Id`), + CONSTRAINT `Services_ibfk_3` FOREIGN KEY (`ShipId`) REFERENCES `Ships` (`Id`), + CONSTRAINT `Services_ibfk_4` FOREIGN KEY (`ServiceTypeId`) REFERENCES `ServiceTypes` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Services` +-- + +LOCK TABLES `Services` WRITE; +/*!40000 ALTER TABLE `Services` DISABLE KEYS */; +INSERT INTO `Services` VALUES (4,'2025-05-24 14:10:31',0,NULL,2),(5,'2025-08-18 14:10:31',1,NULL,4),(6,'2025-09-20 14:10:31',0,NULL,6),(7,'2025-08-04 14:10:31',1,NULL,5),(8,'2025-12-07 14:10:31',1,NULL,4),(11,'2025-08-29 14:12:28',0,NULL,5),(12,'2025-07-26 14:12:28',0,NULL,1),(13,'2025-08-06 14:12:28',0,NULL,2),(14,'2025-06-13 14:12:28',0,NULL,5),(15,'2025-10-10 14:12:28',0,NULL,6); +/*!40000 ALTER TABLE `Services` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `ShipTypes` +-- + +DROP TABLE IF EXISTS `ShipTypes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ShipTypes` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва типу', + PRIMARY KEY (`Id`), + UNIQUE KEY `Name` (`Name`) +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `ShipTypes` +-- + +LOCK TABLES `ShipTypes` WRITE; +/*!40000 ALTER TABLE `ShipTypes` DISABLE KEYS */; +INSERT INTO `ShipTypes` VALUES (7,'Багатоцільовий корабель'),(1,'Балкер'),(5,'Бункеровоз'),(10,'Вантажівка-перевізник (Ferry)'),(2,'Контейнеровоз'),(6,'Круїзний лайнер'),(9,'Лінійний корабель'),(11,'Пасажирський корабель'),(4,'Ро-Ро (Roll-on/Roll-off)'),(3,'Танкер'),(8,'Трал'); +/*!40000 ALTER TABLE `ShipTypes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Ships` +-- + +DROP TABLE IF EXISTS `Ships`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Ships` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Назва корабля', + `Length` decimal(10,2) NOT NULL COMMENT 'Довжина корабля', + `Width` decimal(10,2) NOT NULL COMMENT 'Ширина корабля', + `Capacity` int NOT NULL COMMENT 'Місткість корабля (у тоннах)', + `ShipTypeId` int DEFAULT NULL COMMENT 'Тип корабля', + `VoyageId` int DEFAULT NULL COMMENT 'Інформація про рейс', + `DockId` int DEFAULT NULL COMMENT 'Причал', + PRIMARY KEY (`Id`), + KEY `ShipTypeId` (`ShipTypeId`), + KEY `VoyageId` (`VoyageId`), + KEY `DockId` (`DockId`), + CONSTRAINT `Ships_ibfk_1` FOREIGN KEY (`ShipTypeId`) REFERENCES `ShipTypes` (`Id`), + CONSTRAINT `Ships_ibfk_2` FOREIGN KEY (`VoyageId`) REFERENCES `Voyages` (`Id`), + CONSTRAINT `Ships_ibfk_3` FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`), + CONSTRAINT `Ships_ibfk_4` FOREIGN KEY (`VoyageId`) REFERENCES `Voyages` (`Id`), + CONSTRAINT `Ships_ibfk_5` FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`), + CONSTRAINT `Ships_ibfk_6` FOREIGN KEY (`ShipTypeId`) REFERENCES `ShipTypes` (`Id`), + CONSTRAINT `Ships_ibfk_7` FOREIGN KEY (`ShipTypeId`) REFERENCES `ShipTypes` (`Id`), + CONSTRAINT `Ships_ibfk_8` FOREIGN KEY (`VoyageId`) REFERENCES `Voyages` (`Id`), + CONSTRAINT `Ships_ibfk_9` FOREIGN KEY (`DockId`) REFERENCES `Docks` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Ships` +-- + +LOCK TABLES `Ships` WRITE; +/*!40000 ALTER TABLE `Ships` DISABLE KEYS */; +INSERT INTO `Ships` VALUES (91,'Корабель 1',50.50,10.50,500,1,1,1),(92,'Корабель 2',60.20,12.80,700,2,2,2),(93,'Корабель 3',55.00,11.00,600,3,3,3),(94,'Корабель 4',45.80,9.50,450,4,4,4),(95,'Корабель 10',59.90,12.00,690,10,10,10),(96,'Корабель 11',57.20,11.20,590,11,11,11),(97,'Корабель 12',63.80,13.80,770,5,12,12),(98,'Корабель 13',52.40,10.80,540,3,9,13),(99,'Корабель 14',49.00,9.80,480,6,8,14),(100,'Корабель 15',66.50,14.00,820,8,5,15); +/*!40000 ALTER TABLE `Ships` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Users` +-- + +DROP TABLE IF EXISTS `Users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Users` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Password` varchar(1000) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT 'Пароль', + `PersonId` int DEFAULT NULL COMMENT 'Дані людини', + PRIMARY KEY (`Id`), + KEY `PersonId` (`PersonId`), + CONSTRAINT `Users_ibfk_1` FOREIGN KEY (`PersonId`) REFERENCES `Persons` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Users` +-- + +LOCK TABLES `Users` WRITE; +/*!40000 ALTER TABLE `Users` DISABLE KEYS */; +INSERT INTO `Users` VALUES (1,'strongpassword1',1),(2,'securepass123',2),(3,'myp@ssw0rd',3),(4,'pass4you',4),(5,'secret123',5),(6,'strongpassword1',1),(7,'securepass123',2),(8,'myp@ssw0rd',3),(9,'pass4you',4),(10,'secret123',5),(11,'strongpassword1',1),(12,'securepass123',2),(13,'myp@ssw0rd',3),(14,'pass4you',4),(15,'secret123',5); +/*!40000 ALTER TABLE `Users` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `Voyages` +-- + +DROP TABLE IF EXISTS `Voyages`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Voyages` ( + `Id` int NOT NULL AUTO_INCREMENT, + `CountryFromId` int DEFAULT NULL COMMENT 'Країна відправки', + `CountryToId` int DEFAULT NULL COMMENT 'Країна доставки', + PRIMARY KEY (`Id`), + KEY `CountryFromId` (`CountryFromId`), + KEY `CountryToId` (`CountryToId`), + CONSTRAINT `Voyages_ibfk_1` FOREIGN KEY (`CountryFromId`) REFERENCES `Country` (`Id`), + CONSTRAINT `Voyages_ibfk_2` FOREIGN KEY (`CountryToId`) REFERENCES `Country` (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `Voyages` +-- + +LOCK TABLES `Voyages` WRITE; +/*!40000 ALTER TABLE `Voyages` DISABLE KEYS */; +INSERT INTO `Voyages` VALUES (1,26,66),(2,97,8),(3,117,38),(4,6,61),(5,125,31),(8,1,92),(9,118,66),(10,58,32),(11,104,8),(12,49,42),(15,34,71),(16,122,35),(17,123,76),(18,36,117),(19,64,15); +/*!40000 ALTER TABLE `Voyages` ENABLE KEYS */; +UNLOCK TABLES; +SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-03-25 14:33:32 diff --git a/lab2-10/task1.sql b/lab2-10/task1.sql new file mode 100644 index 0000000..d4a65e9 --- /dev/null +++ b/lab2-10/task1.sql @@ -0,0 +1,112 @@ +use Lucky_Shrub; + +Основні завдання: +• Розробка INSERT, UPDATE та DELETE тригерів. +################################################ +############## Умови завдань ############### +################ Завдання 1: ############### +1. Створіть INSERT триггер з назвою ProductSellPriceInsertCheck. Тригер має перевірити, +чи ціна SellPrice продукту менша ніж BuyPrice після того як новий продук було додано у таблицю Products. +Якщо таке станеться, у таблицю Notifications має бути додане сповіщення для відділу продажів. +Відділ продажів має переконатися, що таке значення було введено не помилково. +Сповіщення слід додати у такому форматі: 'Для продукту з id ' + ProductID + 'було внесено значення SellPrice яке менше чи рівне BuyPrice' +2. Перегляньте існуючі тригери +3. Перевіте роботу тригера. Додайте запис у таблицю Products із ціною закупки вищою ніж ціна продажу, на прклад: +P7, Агрополотно, 70, 70, 21; + +4. Перевірте наявність запису у таблиці Products 5. Перевірте наявність запису у таблиці Notifications + +drop trigger ProductSellPriceInsertCheck; + +create trigger if not exists ProductSellPriceInsertCheck +after insert on Products +for each row +begin + if new.SellPrice <= new.BuyPrice then + insert into Notifications (Notification, DateTime) + values (concat('Для продукту з id ', new.ProductID, 'було внесено значення SellPrice яке менше чи рівне BuyPrice'), now()); + end if; +end; + +insert into + Products ( + ProductID, + ProductName, + BuyPrice, + SellPrice, + NumberOfItems + ) +values ( + 'P7', + 'Агрополотно', + 70, + 70, + 21 + ); + +show triggers like 'Products'; + +select * from Notifications; + +select * from Products; + +delete from Products where ProductID = 'P7'; + +################################################ +################ Завдання 2: ############### +1. Створіть UPDATE тригер з назвою ProductSellPriceUpdateCheck. Цей тригер повинен перевіряти +чи продукти не оновлюються з ціною SellPrice, яка менша чи рівна ціні BuyPrice. Якщо це так, +слід додати сповіщення до таблиці Notifications для відділу продажів щоб вони переконалися, + що ціни на продукти не оновлено з некоректними значеннями. Цей тригер надсилає сповіщення у +tаблицю Notifications, яке попереджає відділ продажів про проблему. +Сповіщення має бути додано у такому форматі: ProductID + 'було оновлено зі значенням SellPrice = ' + SellPrice + 'яке менше чи рівне значення BuyPrice' +2. Перегляньте тригери +3. Перевірте роботу тригера. Наприклад, змініть значення SellPrice на 65 для запису з ID продукту P6 таблиці Products +4. Перевірте наявність запису у таблиці Products +5. Перевіряємо наявність запису у таблиці Notifications + +drop trigger if exists ProductSellPriceUpdateCheck; + +create trigger if not exists ProductSellPriceUpdateCheck +before update on Products +for each row +begin + if new.SellPrice <= new.BuyPrice then + insert into Notifications (Notification, DateTime) + values (concat(new.ProductID, 'було оновлено зі значенням SellPrice = ', new.SellPrice, 'яке менше чи рівне значення BuyPrice'), now()); + end if; +end; + +update Products set SellPrice = 60 where ProductID = 'P1'; + +select * from Products where ProductID = 'P1'; + +select * from Notifications; + +################################################ +################ Завдання 3: ############### +1. Створіть тригер DELETE з назвою NotifyProductDelete. Цей тригер повинен додати сповіщення +до таблиці Notifications для відділу продажів після того, як продукт було видалено з таблиція Products. +Сповіщення повинно бути у такому форматі: 'Продукт з id' + ProductID + 'було видалено' +2. Перегляньте тригери +3. Перевірте роботу тригра. Наприклад, видаліть один запис із таблицю Products з ID продукту P7 +4. Перевірте наявність запису у таблиці Products +5. Перевірте наявність запису у таблиці Notifications + +drop trigger NotifyProductDelete; + +create trigger if not exists NotifyProductDelete +after delete on Products +for each row +begin + insert into Notifications (Notification, DateTime) + values (concat('Продукт з id ', old.ProductID, 'було видалено'), now()); +end; + +show triggers like 'Products'; + +delete from Products where ProductID = 'P1'; + +select * from Products; + +select * from Notifications; \ No newline at end of file diff --git a/lab2-10/task2.sql b/lab2-10/task2.sql new file mode 100644 index 0000000..e7b44d9 --- /dev/null +++ b/lab2-10/task2.sql @@ -0,0 +1,65 @@ +CREATE DATABASE EventsDB; + +USE EventsDB; + +CREATE TABLE Messages ( + id INT PRIMARY KEY AUTO_INCREMENT, + message VARCHAR(100), + created_at DATETIME +); + +SET GLOBAL event_scheduler = ON; + +#1.1 Створіть одноразову подію (слайд 33) +CREATE EVENT IF NOT EXISTS test_event_02 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 20 second +ON COMPLETION PRESERVE +DO + INSERT INTO + Messages(message,created_at) + VALUES('Test MySQL Event 2', DATE_FORMAT( + CONVERT_TZ( + UTC_TIMESTAMP(), + '+00:00', + 'Europe/Kyiv' + ), + '%Y-%m-%d %H:%i:%s' +)); + +drop event test_event_02; + +ALTER EVENT test_event_02 +ON SCHEDULE AT NOW() +ENABLE; + +SHOW EVENTS; + +# 1.2 Переконайтеся у її працездатності + +select * from Messages; + +# 2.1 Створіть повторювану подію (слайд 34) +CREATE EVENT test_event_03 +ON SCHEDULE EVERY 1 MINUTE +STARTS CURRENT_TIMESTAMP +ENDS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE +DO + INSERT INTO Messages(message,created_at) + VALUES('Test MySQL recurring Event', DATE_FORMAT( + CONVERT_TZ( + UTC_TIMESTAMP(), + '+00:00', + 'Europe/Kyiv' + ), + '%Y-%m-%d %H:%i:%s' +)); + +drop event test_event_03; + +SHOW EVENTS; + +# 2.2 Переконайтеся у її працездатності + +select * from Messages; + +set global time_zone = 'Europe/Kyiv'; \ No newline at end of file diff --git a/lab2-10/tasks.sql b/lab2-10/tasks.sql new file mode 100644 index 0000000..b40b775 --- /dev/null +++ b/lab2-10/tasks.sql @@ -0,0 +1,94 @@ + +Робота з тригерами (triggers) +Lucky Shrub потребує визначити правила для вставки, оновлення та видалення даних про продукти у своїй базі даних. Вам слід використати для цього тригери +Таблиця Products містить наступну інформацію про кожен продукт: +• ProductID, +• ProductName, +• BuyPrice, +• SellPrice , +• NumberOfItems. + +Передумови +Для виконання роботи Вам потрібна буде база даних Lucky Shrub та таблиця Products в MySQL. Таблиця Products повинна бути заповнена відпвідними даними. Виконайте наступні кроки для створення бази даних (якщо потрібно) та заповнення таблиці даними: +------------------------------------------------ +1: Створіть базу даних Lucky_Shrub (якщо потрібно) + +CREATE DATABASE IF NOT EXISTS Lucky_Shrub; +------------------------------------------------- +2: Оберіть базу даних Lucky_Shrub + +USE Lucky_Shrub; +------------------------------------------------ +3: Створіть таблицю Products: + +CREATE TABLE Products ( + ProductID VARCHAR(10) PRIMARY KEY, + ProductName VARCHAR(100), + BuyPrice DECIMAL(6, 2), + SellPrice DECIMAL(6, 2), + NumberOfItems INT +); +------------------------------------------------ +4: Використайте наступний код для заповнення таблиці Products: + +INSERT INTO + Products ( + ProductID, + ProductName, + BuyPrice, + SellPrice, + NumberOfITems + ) +VALUES ( + "P1", + "Artificial grass bags ", + 40, + 50, + 100 + ), + ( + "P2", + "Wood panels", + 15, + 20, + 250 + ), + ( + "P3", + "Patio slates", + 35, + 40, + 60 + ), + ( + "P4", + "Sycamore trees ", + 7, + 10, + 50 + ), + ( + "P5", + "Trees and Shrubs", + 35, + 50, + 75 + ), + ( + "P6", + "Water fountain", + 65, + 80, + 15 + ); + +------------------------------------------------ +5: Створіть таблицю Notifications з такими полями: + +CREATE TABLE Notifications ( + NotificationID INT AUTO_INCREMENT, + Notification VARCHAR(255), + DateTime TIMESTAMP NOT NULL, + PRIMARY KEY (NotificationID) +); +------------------------------------------------ \ No newline at end of file diff --git a/lab2-11/task.sql b/lab2-11/task.sql new file mode 100644 index 0000000..549782d --- /dev/null +++ b/lab2-11/task.sql @@ -0,0 +1,115 @@ +############################################### +############### Завдання ################# +############################################### + +################################################ +############### Завдання 1 ################# + +Для того, щоб швидко вивести інформацію про замовлення було створено такий запит: + +SELECT * FROM Orders; + +--------------------------------------------------- +1. Оптимізуйте даний запит, якщо відомо, що потрібна інформація представлена у полях +OrderID, ProductID, Quantity та Date. + +select OrderID, ProductID, Quantity, Date from Orders; + +################################################ +############### Завдання 2 ################# +Для того, щоб вивести замовлення розміщене клієнтом з ідентифікатором Cl1 було створено наступний запис: + +SELECT * FROM Orders WHERE ClientID = 'Cl1'; +--------------------------------------------------- +1. Виконайте наступний запит, +щоб переглянути параметри плану виконання. + +EXPLAIN SELECT * FROM Orders WHERE ClientID = 'Cl1'; + + +Значення деяких полів: + +type + -- містиь значення ALL, яке свідчить, що для пошуку потрібного значення була просканована уся таблиця. + -- це найгірший тип сканування, який зазвичай вказує на відсутність відповідних індексів у таблиці + +possible_keys + -- цей стовпець показує ключі, які може використовувати MySQL для пошуку рядків у таблиці; + -- значення стовпця дорівнює NULL, це означає, що відповідні індекси не знайдено. + +key + -- вказує фактичний індекс, який використовує MySQL; + -- у нашому видку стовпець містить значення NULL, яке вказує на те, що в таблиці немає ключів або індексів, які MySQL може використовувати для пошуку або фільтрації рядків +rows + -- кількість опрацьованих рядків для отримання результату +Extra + --Примітки +Ситуацію можна виправити шляхом створення індексу. + +--------------------------------------------------- +2. З метою оптимізації запиту створіть index з іменем IdxClientID на потрібному полі таблиці Orders. + +create index IdxClientID on Orders (ClientID); + +drop index IdxClientID on Orders; +--------------------------------------------------- +3.Як тільки індекс буде створено, повторно виконайте той же запит SELECT з операторм EXPLAIN. +Порівняйте результати й зробіть висновки. + +explain select * from Orders where ClientID = 'Cl1'; + +################################################ +############### Завдання 3 ################# +Для пошуку повної інформації про працівника з прізвищем 'Tolo' було написано такий запит: + +SELECT * FROM Employees WHERE FullName LIKE '%Tolo'; + + +FullName містить ім’я та прізвище працівника + +Якщо у стовпці FullName є індекс, то запит не зможе його використати, оскільки в умові пропозиції WHERE він містить на початку груповий символ (%). +Для уникнення систуації використання в умові WHERE на початку групового символа (%) виконайте такі кроки: +--------------------------------------------------- +1: Додайте новий стовпець ReverseFullName до таблиці Employees. + +alter table Employees +add column ReverseFullName varchar(100) default CONCAT( + SUBSTRING_INDEX(FullName, ' ', -1), + ' ', + SUBSTRING_INDEX(FullName, ' ', 1) +); + +alter table Employees +add column asd integer unique auto_increment primary key; + +--------------------------------------------------- +2: Заповніть стовпець ReverseFullName значенням з повного імені працівників але у порядку "Прізвище І’мя". + +select * from Employees; + +update Employees +set + ReverseFullName = CONCAT( + SUBSTRING_INDEX(FullName, ' ', -1), + ' ', + SUBSTRING_INDEX(FullName, ' ', 1) + ); + +--------------------------------------------------- +2.1: Перегляньте новостворений стовбець + +select ReverseFullName from Employees; + +--------------------------------------------------- +3: Створіть індекс з іменем IdxReverseFullName на основі стовпця ReverseFullName. + +create index IdxReverseFullName on Employees (ReverseFullName); + +drop index IdxReverseFullName on Employees; + +--------------------------------------------------- +4. Перепишіть запит із використанням вже новоствореного стовпця. + +select * from Employees where ReverseFullName like 'Tolo%'; + +explain select * from Employees where ReverseFullName like 'Tolo%'; \ No newline at end of file diff --git a/lab2-11/tasks.sql b/lab2-11/tasks.sql new file mode 100644 index 0000000..67a392e --- /dev/null +++ b/lab2-11/tasks.sql @@ -0,0 +1,316 @@ + +SELECT statement optimization in MySQL +Оптимізація пропозиції SELECT + +У цій роботі слід застосувати техніки оптимізації запитів на основі оператора SELECT, а також побудувати індекси на основі стовпців для прискорення виконання запитів. +У роботі буде використано базу даних Lucky_Shrub. Слід оптимізувати запити, які звертаються до таблиць працівників (Employees) та замовлень (Orders). + +Таблиця Orders містить таку інформацію: +OrderID - ідентифікатор замовлення +ClientID - ідентифікатор клієнта +ProductID - ідентифікатор продукту +Quantity - кількість одиниць продукту +Cost - вартість замовлення +Date - дата кожного замовлення + +Таблиця Employees містить таку інформацію +EmployeeID - ідентифікатор працівника +FullName - повне ім’я працівника (містить, власне, ім’я та прізвище) +Role - роль працівника +Department - відділ працівника + +Передумови +1: Створити базу даних, якщо не створено +CREATE DATABASE Lucky_Shrub; + +2: Використати базу даних + +USE Lucky_Shrub; + +3: Створити таблицю Orders (якщо не створено; + +якщо створено, тоді перевірити правильність схеми таблиці) + +CREATE TABLE Orders ( + OrderID INT NOT NULL, + ClientID VARCHAR(10) DEFAULT NULL, + ProductID VARCHAR(10) DEFAULT NULL, + Quantity INT DEFAULT NULL, + Cost DECIMAL(6, 2) DEFAULT NULL, + Date DATE DEFAULT NULL, + PRIMARY KEY (OrderID) +); + +Для перевірки схеми можна використати команду +SHOW CREATE TABLE Orders; + +4: Створити таблицю Employees (якщо не створено; + +якщо створено, тоді перевірити правильність схеми таблиці) + +CREATE TABLE Employees ( + EmployeeID INT DEFAULT NULL, + FullName VARCHAR(100) DEFAULT NULL, + Role VARCHAR(50) DEFAULT NULL, + Department VARCHAR(255) DEFAULT NULL +); + +Для перевірки схеми можна використати команду +SHOW CREATE TABLE Orders; + +5: Вставте дані у таблицю Orders (якщо дані у таблиці є, перевірте чи відповідають вони запропонованим, за потреби підкоригуйте) + +INSERT INTO + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost, + Date + ) +VALUES ( + 1, + "Cl1", + "P1", + 10, + 500, + "2020-09-01" + ), + ( + 2, + "Cl2", + "P2", + 5, + 100, + "2020-09-05" + ), + ( + 3, + "Cl3", + "P3", + 20, + 800, + "2020-09-03" + ), + ( + 4, + "Cl4", + "P4", + 15, + 150, + "2020-09-07" + ), + ( + 5, + "Cl3", + "P3", + 10, + 450, + "2020-09-08" + ), + ( + 6, + "Cl2", + "P2", + 5, + 800, + "2020-09-09" + ), + ( + 7, + "Cl1", + "P4", + 22, + 1200, + "2020-09-10" + ), + ( + 8, + "Cl3", + "P1", + 15, + 150, + "2020-09-10" + ), + ( + 9, + "Cl1", + "P1", + 10, + 500, + "2020-09-12" + ), + ( + 10, + "Cl2", + "P2", + 5, + 100, + "2020-09-13" + ), + ( + 11, + "Cl1", + "P2", + 15, + 80, + "2020-09-12" + ), + ( + 12, + "Cl1", + "P1", + 10, + 500, + "2022-09-01" + ), + ( + 13, + "Cl2", + "P2", + 5, + 100, + "2022-09-05" + ), + ( + 14, + "Cl3", + "P3", + 20, + 800, + "2022-09-03" + ), + ( + 15, + "Cl4", + "P4", + 15, + 150, + "2022-09-07" + ), + ( + 16, + "Cl3", + "P3", + 10, + 450, + "2022-09-08" + ), + ( + 17, + "Cl2", + "P2", + 5, + 800, + "2022-09-09" + ), + ( + 18, + "Cl1", + "P4", + 22, + 1200, + "2022-09-10" + ), + ( + 19, + "Cl3", + "P1", + 15, + 150, + "2022-09-10" + ), + ( + 20, + "Cl1", + "P1", + 10, + 500, + "2022-09-12" + ), + ( + 21, + "Cl2", + "P2", + 5, + 100, + "2022-09-13" + ), + ( + 22, + "Cl2", + "P1", + 10, + 500, + "2021-09-01" + ), + ( + 23, + "Cl2", + "P2", + 5, + 100, + "2021-09-05" + ), + ( + 24, + "Cl3", + "P3", + 20, + 800, + "2021-09-03" + ), + ( + 25, + "Cl4", + "P4", + 15, + 150, + "2021-09-07" + ), + ( + 26, + "Cl1", + "P3", + 10, + 450, + "2021-09-08" + ), + ( + 27, + "Cl2", + "P1", + 20, + 1000, + "2022-09-01" + ), + ( + 28, + "Cl2", + "P2", + 10, + 200, + "2022-09-05" + ), + ( + 29, + "Cl3", + "P3", + 20, + 800, + "2021-09-03" + ); + +5: Імпортуйте дані у таблицю Employees скориставшись файлом MS Excel (https://docs.google.com/spreadsheets/d/14KHqSVEqqvaPXSRSlJdHwMUJlBt6VBtr?rtpof=true&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs). Для цього здійсніть експорт даних у формат csv з екселівського файлу, після чого здійсніть імпорт у таблицю бази даних. + +LOAD DATA INFILE '/var/lib/mysql-files/Employees.csv' INTO +TABLE Employees FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES ( + EmployeeID, + FullName, + Role, + Department, + @dummy +); + +Перевірте наявність даних після операції імпорту \ No newline at end of file diff --git a/lab2-2/db.sql b/lab2-2/db.sql new file mode 100644 index 0000000..6b85c63 --- /dev/null +++ b/lab2-2/db.sql @@ -0,0 +1,59 @@ +-- ============================== +-- Частина І — Lucky Shrub (Orders) +-- ============================== + +CREATE DATABASE IF NOT EXISTS LuckyShrub; + +USE LuckyShrub; + +DROP TABLE IF EXISTS Orders; + +CREATE TABLE Orders ( + OrderID INT PRIMARY KEY, + ClientID VARCHAR(10) NOT NULL, + ProductID VARCHAR(10) NOT NULL, + Quantity INT NOT NULL, + Cost DECIMAL(10, 2) NOT NULL +); + +-- Початкові дані (записи 1–8) +INSERT INTO + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost + ) +VALUES (1, 'Cl1', 'P1', 2, 1000.00), + (2, 'Cl2', 'P2', 3, 150.00), + (3, 'Cl3', 'P3', 1, 500.00), + (4, 'Cl1', 'P4', 6, 300.00), + (5, 'Cl2', 'P1', 4, 2000.00), + (6, 'Cl3', 'P2', 2, 100.00), + (7, 'Cl1', 'P3', 8, 4000.00), + (8, 'Cl2', 'P4', 1, 50.00); + +-- ============================== +-- Частина ІІ — Starters +-- ============================== + +DROP TABLE IF EXISTS Starters; + +CREATE TABLE Starters ( + Name VARCHAR(100) PRIMARY KEY, + Price DECIMAL(5, 2) NOT NULL, + Type VARCHAR(50) NOT NULL +); + +-- Початкові дані +INSERT INTO + Starters (Name, Price, Type) +VALUES ('Hummus', 5.00, 'Turkish'), + ('Falafel', 7.50, 'Turkish'), + ( + 'Spring rolls', + 8.00, + 'Chinese' + ), + ('Samosa', 6.50, 'Indian'); \ No newline at end of file diff --git a/lab2-2/task.md b/lab2-2/task.md new file mode 100644 index 0000000..102a24e --- /dev/null +++ b/lab2-2/task.md @@ -0,0 +1,59 @@ +# Виконання завдання — робота з базою даних "Team" + +> Для виконання завдання використайте презентацію (слайди 7–16) + +| № | Завдання | Бали | Опис | +|---|----------|------|------| +| І-1 | REPLACE — вставка записів | 1 | Напишіть запит SQL, який використовує оператор `REPLACE` для вставки у таблицю замовлень двох нових записів: | + +**Запис 9:** + +| Поле | Значення | +|------|----------| +| ID замовлення | 9 | +| ID клієнта | Cl1 | +| ID продукта | P1 | +| Кількість одиниць | 10 | +| Вартість | $5000 | + +**Запис 10:** + +| Поле | Значення | +|------|----------| +| ID замовлення | 10 | +| ID клієнта | Cl2 | +| ID продукта | P2 | +| Кількість одиниць | 5 | +| Вартість | $100 | + +> Після виконання запиту виведіть усі записи з таблиці замовлень. + +--- + +| № | Завдання | Бали | Опис | +|---|----------|------|------| +| І-2 | REPLACE — виправлення помилки | 1 | У Lucky Shrub помітили, що вартість замовлення №9 становить $5000. Це помилка. Замовлення має коштувати $500. Потрібно змінити його на $500, написавши відповідну пропозицію `REPLACE`. | + +> Після виконання запиту виведіть усі записи з таблиці замовлень. + +--- + +| № | Завдання | Бали | Опис | +|---|----------|------|------| +| ІІ-1 | REPLACE — вставка нового запису | 1 | Використайте оператор `REPLACE` для того, щоб вставити новий запис з наведеною нижче інформацією: | + +| Поле | Значення | +|------|----------| +| Назва страви | Cheese bread | +| Вартість | $9,50 | +| Тип страви | Indian | + +> Після виконання запиту відобразіть таблицю Starters. + +--- + +| № | Завдання | Бали | Опис | +|---|----------|------|------| +| ІІ-2 | REPLACE — зміна вартості | 1 | Використайте оператор `REPLACE` для того, щоб змінити вартість страви Cheese bread з $9,50 на $9,75. | + +> Після виконання запиту відобразіть таблицю Starters. \ No newline at end of file diff --git a/lab2-2/tasks.sql b/lab2-2/tasks.sql new file mode 100644 index 0000000..883ab9e --- /dev/null +++ b/lab2-2/tasks.sql @@ -0,0 +1,115 @@ +create database Team; + +use Team; + +CREATE TABLE member ( + m_id int NOT NULL, + mname char(40) NOT NULL, + mcity char(40), + mmail char(8ß0) UNIQUE, + PRIMARY KEY (m_id) +); + +# + +INSERT INTO + member (m_id, mname, mcity, mmail) +VALUES ( + 1001, + 'Зеленюк Іван', + 'Острог', + 'ivan.zelenyuk@oa.edu.ua' + ), + ( + 1002, + 'Нікітюк Анна', + 'Рівне', + 'anna.nikitiuk@oa.edu.ua' + ); + +REPLACE INTO + member (m_id, mname, mcity, mmail) +VALUES ( + 1003, + 'Довгий Петро', + 'Острог', + 'dovhyi.petro@oa.edu.ua' + ), + ( + 1004, + 'Остренко Давид', + 'Рівне', + 'davyd.ostrenko@oa.edu.ua' + ); + +REPLACE INTO + member (m_id, mname, mcity, mmail) +VALUES ( + 1003, + 'Вартова Світлана', + 'Нетішин', + 'svitlana.vartova@oa.edu.ua' + ); + +REPLACE INTO + member +VALUES ( + 1003, + 'Вартова Світлана', + 'Рівне', + 'svitlana.vartova@oa.edu.ua' + ); + +REPLACE INTO + member +VALUES ( + 1001, + 'Зеленюк Іван', + 'Рівне', + 'ivan.zelenyuk@oa.edu.ua' + ); + +UPDATE member SET mcity = "Рівне" WHERE m_id = 1001; + +# Tasks + +use LuckyShrub; + +replace into + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost + ) +values (9, 'Cl1', 'P1', 10, 5000.00), + (10, 'Cl2', 'P2', 5, 100.00); + +replace into + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost + ) +values (9, 'Cl1', 'P1', 10, 500.00); + +# + +replace into + Starters (Name, Price, Type) +values ( + 'Cheese bread', + 9.50, + 'Indian' + ); + +replace into + Starters (Name, Price, Type) +values ( + 'Cheese bread', + 9.75, + 'Indian' + ); \ No newline at end of file diff --git a/lab2-3/OrdersDB_create_popolate.sql b/lab2-3/OrdersDB_create_popolate.sql new file mode 100755 index 0000000..01ce8e7 --- /dev/null +++ b/lab2-3/OrdersDB_create_popolate.sql @@ -0,0 +1,196 @@ +--Створення бази даних +CREATE DATABASE OrdersDB; + +use OrdersDB; + +--Створення таблиці Salespeople +CREATE TABLE Salespeople ( + SNUM int NOT NULL, + SNAME char(20) NOT NULL, + CITY char(20), + COMM decimal(8, 2), + PRIMARY KEY (SNUM) +); + +--Створення таблиці Customers +CREATE TABLE Customers ( + CNUM int NOT NULL, + CNAME char(20) NOT NULL, + CITY char(20), + RATING int, + SNUM int, + PRIMARY KEY (CNUM), + FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM) +); + +--Створення таблиці Orders +CREATE TABLE Orders ( + ONUM int NOT NULL, + AMT DECIMAL(8, 2) NOT NULL, + ODATE DATE, + SNUM int, + CNUM int, + PRIMARY KEY (ONUM), + FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM), + FOREIGN KEY (CNUM) REFERENCES Customers (CNUM) +); + +--Масова ставка даних у таблиці +INSERT INTO + Salespeople (snum, sname, city, comm) +VALUES (1001, 'Peel', 'London', 0.12), + ( + 1002, + 'Serres', + 'San Jose', + 0.13 + ), + ( + 1003, + 'Axelrod', + 'New York', + 0.1 + ), + ( + 1004, + 'Motika', + 'London', + 0.11 + ), + ( + 1007, + 'Rifkin', + 'Barcelona', + 0.15 + ); + +INSERT INTO + Customers ( + cnum, + cname, + city, + rating, + snum + ) +VALUES ( + 2001, + 'Hoffman', + 'London', + 100, + 1001 + ), + ( + 2002, + 'Giovanni', + 'Rome', + 200, + 1003 + ), + ( + 2003, + 'Liu', + 'San Jose', + 200, + 1002 + ), + ( + 2004, + 'Grass', + 'Berlin', + 300, + 1002 + ), + ( + 2006, + 'Clemens', + 'London', + 100, + 1001 + ), + ( + 2007, + 'Pereira', + 'Rome', + 100, + 1004 + ), + ( + 2008, + 'Cisneros', + 'San Jose', + 300, + 1007 + ); + +INSERT INTO + Orders (onum, amt, odate, cnum, snum) +VALUES ( + 3001, + 18.69, + '1990-10-03', + 2008, + 1007 + ), + ( + 3002, + 1900.1, + '1990-10-03', + 2007, + 1004 + ), + ( + 3003, + 767.19, + '1990-10-03', + 2001, + 1001 + ), + ( + 3005, + 5160.45, + '1990-10-03', + 2003, + 1002 + ), + ( + 3006, + 1098.16, + '1990-10-03', + 2008, + 1007 + ), + ( + 3007, + 75.75, + '1990-10-04', + 2004, + 1002 + ), + ( + 3008, + 4723.0, + '1990-10-05', + 2006, + 1001 + ), + ( + 3009, + 1713.23, + '1990-10-04', + 2002, + 1003 + ), + ( + 3010, + 1309.95, + '1990-10-06', + 2004, + 1002 + ), + ( + 3011, + 9891.88, + '1990-10-06', + 2006, + 1001 + ); \ No newline at end of file diff --git a/lab2-3/task1.sql b/lab2-3/task1.sql new file mode 100755 index 0000000..a9e3a5e --- /dev/null +++ b/lab2-3/task1.sql @@ -0,0 +1,45 @@ +CREATE DATABASE Mangata_Gallo; + +use Mangata_Gallo; + +-- 1.1 +-- Створіть таблицю "Clients" з такими обмеженнями: +-- ClientID: первинний ключ, тип - цілі, не порожнє +-- FullName: тип - змінний символьний довжиною 100, не порожнє +-- PhoneNumber: тип - цілі, не порожнє, унікальні + +create table Clients ( + client_id int primary key auto_increment, + full_name nvarchar (100) not null, + phone_number int not null unique +); + +-- 1.2 +-- Створіть таблицю "Items" з такими атрибутами та обмеженнями: +-- ItemID: первинний ключ, тип - цілі, не порожнє +-- ItemName: тип - змінний символьний довжиною 100, не порожнє +-- Price: тип – десяткові (7 розрядів, два знаки після коми), не порожнє + +create table Items ( + item_id int primary key auto_increment, + item_name nvarchar (100) not null, + price decimal(7, 2) not null +); + +-- 1.3 +-- творіть таблицю "Orders" з такими атрибутами та обмеженнями: +-- OrderID: первинний ключ, тип - цілі, не порожнє +-- ClientID: зовнішній ключ, тип - цілі, не порожнє +-- ItemID: зовнішній ключ, тип - цілі, не порожнє +-- Quantity: тип - цілі, не порожнє, максимально допустима кількість одиниць товару на замовлення - 3 +-- Cost: тип – десяткові (8 розрядів, 2 знаки після коми), не порожнє + +create table Orders ( + order_id int primary key auto_increment, + client_id int not null, + item_id int not null, + quantity int not null check (quantity <= 3), + cost decimal(8, 2) not null, + constraint fk_client foreign key (client_id) references Clients (client_id), + constraint fk_item foreign key (item_id) references Items (item_id) +); \ No newline at end of file diff --git a/lab2-3/task2.sql b/lab2-3/task2.sql new file mode 100755 index 0000000..b66d2fb --- /dev/null +++ b/lab2-3/task2.sql @@ -0,0 +1,92 @@ +use Mangata_Gallo; + +-- 2.1 +-- Створіть таблицю "Staff" з такими атрибутами та обмеженнями "не порожнє": +-- StaffID: первинний ключ, тип - цілі, не порожнє +-- PhoneNumber: тип - цілі, не порожнє, унікальні +-- FullName: тип - змінний символьний довжиною 100, не порожнє +-- email: тип - змінний символьний довжиною 100, не порожнє, знаходиться у домені "mangata-gallo.com" +-- Відобразіть схему таблиці +-- Додайте два записи у таблицю, які задовольняють обмеженням, спробуйте ввести один запис для якого значення домену не відповідає обмеженню + +create table Staff ( + staff_id int primary key auto_increment, + phone_number int not null unique, + full_name nvarchar (100) not null, + email nvarchar (100) not null check ( + email like '%@mangata-gallo.com' + ) +); + +insert into + Staff ( + phone_number, + full_name, + email + ) +values ( + 123456789, + 'John Doe 1', + 'random1@mangata-gallo.com' + ), + ( + 123456788, + 'John Doe 2', + 'random2@mangata-gallo.com' + ); + +insert into + Staff ( + phone_number, + full_name, + email + ) +values ( + 123456787, + 'John Doe 3', + 'random3@gallo.com' + ); + +-- 2.2 +-- Створіть таблицю "ContractInfo" з такими атрибутами та обмеженнями "не порожнє": +-- ContractID: первинний ключ, тип - цілі, не порожнє +-- StaffID: тип - цілі, не порожнє +-- Location: тип - змінний символьний довжиною 50, не порожнє, значення за замовчуванням - "Texas" +-- StaffType: тип - змінний символьний довжиною 20, не порожнє, може набувати значень - "Junior" or a "Senior" +-- Salary: тип – десяткові (9 розрядів, 2 знаки після коми), не порожнє +-- Відобразіть схему таблиці +-- Додайте два записи у таблицю з довільними даними, які задовольняють обмеженням, для другого запису не додавайте значення поля Location +-- Спробуйте додати ще один запис, в якості StaffType використавши значення "Midle" + +create table ContractInfo ( + contract_id int primary key auto_increment, + staff_id int not null, + location nvarchar (50) default 'Texas', + staff_type nvarchar (20) check ( + staff_type in ('Junior', 'Senior') + ), + salary decimal(9, 2) not null, + constraint fk_staff foreign key (staff_id) references Staff (staff_id) +); + +insert into + ContractInfo ( + staff_id, + location, + staff_type, + salary + ) +values (1, 'Texas', 'Junior', 100000); + +insert into + ContractInfo (staff_id, staff_type, salary) +values (2, 'Senior', 200000); + +insert into + ContractInfo ( + staff_id, + location, + staff_type, + salary + ) +values (3, 'Texas', 'Middle', 150000); \ No newline at end of file diff --git a/lab2-3/task3.sql b/lab2-3/task3.sql new file mode 100755 index 0000000..5b5c14b --- /dev/null +++ b/lab2-3/task3.sql @@ -0,0 +1,80 @@ +use OrdersDB; + +-- 3.1 +-- Додайте у таблицю Salespeople себе у якості продавця +-- Додайте у таблицю Customers двох своїх напарників у якості +-- Ваших клієнтів Додайте дві угоди у таблицю Orders ( +-- по одній для кожного з Ваших клієнтів +-- ) + +insert into + Salespeople (snum, sname, city, comm) +values ( + 1111, + 'Vitalii', + 'Zdolbuniv', + 0.11 + ); + +insert into + Customers ( + cnum, + cname, + city, + rating, + snum + ) +values ( + 2009, + 'Oleg', + 'Ostroh', + 100, + 1111 + ), + ( + 2010, + 'Poman', + 'Ostroh', + 200, + 1111 + ); + +insert into + Orders (onum, amt, odate, cnum, snum) +values ( + 3012, + 1000, + '2026-03-19', + 2009, + 1111 + ), + ( + 3013, + 2000, + '2026-03-19', + 2010, + 1111 + ); + +-- 3.2 +-- Накладіть додаткові обмеження на зовнішні ключі snum у таблицях Customers та Orders: ON DELETE CASCADE ON UPDATE CASCADE +-- Спробуйте змінити для себе у таблиці Salespeople значення snum, збільшивши його на 1 +-- перевірте чи з'явилися відповідні зміни у таблицях Customers та Orders +-- Спробуйте видалити свій запис продавця у таблиці Salespeople +-- перевірте чи спрацювало каскадне видалення пов'язаних записів у таблицях Customers та Orders + +alter table Customers drop constraint Customers_ibfk_1; + +alter table Orders drop constraint Orders_ibfk_1; + +alter table Customers +add constraint Customers_ibfk_1 foreign key (snum) references Salespeople (snum) on delete cascade on update cascade; + +alter table Orders +add constraint Orders_ibfk_1 foreign key (snum) references Salespeople (snum) on delete cascade on update cascade; + +update Customers set snum = 1112 where snum = 1111; + +update Orders set snum = 1112 where snum = 1111; + +delete from Salespeople where snum = 1112; \ No newline at end of file diff --git a/lab2-4/task.md b/lab2-4/task.md new file mode 100644 index 0000000..0c758f2 --- /dev/null +++ b/lab2-4/task.md @@ -0,0 +1,40 @@ +# Лабораторна Робота 2-4: Завдання + +## Загальна таблиця оцінювання + +| Завдання | Опис завдання | Деталі оцінювання | Макс. бал | +|----------|---------------|-------------------|-----------| +| **1.0** | **Виконується на основі матеріалу презентації** | | | +| 1.0.1 | Експорт даних з таблиці `Order` у файл `.csv` | | 1 | +| 1.0.2 | Зміна значення `рік` для усіх даних з 1990 на 2023 | Виконується в MS Excel/Google Таблиці | 1 | +| 1.0.3 | Експорт змінених даних з MS Excel/Google Таблиці у `файл.csv` | | 1 | +| 1.0.4 | Імпорт оновлених даних у таблицю `NewOrder` | | 1 | +| 1.0.5 | Збереження копії таблиці `Salespeople` у нову таблицю `NewSalespeople` | Без збереження обмежень та ключів | 1 | +| 1.0.6 | Збереження копії таблиці `Customers` у нову таблицю `NewCustomers` | Із повним збереженням схеми таблиці | 1 | +| **1.1** | **Використайте базу даних `Team`** | | | +| 1.1.1.a | Додавання поля `birthday` у таблицю `member` | Тип `date`, за замовчуванням `NULL` | 1 | +| 1.1.1.b | Додавання поля `salary` у таблицю `member` | Десятковий 7 розрядів 2 знаки, `NOT NULL`, default `7999,99` | 1 | +| 1.1.2.a | Імпорт даних у таблицю з файлу MS Excel | Зміна формату дати | 1 | +| 1.1.2.b | Імпорт даних у таблицю з файлу MS Excel | Зміна формату десяткових чисел | 1 | +| 1.1.2.c | Імпорт даних у таблицю з файлу MS Excel | Експорт у файл та копіювання в IS Linux | 1 | +| 1.1.2.d | Імпорт даних у таблицю з файлу MS Excel | Безпосередньо імпорт даних | 1 | +| 1.1.3 | Відобразіть інформацію з таблиці `member` | | 1 | +| **1.2** | **Використайте базу даних `Team`** | | | +| 1.2.1 | Експорт даних таблиці `member` у файл `AllMembers.scv` | | 1 | +| 1.2.2.a | Робота з файлом у MS Windows та MS Excel | Копіювання файлу у MS Windows | 1 | +| 1.2.2.b | Робота з файлом у MS Windows та MS Excel | Відкриття в Excel зі зміною стандарту десяткових чисел | 1 | +| 1.2.3 | Збереження файлу у форматі MS Excel та його відкриття | | 1 | +| **1.3** | **Копіювання таблиць (без обмежень)** | | | +| 1.3.1.a | Копія таблиці `member` з назвою `backup_member` | Правильна назва | 1 | +| 1.3.1.b | Копія таблиці `member` з назвою `backup_member` | Відсутність обмежень та ключів | 1 | +| 1.3.1.c | Копія таблиці `member` з назвою `backup_member` | Наявність коректних даних | 1 | +| 1.3.2 | Відобразіть схему нової таблиці | | 1 | +| 1.3.3 | Відобразіть вміст нової таблиці | | 1 | +| **1.4** | **Копіювання таблиць (з обмеженнями та фільтрацією)** | | | +| 1.4.1.a | Копія таблиці `member` у БД `Orders_backup` | Наявність ключів та обмежень | 1 | +| 1.4.1.b | Копія таблиці `member` у БД `Orders_backup` | Назва таблиці має залишитися такою ж | 1 | +| 1.4.1.c | Копія таблиці `member` у БД `Orders_backup` | Лише рядки, які не містять дати народження | 1 | +| 1.4.2 | Відобразіть схему нової таблиці | | 1 | +| 1.4.3 | Відобразіть вміст нової таблиці | | 1 | + +**Всього балів:** 27 балів diff --git a/lab2-4/tasks.sql b/lab2-4/tasks.sql new file mode 100644 index 0000000..48e0ed7 --- /dev/null +++ b/lab2-4/tasks.sql @@ -0,0 +1,82 @@ +use OrdersDB; +# 1 +select * +from Orders into outfile '/var/lib/mysql-files/Orders123.csv' fields terminated by ',' +enclosed by '"' lines terminated by '\n'; + +CREATE TABLE NewOrder ( + ONUM int NOT NULL, + AMT DECIMAL(8, 2) NOT NULL, + ODATE DATE, + SNUM int, + CNUM int, + PRIMARY KEY (ONUM), + FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM), + FOREIGN KEY (CNUM) REFERENCES Customers (CNUM) +); + +LOAD DATA INFILE '/var/lib/mysql-files/Orders.csv' INTO +TABLE NewOrder FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ( + ONUM, + AMT, + ODATE, + SNUM, + CNUM, + @dummy +); + +CREATE TABLE NewSalespeople AS SELECT * FROM Salespeople; + +CREATE TABLE NewCustomers LIKE Customers; + +INSERT INTO NewCustomers SELECT * FROM Customers; + +# 2 + +use Team; + +ALTER TABLE member ADD birthday DATE DEFAULT NULL; + +ALTER TABLE member ADD salary DECIMAL(7, 2) NOT NULL DEFAULT 7999.99; + +load data infile '/var/lib/mysql-files/new_members.csv' into +table member fields terminated by ',' enclosed by '"' lines terminated by '\n' ignore 1 lines ( + m_id, + mname, + birthday, + mcity, + mmail, + salary +); + +# 3 + +select * from member into outfile '/var/lib/mysql-files/AllMembers.csv' +fields terminated by ',' enclosed by '"' lines terminated by '\n'; + +# 4 + +CREATE TABLE backup_member AS SELECT * FROM member; + +show create table backup_member; + +DESCRIBE backup_member; + +SELECT * FROM backup_member; + +# 5 + +create database Orders_backup; + +CREATE TABLE IF NOT EXISTS Orders_backup.member LIKE member; + +INSERT INTO + Orders_backup.member +SELECT * +FROM member +WHERE + birthday IS NULL; + +DESCRIBE Orders_backup.member; + +SELECT * FROM Orders_backup.member; \ No newline at end of file diff --git a/lab2-5/task1.sql b/lab2-5/task1.sql new file mode 100644 index 0000000..0e6330a --- /dev/null +++ b/lab2-5/task1.sql @@ -0,0 +1,57 @@ +-- # Changing table structure +-- Передумови: +-- Для виконання роботи слід створити, якщо нема базу даних Mangata_Gallo з таблицею Staff: +-- ####################################################### +-- 1. Створіть, ящо немає, базу даних +CREATE DATABASE IF NOT EXISTS Mangata_Gallo_1; +-- ------------------------------------------------------- +-- 2. Оберіть базу даних USE Mangata_Gallo; +USE Mangata_Gallo_1; +-- ------------------------------------------------------- +-- ####################################################### +-- ##################### Завдання ###################### +-- ####################################################### +-- ##################### Завдання 1 #################### +-- Напишість запит, що створить таблицю Staff з такими стовпціями: + +-- StaffID: INT +-- FullName: VARCHAR(100) +-- PhoneNumber: VARCHAR(10) + +CREATE TABLE Staff ( + StaffID INT, + FullName VARCHAR(100), + PhoneNumber VARCHAR(10) +); + +-- ####################################################### +-- ##################### Завдання 2 #################### +-- Напишіть запит, що додасть наступні обмеження до таблиці Staff: + +-- StaffID: INT NOT NULL and PRIMARY KEY +-- FullName: VARCHAR(100) and NOT NULL +-- PhoneNumber: INT NOT NULL + +ALTER TABLE Staff +MODIFY StaffID INT NOT NULL, +ADD CONSTRAINT pk_staff PRIMARY KEY (StaffID), +MODIFY FullName VARCHAR(100) NOT NULL, +MODIFY PhoneNumber INT NOT NULL; + +-- ####################################################### +-- ##################### Завдання 3 #################### + +-- Напишіть запит, що додасть новий стовпець Role до таблиці Staff відразу після стовпця FullName з такими обмеженнями: +-- Role: VARCHAR(50) and NOT NULL + +ALTER TABLE Staff ADD Role VARCHAR(50) NOT NULL AFTER FullName; + +-- ####################################################### +-- ##################### Завдання 4 #################### + +-- Напишіть запит, що дозволиться видалити стовпець PhoneNumber з табиці Staff. + +ALTER TABLE Staff DROP PhoneNumber; + +--- +alter table Staff add column PhoneNumber VARCHAR(10); \ No newline at end of file diff --git a/lab2-5/task2.sql b/lab2-5/task2.sql new file mode 100644 index 0000000..9e604f3 --- /dev/null +++ b/lab2-5/task2.sql @@ -0,0 +1,136 @@ +-- #ALTER TABLE statement + +-- Передумови + +-- Для виконання роботи потрібна база даих little_lemon та такі таблиці в ній: +-- Customers та Bookings. +-- ########################################## +-- 1. Створіть базу даних, якщо не існує: +CREATE DATABASE IF NOT EXISTS little_lemon_1; +-- ------------------------------------------- +-- 2. Оберіть базу даних: USE little_lemon; +USE little_lemon_1; +-- ------------------------------------------- +-- 3. Створіть необхідні таблиці й наповніть їх запропонованими даними: + +CREATE TABLE Customers ( + CustomerID INT NOT NULL PRIMARY KEY, + FullName VARCHAR(100) NOT NULL, + PhoneNumber INT NOT NULL UNIQUE +); +-- ------------------------------------------- + +CREATE TABLE Bookings ( + BookingID INT NOT NULL PRIMARY KEY, + BookingDate DATE NOT NULL, + TableNumber INT NOT NULL, + NumberOfGuests INT NOT NULL CHECK (NumberOfGuests <= 8), + CustomerID INT NOT NULL, + FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID) ON DELETE CASCADE ON UPDATE CASCADE +); +-- ------------------------------------------- + +INSERT INTO + Customers ( + CustomerID, + FullName, + PhoneNumber + ) +VALUES ( + 1, + "Vanessa McCarthy", + 0757536378 + ), + ( + 2, + "Marcos Romero", + 0757536379 + ), + ( + 3, + "Hiroki Yamane", + 0757536376 + ), + (4, "Anna Iversen", 0757536375), + (5, "Diana Pinto", 0757536374); +------------------------------------------- + +INSERT INTO + Bookings ( + BookingID, + BookingDate, + TableNumber, + NumberOfGuests, + CustomerID + ) +VALUES (10, '2021-11-11', 7, 5, 1), + (11, '2021-11-10', 5, 2, 2), + (12, '2021-11-10', 3, 2, 4); +------------------------------------------- + +CREATE TABLE FoodOrders ( + OrderID INT, + Quantity INT, + Cost Decimal(4, 2) +); + +-- ####################################################### +-- ##################### Завдання ###################### +-- ####################################################### +-- ##################### Завдання 1 #################### +-- Напишіть запит, який зробить поле OrderID первинним ключем таблиці FoodOrders. + +ALTER TABLE FoodOrders +ADD CONSTRAINT pk_foodorders PRIMARY KEY (OrderID); + +-- ####################################################### +-- ##################### Завдання 2 #################### +-- Застосуйте обмеження NOT NULL для полів quantity та cost. + +alter table FoodOrders +modify Quantity int not null, +modify Cost decimal(4, 2) not null; + +SHOW COLUMNS FROM FoodOrders; + +-- ####################################################### +-- ##################### Завдання 3 #################### +-- Створіть два нових стовпців таблиці FoodOrders: OrderDate з типом даних DATE та CustomerID +-- типом даних INT. Для обох полів застосуйте обмеження NOT NULL. +-- CustomerID у таблиці FoodOrders зробіть зовнішнім ключем з посиланням на поле CustomerID +-- таблиці Customers. + +ALTER TABLE FoodOrders +ADD OrderDate DATE NOT NULL, +ADD CustomerID INT NOT NULL, +ADD CONSTRAINT fk_foodorders_customers FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID); + +SHOW COLUMNS FROM FoodOrders; + +-- ####################################################### +-- ##################### Завдання 4 #################### +-- Видаліть поле OrderDate з таблиці FoodOrder. + +alter table FoodOrders drop column OrderDate; + +SHOW COLUMNS FROM FoodOrders; + +-- ####################################################### +-- ##################### Завдання 5 #################### +-- Додати та перейменуйте стовпець Order_Status таблиці FoodOrders на DeliveryStatus. + +alter table FoodOrders add column Order_Status varchar(20) not null; + +alter table FoodOrders rename column Order_Status to DeliveryStatus; + +alter table FoodOrders modify column DeliveryStatus boolean not null; + +SHOW COLUMNS FROM FoodOrders; +-- ####################################################### +-- ##################### Завдання 6 #################### +-- Змініть ім’я таблиці з FoodOrders на OrderDeliveryStatus. + +alter table FoodOrders rename to OrderDeliveryStatus; + +SHOW COLUMNS FROM OrderDeliveryStatus; +-- ######################################################## \ No newline at end of file diff --git a/lab2-5/tasks.sql b/lab2-5/tasks.sql new file mode 100644 index 0000000..e69de29 diff --git a/lab2-6/2-6-1 Робота з підзапитами.sql b/lab2-6/2-6-1 Робота з підзапитами.sql new file mode 100644 index 0000000..a45f96c --- /dev/null +++ b/lab2-6/2-6-1 Робота з підзапитами.sql @@ -0,0 +1,203 @@ +# Робота з підзапитами +Передумови +Для роботи використайте навчальну базу даних OrdersDB_2. +OrdersDB_2 складається з 3-х таблиць: +1. Salespeople - продавці +містить поля: + SNUM - ID продавця + SNAME - ім’я продавця + CITY - місто продавця + COMM - комісійні продавця + +2. Cusstomer - покупці +містить поля: + CNUM - ID покупця + CNAME - ім’я покупця, + CITY - місто покупця, + RATING - рейтинг покупця, + SNUM - ID продавця, що обслуговує покупця, + +3. Orders - покупці +містить поля: + ONUM - ID угоди + amt - сума угоди + ODATE - дата угоди + CNUM - ID покупця, + SNUM - ID продавця, +------------------------------------------------------- +------------------------------------------------------- +1. Створіть, якщо не має базу даних OrdersDB_2. + +CREATE DATABASE OrdersDB_2; +------------------------------------------------------- +2. Виберіть базу даних OrdersDB_2 + +USE OrdersDB_2; +------------------------------------------------------- +3. Створіть необхідні таблиці 3.1 Таблицю продавцівв + +CREATE TABLE Salespeople ( + SNUM int NOT NULL, + SNAME char(20) NOT NULL, + CITY char(20), + COMM decimal(8, 2), + PRIMARY KEY (SNUM) +); +------------------------------------------------------- +3.2 Таблицю покупців + +CREATE TABLE Customers ( + CNUM int NOT NULL, + CNAME char(20) NOT NULL, + CITY char(20), + RATING int, + SNUM int, + PRIMARY KEY (CNUM), + CONSTRAINT sales_snum FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM) +); +------------------------------------------------------- +3.3 Таблицю Замовлень + +CREATE TABLE Orders ( + ONUM int NOT NULL, + amt decimal(9, 2), + ODATE date, + CNUM int, + SNUM int, + PRIMARY KEY (ONUM), + CONSTRAINT o_sales_snum FOREIGN KEY (SNUM) REFERENCES Salespeople (SNUM), + CONSTRAINT custom_cnum FOREIGN KEY (CNUM) REFERENCES Customers (CNUM) +); +------------------------------------------------------- +4. Заповніть таблиці даними 4.1 Таблицю Satespeople + +INSERT INTO Salespeople (SNUM, SNAME, CITY, COMM) +VALUES + (1001,"Peel","London",.12), + (1002,"Serres","San Jose",.13), + (1004,"Motika","London",.11), + (1007,"Rifkin","Barcelona",.15), + (1003,"Axelrod","New York",.10) + ; +------------------------------------------------------- +4.2 Таблицю Customers + +INSERT INTO + Customers +VALUES ( + 2001, + "Hoffman", + "London", + 100, + 1001 + ), + ( + 2002, + "Giovanni", + "Rome", + 200, + 1003 + ), + ( + 2003, + "Liu", + "San Jose", + 200, + 1002 + ), + ( + 2004, + "Grass", + "Berlin", + 300, + 1002 + ), + ( + 2006, + "Clemens", + "London", + 100, + 1001 + ), + ( + 2008, + "Cisneros", + "San Jose", + 300, + 1007 + ), + ( + 2007, + "Pereira", + "Rome", + 100, + 1004 + ); +------------------------------------------------------- +4.2 Таблицю Orders + +INSERT INTO + Orders +VALUES ( + 3003, + 767.19, + "1990-10-03", + 2001, + 1001 + ), + ( + 3002, + 1900.10, + "1990-10-03", + 2007, + 1004 + ), + ( + 3005, + 5160.45, + "1990-10-03", + 2003, + 1002 + ), + ( + 3006, + 1098.16, + "1990-10-03", + 2008, + 1007 + ), + ( + 3009, + 1713.23, + "1990-10-04", + 2002, + 1003 + ), + ( + 3007, + 75.75, + "1990-10-04", + 2004, + 1002 + ), + ( + 3008, + 4723.00, + "1990-10-05", + 2006, + 1001 + ), + ( + 3010, + 1309.95, + "1990-10-06", + 2004, + 1002 + ), + ( + 3011, + 9891.88, + "1990-10-06", + 2006, + 1001 + ); \ No newline at end of file diff --git a/lab2-6/task1.sql b/lab2-6/task1.sql new file mode 100644 index 0000000..2301897 --- /dev/null +++ b/lab2-6/task1.sql @@ -0,0 +1,107 @@ +use OrdersDB_2; + +##################### Завдання ####################### +########################################################## +################### Завдання 1.1 ##################### +Знайдіть максимальну і мінімальну середню суму угоди на основі середньої суми угод кожного продавця. +Підказка: використайте підзапит у пропозиції FROM. + +select max(avg_amt), min(avg_amt) +from ( + select avg(amt) as avg_amt + from Orders + group by + SNUM + ) as avg_amt; + +###################################################### +################# Завдання 1.2 ################### + +Напишіть запит, що виведе кожне замовлення покупців, якщо їх вартість більша за кожне замовлення +покупця Grass. Вивід здійснити у формі onum, amt, odate, cname. +Підказка: використайте оператор ALL + +select onum, amt, odate, cname +from Orders o + join Customers c on o.cnum = c.cnum +where + amt > all ( + select amt + from Orders + where + cnum = ( + select cnum + from Customers + where + cname = 'Grass' + ) + ); + +###################################################### +################# Завдання 1.3 ################### +Виведіть усі замовлення для яких сума угоди перевершує хоча б якесь замолення, +що обслуговувалося продавцем Peel +Вивід здійсніть у формі amt, odate, cname, sname + +select amt, odate, cname, sname +from + Orders o + join Customers c on o.cnum = c.cnum + join Salespeople s on o.snum = s.snum +where + amt > any ( + select amt + from Orders + where + snum = ( + select snum + from Salespeople + where + sname = 'Peel' + ) + ); + +##################################################### +################ Завдання 1.4 ################### +Виведіть продавців серердня сума угод яких перевищує середню суму усіх угод. +У вивід включіть ім’я продавця та його середню суму угод +Підказка: + +select sname, avg_amt +from Salespeople s + join ( + select snum, avg(amt) as avg_amt + from Orders + group by + snum + ) as avg_amt on s.snum = avg_amt.snum +where + avg_amt > ( + select avg(amt) + from Orders + ); + +##################################################### +################ Завдання 1.5 ################### +Виведіть покупців, серердня сума угод яких перевищує середню суму усіх угод. +У вивід включіть ім’я покупця та його середню суму угод а також загальну середню суму угод. +Підказка: + +select cname, avg_amt, round( + ( + select avg(amt) + from Orders + ), 2 + ) as avg_amt_all +from Customers c + join ( + select cnum, avg(amt) as avg_amt + from Orders + group by + cnum + ) as avg_cus on c.cnum = avg_cus.cnum +where + avg_amt > ( + select avg(amt) + from Orders + ); \ No newline at end of file diff --git a/lab2-6/task2.sql b/lab2-6/task2.sql new file mode 100644 index 0000000..aa80755 --- /dev/null +++ b/lab2-6/task2.sql @@ -0,0 +1,86 @@ +##################################################### +################ Завдання 2.1 ################### +1. На остнові таблиці Orders створіть представлення V_Orders з алгоритмом обробки TEMPTABLE, +яке б вивело увесь вміст таблиці. + +CREATE ALGORITHM = TEMPTABLE VIEW V_Orders AS SELECT * FROM Orders; + +SELECT * FROM V_Orders; + +2. Переіменуйте представлення на VOrders + +RENAME TABLE V_Orders TO VOrders; + +SELECT * FROM VOrders; + +3. Спробуйте використати переіменоване представлення для видалення запису з onum = 3001. +Поясніть результат. + +DELETE FROM VOrders WHERE onum = 3001; +# Error: The target table VOrders of the DELETE is not updatable +# Видалення не відбулося, оскільки представлення було створено з алгоритмом TEMPTABLE. + +##################################################### +################ Завдання 2.2 ################### +1. Створіть точну копію таблиці Salespeople, назвавши її Salespeople_1. + +create table Salespeople_1 as select * from Salespeople; + +2. На остнові таблиці Salespeople_1 створіть представлення V_Salespeople_1, яке б вивело увесь вміст + таблиці. + +drop view if exists V_Salespeople_1; + +CREATE VIEW V_Salespeople_1 AS SELECT * FROM Salespeople_1; + +SELECT * FROM V_Salespeople_1; + +3. Спробуйте використати представлення V_Salespeople_1 для додавання в якості продавця себе. +Перевірте наявність змін. + +insert into + V_Salespeople_1 (SNUM, SNAME, CITY, COMM) +values ( + 1008, + 'Vitalii', + 'Zdolbuniv', + 0.1 + ); + +##################################################### +################ Завдання 2.3 ################### +1. На остнові таблиці Salespeople_1 створіть представлення V_Salespeople_2, +яке б вивело лише записи продавців, які проживають у місті London. + +drop view if exists V_Salespeople_2; + +create view V_Salespeople_2 as +select * +from Salespeople_1 +where + CITY = 'London'; + +SELECT * FROM V_Salespeople_2; + +2. Спробуйте використати представлення V_Salespeople_2 для зміни свого міста проживання на Texas. +Перевірте наявність змін. + +update V_Salespeople_2 set CITY = 'Texas' where SNUM = 1008; + +SELECT * FROM V_Salespeople_2; + +3. Спробуйте самостійно знайти спосіб, який заборонить вносити зміни у записи, +які представленням не відображаються. Переконайтеся у працездатності такого обмеження +спробувавши видалити свій запис. + +create view V_Salespeople_3 as +select * +from Salespeople_1 +where + CITY = 'London' +with + check option; + +update V_Salespeople_3 set CITY = 'Texas' where SNUM = 1001; + +SELECT * FROM V_Salespeople_3; \ No newline at end of file diff --git a/lab2-7/task1.sql b/lab2-7/task1.sql new file mode 100644 index 0000000..8d2f6ff --- /dev/null +++ b/lab2-7/task1.sql @@ -0,0 +1,192 @@ +# MySQL Functions І +Для роботи потрібна буде база даних jewelrystore_db а також її дві таблиці: item та mg_orders. +Таблиця item містить інформацію про товар та його вартість, таблиця mg_orders містить список замовлень та їх деталі + +Передумови +############################################################ +############################################################ + +В MySQL має бути створена база даних магазину коштовностей фірми M&G, яка включає таблиці item та mg_orders які слід заповнити відповідними даними. +Для створення бази, таблиць та наповнення їх необхідною інформацією скористайтеся наданми нижче кодом: +------------------------------------------------------------ +1: Створіть базу даних якщо не існує + +CREATE DATABASE IF NOT EXISTS jewelrystore_db; + +------------------------------------------------------------ +2: Оберіть базу даних + +USE jewelrystore_db; + +------------------------------------------------------------ +3: Створіть, якщо не існує, таблицю item. + +CREATE TABLE IF NOT EXISTS item ( + ItemID INT, + Name VARCHAR(150), + Cost INT, + PRIMARY KEY (ItemID) +); + +SHOW CREATE TABLE item; + +SELECT * FROM item; +------------------------------------------------------------ +4: Внесіть дані у таблицю, або перевірте їх відповідність, якщо вони вже внесені + +INSERT INTO + item +VALUES (1, 'Engagement ring', 2500), + (2, 'Silver brooch', 400), + (3, 'Earrings', 350), + (4, 'Luxury watch', 1250), + (5, 'Golden bracelet', 800), + (6, 'Gemstone', 1500); + +SELECT * FROM item; + +------------------------------------------------------------ +5: Створіть, якщо не існує, таблицю mg_orders + +CREATE TABLE IF NOT EXISTS mg_orders ( + OrderID INT, + ItemID INT, + Quantity INT, + Cost INT, + OrderDate DATE, + DeliveryDate DATE, + OrderStatus VARCHAR(50), + PRIMARY KEY (OrderID) +); + +------------------------------------------------------------ +6: Внесіть дані у таблицю, або перевірте їх відповідність, якщо вони вже внесені + +INSERT INTO + mg_orders +VALUES ( + 1, + 1, + 50, + 122000, + '2022-04-05', + '2022-05-25', + 'Delivered' + ), + ( + 2, + 2, + 75, + 28000, + '2022-03-08', + NULL, + 'In progress' + ), + ( + 3, + 3, + 80, + 25000, + '2022-05-19', + '2022-06-08', + 'Delivered' + ), + ( + 4, + 4, + 45, + 100000, + '2022-01-10', + NULL, + 'In progress' + ), + ( + 5, + 5, + 70, + 56000, + '2022-05-19', + NULL, + 'In progress' + ), + ( + 6, + 6, + 60, + 90000, + '2022-06-10', + '2022-06-18', + 'Delivered' + ); + +SELECT *, Date_format(OrderDate, '%Y-%m-%d') AS OrderDate, Date_format(DeliveryDate, '%Y-%m-%d') AS DeliveryDate +FROM mg_orders; +########################################################## + +Основна мета: +• Робота із стрічковими, математичним, та функціями типу дата/час в MySQL. +########################################################## +######################### Завдання ##################### +######################## Завдання 1 #################### +1. Напишіть запит, використовуючи стрічкові функцію для відображення списку товарів, +їх кількості та статусу замовлення у такому форматі: + Item name–quantity–order status + +SELECT CONCAT( + Name, '-', Quantity, '-', OrderStatus + ) AS ItemNameQuantityOrderStatus +FROM mg_orders + JOIN item ON mg_orders.ItemID = item.ItemID; + + +2. Ім’я товару повинно бути відображено символами верхнього регістру, +а статус замовлення - символами нижнього регістру. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15v1G3pzopt_bKV1X_DDyBVZQti13fHy-&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +items +item - quantity - order status (Uppercase) + +SELECT CONCAT( + LOWER(Name), '-', Quantity, '-', UPPER(OrderStatus) + ) AS ItemNameQuantityOrderStatus +FROM mg_orders + JOIN item ON mg_orders.ItemID = item.ItemID; + +########################################################## +###################### Завдання 2: ################### +Напишіть запит із використанням функцій дата/час, для відображення імені та дня тижня +у який замовлення має бути доставлено. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15u1sWEgU0ianaMqfPVgbjdE04r8hbPq1&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +Name, Day_of_week +(Capitalized), (Name of day, nullable) + +SELECT Name, DAYNAME(DeliveryDate) AS Day_of_week +FROM mg_orders + JOIN item ON mg_orders.ItemID = item.ItemID; + +############################################################ +####################### Завдання 3: #################### +Напишіть запити, який підрахує вартість обробки кожного замовлення, яка складає 5% від +загальної вартості замовлення. +Використайте відповідну математичну фукнцію, яка дозволить заокрулити суму до двох знаків після коми. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15vCd0vIvLaqpbh9l5jr_h_W_rZe9tXW5&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +OrderID, cost_of_handling + +SELECT OrderID, ROUND(Cost * 0.05, 2) AS cost_of_handling +from mg_orders; + +############################################################ +####################### Завдання 4: #################### +Модифікуйте запит із завдання 2 щоб відфільтрувати записи, які не містять порожніх даних у стовпці +дати доставки. Використайте для цього відповідну функцію порівняння. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15wLyFBx9i5BM_qVgTxjaILojwnZWQPZx&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +SELECT Name, DAYNAME(DeliveryDate) AS Day_of_week +FROM mg_orders + JOIN item ON mg_orders.ItemID = item.ItemID +WHERE + NOT ISNULL(DeliveryDate); + +############################################################ \ No newline at end of file diff --git a/lab2-7/task2.sql b/lab2-7/task2.sql new file mode 100644 index 0000000..4304231 --- /dev/null +++ b/lab2-7/task2.sql @@ -0,0 +1,276 @@ +# MySQL Functions ІІ +Для роботи потрібна буде база даних jewelrystore_db з 4-ма таблицями. + +############################################################ +############################################################ +Передумови: + +Встановіть, якщо потрібно, базу даних та необхідні таблиці. Заповніть їх даними (якщо дані вже є, ппроведіть звірку даних) +------------------------------------------------------------ +1. Створіть, якщо потрібно, базу даних та таблицю clients + +CREATE DATABASE IF NOT EXISTS jewelrystore_db; + +------------------------------------------------------------ +1.1 Оберіть базу днахи + +USE jewelrystore_db; + +------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS clients ( + ClientID int NOT NULL, + ClientName varchar(255) DEFAULT NULL, + Address varchar(255) DEFAULT NULL, + ContactNo varchar(10) DEFAULT NULL, + PRIMARY KEY (ClientID) +); + +------------------------------------------------------------ +2. Створіть балицю client_orders + +CREATE TABLE IF NOT EXISTS client_orders ( + OrderID INT NOT NULL, + ClientID INT DEFAULT NULL, + ItemID INT DEFAULT NULL, + Cost INT DEFAULT NULL, + PRIMARY KEY (OrderID) +); + +------------------------------------------------------------ +3. Створіть таблицю item. + +CREATE TABLE IF NOT EXISTS item ( + ItemID INT NOT NULL, + Name varchar(150) DEFAULT NULL, + Cost INT DEFAULT NULL, + PRIMARY KEY (ItemID) +); + +------------------------------------------------------------ +4. Створіть таблицю mg_orders + +CREATE TABLE IF NOT EXISTS mg_orders ( + OrderID INT NOT NULL, + ItemID INT DEFAULT NULL, + Quantity INT DEFAULT NULL, + Cost INT DEFAULT NULL, + OrderDate DATE DEFAULT NULL, + DeliveryDate DATE DEFAULT NULL, + OrderStatus VARCHAR(50) DEFAULT NULL, + PRIMARY KEY (OrderID) +); + +------------------------------------------------------------ +5. Додайте необхідні дані у таблицю clients + +INSERT INTO + clients +VALUES ( + 1, + 'Kishan Hughes', + '223 Golden Hills, North Austin, TX', + '387986345' + ), + ( + 2, + 'Indira Moncada', + '119 Silver Street, Bouldin Creek, TX', + '334567243' + ), + ( + 3, + 'Mosha Setsile', + '785 Bronze Lane, East Austin, TX', + '315642597' + ), + ( + 4, + 'Laura Mills', + '908 Diamond Crescent, South Lamar, TX', + '300842509' + ), + ( + 5, + 'Henrik Kreida', + '345, Golden Hills, North Austin, TX', + '358208983' + ), + ( + 6, + 'Millicent Blou', + '812, Diamond Crescent, North Burnet, TX', + '347898755' + ); + +------------------------------------------------------------ +6. Додайте необхідні дані у таблицю item + +INSERT INTO + item +VALUES (1, 'Engagement ring', 2500), + (2, 'Silver brooch', 400), + (3, 'Earrings', 350), + (4, 'Luxury watch', 1250), + (5, 'Golden bracelet', 800), + (6, 'Gemstone', 1500); + +------------------------------------------------------------ +7. Додайте необхідні дані у таблицю client_orders + +INSERT INTO + client_orders +VALUES (1, 1, 1, 2500), + (2, 2, 2, 400), + (3, 3, 3, 350), + (4, 4, 4, 1250), + (5, 5, 5, 800), + (6, 6, 6, 1500), + (7, 2, 4, 400), + (8, 3, 4, 1250), + (9, 4, 2, 400), + (10, 1, 3, 350); +------------------------------------------------------------ +8. Додайте необхідні дані у таблицю mg_orders + +INSERT INTO + mg_orders +VALUES ( + 1, + 1, + 50, + 122000, + '2022-04-05', + '2022-05-25', + 'Delivered' + ), + ( + 2, + 2, + 75, + 28000, + '2022-03-08', + NULL, + 'In progress' + ), + ( + 3, + 3, + 80, + 25000, + '2022-05-19', + '2022-06-08', + 'Delivered' + ), + ( + 4, + 4, + 45, + 100000, + '2022-01-10', + NULL, + 'In progress' + ), + ( + 5, + 5, + 70, + 56000, + '2022-05-19', + NULL, + 'In progress' + ), + ( + 6, + 6, + 60, + 90000, + '2022-06-10', + '2022-06-18', + 'Delivered' + ); + +######################################################### +#################### Завдання 1: #################### +Клієнтам, які замовили luxury watches надали 5% знижку. +На основі таблиць client_orders та item виведіть інформацію про ці замовлення. +У вибірку включіть ІД клієнта, ІД замовлення та вартість після знижки (afterDiscount). +Використайте математичну фукнцію CEIL щоб заокруглити вартість замовлення після знижки до найменшого +цілого, яке не менше вартості замовлення після знижки. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15xthe7YF52eewjLfCFtPD7X0fermHxbO&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +ClientID, OrderID, afterDiscount + +SELECT client_orders.ClientID, client_orders.OrderID, CEIL(client_orders.Cost * 0.95) AS afterDiscount +FROM client_orders + JOIN item ON client_orders.ItemID = item.ItemID +WHERE + LOWER(item.Name) = LOWER('luxury watch'); + +######################################################### +#################### Завдання 2: #################### + +Використайте запит з попереднього завдання, щоб відформатувати поле afterDiscount відповідно до маски +'#,###,###.##' з двома знаками після коми використавши функцію FORMAT function. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15yn9iYpMyBcRld1wXpmrKkbH6o6Z8hBp&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +ClientID, OrderID, afterDiscount + +SELECT client_orders.ClientID, client_orders.OrderID, FORMAT( + CEIL(client_orders.Cost * 0.95), 2 + ) AS afterDiscount +FROM client_orders + JOIN item ON client_orders.ItemID = item.ItemID +WHERE + LOWER(item.Name) = LOWER('luxury watch'); + +######################################################### +#################### Завдання 3: #################### +Знайдіть очікувану дату доставки для замовлень. Запланований час доставки 30 днів після дати замовлення. +Використайте для цього фукнкцію ADDDATE. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=15zmq2p19Gua485l0hki9lQrVqBYb1N3-&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +ExpectedDelivDate + +SELECT ADDDATE(OrderDate, 30) AS ExpectedDelivDate FROM mg_orders; + +######################################################### +#################### Завдання 4: #################### +Згенеруйте дані, необхідні для звіту з деталями всіх замовлень. +Для замовлень, які ще не доставлені, стовпець DeliveryDate має значення NULL. +У цьому стовпці відобразіть значення "NOT DELIVERED" замість NULL для замовлень, +які ще не доставлено. Для цього використайте функцію COALESCE. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=160knbiH6JD_-0s36txaxzC5m2BEuhGLq&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +OrderID,ItemID,Quantity,Cost,OrderDate,DeliveryDate,OrderStatus + +SELECT + OrderID, + ItemID, + Quantity, + Cost, + OrderDate, + COALESCE(DeliveryDate, 'NOT DELIVERED') AS DeliveryDate, + OrderStatus +FROM mg_orders; + +######################################################### +#################### Завдання 5: #################### +Згенеруйте дані, необхідні для звіту, отримавши список усіх замовлень. +Замовлення які ще не доставлені мають статус "In progress". +За допомогою функції NULLIF згенеруйте дані таким чиному, щоб у стовпці OrderStatus + замість "In progress" відображалося значення null. +Очікуваний вигляд вибірки: https://drive.google.com/open?id=163dVCzWR9Vw3QY3QWmh8C34W1QX5kBrS&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs + +OrderID, ItemID, Quantity, Cost, OrderDate, DeliveryDate, OrderStatus + +SELECT + OrderID, + ItemID, + Quantity, + Cost, + OrderDate, + DeliveryDate, + NULLIF(OrderStatus, 'In progress') AS OrderStatus +FROM mg_orders; + +######################################################### \ No newline at end of file diff --git a/lab2-8-test/task1.sql b/lab2-8-test/task1.sql new file mode 100644 index 0000000..5ac24f8 --- /dev/null +++ b/lab2-8-test/task1.sql @@ -0,0 +1,9 @@ +################################################# +################ Завдання 1 ################### +-------------------------------------------------- +1. Створіть базу даних "Your_Name_L_L" де Your_Name - це Ваше прізвище_Ім’я. +2. Здійсніть відновлення даних у новостворуну базу з резервної +копії: https://drive.google.com/open?id=16J43U4Jx96n-A-nkEM-XYs2gD4_p34Bv&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs +3. Перегляньте структуру таблиць та їх вміст. + +create database Litvinchuk_Vitalii_L_L; \ No newline at end of file diff --git a/lab2-8-test/task2.sql b/lab2-8-test/task2.sql new file mode 100644 index 0000000..1dd7ff8 --- /dev/null +++ b/lab2-8-test/task2.sql @@ -0,0 +1,12 @@ +################################################# +################ Завдання 2 ################### +-------------------------------------------------- +1. Використайте дані +https://docs.google.com/spreadsheets/d/16I5INlUTo0jZ2ZyWQuBbgUkrWy5NeQtl?rtpof=true&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs +для здійснення імпорту у табицію Courses. +2. Перегляньте вміст таблиці + +LOAD DATA INFILE '/var/lib/mysql-files/courses.csv' INTO +TABLE Courses FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ignore 1 lines (CourseName, Cost, @dummy); + +select * from Courses; \ No newline at end of file diff --git a/lab2-8-test/task3.sql b/lab2-8-test/task3.sql new file mode 100644 index 0000000..5744ba3 --- /dev/null +++ b/lab2-8-test/task3.sql @@ -0,0 +1,15 @@ +################################################# +################ Завдання 3 ################### +-------------------------------------------------- +1. Напишіть +REPLACE + запит, + який змінить вартість страви "Kabasa" з $17, + 00 на $20, + 00. + -------------------------------------------------- + 2. Відобразіть таблицю зі зміненою вартістю страви + +replace into Courses set CourseName = 'Kabasa', cost = 20.00; + +select * from Courses where CourseName = 'Kabasa'; \ No newline at end of file diff --git a/lab2-8-test/task4.sql b/lab2-8-test/task4.sql new file mode 100644 index 0000000..93bf3bf --- /dev/null +++ b/lab2-8-test/task4.sql @@ -0,0 +1,23 @@ +################################################# +################ Завдання 4 ################### +-------------------------------------------------- + + +1. Створіть нову таблицю "DeliveryAddress" з такими полями та обмеженнями: +• ID: первинний ключ, цілочисельний тип даних +• Address: змінний символьний тип даних довжиною 255 символів, не порожнє +• Type: змінний символьний тип даних довжиною 100 символів, не порожнє, значення за замовчуванням "Private" +• CustomerID: зовнішній ключ (зв’язок із первинним ключем таблиц "Customers"), цілочисельний тип даних, не порожнє. + +2. Відобразійть структуру таблиці з допомогою команди SHOW CREATE TABLE + +create table DeliveryAddress ( + ID int PRIMARY KEY, + Address varchar(255) NOT NULL, + Type varchar(100) NOT NULL DEFAULT 'Private', + CustomerID int NOT NULL, + FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID) +); +-- DeliveryAddress_ibfk_1 + +show create table DeliveryAddress; \ No newline at end of file diff --git a/lab2-8-test/task5.sql b/lab2-8-test/task5.sql new file mode 100644 index 0000000..4549236 --- /dev/null +++ b/lab2-8-test/task5.sql @@ -0,0 +1,12 @@ +################################################# +################ Завдання 5 ################### +-------------------------------------------------- +1. Створіть запит, який додасть нове поле "Ingredients" + (змінний символьний тип даних довжиною 255 символів) +до табиці Courses. +-------------------------------------------------- +2. Відобразіть структуру таблиці + +alter table Courses add column Ingredients varchar(255); + +describe Courses; \ No newline at end of file diff --git a/lab2-8-test/task6.sql b/lab2-8-test/task6.sql new file mode 100644 index 0000000..345d1fb --- /dev/null +++ b/lab2-8-test/task6.sql @@ -0,0 +1,17 @@ +################################################# +################ Завдання 6 ################### +-------------------------------------------------- +1. Створіть запит, який використає підзапит для того, +щоб вивести повне ім’я покупців, які забронювали столик на 2021-11-11. +-------------------------------------------------- +2. Здійсніть вивід + +select * +from Customers +where + CustomerID in ( + select CustomerID + from Bookings + where + BookingDate = '2021-11-11' + ) \ No newline at end of file diff --git a/lab2-8-test/task7.sql b/lab2-8-test/task7.sql new file mode 100644 index 0000000..f5dcf7e --- /dev/null +++ b/lab2-8-test/task7.sql @@ -0,0 +1,20 @@ +################################################# +################ Завдання 7 ################### +-------------------------------------------------- +1. Створіть представлення з іменем "BookingsView" для відображення ідентифікаторів, + дат бронювання та кількості гостей для замовлень, зроблених до 2021-11-13, + якщо кількість готей більша ніж 3. +-------------------------------------------------- +2. Здійсніть вивід усіх даних з новоствореної віртуальної таблиці. + +create view BookingsView as +select + CustomerID, + BookingDate, + NumberOfGuests +from Bookings +where + BookingDate < '2021-11-13' + and NumberOfGuests > 3; + +select * from BookingsView; \ No newline at end of file diff --git a/lab2-8-test/task8.sql b/lab2-8-test/task8.sql new file mode 100644 index 0000000..b03c424 --- /dev/null +++ b/lab2-8-test/task8.sql @@ -0,0 +1,15 @@ +################################################# +################ Завдання 8 ################### +-------------------------------------------------- +1. Створіть збережену процедуру з іменем 'GetBookingsData'. Процедура повинна містити часовий +параметр 'InputDate', який дозволить вивести усю інформацію про бронювання на вказуну користувачем дату. +2. Після виконання запиту викличте створену процедуру зі значенням параметра '2021-11-13' + +create procedure GetBookingsData(InputDate date) +begin + select * from Bookings where BookingDate = InputDate; +end + +call GetBookingsData ('2021-11-14'); + +select * from Bookings; \ No newline at end of file diff --git a/lab2-8-test/task9.sql b/lab2-8-test/task9.sql new file mode 100644 index 0000000..6c4e35c --- /dev/null +++ b/lab2-8-test/task9.sql @@ -0,0 +1,13 @@ +################################################# +################ Завдання 9 ################### +-------------------------------------------------- +1. Створіть запит, використавши відповідну стрічкову функцію для відображення списку +деталей замовлення ("Booking Details") у такому вигляді: +"ID: 13, Date: 2021-11-11, Number of guest: 5" +-------------------------------------------------- +2. Здійсніть вивід даних + +select CONCAT( + 'ID: ', BookingID, ', Date: ', BookingDate, ', Number of guest: ', NumberOfGuests + ) as BookingDetails +from Bookings; \ No newline at end of file diff --git a/lab2-8/task1.sql b/lab2-8/task1.sql new file mode 100644 index 0000000..cc4dded --- /dev/null +++ b/lab2-8/task1.sql @@ -0,0 +1,35 @@ +-- use OrdersDB; + +-- use OrdersDB_2; + +-- -- Створіть процедуру без параметрів з назвою Agregate_Amt, +-- -- яка після виклику дозволить вивести таку інформацію: +-- -- sname – ім’я продавця +-- -- s_Avg_Amt – середнє значення угоди продавця +-- -- Avg_Amt – середнє значення усіх угод +-- -- s_Max _Amt – максимальне значення угоди продавця +-- -- Max _Amt – максимальне значення усіх угод +-- -- s_Min _Amt – мінімальне значення угоди продавця +-- -- Min _Amt – мінімальна значення усіх угод +-- -- Інформацію відсортуйте за s_Avg_Amt +-- -- Викличте процедуру, щоб переконатися у правильності її роботи + +-- create procedure Agregate_Amt() +-- begin +-- select +-- s.sname, +-- avg(o.amt) as s_Avg_Amt, +-- (select avg(amt) from Orders) as Avg_Amt, +-- max(o.amt) as s_Max_Amt, +-- (select max(amt) from Orders) as Max_Amt, +-- min(o.amt) as s_Min_Amt, +-- (select min(amt) from Orders) as Min_Amt +-- from Orders o +-- join Salespeople s on o.snum = s.snum +-- group by s.sname +-- order by s_Avg_Amt; +-- end + +-- drop procedure if exists Agregate_Amt; + +-- call Agregate_Amt (); \ No newline at end of file diff --git a/lab2-8/task2.sql b/lab2-8/task2.sql new file mode 100644 index 0000000..e256455 --- /dev/null +++ b/lab2-8/task2.sql @@ -0,0 +1,33 @@ +-- Створіть процедуру з параметрами з назвою Sum_Amt_of_Cust_Period, +-- яка дозовлить переглялянути загальну суму усіх угод (c_Sum_Amt) вказаного покупця за обраний період +-- у якості вхідних параметрів використайте: +-- ім'я покупця +-- дату початку періоду +-- дату кінця періоду +-- Викличте процедуру, щоб переконатися у правильності її роботи +-- спробуйте різні параметри + +use OrdersDB; + +select * from Customers; + +create procedure Sum_Amt_of_Cust_Period( + cust_name varchar(50), + start_date date, + end_date date +) +begin +select + c.cname, + sum(o.amt) as c_Sum_Amt + from Customers c + join Orders o on c.cnum = o.cnum + where c.cname = cust_name and o.odate between start_date and end_date + group by c.cname; +end + +drop procedure if exists Sum_Amt_of_Cust_Period; + +call Sum_Amt_of_Cust_Period ( 'Grass', '1990-10-03', '1990-10-06' ); + +call Sum_Amt_of_Cust_Period ( 'Grass', '1990-10-03', '1990-10-04' ); \ No newline at end of file diff --git a/lab2-9/task1.sql b/lab2-9/task1.sql new file mode 100644 index 0000000..dc235d8 --- /dev/null +++ b/lab2-9/task1.sql @@ -0,0 +1,19 @@ +##################################################### +###################### Task 1: ################## +1. Створіть SQL-функцію, яка виведе значення вартості (Cost) для угоди, +номер якої вкаже користувач при виклику фукнції. +2. Викличте функцію, використавши в якості вхідного параметра OrderID = 5. + +USE Lucky_Shrub; + +create function CalculateCost(order_id int) +returns int DETERMINISTIC +begin + declare v_cost int; + select Cost into v_cost from Orders where OrderID = order_id; + return v_cost; +end + +set @OrderID = 8; + +select CalculateCost (@OrderID); \ No newline at end of file diff --git a/lab2-9/task2.sql b/lab2-9/task2.sql new file mode 100644 index 0000000..d1c7299 --- /dev/null +++ b/lab2-9/task2.sql @@ -0,0 +1,42 @@ +##################################################### +###################### Task 2: ################## + +1. Створіть збережену процедуру, яка довзволить вивести вартість замовлення із врахуванням знижки. +Як вхідний параметр процедура повинна використовувати значення ідентифікатора замовлення (OrderID). +Умови знижки: +• якщо кількість товару у замовлення >= 20, тоді знижка становить 20%; + +• якщо кількість товару у замовленні < 20 і >= 10, тоді знижка становить 10%; + +• в іншому випадку знижка не передбачена. +2. Викличте створену процедуру зі значення ідентифікатора замовлення OrderID = 5. +##################################################### + +drop procedure if exists CalculateDiscountedCost; + +create procedure CalculateDiscountedCost(in order_id int) +begin + declare v_cost decimal(10,2); + declare v_discount decimal(5,2); + declare v_final_cost decimal(10,2); + declare v_quantity int; + + select Cost, Quantity into v_cost, v_quantity + from Orders + where OrderID = order_id; + + if v_quantity >= 20 then + set v_discount = 0.20; + elseif v_quantity >= 10 then + set v_discount = 0.10; + else + set v_discount = 0.00; + end if; + + set v_final_cost = v_cost * (1 - v_discount); + select v_final_cost as FinalCost, v_cost as Cost, v_discount as Discount, v_quantity as Quantity, v_cost - v_cost * (1 - v_discount) as DiscountAmount; +end + +set @OrderID = 8; + +call CalculateDiscountedCost (@OrderID); \ No newline at end of file diff --git a/lab2-9/tasks.sql b/lab2-9/tasks.sql new file mode 100644 index 0000000..3e0e7a2 --- /dev/null +++ b/lab2-9/tasks.sql @@ -0,0 +1,285 @@ +################################################### +Передумови +1. Створіть базу даних Lucky_Shrub (якщо не існує), та оберіть її. + +CREATE DATABASE IF NOT EXISTS Lucky_Shrub; + +USE Lucky_Shrub; + +2.Створіть таблицю Orders (якщо не існує) та наповніть її відповідними даними (якщо потрібно). + +CREATE TABLE Orders ( + OrderID INT NOT NULL PRIMARY KEY, + ClientID VARCHAR(10), + ProductID VARCHAR(10), + Quantity INT, + Cost DECIMAL(6, 2), + Date DATE +); + +-- Якщо база даних існує, порівняйте схему із запропонованою. +-- Для цього використаємо код наведений нижче: +SHOW CREATE TABLE Orders; + +-- У разі потреби внесіть у схему необхідні зміни + +--------------------------------------------------- + +Якщо Ваша таблиця вже містить певні дані, +щоб оновити їх й додати нові використайте запит + +REPLACE INTO + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost, + Date + ) +VALUES ( + 1, + "Cl1", + "P1", + 10, + 500, + "2020-09-01" + ), + ( + 2, + "Cl2", + "P2", + 5, + 100, + "2020-09-05" + ), + ( + 3, + "Cl3", + "P3", + 20, + 800, + "2020-09-03" + ), + ( + 4, + "Cl4", + "P4", + 15, + 150, + "2020-09-07" + ), + ( + 5, + "Cl3", + "P3", + 10, + 450, + "2020-09-08" + ), + ( + 6, + "Cl2", + "P2", + 5, + 800, + "2020-09-09" + ), + ( + 7, + "Cl1", + "P4", + 22, + 1200, + "2020-09-10" + ), + ( + 8, + "Cl3", + "P1", + 15, + 150, + "2020-09-10" + ), + ( + 9, + "Cl1", + "P1", + 10, + 500, + "2020-09-12" + ), + ( + 10, + "Cl2", + "P2", + 5, + 100, + "2020-09-13" + ), + ( + 11, + "Cl4", + "P5", + 5, + 100, + "2020-09-15" + ), + ( + 12, + "Cl1", + "P1", + 10, + 500, + "2022-09-01" + ), + ( + 13, + "Cl2", + "P2", + 5, + 100, + "2022-09-05" + ), + ( + 14, + "Cl3", + "P3", + 20, + 800, + "2022-09-03" + ), + ( + 15, + "Cl4", + "P4", + 15, + 150, + "2022-09-07" + ), + ( + 16, + "Cl3", + "P3", + 10, + 450, + "2022-09-08" + ), + ( + 17, + "Cl2", + "P2", + 5, + 800, + "2022-09-09" + ), + ( + 18, + "Cl1", + "P4", + 22, + 1200, + "2022-09-10" + ), + ( + 19, + "Cl3", + "P1", + 15, + 150, + "2022-09-10" + ), + ( + 20, + "Cl1", + "P1", + 10, + 500, + "2022-09-12" + ), + ( + 21, + "Cl2", + "P2", + 5, + 100, + "2022-09-13" + ), + ( + 22, + "Cl2", + "P1", + 10, + 500, + "2021-09-01" + ), + ( + 23, + "Cl2", + "P2", + 5, + 100, + "2021-09-05" + ), + ( + 24, + "Cl3", + "P3", + 20, + 800, + "2021-09-03" + ), + ( + 25, + "Cl4", + "P4", + 15, + 150, + "2021-09-07" + ), + ( + 26, + "Cl1", + "P3", + 10, + 450, + "2021-09-08" + ), + ( + 27, + "Cl2", + "P1", + 20, + 1000, + "2022-09-01" + ), + ( + 28, + "Cl2", + "P2", + 10, + 200, + "2022-09-05" + ), + ( + 29, + "Cl3", + "P3", + 20, + 800, + "2021-09-03" + ), + ( + 30, + "Cl1", + "P1", + 10, + 500, + "2022-09-01" + ); + +##################################################### +Основні завдання: +• Розробити визначену користувачем фукнцію +• Розробити збережену процедуру +##################################################### \ No newline at end of file