From d6b99cc0d171fb1581b9ad643f7c8c62bf063671 Mon Sep 17 00:00:00 2001 From: Sai-Nandan-Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Fri, 26 May 2023 22:29:40 +0530 Subject: [PATCH 1/8] Update 7.sql No hardcoding the ids. --- solutions/7.sql | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/solutions/7.sql b/solutions/7.sql index 64a4164..101a839 100644 --- a/solutions/7.sql +++ b/solutions/7.sql @@ -3,6 +3,18 @@ SELECT * FROM albums where release_year IS NULL; */ +/* UPDATE albums SET release_year = 1986 -WHERE id = 4; \ No newline at end of file +WHERE id = 4; +*/ + +/* +The above solution doesn't seem practical +if you have many different ids whose release_year IS NULL +*/ + +UPDATE albums, + (SELECT id FROM albums WHERE release_year IS NULL) AS not_yet_released +SET albums.release_year = 1986 +WHERE albums.id = not_yet_released.id; From ca24e4419a5a9604b406da6b49c9a2096fa844e8 Mon Sep 17 00:00:00 2001 From: Sai-Nandan-Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Fri, 26 May 2023 22:40:44 +0530 Subject: [PATCH 2/8] Update 5.sql Using non-aggregate columns in SELECT with the default modes in MySQL Workbench. --- solutions/5.sql | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/solutions/5.sql b/solutions/5.sql index 6a5ebff..8f2cba4 100644 --- a/solutions/5.sql +++ b/solutions/5.sql @@ -1,5 +1,21 @@ +/* SELECT bands.name AS 'Band Name' FROM bands LEFT JOIN albums ON bands.id = albums.band_id GROUP BY albums.band_id -HAVING COUNT(albums.id) = 0; \ No newline at end of file +HAVING COUNT(albums.id) = 0; +*/ + +/* +The given solution throws an error: +Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'record_company.bands.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by +*/ +SELECT bands.name AS 'Band Name' +FROM bands +INNER JOIN ( + SELECT bands.id as id + FROM bands + LEFT JOIN albums ON bands.id = albums.band_id + WHERE albums.band_id IS NULL +) AS bands_with_no_albums +ON bands.id = bands_with_no_albums.id; From 96c4b64af0a11d15787de908bb17afb59515feaa Mon Sep 17 00:00:00 2001 From: Sai-Nandan-Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Fri, 26 May 2023 23:49:23 +0530 Subject: [PATCH 3/8] Update 9.sql --- solutions/9.sql | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/solutions/9.sql b/solutions/9.sql index b2f041e..d3dea6b 100644 --- a/solutions/9.sql +++ b/solutions/9.sql @@ -4,6 +4,7 @@ ORDER BY id DESC LIMIT 1; */ +/* DELETE FROM albums WHERE id = 19; @@ -14,4 +15,22 @@ WHERE id = 19; */ DELETE FROM bands -WHERE id = 8; \ No newline at end of file +WHERE id = 8; +*/ + +/* +No harcoding the id +*/ +DELETE FROM albums +WHERE albums.band_id +IN (SELECT id FROM bands WHERE name = 'SSSPSN'); + +SELECT * FROM albums; + +/* +Note the apparently redundant but necessary use of the SELECT * subquery +*/ +DELETE FROM bands +WHERE id IN (SELECT * FROM (SELECT id FROM bands WHERE name = 'SSSPSN') AS to_delete); + +SELECT * FROM bands; From 683c92ca0a68bc420187f3b9e4416a3230357a4a Mon Sep 17 00:00:00 2001 From: Sai-Nandan-Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Fri, 26 May 2023 23:49:51 +0530 Subject: [PATCH 4/8] Update 9.sql --- solutions/9.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/solutions/9.sql b/solutions/9.sql index d3dea6b..135d959 100644 --- a/solutions/9.sql +++ b/solutions/9.sql @@ -7,6 +7,7 @@ /* DELETE FROM albums WHERE id = 19; +*/ /* This is the query used to get the band id of the band added in #8 */ /* @@ -14,6 +15,7 @@ WHERE id = 19; ORDER BY id DESC LIMIT 1; */ +/* DELETE FROM bands WHERE id = 8; */ From e2ebd160f2033b06e0a0c5625fb98a3b65d2df7d Mon Sep 17 00:00:00 2001 From: Sai-Nandan-Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Sat, 27 May 2023 00:27:46 +0530 Subject: [PATCH 5/8] Update 12.sql --- solutions/12.sql | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/solutions/12.sql b/solutions/12.sql index 8beb83b..3a70d93 100644 --- a/solutions/12.sql +++ b/solutions/12.sql @@ -1,7 +1,24 @@ +/* SELECT bands.name AS 'Band', COUNT(songs.id) AS 'Number of Songs' FROM bands JOIN albums ON bands.id = albums.band_id JOIN songs ON albums.id = songs.album_id -GROUP BY albums.band_id; \ No newline at end of file +GROUP BY albums.band_id; +*/ + +SELECT bands.name AS 'Band', songs_per_band AS 'Number of Songs' +FROM bands +INNER JOIN ( + SELECT band_id, sum(albums_songs.songs_per_album) AS songs_per_band + FROM albums + INNER JOIN ( + SELECT album_id, count(album_id) AS songs_per_album + FROM songs + GROUP BY album_id + ) AS albums_songs + ON albums.id = albums_songs.album_id + GROUP BY band_id +) AS bands_songs +ON bands.id = bands_songs.band_id; From 530f71b6f49a2fb2e213750641390e04f6a8262a Mon Sep 17 00:00:00 2001 From: Sai-Nandan-Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Sat, 27 May 2023 00:28:58 +0530 Subject: [PATCH 6/8] Update 11.sql --- solutions/11.sql | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/solutions/11.sql b/solutions/11.sql index 3c32272..b8ab0cc 100644 --- a/solutions/11.sql +++ b/solutions/11.sql @@ -1,7 +1,17 @@ +/* SELECT albums.name AS 'Album', albums.release_year AS 'Release Year', MAX(songs.length) AS 'Duration' FROM albums JOIN songs ON albums.id = songs.album_id -GROUP BY songs.album_id; \ No newline at end of file +GROUP BY songs.album_id; +*/ + +SELECT albums.name AS 'Name', albums.release_year AS 'Release Year', longest_songs.duration AS 'Duration' +FROM albums +INNER JOIN ( + SELECT album_id, max(length) AS duration FROM songs + GROUP BY album_id +) AS longest_songs +ON albums.id = longest_songs.album_id; From a4ea375bf6e5cb642828e4bdc24ea4356f61fe51 Mon Sep 17 00:00:00 2001 From: Sai Nandan Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Wed, 14 Jun 2023 15:25:55 +0530 Subject: [PATCH 7/8] Delete solutions directory --- solutions/1.sql | 8 -------- solutions/10.sql | 2 -- solutions/11.sql | 17 ----------------- solutions/12.sql | 24 ------------------------ solutions/2.sql | 2 -- solutions/3.sql | 4 ---- solutions/4.sql | 14 -------------- solutions/5.sql | 21 --------------------- solutions/6.sql | 9 --------- solutions/7.sql | 20 -------------------- solutions/8.sql | 11 ----------- solutions/9.sql | 38 -------------------------------------- 12 files changed, 170 deletions(-) delete mode 100644 solutions/1.sql delete mode 100644 solutions/10.sql delete mode 100644 solutions/11.sql delete mode 100644 solutions/12.sql delete mode 100644 solutions/2.sql delete mode 100644 solutions/3.sql delete mode 100644 solutions/4.sql delete mode 100644 solutions/5.sql delete mode 100644 solutions/6.sql delete mode 100644 solutions/7.sql delete mode 100644 solutions/8.sql delete mode 100644 solutions/9.sql diff --git a/solutions/1.sql b/solutions/1.sql deleted file mode 100644 index c599583..0000000 --- a/solutions/1.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE songs ( - id INT NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - length FLOAT NOT NULL, - album_id INT NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (album_id) REFERENCES albums(id) -); \ No newline at end of file diff --git a/solutions/10.sql b/solutions/10.sql deleted file mode 100644 index a6fb165..0000000 --- a/solutions/10.sql +++ /dev/null @@ -1,2 +0,0 @@ -SELECT AVG(length) as 'Average Song Duration' -FROM songs; \ No newline at end of file diff --git a/solutions/11.sql b/solutions/11.sql deleted file mode 100644 index b8ab0cc..0000000 --- a/solutions/11.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* -SELECT - albums.name AS 'Album', - albums.release_year AS 'Release Year', - MAX(songs.length) AS 'Duration' -FROM albums -JOIN songs ON albums.id = songs.album_id -GROUP BY songs.album_id; -*/ - -SELECT albums.name AS 'Name', albums.release_year AS 'Release Year', longest_songs.duration AS 'Duration' -FROM albums -INNER JOIN ( - SELECT album_id, max(length) AS duration FROM songs - GROUP BY album_id -) AS longest_songs -ON albums.id = longest_songs.album_id; diff --git a/solutions/12.sql b/solutions/12.sql deleted file mode 100644 index 3a70d93..0000000 --- a/solutions/12.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* -SELECT - bands.name AS 'Band', - COUNT(songs.id) AS 'Number of Songs' -FROM bands -JOIN albums ON bands.id = albums.band_id -JOIN songs ON albums.id = songs.album_id -GROUP BY albums.band_id; -*/ - -SELECT bands.name AS 'Band', songs_per_band AS 'Number of Songs' -FROM bands -INNER JOIN ( - SELECT band_id, sum(albums_songs.songs_per_album) AS songs_per_band - FROM albums - INNER JOIN ( - SELECT album_id, count(album_id) AS songs_per_album - FROM songs - GROUP BY album_id - ) AS albums_songs - ON albums.id = albums_songs.album_id - GROUP BY band_id -) AS bands_songs -ON bands.id = bands_songs.band_id; diff --git a/solutions/2.sql b/solutions/2.sql deleted file mode 100644 index f7d1977..0000000 --- a/solutions/2.sql +++ /dev/null @@ -1,2 +0,0 @@ -SELECT bands.name AS 'Band Name' -FROM bands; \ No newline at end of file diff --git a/solutions/3.sql b/solutions/3.sql deleted file mode 100644 index 36500fb..0000000 --- a/solutions/3.sql +++ /dev/null @@ -1,4 +0,0 @@ -SELECT * FROM albums -WHERE release_year IS NOT NULL -ORDER BY release_year -LIMIT 1; \ No newline at end of file diff --git a/solutions/4.sql b/solutions/4.sql deleted file mode 100644 index 8df1baf..0000000 --- a/solutions/4.sql +++ /dev/null @@ -1,14 +0,0 @@ - -/* This assummes all bands have a unique name */ -SELECT DISTINCT bands.name AS 'Band Name' -FROM bands -JOIN albums ON bands.id = albums.band_id; - -/* If bands do not have a unique name then use this query */ -/* - SELECT bands.name AS 'Band Name' - FROM bands - JOIN albums ON bands.id = albums.band_id - GROUP BY albums.band_id - HAVING COUNT(albums.id) > 0; -*/ \ No newline at end of file diff --git a/solutions/5.sql b/solutions/5.sql deleted file mode 100644 index 8f2cba4..0000000 --- a/solutions/5.sql +++ /dev/null @@ -1,21 +0,0 @@ -/* -SELECT bands.name AS 'Band Name' -FROM bands -LEFT JOIN albums ON bands.id = albums.band_id -GROUP BY albums.band_id -HAVING COUNT(albums.id) = 0; -*/ - -/* -The given solution throws an error: -Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'record_company.bands.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by -*/ -SELECT bands.name AS 'Band Name' -FROM bands -INNER JOIN ( - SELECT bands.id as id - FROM bands - LEFT JOIN albums ON bands.id = albums.band_id - WHERE albums.band_id IS NULL -) AS bands_with_no_albums -ON bands.id = bands_with_no_albums.id; diff --git a/solutions/6.sql b/solutions/6.sql deleted file mode 100644 index aebd9dc..0000000 --- a/solutions/6.sql +++ /dev/null @@ -1,9 +0,0 @@ -SELECT - albums.name as Name, - albums.release_year as 'Release Year', - SUM(songs.length) as 'Duration' -FROM albums -JOIN songs on albums.id = songs.album_id -GROUP BY songs.album_id -ORDER BY Duration DESC -LIMIT 1; \ No newline at end of file diff --git a/solutions/7.sql b/solutions/7.sql deleted file mode 100644 index 101a839..0000000 --- a/solutions/7.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* This is the query used to get the id */ -/* - SELECT * FROM albums where release_year IS NULL; -*/ - -/* -UPDATE albums -SET release_year = 1986 -WHERE id = 4; -*/ - -/* -The above solution doesn't seem practical -if you have many different ids whose release_year IS NULL -*/ - -UPDATE albums, - (SELECT id FROM albums WHERE release_year IS NULL) AS not_yet_released -SET albums.release_year = 1986 -WHERE albums.id = not_yet_released.id; diff --git a/solutions/8.sql b/solutions/8.sql deleted file mode 100644 index 8ed5185..0000000 --- a/solutions/8.sql +++ /dev/null @@ -1,11 +0,0 @@ -INSERT INTO bands (name) -VALUES ('Favorite Band Name'); - -/* This is the query used to get the band id of the band just added */ -/* - SELECT id FROM bands - ORDER BY id DESC LIMIT 1; -*/ - -INSERT INTO albums (name, release_year, band_id) -VALUES ('Favorite Album Name', 2000, 8); \ No newline at end of file diff --git a/solutions/9.sql b/solutions/9.sql deleted file mode 100644 index 135d959..0000000 --- a/solutions/9.sql +++ /dev/null @@ -1,38 +0,0 @@ -/* This is the query used to get the album id of the album added in #8 */ -/* - SELECT id FROM albums - ORDER BY id DESC LIMIT 1; -*/ - -/* -DELETE FROM albums -WHERE id = 19; -*/ - -/* This is the query used to get the band id of the band added in #8 */ -/* - SELECT id FROM bands - ORDER BY id DESC LIMIT 1; -*/ - -/* -DELETE FROM bands -WHERE id = 8; -*/ - -/* -No harcoding the id -*/ -DELETE FROM albums -WHERE albums.band_id -IN (SELECT id FROM bands WHERE name = 'SSSPSN'); - -SELECT * FROM albums; - -/* -Note the apparently redundant but necessary use of the SELECT * subquery -*/ -DELETE FROM bands -WHERE id IN (SELECT * FROM (SELECT id FROM bands WHERE name = 'SSSPSN') AS to_delete); - -SELECT * FROM bands; From ed136919234f52125f5c4d3c5d7c1f830460b16a Mon Sep 17 00:00:00 2001 From: Sai Nandan Desetti <80631906+Sai-Nandan-Desetti@users.noreply.github.com> Date: Wed, 14 Jun 2023 15:27:33 +0530 Subject: [PATCH 8/8] my solutions --- solutions/1.sql | 9 +++++++++ solutions/10.sql | 2 ++ solutions/11.sql | 7 +++++++ solutions/12.sql | 14 ++++++++++++++ solutions/2.sql | 2 ++ solutions/3.sql | 14 ++++++++++++++ solutions/4.sql | 21 +++++++++++++++++++++ solutions/5.sql | 29 +++++++++++++++++++++++++++++ solutions/6.sql | 9 +++++++++ solutions/7.sql | 4 ++++ solutions/8.sql | 9 +++++++++ solutions/9.sql | 11 +++++++++++ 12 files changed, 131 insertions(+) create mode 100644 solutions/1.sql create mode 100644 solutions/10.sql create mode 100644 solutions/11.sql create mode 100644 solutions/12.sql create mode 100644 solutions/2.sql create mode 100644 solutions/3.sql create mode 100644 solutions/4.sql create mode 100644 solutions/5.sql create mode 100644 solutions/6.sql create mode 100644 solutions/7.sql create mode 100644 solutions/8.sql create mode 100644 solutions/9.sql diff --git a/solutions/1.sql b/solutions/1.sql new file mode 100644 index 0000000..e4caa53 --- /dev/null +++ b/solutions/1.sql @@ -0,0 +1,9 @@ +CREATE TABLE songs +( +id int NOT NULL AUTO_INCREMENT, +name varchar(255) NOT NULL, +length float NOT NULL, +album_id int NOT NULL, +PRIMARY KEY(id), +FOREIGN KEY(album_id) REFERENCES albums(id) +); \ No newline at end of file diff --git a/solutions/10.sql b/solutions/10.sql new file mode 100644 index 0000000..f9eaa72 --- /dev/null +++ b/solutions/10.sql @@ -0,0 +1,2 @@ +SELECT avg(length) AS 'Average Song Duration' +FROM songs; \ No newline at end of file diff --git a/solutions/11.sql b/solutions/11.sql new file mode 100644 index 0000000..47d13f3 --- /dev/null +++ b/solutions/11.sql @@ -0,0 +1,7 @@ +SELECT albums.name AS 'Name', albums.release_year AS 'Release Year', longest_songs.duration AS 'Duration' +FROM albums +INNER JOIN ( + SELECT album_id, max(length) AS duration FROM songs + GROUP BY album_id +) AS longest_songs +ON albums.id = longest_songs.album_id; \ No newline at end of file diff --git a/solutions/12.sql b/solutions/12.sql new file mode 100644 index 0000000..20997fd --- /dev/null +++ b/solutions/12.sql @@ -0,0 +1,14 @@ +SELECT bands.name AS 'Band', songs_per_band AS 'Number of Songs' +FROM bands +INNER JOIN ( + SELECT band_id, sum(albums_songs.songs_per_album) AS songs_per_band + FROM albums + INNER JOIN ( + SELECT album_id, count(album_id) AS songs_per_album + FROM songs + GROUP BY album_id + ) AS albums_songs + ON albums.id = albums_songs.album_id + GROUP BY band_id +) AS bands_songs +ON bands.id = bands_songs.band_id; \ No newline at end of file diff --git a/solutions/2.sql b/solutions/2.sql new file mode 100644 index 0000000..771c6ad --- /dev/null +++ b/solutions/2.sql @@ -0,0 +1,2 @@ +SELECT name AS 'Band Name' +FROM bands; \ No newline at end of file diff --git a/solutions/3.sql b/solutions/3.sql new file mode 100644 index 0000000..ecf07bd --- /dev/null +++ b/solutions/3.sql @@ -0,0 +1,14 @@ +# My solution +SELECT albums.* +FROM albums +INNER JOIN +(SELECT min(release_year) AS release_year FROM albums) AS oldest_album +ON albums.release_year = oldest_album.release_year; + + +# Given solution +SELECT * +FROM albums +WHERE release_year IS NOT NULL +ORDER BY release_year +LIMIT 1; \ No newline at end of file diff --git a/solutions/4.sql b/solutions/4.sql new file mode 100644 index 0000000..9f220d6 --- /dev/null +++ b/solutions/4.sql @@ -0,0 +1,21 @@ +# Solution 1 +/* Assumes that bands with different ids have different names. */ +SELECT DISTINCT(b.name) AS 'Band Name' +FROM albums AS a +INNER JOIN (bands AS b) ON a.band_id = b.id; + + +/* The following two solutions don't assume that. */ + +# Solution 2 +SELECT name AS 'Band Name' +FROM bands +INNER JOIN (SELECT DISTINCT(band_id) AS album_band_id FROM albums) AS bands_with_albums +ON bands_with_albums.album_band_id = bands.id; + + +# Solution 3 +SELECT name AS 'Band Name' +FROM bands +INNER JOIN (SELECT band_id FROM albums GROUP BY band_id) AS bands_with_albums +ON bands_with_albums.band_id = bands.id; diff --git a/solutions/5.sql b/solutions/5.sql new file mode 100644 index 0000000..fd1afe0 --- /dev/null +++ b/solutions/5.sql @@ -0,0 +1,29 @@ +# Solution 1 +/* Assumes band names are unique */ +SELECT DISTINCT(bands.name) AS 'Band Name' +FROM bands +LEFT JOIN albums ON bands.id = albums.band_id +WHERE albums.band_id IS NULL; + + +/* No such assumption */ +# Solution 2 +SELECT bands.name AS 'Band Name' +FROM bands +INNER JOIN ( + SELECT bands.id as id + FROM bands + LEFT JOIN albums ON bands.id = albums.band_id + WHERE albums.band_id IS NULL +) AS bands_with_no_albums +ON bands.id = bands_with_no_albums.id; + + +/* +Note: +There's an issue with the given solution: https://github.com/WebDevSimplified/Learn-SQL/issues/8 +The fellow who closed it must have changed the mode of SQL to something else. +But it's been suggested to use full_group_by mode for SQL to avoid "inconsistencies". +(Basically, find a different way to solve your problem + without using columns in SELECT that were not included in your GROUP BY.) +*/ \ No newline at end of file diff --git a/solutions/6.sql b/solutions/6.sql new file mode 100644 index 0000000..6466d3b --- /dev/null +++ b/solutions/6.sql @@ -0,0 +1,9 @@ +SELECT albums.name AS 'Name', albums.release_year AS 'Release Year', longest_album.Duration +FROM ( + SELECT album_id, sum(length) AS 'Duration' + FROM songs + GROUP BY album_id + ORDER BY Duration DESC + LIMIT 1 +) AS longest_album +INNER JOIN albums ON longest_album.album_id = albums.id; \ No newline at end of file diff --git a/solutions/7.sql b/solutions/7.sql new file mode 100644 index 0000000..e7a49c0 --- /dev/null +++ b/solutions/7.sql @@ -0,0 +1,4 @@ +UPDATE albums, + (SELECT id FROM albums WHERE release_year IS NULL) AS not_yet_released +SET albums.release_year = 1986 +WHERE albums.id = not_yet_released.id; \ No newline at end of file diff --git a/solutions/8.sql b/solutions/8.sql new file mode 100644 index 0000000..4ce9727 --- /dev/null +++ b/solutions/8.sql @@ -0,0 +1,9 @@ +INSERT INTO bands(name) +VALUES ('SSSPSN'); + +SELECT * FROM bands; + +INSERT INTO albums(name, release_year, band_id) +VALUES ('Bhajans', 2009, 8); + +SELECT * FROM albums; \ No newline at end of file diff --git a/solutions/9.sql b/solutions/9.sql new file mode 100644 index 0000000..e082a70 --- /dev/null +++ b/solutions/9.sql @@ -0,0 +1,11 @@ +DELETE FROM albums +WHERE albums.band_id +IN (SELECT id FROM bands WHERE name = 'SSSPSN'); + +SELECT * FROM albums; + + +DELETE FROM bands +WHERE id IN (SELECT * FROM (SELECT id FROM bands WHERE name = 'SSSPSN') AS to_delete); + +SELECT * FROM bands; \ No newline at end of file