When last we left you were discussing in pairs...
Partner 1: explain to partner 2 what SQL or MySQL is and how it relates to a full stack applications.
Partner 2: explain to partner 1 what PHP is and how it is used in a full stack application.
Together: Come up with a description of what the PDO object is and represents, why we use it, and what are some of the things we can do with it?
Database querying
Database manipulation (create/insert)
Accessing SQL from PHP with the PDO object
grades
with student_id
)This is covered more in depth in database courses (e.g. CSE 344 (CSE majors) and CSE 414 (non-CSE-majors)) and Info 330.
Given...
SELECT * FROM students;
...produced 8 rows, and...
SELECT * FROM grades;
...produced 4 rows, what does the following do?
SELECT * FROM students, grades;
What do you notice about these results?
You can visualize this like a venn diagram
SELECT *
FROM students, grades
WHERE students.id = grades.student_id;
Demo in phpMyAdmin or our Query Tester
You can visualize this like a venn diagram
SELECT col(s) -- Which columns you want to display
FROM table1, table2, ... -- From all the tables that have your data
WHERE table1.a = table2.b -- A condition that combines two tables.
AND table2.c > '42'; -- And maybe more conditions
SELECT students.name, grades.*
FROM students, grades
WHERE students.id = grades.student_id
AND grades.grade > 'C';
Result table
SELECT students.name, grades.*
FROM students, grades
WHERE students.id = grades.student_id
AND grades.grade > 'C';
A more compact solution (giving variable names to tables)
SELECT s.name, g.*
FROM students s, grades g
WHERE s.id = g.student_id
AND g.grade > 'C';
SELECT s.name, g.*
FROM students s, grades g
WHERE s.id = g.student_id
AND g.grade > 'C';
SELECT s.name, g.*
FROM students s
JOIN grades g ON s.id = g.student_id
WHERE g.grade > 'C';
The JOIN
keyword is another way to join multiple tables. Some people find
this more intuitive, while others find joining tables on multiple WHERE conditions more
intuitive. Use whichever form you prefer most!
Note: There are other types of JOINS you may find on the recommended SQL query practice sites. You may learn these for fun if you'd like, but we don't cover it in this class (you will learn about them in other database courses). The JOIN keyword in this slide's example is also known as an "INNER JOIN"
Click the text for solutions
What teachers do all of the students have? Order this by the student's name and use the WHERE
SELECT s.name, t.name
FROM students s, teachers t, grades g, courses c
WHERE s.id = g.student_id
AND g.course_id = c.id
AND c.teacher_id = t.id
ORDER BY s.name ASC;
What teachers do all of the students have? Order this by the student's name and use the JOIN
SELECT s.name, t.name
FROM students s
JOIN grades g ON s.id = g.student_id
JOIN courses c ON g.course_id = c.id
JOIN teachers t ON c.teacher_id = t.id
ORDER BY s.name ASC;
Exercise: What courses have been taken by both Bart and Lisa?
SELECT bart.course_id
FROM grades bart, grades lisa
WHERE lisa.course_id = bart.course_id
AND bart.student_id = 123
AND lisa.student_id = 888;
What's wrong here?
What courses have been taken by both Bart and Lisa?
SELECT DISTINCT c.name
FROM courses c, students lisa, students bart, grades g1, grades g2
WHERE g1.course_id = c.id
AND g1.student_id = bart.id
AND g2.course_id = c.id
AND g2.student_id = lisa.id
AND bart.name = 'Bart'
AND lisa.name = 'Lisa';
Why so many tables?
student
and grades
information distinctly,
so we need to have two variables for each of these tables to join them correctly.Click the text for solutions
What are the names of all teachers Bart has had?
SELECT t.name
FROM teachers t
JOIN courses c ON c.teacher_id = t.id
JOIN grades g ON g.course_id = c.id
JOIN students s ON s.id = g.student_id
WHERE s.name = "Bart";
How many total students has Ms. Krabappel taught, and what are their names?
-- COUNT(s.name) gives the count
SELECT s.name
FROM students s
JOIN grades g ON s.id = g.student_id
JOIN courses c ON c.id = g.course_id
JOIN teachers t ON t.id = c.teacher_id
WHERE t.name="Krabappel";
What are the names of all teachers Bart has had?
SELECT t.name
FROM teachers t, students s, grades g, courses c
WHERE s.name="Bart"
AND s.id=g.student_id
AND g.course_id=c.id
AND c.teacher_id=t.id
How many total students has Ms. Krabappel taught, and what are their names?
-- COUNT(s.name) gives the count
SELECT s.name
FROM students s, grades g, courses c, teachers t
WHERE t.name="Krabappel"
AND t.id=c.teacher_id
AND c.id=g.course_id
AND g.student_id=s.id;
Figure out the proper SQL queries in the following way:
FROM
)SELECT
)JOIN
and/or WHERE
) and values
filtered (WHERE
)?DISTINCT
records?
imdb-small
is also provided on the query tester page for testing queries
with a smaller dataset
What are the names of all movies released in 1995?
How many people played a part in the movie "Lost in Translation"?
What are the names of all the people who played a part in the movie "Lost in Translation"?
Who directed the movie "Fight Club"?
How many movies has Clint Eastwood directed?
What are the names of all movies Clint Eastwood has directed?
What are the names of all directors who have directed at least one horror film?
What are the names of every actor who has appeared in a movie directed by Christopher Nolan?
SELECT name
FROM movies
WHERE year = 1995;
SELECT COUNT(*)
FROM actors a
JOIN roles r ON a.id = r.actor_id
JOIN movies m ON r.movie_id = m.id
WHERE m.name="Lost In Translation";
SELECT first_name, last_name
FROM actors a
JOIN roles r ON a.id = r.actor_id
JOIN movies m ON r.movie_id = m.id
WHERE m.name="Lost In Translation";
SELECT d.first_name, d.last_name
FROM directors d
JOIN movies_directors md ON md.director_id = d.id
JOIN movies m ON m.id = md.movie_id
WHERE m.name="Fight Club";
SELECT COUNT(*)
FROM movies m
JOIN movies_directors md ON md.movie_id = m.id
JOIN directors d ON md.director_id = d.id
WHERE d.first_name = "Clint"
AND d.last_name = "Eastwood";
SELECT m.name
FROM movies m
JOIN movies_directors md ON md.movie_id = m.id
JOIN directors d ON md.director_id = d.id
WHERE d.first_name = "Clint"
AND d.last_name = "Eastwood";
SELECT DISTINCT d.first_name, d.last_name
FROM directors d
JOIN movies_directors md ON md.director_id = d.id
JOIN movies_genres mg ON mg.movie_id = md.movie_id
WHERE mg.genre = "Horror";
SELECT DISTINCT a.first_name, a.last_name
FROM actors a
JOIN roles r ON a.id = r.actor_id
JOIN movies m ON m.id = r.movie_id
JOIN movies_directors md ON md.movie_id = m.id
JOIN directors d ON md.director_id = d.id
WHERE d.first_name = "Christopher"
AND d.last_name = "Nolan";
We do not cover JOINS in depth, but for more information you can look here