-- Δοκιμή του τρόπου λειτουργίας των περιορισμών πρωτεύοντος και ξένου κλειδιού
INSERT INTO "product"("maker", "model", "type")
VALUES ('K', 1001, 'laptop'); -- ERROR: duplicate key value violates unique constraint "product_pkey"

INSERT INTO "printer"("model", "color", "ptype", "price")
VALUES (3008, 'false', 'laser', '145'); -- ERROR: insert or update on table "printer" violates foreign key constraint "printer_model_fkey"

-- Ποια είναι τα μοντέλα PC που έχουν ταχύτητα τουλάχιστον 3.00 GHZ;
SELECT "model"
FROM "pc"
WHERE "speed" >= 3.00;

-- Τυπώστε σε φθίνουσα σειρά τις τιμές των PCs που έχουν σκληρό δίσκο >100GB.
SELECT "price", "hd"
FROM "pc"
WHERE "hd" > 100
ORDER BY "price" DESC;

-- Ποιοι είναι οι κατασκευαστές που παράγουν laptops
-- με σκληρό δίσκο χωρητικότητας τουλάχιστον 100GB;
SELECT DISTINCT "product"."maker", "laptop"."hd"
FROM "product"
JOIN "laptop" ON "product"."model" = "laptop"."model"
WHERE "laptop"."hd" >= 100;

-- Ποιοι είναι οι κατασκευαστές που πωλούν laptops αλλά όχι PC’s;
SELECT "maker" FROM "product" WHERE "type" = 'laptop'
EXCEPT
SELECT "maker" FROM "product" WHERE "type" = 'pc';

-- Βρείτε τα μεγέθη σκληρών δίσκων που υπάρχουν στα PC αλλά όχι στα Laptops (διατηρώντας τα διπλότυπα αν υπάρχουν)
SELECT "hd" FROM "pc"
EXCEPT ALL
SELECT "hd" FROM "laptop";

-- Δημιουργήστε μια ενιαία λίστα με όλα τα προϊόντα (PC, Laptop, Printer) που κοστίζουν πάνω από 500€,
-- εμφανίζοντας το μοντέλο και την τιμή τους.
SELECT "model", "price" FROM "pc" WHERE "price" > 500
UNION
SELECT "model", "price" FROM "laptop" WHERE "price" > 500
UNION
SELECT "model", "price" FROM "printer" WHERE "price" > 500;

-- Βρείτε τους κατασκευαστές που παράγουν ταυτόχρονα και Laptops και Εκτυπωτές.
SELECT "maker" FROM "product" WHERE "type" = 'laptop'
INTERSECT
SELECT "maker" FROM "product" WHERE "type" = 'printer';

-- Βρείτε το μοντέλο, την ταχύτητα και τον κατασκευαστή για όλα τα Laptops που έχουν οθόνη τουλάχιστον 15 ιντσών.
SELECT "product"."maker", "laptop"."model", "laptop"."speed"
FROM "product"
INNER JOIN "laptop" ON "product"."model" = "laptop"."model"
WHERE "laptop"."screen" >= 15;

-- Βρείτε το μοντέλο, την ταχύτητα και τον κατασκευαστή για όλα τα Laptops που έχουν οθόνη τουλάχιστον 15 ιντσών.
SELECT "product"."maker", "laptop"."model", "laptop"."speed"
FROM "product"
INNER JOIN "laptop" ON "product"."model" = "laptop"."model"
AND "laptop"."screen" >= 15;

-- Εμφανίστε τον κατασκευαστή και τον τύπο εκτυπωτή (laser ή ink-jet) για όλους τους έγχρωμους εκτυπωτές.
SELECT "maker", "type", "price"
FROM "product"
NATURAL JOIN "printer"
WHERE "color" = true;

-- Βρείτε εκείνα τα ζεύγη των μοντέλων PC που και τα δύο μέλη του ζεύγους
-- έχουν την ίδια ταχύτητα και RAM.
-- Ένα ζεύγος πρέπει να δίνεται μόνο μια φορά (π.χ. i,j αλλά όχι j,i).
SELECT "p1"."model", "p2"."model"
FROM "pc" AS "p1", "pc" AS "p2"
WHERE "p1"."speed" = "p2"."speed"
AND "p1"."ram" = "p2"."ram"
AND "p1"."model" < "p2"."model";

-- Θέλουμε μια λίστα με όλους τους κατασκευαστές και δίπλα τα Laptop τους, αλλά μόνο αν αυτά είναι πάνω από 15 ίντσες.
-- ΠΡΟΣΟΧΗ: ΑΝΑΛΟΓΑ ΜΕ ΤΟ ΠΟΥ ΜΠΑΙΝΕΙ Η ΣΥΝΘΗΚΗ ΠΑΡΑΓΟΝΤΑΙ ΔΙΑΦΟΡΕΤΙΚΑ ΑΠΟΤΕΛΕΣΜΑΤΑ
SELECT "product"."maker", "product"."model", "laptop"."model", "laptop"."screen"
FROM "product"
LEFT JOIN "laptop" ON "product"."model" = "laptop"."model"
AND "laptop"."screen" >= 15;

-- Θέλουμε μια λίστα με όλους τους κατασκευαστές και δίπλα τα Laptop τους, αλλά μόνο αν αυτά είναι πάνω από 15 ίντσες.
-- ΠΡΟΣΟΧΗ: ΑΝΑΛΟΓΑ ΜΕ ΤΟ ΠΟΥ ΜΠΑΙΝΕΙ Η ΣΥΝΘΗΚΗ ΠΑΡΑΓΟΝΤΑΙ ΔΙΑΦΟΡΕΤΙΚΑ ΑΠΟΤΕΛΕΣΜΑΤΑ
SELECT "product"."maker", "product"."model", "laptop"."model", "laptop"."screen"
FROM "product"
LEFT JOIN "laptop" ON "product"."model" = "laptop"."model"
WHERE "laptop"."screen" >= 15;

-- Τυπώστε όλα τα ζευγάρια μοντέλα PC και μοντέλα Laptop με την ίδια ταχύτητα επεξεργαστή μαζί με τις τιμές τους.
-- Στη λίστα θα πρέπει να εμφανίζονται όλα τα μοντέλα PC και αν δεν υπάρχει κάποιο μοντέλο laptop με την ίδια ταχύτητα
-- θα εμφανίζεται η ένδειξη ‘none’ (στο μοντέλο laptop και στην τιμή του).
SELECT "pc"."model",
COALESCE("laptop"."model"::TEXT, 'none'),
"pc"."price",
COALESCE("laptop"."price"::TEXT, 'none')
FROM "pc"
LEFT JOIN "laptop" ON "pc"."speed" = "laptop"."speed";

-- Εμφανίστε όλους τους εκτυπωτές και το όνομα του κατασκευαστή τους,
-- διασφαλίζοντας ότι ακόμα και αν ένας κατασκευαστής δεν παράγει εκτυπωτές,
-- θα εμφανιστεί στη λίστα.
SELECT DISTINCT "product"."maker", "printer"."model", "printer"."ptype"
FROM "printer"
RIGHT JOIN "product" ON "product"."model" = "printer"."model";

-- Εμφανίστε μια λίστα με όλα τα μοντέλα PC και όλα τα μοντέλα Laptop,
-- έτσι ώστε αν έχουν την ίδια RAM να εμφανίζονται στην ίδια γραμμή.
-- Αν ένα μοντέλο δεν έχει "ταίρι", τα πεδία του άλλου να είναι NULL.

SELECT "pc"."model" AS "pc_model", "laptop"."model" AS "laptop_model", "pc"."ram", "laptop"."ram"
FROM "pc"
FULL OUTER JOIN "laptop" ON "pc"."ram" = "laptop"."ram";

-- Εμφάνισε τον κατασκευαστή, το μοντέλο PC και την τιμή του, για όλα τα PC
-- που έχουν την ίδια ταχύτητα με τουλάχιστον ένα Laptop.
SELECT DISTINCT "p"."maker", "pc"."model", "pc"."price"
FROM "product" AS "p"
INNER JOIN "pc" ON "p"."model" = "pc"."model"
INNER JOIN "laptop" AS "l" ON "pc"."speed" = "l"."speed";

-- Βρείτε όλους τους εκτυπωτές (μοντέλο και τιμή) μαζί με το όνομα του κατασκευαστή τους,
-- αλλά μόνο για εκείνους τους κατασκευαστές που παράγουν επίσης και Laptop.
SELECT DISTINCT "product"."maker", "printer"."model", "printer"."price"
FROM "product"
INNER JOIN "printer" ON "product"."model" = "printer"."model"
INNER JOIN "product" AS "product_l" ON "product"."maker" = "product_l"."maker"
INNER JOIN "laptop" ON "product_l"."model" = "laptop"."model";