'Ασκηση στην SQL
Συντονιστές: WebDev Moderators, Super-Moderators
'Ασκηση στην SQL
Γεια σε όλους, έχω μια άσκηση με SQL και έχω κολλήσει σε 2 ερωτήσεις και θα ήθελα λιγη βοήθεια!!
έχουμε τους παρακάτω πίνακες:
MOVIE (Movie_id,Title, Type, Year, Producer)
CLIENT (client_id, Name, Address, City)
RENT (Rental_id, Date, Movie_id, Client-id, Cost)
και δεν μπορώ να σκεφτώ πως να απαντήσω τα εξής:
1.Βρείτε την πιο δημοφιλή (δηλαδή με τις περισσότερες ενοικιάσεις) ταινία παραγωγής 2005 έως 2008
2. Βρείτε το μέσο αριθμό ενοικιάσεων ανά πελάτη...
Μήπως μπορεί να βοηθείση καποιος???
έχουμε τους παρακάτω πίνακες:
MOVIE (Movie_id,Title, Type, Year, Producer)
CLIENT (client_id, Name, Address, City)
RENT (Rental_id, Date, Movie_id, Client-id, Cost)
και δεν μπορώ να σκεφτώ πως να απαντήσω τα εξής:
1.Βρείτε την πιο δημοφιλή (δηλαδή με τις περισσότερες ενοικιάσεις) ταινία παραγωγής 2005 έως 2008
2. Βρείτε το μέσο αριθμό ενοικιάσεων ανά πελάτη...
Μήπως μπορεί να βοηθείση καποιος???
'Ασκηση στην SQL
Γράψε μας τι έχεις κάνει μέχρι τώρα να δούμε σε πιο σημείο μπορούμε να βοηθήσουμε.
Και ρίξε μια ματιά και εδώ: http://www.freestuff.gr/forums/viewtopic.php?t=46323
Και ρίξε μια ματιά και εδώ: http://www.freestuff.gr/forums/viewtopic.php?t=46323
'Ασκηση στην SQL
Σκοπός της άσκησης μου ειναι η εξάσκηση στην δημιουργία μιας βασης δεδομένων και η απάντηση ερωτήσεων (query).
ξεκινώντας δημιούργησα τους 3ης πίνακες MOVIE (key = movie_id) , CLIENT (key= client_id) , RENT(key = rental_id)
και στην συνεχεια τους γέμισα με διαφορες τυχαίες πλειάδες δηλ. έβαλα πέλατες, έβαλα διάφορες ταίνιες και στην συνέχεια κάποιες ενοικιάσεις!! (ολες οι παραπάνω προσθήκες έγιναν με σκοπο να υπάρχουν απαντήσεις στα query).
Τα query που πρέπει να απαντήσω είναι τα εξής:
a. Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά.
b. Βρείτε τα ονόματα και τις διευθύνσεις των πελατών οι οποίοι νοικιάζουν ταινίες τύπου "Action".
c. Βρείτε τις πόλεις στις οποίες μένουν πελάτες οι οποίοι δεν νοικιάζουν καμία ταινία με ημερομηνία παραγωγής νωρίτερα από το 1995.
d. Βρείτε τους τίτλους των ταινιών που νοικιάζονται με κόστος μεγαλύτερο από 5 ευρώ από πελάτες που βρίσκονται στην Αθήνα
e. Βρείτε τα ζεύγη πελατών – παραγωγών ταινιών τα οποία είναι τέτοια ώστε ο πελάτης να μην νοικιάζει καμία ταινία του παραγωγού.
f. Βρείτε την πιο δημοφιλή (δηλαδή με τις περισσότερες ενοικιάσεις) ταινία παραγωγής 2005 έως 2008
g. Βρείτε το μέσο αριθμό ενοικιάσεων ανά πελάτη
Στα 5 πρώτα είμαι οκ... τα προβλήματα μου ξεκίνανε στα 2 τελυταία!!!
για το 6 έχω βρει ποιες ταινίες έχουν νοικιαστει χρεισιμοποιώντας το εξής:
SELECT movie_id , count(*)
FROM rent
GROUP BY movie_id;
αλλα τώρα πως θα πάρω την πιο δημοφιλη η πως θα ζητήσω να μου βγάλει μονο τις παραγωγές 2005-2008 χάνομαι...
επισης για το 7 προσπαθησα να το κανω με ενα είδος διαίρεσης :
SELECT count(rental_id.a)/count(client_id.b)
from rent a , client b;
αλλα μου βαζει error!!
Ειμαι αρκετά νεος στην SQL και ίσως αυτο που ψάχνω να ειναι πολυ εύκολο αλλα έχω κολλήσει....
Καθε βοήθεια θα είναι δέκτη... έστω και καποιο βοήθημα που μπορεί να μην βρήκα ψάχνοντας στο ιντερνετ...
ξεκινώντας δημιούργησα τους 3ης πίνακες MOVIE (key = movie_id) , CLIENT (key= client_id) , RENT(key = rental_id)
και στην συνεχεια τους γέμισα με διαφορες τυχαίες πλειάδες δηλ. έβαλα πέλατες, έβαλα διάφορες ταίνιες και στην συνέχεια κάποιες ενοικιάσεις!! (ολες οι παραπάνω προσθήκες έγιναν με σκοπο να υπάρχουν απαντήσεις στα query).
Τα query που πρέπει να απαντήσω είναι τα εξής:
a. Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά.
b. Βρείτε τα ονόματα και τις διευθύνσεις των πελατών οι οποίοι νοικιάζουν ταινίες τύπου "Action".
c. Βρείτε τις πόλεις στις οποίες μένουν πελάτες οι οποίοι δεν νοικιάζουν καμία ταινία με ημερομηνία παραγωγής νωρίτερα από το 1995.
d. Βρείτε τους τίτλους των ταινιών που νοικιάζονται με κόστος μεγαλύτερο από 5 ευρώ από πελάτες που βρίσκονται στην Αθήνα
e. Βρείτε τα ζεύγη πελατών – παραγωγών ταινιών τα οποία είναι τέτοια ώστε ο πελάτης να μην νοικιάζει καμία ταινία του παραγωγού.
f. Βρείτε την πιο δημοφιλή (δηλαδή με τις περισσότερες ενοικιάσεις) ταινία παραγωγής 2005 έως 2008
g. Βρείτε το μέσο αριθμό ενοικιάσεων ανά πελάτη
Στα 5 πρώτα είμαι οκ... τα προβλήματα μου ξεκίνανε στα 2 τελυταία!!!
για το 6 έχω βρει ποιες ταινίες έχουν νοικιαστει χρεισιμοποιώντας το εξής:
SELECT movie_id , count(*)
FROM rent
GROUP BY movie_id;
αλλα τώρα πως θα πάρω την πιο δημοφιλη η πως θα ζητήσω να μου βγάλει μονο τις παραγωγές 2005-2008 χάνομαι...

επισης για το 7 προσπαθησα να το κανω με ενα είδος διαίρεσης :
SELECT count(rental_id.a)/count(client_id.b)
from rent a , client b;
αλλα μου βαζει error!!

Ειμαι αρκετά νεος στην SQL και ίσως αυτο που ψάχνω να ειναι πολυ εύκολο αλλα έχω κολλήσει....
Καθε βοήθεια θα είναι δέκτη... έστω και καποιο βοήθημα που μπορεί να μην βρήκα ψάχνοντας στο ιντερνετ...
'Ασκηση στην SQL
http://anemos.web.auth.gr/database/%CE% ... %20sql.pdf
Αυτά που χρειάζεσαι είναι να συνδιάσεις το count με το order by fieldname/alias. Για τα υπόλοιπα υπάρχουν αντίστοιχες functions με την count, π.χ. avg για μέσο όρο.
Για να φέρεις στοιχεία από 2+ πίνακες πρέπει με κάποιο τρόπο να συνδέσεις τους πίνακες αυτούς με πεδία που έχουν κοινά στοιχεία (ο ένας πίνακας έχει κάποιο/α πεδίο/α που δείχνουν σε στοιχεία κάποιου άλλου). Δες τα left/right/inner joins.
Αυτά που χρειάζεσαι είναι να συνδιάσεις το count με το order by fieldname/alias. Για τα υπόλοιπα υπάρχουν αντίστοιχες functions με την count, π.χ. avg για μέσο όρο.
Για να φέρεις στοιχεία από 2+ πίνακες πρέπει με κάποιο τρόπο να συνδέσεις τους πίνακες αυτούς με πεδία που έχουν κοινά στοιχεία (ο ένας πίνακας έχει κάποιο/α πεδίο/α που δείχνουν σε στοιχεία κάποιου άλλου). Δες τα left/right/inner joins.
'Ασκηση στην SQL
dva_dev ευχαριστώ πολυ, μολις εβγαλα το ενα απο τα 2 (f)...
μενει αλλο ενα!!! δεν το εχω προσπαθήσει ακόμα αλλα ενθουσιάστικα με το πρώτο και ήθελα να σε ευχαριστίσω!!! Καλή σου μέρα!!
μενει αλλο ενα!!! δεν το εχω προσπαθήσει ακόμα αλλα ενθουσιάστικα με το πρώτο και ήθελα να σε ευχαριστίσω!!! Καλή σου μέρα!!
'Ασκηση στην SQL
Όταν θέλεις να ψάξεις σε συγκεκριμένα χρονικά διαστήματα μπορείς είτε να χρησιμοποιείς την between
στο στυλ select tade from deina where mydate BETWEEN '1/1/2005' AND '31/12/2008'
ή με > και < αντί για between...
στο στυλ select tade from deina where mydate BETWEEN '1/1/2005' AND '31/12/2008'
ή με > και < αντί για between...
'Ασκηση στην SQL
Σωστά, απλά νομίζω πως η MySQL χειρίζεται τις ημερομηνίες στην εξής μορφή: YYYY-MM-DD.dimsis έγραψε:Όταν θέλεις να ψάξεις σε συγκεκριμένα χρονικά διαστήματα μπορείς είτε να χρησιμοποιείς την between
στο στυλ select tade from deina where mydate BETWEEN '1/1/2005' AND '31/12/2008'
ή με > και < αντί για between...
'Ασκηση στην SQL
και ακόμα καλύτερα να χρησιμοποιείς την STR_TO_DATE (και βάζεις το string της ημερομηνίας σε ότι μορφή θέλεις), παρά να την αφήνεις να προσπαθήσει να κάνει convert το string μόνη της.
'Ασκηση στην SQL
Τελικά ΟΚ με το F αλλά το τελευταιο ερωτημα δεν βγαίνει!!
Προσπαθώ κανοντα count ωστε να μετρισω ποσες ενοιικιασεις εχουν γεινει, επισης count για να βρω ποσους πελατες εχω αλλα μετα... σκοπος ειναι να μπορουσα να διαιρεσω αυτα τα νουμερα!! αλλα πως??
ΚΑΜΙΑ ΙΔΕΑ...????
Προσπαθώ κανοντα count ωστε να μετρισω ποσες ενοιικιασεις εχουν γεινει, επισης count για να βρω ποσους πελατες εχω αλλα μετα... σκοπος ειναι να μπορουσα να διαιρεσω αυτα τα νουμερα!! αλλα πως??
ΚΑΜΙΑ ΙΔΕΑ...????
'Ασκηση στην SQL
Sorry για τις συνεχόμενες ερωτοαπαντήσεις αλλα ασχολούμε σχεδόν ολη μερα με αυτο και ολο κατι βρίσκω και κατι χάνω!! Αλλα OK ειμαι κοντά στο τέλος... Είναι ολα λυμένα τώρα απλα έχω κανει ενα λαθος, που δεν μπορώ να βρω λύση!! λοιπον στην ερώτηση:
Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά.
απαντάω ως εξης:
SELECT name_id FROM client
WHERE client_id IN
(SELECT client_id FROM rent WHERE movie_id IN
(SELECT movie_id FROM movie WHERE
producer = 'MGM' AND year >2000));
το προβλημα είναι ότι αυτό βγάζει τα ονόματα των πελατών που εχουν ενοικιάσει έστω και μια ταινια απο την MGM παραγωγείς μετα το 2000 και όχι ΟΛΕΣ που είναι το ζητούμενο!!!
ΚΑΜΙΑ ΙΔΕΑ;;;;;;
Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά.
απαντάω ως εξης:
SELECT name_id FROM client
WHERE client_id IN
(SELECT client_id FROM rent WHERE movie_id IN
(SELECT movie_id FROM movie WHERE
producer = 'MGM' AND year >2000));
το προβλημα είναι ότι αυτό βγάζει τα ονόματα των πελατών που εχουν ενοικιάσει έστω και μια ταινια απο την MGM παραγωγείς μετα το 2000 και όχι ΟΛΕΣ που είναι το ζητούμενο!!!

ΚΑΜΙΑ ΙΔΕΑ;;;;;;

'Ασκηση στην SQL
Γεια και από μένα.
Έχω κι εγώ απορία σχετικά με αυτή την άσκηση. Στο ερώτημα e) πως μπορούμε να βρούμε τα ζέυγη πελατών-παραγωγών ταινιών. Έχω προσπαθήσει με διάφορους τρόπους αλλά δεν έχω καταφέρει τιποτα. Τα υπόλοιπα ερωτήμαρα είναι ok.
Ευχαριστώ εκ των προτέρων
Έχω κι εγώ απορία σχετικά με αυτή την άσκηση. Στο ερώτημα e) πως μπορούμε να βρούμε τα ζέυγη πελατών-παραγωγών ταινιών. Έχω προσπαθήσει με διάφορους τρόπους αλλά δεν έχω καταφέρει τιποτα. Τα υπόλοιπα ερωτήμαρα είναι ok.
Ευχαριστώ εκ των προτέρων
'Ασκηση στην SQL
Migi η ιδέα στο (e) είναι:
επιλέγης ολα τα ζεύγη πελατων - παραγωγών (1)... στην συνέχεια επιλέγεις ολα τα ζεύγη πελατών - παραγωγών που εχουν νοικιασει ταινιες παιρνοντας την πληροφορία απο το rent (2)!! και κανεις (1) not in (2) !!!
προσπάθησε και αν δεν το βρεις πες να σου δώσω την απάντηση!!!
καμία βοήθεια για το τι λάθος κάνω στην (a)??????
επιλέγης ολα τα ζεύγη πελατων - παραγωγών (1)... στην συνέχεια επιλέγεις ολα τα ζεύγη πελατών - παραγωγών που εχουν νοικιασει ταινιες παιρνοντας την πληροφορία απο το rent (2)!! και κανεις (1) not in (2) !!!
προσπάθησε και αν δεν το βρεις πες να σου δώσω την απάντηση!!!
καμία βοήθεια για το τι λάθος κάνω στην (a)??????

'Ασκηση στην SQL
Λοιπόν στο πρώτο ερώτημα, έχουμε να κάνουμε διαίρεση. Από ότι είδα στις διαλέξεις του μαθήματος, θα πρέπει να μετατρέψεις την πρόταση σου σε 2 αρνήσεις. Δηλαδή:
η πρόταση μας λεεί: "Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά"
Οπότε μετασχηματίζοντάς τη σε 2 αρνήσεις έχουμε:
"Να βρόυμε τα ονόματα των πελατών για τους οποίους δεν υπάρχει ταινία που έχουν νοικιάσει , η οποία δεν έχει παράγει η MGM από το 2000 και μετά"
Μετά στο παράδειγμα που έχει μετατρέποντας την σε sql υλοποιεί πρώτα την δεύτερη άρνηση και μετά την πρώτη. Την ξαναμετασχημάτισα και προέκυψε η τελική μας πρόταση την οποία και μετέτρεψα σε sql:
"Nα βρόυμε τα ονόματα των πελατών για τους οποίους δεν υπάρχει ταινία παραγωγής της MGM από το 2000 και μετά και την οποίαν δεν νοικίασαν"
Χρησιμοποιείς το not exist 2 φορές, το ένα μέσα στο άλλο.
Δες και αυτό το link. Εμένα με βοήθσε πάρα πολύ. http://www2.cs.uh.edu/~marek/notes/lecture7/sld015.htm
Αν χρειαστείς κάτι άλλο το φωνάζεις
Όσον αφορά την ερώτηση e) με τα ζεύγη έχω δοκιμάσει αυτό που λές αλλά δεν δουλεύει. Πρέπει να γίνει με subqueries ετσι; Άμα μπορείς να μου στείλεις την απάντηση , θα σου ήμουν ευγνώμων.
η πρόταση μας λεεί: "Βρείτε τα ονόματα των πελατών που νοικιάζουν όλες τις ταινίες που παράγει η "MGM" από το 2000 και μετά"
Οπότε μετασχηματίζοντάς τη σε 2 αρνήσεις έχουμε:
"Να βρόυμε τα ονόματα των πελατών για τους οποίους δεν υπάρχει ταινία που έχουν νοικιάσει , η οποία δεν έχει παράγει η MGM από το 2000 και μετά"
Μετά στο παράδειγμα που έχει μετατρέποντας την σε sql υλοποιεί πρώτα την δεύτερη άρνηση και μετά την πρώτη. Την ξαναμετασχημάτισα και προέκυψε η τελική μας πρόταση την οποία και μετέτρεψα σε sql:
"Nα βρόυμε τα ονόματα των πελατών για τους οποίους δεν υπάρχει ταινία παραγωγής της MGM από το 2000 και μετά και την οποίαν δεν νοικίασαν"
Χρησιμοποιείς το not exist 2 φορές, το ένα μέσα στο άλλο.
Δες και αυτό το link. Εμένα με βοήθσε πάρα πολύ. http://www2.cs.uh.edu/~marek/notes/lecture7/sld015.htm
Αν χρειαστείς κάτι άλλο το φωνάζεις

Όσον αφορά την ερώτηση e) με τα ζεύγη έχω δοκιμάσει αυτό που λές αλλά δεν δουλεύει. Πρέπει να γίνει με subqueries ετσι; Άμα μπορείς να μου στείλεις την απάντηση , θα σου ήμουν ευγνώμων.
'Ασκηση στην SQL
Απάντηση στο ερώτημα (e):
select distinct c.name , d.producer
from client c ,movie d
where (c.name, d.producer) not in (
select a.name, b.producer
from client a, movie b
where (a.client_id, b.movie_id) in
(select client_id ,movie_id from rent));
Τώρα θα προσπαθήσω το πρώτο αν ζοριστώ σου λέω...
select distinct c.name , d.producer
from client c ,movie d
where (c.name, d.producer) not in (
select a.name, b.producer
from client a, movie b
where (a.client_id, b.movie_id) in
(select client_id ,movie_id from rent));
Τώρα θα προσπαθήσω το πρώτο αν ζοριστώ σου λέω...
'Ασκηση στην SQL
ok ολα τέλεια!!
δεν πολυκατάλαβα γιατί το (α) μου δουλεύει αλλα δουλεύει!!!
Migi στείλε να μου πεις αν ολα καλα με την απάντηση που σου έστειλα!!
Ευχαριστώ ολους οσους απαντησα και βοήθησαν!!!!
δεν πολυκατάλαβα γιατί το (α) μου δουλεύει αλλα δουλεύει!!!
Migi στείλε να μου πεις αν ολα καλα με την απάντηση που σου έστειλα!!
Ευχαριστώ ολους οσους απαντησα και βοήθησαν!!!!
Μέλη σε σύνδεση
Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες