Advertisement
desislava_topuzakova

Exam Preparation 2

Feb 5th, 2024
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. CREATE DATABASE real_estates;
  2.  
  3. -- 01. Table Design
  4.  
  5. -- CITIES
  6. CREATE TABLE cities
  7. (
  8. id INT AUTO_INCREMENT PRIMARY KEY,
  9. name VARCHAR(60) NOT NULL UNIQUE
  10. );
  11.  
  12. -- property_types
  13. CREATE TABLE property_types
  14. (
  15. id INT AUTO_INCREMENT,
  16. type VARCHAR(40) NOT NULL UNIQUE,
  17. description TEXT,
  18. PRIMARY KEY(id)
  19. );
  20.  
  21. -- PROPERTIES
  22. CREATE TABLE properties
  23. (
  24. id INT AUTO_INCREMENT PRIMARY KEY,
  25. address VARCHAR(80) NOT NULL UNIQUE,
  26. price DECIMAL(19, 2) NOT NULL,
  27. area DECIMAL (19, 2),
  28. property_type_id INT,
  29. city_id INT,
  30. FOREIGN KEY(property_type_id) REFERENCES property_types(id),
  31. FOREIGN KEY(city_id) REFERENCES cities(id)
  32. );
  33.  
  34. -- AGENTS
  35. CREATE TABLE agents
  36. (
  37. id INT AUTO_INCREMENT PRIMARY KEY,
  38. first_name VARCHAR(40) NOT NULL,
  39. last_name VARCHAR(40) NOT NULL,
  40. phone VARCHAR(20) NOT NULL UNIQUE,
  41. email VARCHAR(50) NOT NULL UNIQUE,
  42. city_id INT,
  43. FOREIGN KEY (city_id) REFERENCES cities(id)
  44. );
  45.  
  46. -- BUYERS
  47. CREATE TABLE buyers
  48. (
  49. id INT AUTO_INCREMENT PRIMARY KEY,
  50. first_name VARCHAR(40) NOT NULL,
  51. last_name VARCHAR(40) NOT NULL,
  52. phone VARCHAR(20) NOT NULL UNIQUE,
  53. email VARCHAR(50) NOT NULL UNIQUE,
  54. city_id INT,
  55. FOREIGN KEY (city_id) REFERENCES cities(id)
  56. );
  57.  
  58. -- property_offers
  59. CREATE TABLE property_offers
  60. (
  61. property_id INT NOT NULL,
  62. agent_id INT NOT NULL,
  63. price DECIMAL(19, 2) NOT NULL,
  64. offer_datetime DATETIME,
  65. CONSTRAINT `fk_offers_with_properties` FOREIGN KEY(property_id) REFERENCES properties(id),
  66. CONSTRAINT `fk_offers_with_agents` FOREIGN KEY(agent_id) REFERENCES agents(id)
  67. );
  68.  
  69. -- property_transactions
  70. CREATE TABLE property_transactions
  71. (
  72. id INT AUTO_INCREMENT PRIMARY KEY,
  73. property_id INT NOT NULL,
  74. buyer_id INT NOT NULL,
  75. transaction_date DATE,
  76. bank_name VARCHAR(30),
  77. iban VARCHAR(40) UNIQUE,
  78. is_successful BOOLEAN,
  79. FOREIGN KEY (property_id) REFERENCES properties (id),
  80. FOREIGN KEY (buyer_id) REFERENCES buyers (id)
  81. );
  82.  
  83. -- 02. Insert
  84. INSERT INTO property_transactions (property_id, buyer_id, transaction_date, bank_name, iban, is_successful)
  85. SELECT
  86. po.agent_id + DAY (po.offer_datetime),
  87. po.agent_id + MONTH (po.offer_datetime),
  88. DATE(po.offer_datetime),
  89. CONCAT('Bank ', po.agent_id),
  90. CONCAT('BG', po.price, po.agent_id),
  91. true
  92. FROM property_offers po
  93. WHERE po.agent_id <= 2;
  94.  
  95. -- 03. Update
  96. UPDATE properties prop
  97. SET prop.price = prop.price - 50000
  98. WHERE prop.price >= 800000;
  99.  
  100.  
  101. -- 04. Delete
  102. DELETE FROM property_transactions trans
  103. WHERE trans.is_successful = 0;
  104.  
  105. -- 05. Agents
  106. SELECT * FROM agents
  107. ORDER BY city_id DESC, phone DESC;
  108.  
  109. -- 06. Offers from 2021
  110. SELECT * FROM property_offers po
  111. WHERE YEAR(po.offer_datetime) = 2021
  112. ORDER BY price ASC
  113. LIMIT 10;
  114.  
  115. -- 07. Properties without offers
  116. SELECT SUBSTRING(pr.address, 1, 6) AS agent_name, CHAR_LENGTH(pr.address) * 5430 AS price FROM properties pr
  117. LEFT JOIN property_offers po ON pr.id = po.property_id
  118. WHERE po.agent_id IS NULL
  119. ORDER BY agent_name DESC, price DESC;
  120.  
  121. -- 08. Best Banks
  122. SELECT bank_name, COUNT(`iban`) AS count FROM property_transactions
  123. GROUP BY bank_name
  124. HAVING count >= 9
  125. ORDER BY count DESC, bank_name ASC;
  126.  
  127. -- 09. Size of the area
  128. SELECT address, area,
  129. (CASE
  130. WHEN area <= 100 THEN 'small'
  131. WHEN area <= 200 THEN 'medium'
  132. WHEN area <= 500 THEN 'large'
  133. ELSE 'extra large'
  134. END) AS size
  135. FROM properties
  136. ORDER BY area ASC, address DESC
  137.  
  138. -- 10. Offers count in a city
  139. -- брой на офертите за дадения град
  140. DELIMITER //
  141. CREATE FUNCTION udf_offers_from_city_name (cityName VARCHAR(50))
  142. RETURNS INT
  143. DETERMINISTIC
  144. BEGIN
  145. DECLARE offers_count INT;
  146. SET offers_count := (
  147. SELECT COUNT(*) FROM property_offers po
  148. JOIN properties p on po.property_id = p.id
  149. JOIN cities c on c.id = p.city_id
  150. WHERE cityName = c.name
  151. );
  152. RETURN offers_count;
  153. END;
  154.  
  155. -- 11. Special Offer
  156. DELIMITER //
  157. CREATE PROCEDURE udp_special_offer (first_name VARCHAR(50))
  158. BEGIN
  159. UPDATE property_offers po
  160. JOIN agents a ON a.id = po.agent_id
  161. SET po.price = po.price * 0.9
  162. WHERE a.first_name = first_name;
  163. END;
  164.  
  165.  
  166.  
  167.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement