Grunder och Övning i MySQL: Kom igång med att skapa tabeller och relationer – nu med lösningsförslag

Skapa en databas med tabeller – Övning del 1

Vi skapar en databas, den kan få heta: people. Använd UTF-8 för databasen (med UTF-8 general CI collation)

Se till att det finns 20 människor i customers-tabell (med email som primärnyckeln, samt övriga fält first_name, last_name, gender birth_date).

Se till att det finns 15 adresser i en adresses-tabell (också med email som primärnyckel, samt lite andra bra fält som street_name, street_number, zip_code,  city, country etc.)

I de flesta fall kan du använda VARCHAR som datatyp, utom för birth_date som ska vara av typen DATE.

Se även till att de 15 epost-adresser som finns i adresses-tabellen även finns med i customers-tabellen.

Läs data från tabellerna med SELECT – Övning del 2

Prova att skriva och köra SQL i ett Query-gränssnitt (finns i våra MySQL-GUI:n).

Några exempel:


SELECT * FROM customers; # Visar alla rader och alla kolumner i customers SELECT last_name, birth_date FROM customers; # Visar alla raders last_name och birth_date kolumner. SELECT * FROM customers WHERE birth_date > '1971-12-01'; # Visar de rader där birth_date är yngre än datumet. SELECT * FROM customers ORDER BY birth_date DESC; # Ordnar raderna yngst först. SELECT * FROM customers ORDER BY birth_date ASC LIMIT 1; # hämta rader med äldst birth_date

Öva: Skriv nu ett query som hämtar våra två yngsta customers!

Läs sammanslagen data från två tabeller med implicit JOIN – Övning del 3

(En implicit join är samma sak som en INNER join, trots annan syntax)


SELECT * FROM customers, adresses; # Faktiskt en join, slår ihop alla kolumner från bägge tabeller, rader * rader! Prova! 3 rader i varje tabell ger ett resultat på (3x3) 9 rader. Låt oss avgränsa det lite: SELECT * FROM customers, adresses WHERE customers.email = adresses.email; # ger oss alla rader där emailadressen stämmer mellan valda kolumner i bägge tabeller.

Öva: Skriv nu ett query som slår samman customers och adresses på den primära nyckeln (email) samt ordnar resultatet efter email i omvänd bokstavsordning

Normalisera adresserna och skapa en en-till-många (1-m) relation mellan customers och adresser – Övning del 4

  1. Avpersonifiera adresses genom att ta bort email-kolumnen och dess primary key. Lägg istället till en id-kolumn med AUTO_INCREMENT och ge den en ny primary key.

  2. I customers: Behåll email-kolumnen, men ta bort dess primary key. Lägg istället till en id-kolumn med AUTO_INCREMENT och ge den en ny primary key. Lägg också till en adress-kolumn med datatypen INT och 11 tecken + unsigned.

  3. Skapa en foreign key från customers.adress till adresses.id. Lägg in värden så varje customer får en adress, alltså i customers.adress ska finnas ett id som pekar på en existerande id i adresses.

  4. Skriv ett query som slår samman customers och adresses precis som tidigare, men joina dem denna gång på just customers.adress och addresses.id (istället för email).

Skapa en campaigns-tabell + en relationstabell och skapa många-till-många (m-m) relationer mellan customers och campaigns – Övning del 5

  1. campaigns ska ha kolumnerna id (INT 11, UNSIGNED, AUTO_INCREMENT, PRIMARY) och name (VARCHAR 255). Lägg in några kampanjer.

  2. customersXcampaigns ska ha kolumnerna customer (INT 11, UNSIGNED) och campaign (INT 11, UNSIGNED). Dessa ska vara foreign keys till customer.id samt campaign.id. Lägg till värden så att några customers har en eller ett par kampanjer och att minst en kampanj has av flera customers.

  3. OBS! Lite svårare uppgift: Skriv en implicit join som slår samman customers och campaigns med hjälp av customersXcampaigns.

Överkurs (en avancerad MySQL primer):

En mer avancerad grundkurs finns här nedan. Notera att detta är överkurs och inte ett krav:

https://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase

Lösningsförslag för övningarna ovan:

people.sql (Övning del 1-3)

people_slightly_normalised.sql (ERSÄTTER people.sql – Övning del 4)

campaigns.sql (Kompletterar ocanstående – Övning del 5)

0 votes