Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions task-1/queries.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,52 @@

-- **Question 1** — List the title and published year of every book in the `'Science Fiction'` genre, ordered by published year (oldest first).

SELECT title,published_year FROM books b
WHERE b.genre = "Science Fiction"
ORDER BY b.published_year ASC ;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. For better readability, add a space after a comma.
  2. If you have only one table, there can be no confusion as to which field belongs to which table. You therefore do not need to prefix the field names with the table name (or alias):
SELECT title, published_year FROM books
WHERE genre = "Science Fiction"
ORDER BY published_year ASC;


-- **Question 2** — Show every book published before 1950. Display the title and year only.

SELECT title,published_year FROM books b
WHERE b.published_year < 1950;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.


-- **Question 3** — Show every book in the database along with its author's full name. Combine `first_name` and `last_name` into a single column called `author`. _(Hint: you will need a JOIN.)_

SELECT b.title,a.first_name || ' ' || a.last_name AS author
FROM books b
JOIN authors a ON b.author_id = a.id;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, you indeed need to prefix the field name id with the table name because both tables have an id field. Strictly speaking, that is the only field that needs a prefix. But your version with table prefixes is preferred and more robust than the minimal version shown below. That version makes assumptions about the uniqueness of some fields, which may not hold in the future if more fields are added.

SELECT title, first_name || ' ' || last_name AS author
FROM books
JOIN authors a ON author_id = a.id;


-- **Question 4** — List all books written by Stephen King. Show the title and published year, ordered by year. _(Hint: JOIN the two tables and filter on the author's name.)_

SELECT b.title,b.published_year
FROM books b
JOIN authors a ON b.author_id = a.id
WHERE a.first_name = 'Stephen' AND a.last_name = 'King'
ORDER BY b.published_year;

-- **Question 5** — Add yourself as a new author. Use your real name, or make one up. Pick any nationality and birth year.

INSERT INTO authors (first_name, last_name, nationality, birth_year)
VALUES ('Hannah', 'Nyongo', 'Dutch', 1942);

-- **Question 6** — Add one book for the author you just inserted. It can be a real book or a made-up one.

INSERT INTO books (title, published_year, author_id)
VALUES ('The Joy of Life', 2002, 25);

-- **Question 7** — The genre for "The Dark Tower: The Gunslinger" was entered incorrectly as `'Fantasy'`. It should be `'Horror'`. Write an UPDATE to fix it, then verify the change with a SELECT.

UPDATE books
SET genre = 'Horror'
WHERE title = 'The Dark Tower: The Gunslinger';

SELECT * FROM books
WHERE genre = 'Horror';

-- **Question 8** — Delete the book you added in Question 6. Make sure your query targets only that specific row.

DELETE FROM books
WHERE title = 'The Joy of Life';
---

-- ### Bonus questions _(optional)_
Expand All @@ -24,4 +56,9 @@

-- **Bonus A** — How many books are there per genre? Show the genre name and the count, ordered from most to fewest books.

SELECT genre,
COUNT(*) AS total_books
FROM books
GROUP BY genre
ORDER BY total_books DESC;
-- **Bonus B** — Find any authors in the database who have no books at all. _(Hint: you will need a LEFT JOIN and check for NULL.)
Binary file added task-2/data/flashcards.db
Binary file not shown.
36 changes: 36 additions & 0 deletions task-2/migrate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import fs from "fs";
import Database from "better-sqlite3";

const data = JSON.parse(fs.readFileSync("data/data.json", "utf-8"));

const db = new Database("data/flashcards.db");

for (const deck of data.decks) {
db.prepare("INSERT INTO decks (id, name, description) VALUES (?, ?, ?)").run(
deck.id,
deck.name,
deck.description,
);

console.log(`Added deck: ${deck.name}`);
}

// loop through every card in the JSON file
for (const card of data.cards) {
const learned = card.learned ? 1 : 0;

db.prepare(
"INSERT INTO cards (id, question, answer, learned, deck_id) VALUES (?, ?, ?, ?, ?)",
).run(
card.id, // the card id
card.question, // the question
card.answer, // the answer
learned, // 1 or 0
card.deckId, // which deck it belongs to
);

// tell us what is happening
console.log(`Added card: ${card.question}`);
}

console.log("Migration done! All decks and cards are in the database.");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works fine.

Loading