CREATE DATABASE `LOCAL_REAL_ESTATE` DEFAULT CHARACTER SET utf8mb4;

USE `LOCAL_REAL_ESTATE`;

/* create tables of attributes */
CREATE TABLE Property(
	address VARCHAR(50) NOT NULL,
	ownerName VARCHAR(30),
	price INT,
	PRIMARY KEY(address)
);

CREATE TABLE House(
	address VARCHAR(50) NOT NULL,
	ownerName VARCHAR(30),
	price INT,
	bedrooms INT,
	bathrooms INT,
	size INT,
	FOREIGN KEY(address) REFERENCES Property(address)
);

CREATE TABLE BusinessProperty(
	address VARCHAR(50) NOT NULL,
	ownerName VARCHAR(30),
	price INT,
	type CHAR(20),
	size INT,
	FOREIGN KEY(address) REFERENCES Property(address)
);

CREATE TABLE Firm(
	id INT NOT NULL,
	name VARCHAR(30),
	address VARCHAR(50),
	PRIMARY KEY(id)
);

CREATE TABLE Agent(
	agentId INT NOT NULL,
	name VARCHAR(30),
	phone CHAR(12),
	firmId INT NOT NULL,
	dateStarted DATE,
	PRIMARY KEY(agentId),
	FOREIGN KEY(firmId) REFERENCES Firm(id)
);

CREATE TABLE Listing(
	address VARCHAR(50),
	agentId INT,
	mlsNumber INT PRIMARY KEY,
	dataListed DATE,
	FOREIGN KEY(agentId) REFERENCES Agent(agentId),
	FOREIGN KEY(address) REFERENCES Property(address)
);

CREATE TABLE Buyer(
	id INT NOT NULL,
	name VARCHAR(30),
	phone CHAR(12),
	propertyType CHAR(20),
	bedrooms INT,
	bathrooms INT,
	businessPropertyType CHAR(20),
	minimumPreferredPrice INT,
	maximumPreferredPrice INT,
	PRIMARY KEY(id)
);

CREATE TABLE Work_With(
	buyerId INT,
	agentId INT,
	FOREIGN KEY(buyerId) REFERENCES Buyer(id),
	FOREIGN KEY(agentId) REFERENCES Agent(agentId)
);

/* create an assertion */
/*
CREATE ASSERTION PROPERTY_AGENT_PROJECTION CHECK
	(NOT EXISTS
        	(SELECT L1.address
           	 FROM Listings L1, Listings L2
           	 WHERE L1.address = L2.address AND L1.agentId != L2.agentId
		)
	);
*/
/* insert records to each tables, each table has at least 5 records */
/* 10 records into Property */
INSERT INTO Property
VALUES('2350 Gibson Road', 'John Smith', 235000);

INSERT INTO Property
VALUES('197 Watson Street', 'Raymond Chou', 789000);

INSERT INTO Property
VALUES('2525 Pottsdamer Street', 'Jim Lee', 100500);

INSERT INTO Property
VALUES('193 Love BLVD', 'Kim Abudal', 930000);

INSERT INTO Property
VALUES('647 Maston Road', 'Robert Clue', 135000);

INSERT INTO Property
VALUES('1350 Navada Street', 'Jack Green', 674090);

INSERT INTO Property
VALUES('256 Florida Street', 'Michael Kohen', 179280);

INSERT INTO Property
VALUES('1717 Kansas Street', 'Leah Mars', 345000);

INSERT INTO Property
VALUES('2613 Academic Way', 'Marry Song', 997050);

INSERT INTO Property
VALUES('179 Tinker Road', 'Leon Kant', 90000);

/* 5 records into House */
INSERT INTO House
VALUES('2350 Gibson Road', 'John Smith', 235000, 3, 2, 196);

INSERT INTO House
VALUES('197 Watson Street', 'Raymond Chou', 789000, 2, 4, 203);

INSERT INTO House
VALUES('2525 Pottsdamer Street', 'Jim Lee', 100500, 2, 3, 180);

INSERT INTO House
VALUES('193 Love BLVD', 'Kim Abudal', 930000, 3, 2, 401);

INSERT INTO House
VALUES('647 Maston Road', 'Robert Clue', 135000, 3, 2, 102);

/* 5 records into BusinessProperty */
INSERT INTO BusinessProperty
VALUES('1350 Navada Street', 'Jack Green', 674090, 'office space', 467);

INSERT INTO BusinessProperty
VALUES('256 Florida Street', 'Michael Kohen', 179280, 'gas station', 245);

INSERT INTO BusinessProperty
VALUES('1717 Kansas Street', 'Leah Mars', 345000, 'office space', 356);

INSERT INTO BusinessProperty
VALUES('2613 Academic Way', 'Marry Song', 997050, 'office space', 670);

INSERT INTO BusinessProperty
VALUES('179 Tinker Road', 'Leon Kant', 90000, 'store front', 128);

/* 5 records into Firm */
INSERT INTO Firm
VALUES(135210, 'Goldman Sash', '799 Georgia Way');

INSERT INTO Firm
VALUES(146277, 'Holloway', '124 Texas Street');

INSERT INTO Firm
VALUES(165034, 'Good Target', '135 California Street');

INSERT INTO Firm
VALUES(230754, 'Cozy Home', '277 Beach Road');

INSERT INTO Firm
VALUES(210211, 'Fast Searcher', '1010 Alas Road');

/* 10 records into Agent */
INSERT INTO Agent
VALUES(100, 'Leet Kim', '135145636', 210211, '2012-01-23');

INSERT INTO Agent
VALUES(112, 'Jim Alpha', '171135636', 210211, '2012-03-26');

INSERT INTO Agent
VALUES(123, 'George Grey', '176321636', 135210, '2015-02-23');

INSERT INTO Agent
VALUES(145, 'Sarah Core', '135145909', 135210, '2016-07-03');

INSERT INTO Agent
VALUES(168, 'Livia Watson', '137145638', 146277, '2014-01-17');

INSERT INTO Agent
VALUES(189, 'Nik Ray', '135873630', 146277, '2014-01-28');

INSERT INTO Agent
VALUES(201, 'Cris Paul', '136141236', 165034, '2016-05-23');

INSERT INTO Agent
VALUES(223, 'Lena Clay', '137145123', 165034, '2014-08-19');

INSERT INTO Agent
VALUES(267, 'Kevin Nil', '190145636', 230754, '2011-07-20');

INSERT INTO Agent
VALUES(310, 'Hugh Grant', '132145639', 230754, '2012-12-31');

/* 10 records into Listing */
INSERT INTO Listing
VALUES('2350 Gibson Road', 100, 1212, '2013-02-04');

INSERT INTO Listing
VALUES('197 Watson Street', 112, 1500, '2013-05-06');

INSERT INTO Listing
VALUES('2525 Pottsdamer Street', 123, 1617, '2016-12-04');

INSERT INTO Listing
VALUES('193 Love BLVD', 145, 1718, '2016-02-09');

INSERT INTO Listing
VALUES('647 Maston Road', 168, 1900, '2014-12-19');

INSERT INTO Listing
VALUES('1350 Navada Street', 189, 2101, '2015-06-06');

INSERT INTO Listing
VALUES('256 Florida Street', 201, 2305, '2017-05-25');

INSERT INTO Listing
VALUES('1717 Kansas Street', 223, 2500, '2014-12-04');

INSERT INTO Listing
VALUES('2613 Academic Way', 267, 2790, '2013-10-01');

INSERT INTO Listing
VALUES('179 Tinker Road', 310, 3001, '2015-09-05');

/* 6 records into Buyer */
INSERT INTO Buyer
VALUES(799, 'John Nay', '125345790', 'house', 3, 2, 'not applied', 100000, 635000);

INSERT INTO Buyer
VALUES(801, 'Retina Grey', '146345790', 'house', 3, 2, 'not applied', 100000, 400000);

INSERT INTO Buyer
VALUES(813, 'Reg Neal', '189345791', 'house', 2, 3, 'not applied', 300000, 635000);

INSERT INTO Buyer
VALUES(845, 'Gena Sarah', '789345790', 'house', 3, 2, 'not applied', 200000, 960000);

INSERT INTO Buyer
VALUES(875, 'Bill Clay', '888345798', 'not applied', 0, 0, 'office space', 100000, 900000);

INSERT INTO Buyer
VALUES(999, 'Hilton Clag', '999345792', 'not applied', 0, 0, 'office space', 300000, 790000);

/* 6 records into Works_With */
INSERT INTO Work_With
VALUES(799, 100);

INSERT INTO Work_With
VALUES(801, 145);

INSERT INTO Work_With
VALUES(813, 123);

INSERT INTO Work_With
VALUES(845, 168);

INSERT INTO Work_With
VALUES(875, 189);

INSERT INTO Work_With
VALUES(999, 223);

/* queries */
/* 1st query */
SELECT Listing.address
FROM Listing, House
WHERE Listing.address = House.address;

/* 2nd query */
SELECT Listing.address, Listing.mlsNumber
FROM Listing, House
WHERE Listing.address = House.address;

/* 3rd query */
SELECT Listing.address
FROM Listing, House
WHERE Listing.address = House.address AND House.bedrooms = 3 AND House.bathrooms = 2;

/* 4th query */
SELECT address, price
FROM House
WHERE bedrooms = 3 AND bathrooms = 2 AND price >= 100000 AND price <= 250000
ORDER BY price DESC;

/* 5th query */
SELECT address, price
FROM BusinessProperty
WHERE type = 'office space'
ORDER BY price DESC;

/* 6th query */
SELECT agentId, Agent.name, phone, Firm.name, dateStarted
FROM Agent, Firm
WHERE Agent.firmId = Firm.id;

/* 7th query, agentId is indicated as 201 here */
SELECT Property.*
FROM Property, Listing
WHERE Property.address = Listing.address AND Listing.agentId = 201;

/* 8th query */
SELECT Agent.name AS Agent_Name, Buyer.name AS Buyer_Name
FROM Agent, Buyer, Work_With
WHERE Agent.agentId = Work_With.agentId AND Buyer.id = Work_With.buyerId;

/* 9th query, suppose the buyer's Id is 799 in our case */
SELECT House.*
FROM House, Buyer
WHERE Buyer.id = 799 AND
      Buyer.bedrooms = House.bedrooms AND
      Buyer.bathrooms = House.bathrooms AND
      Buyer.minimumPreferredPrice <= House.price AND
      Buyer.maximumPreferredPrice >= House.price;

/* the end of program */
