SQL Oppimiskeskus

Kehitä SQL taitojasi selkeästi ja tehokkaasti

Opi SQL:n perusteet sekä edistyneet tekniikat, PostgreSQL:n käyttö ja ymmärrä ero relaatio- ja dokumenttitietokantojen välillä. Tutustu myös moderneihin ORM-kirjastoihin kuten Prismaan. Kattavia käytännönläheisiä esimerkkejä ja selkeitä selityksiä opiskelijoille, opettajille ja kehittäjille.

Opi SQL nopeasti ja tehokkaasti

Kattava opas SQL-tietokantoihin

SQL Perusteet

Opi SQL:n peruskäsitteet, taulut, sarakkeet ja tietojen rakenne. Ymmärrä miten relaatiotietokannat toimivat.

SQL Kyselyt

Opettele SELECT, WHERE, JOIN, GROUP BY ja muut keskeiset SQL-komennot tehokkaaseen tiedonhakuun.

PostgreSQL

Tutustu PostgreSQL:ään - suosittuun avoimen lähdekoodin relaatiotietokantaan ja sen erikoisominaisuuksiin.

MongoDB vs SQL

Ymmärrä erot relaatiotietokantojen (SQL) ja dokumenttitietokantojen (MongoDB) välillä.

Tietojen hallinta

Opi lisäämään, muokkaamaan ja poistamaan tietoja INSERT, UPDATE ja DELETE komennoilla.

Prisma & ORM

Tutustu Prismaan ja ORM-kirjastoihin - miten JavaScript/TypeScript kääntää koodin SQL-komennoiksi.

Käytännön esimerkit

Konkreettisia esimerkkejä SQL:n käytöstä reaalimaailman sovelluksissa ja projekteissa.

Perusteet

Mikä on SQL?

SQL (Structured Query Language) on standardoitu ohjelmointikieli, joka on suunniteltu relaatiotietokantojen hallintaan ja käsittelyyn. SQL:llä voit:

Hakea tietoja

Käytä SELECT-lauseita etsiäksesi ja suodattaaksesi tietoja tietokannoista.

Muokata tietoja

INSERT, UPDATE ja DELETE komennoilla lisäät, päivität ja poistat tietoja.

Luoda rakenteita

CREATE TABLE ja ALTER TABLE komennoilla luot ja muokkaat tietokantarakenteita.

Yhdistää tauluja

JOIN-operaatioilla yhdistät useita tauluja komplekseihin kyselyihin.

Kyselyt

SQL Kyselyt

SQL-kyselyt ovat tietokannan sydän. Niillä haet, suodatat ja järjestelet tietoja tehokkaasti.

SELECT

Peruskysely tietojen hakemiseen:

sql — query
SELECT name, email FROM users;

WHERE

Suodata tuloksia ehtojen perusteella:

sql — query
SELECT * FROM users
WHERE age > 18;

JOIN

Yhdistä useita tauluja:

sql — query
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id;

GROUP BY

Ryhmittele ja laske:

sql — query
SELECT city, COUNT(*)
FROM users
GROUP BY city;
Hallinta

Tietojen hallinta

SQL:llä voit paitsi hakea tietoja, myös lisätä, muokata ja poistaa niitä turvallisesti.

INSERT - Tietojen lisääminen

sql — insert
-- Lisää uusi käyttäjä
INSERT INTO users (name, email, age)
VALUES ('Matti Meikäläinen', 'matti@example.com', 25);

UPDATE - Tietojen muokkaaminen

sql — update
-- Päivitä käyttäjän sähköposti
UPDATE users
SET email = 'uusi.sahkoposti@example.com'
WHERE id = 1;

DELETE - Tietojen poistaminen

sql — delete
-- Poista inaktiiviset käyttäjät
DELETE FROM users
WHERE last_login < '2023-01-01';

Turvallisuusvinkkejä:

  • Käytä aina WHERE-ehtoja UPDATE ja DELETE komennoissa
  • Tee varmuuskopio ennen suuria muutoksia
  • Testaa kyselyt ensin pienellä datajoukolla
  • Käytä transaktioita kriittisissä operaatioissa
Tietokanta

PostgreSQL

PostgreSQL on tehokas, avoimen lähdekoodin relaatiotietokantajärjestelmä, joka noudattaa SQL-standardia mutta tarjoaa lukuisia laajennuksia ja parannuksia.

PostgreSQL vs SQL-standardi

SQL-standardi (ANSI SQL)

SQL-standardi määrittelee peruskyselykielen:

  • SELECT, INSERT, UPDATE, DELETE
  • Perusdatatyypit (VARCHAR, INTEGER, DATE)
  • JOIN-operaatiot
  • Perustriggerit ja stored proceduret
  • Perusindeksit
Standardin noudattaminen:

Kaikki suuret tietokantajärjestelmät (MySQL, PostgreSQL, SQL Server, Oracle) noudattavat SQL-standardia, mutta lisäävät omia laajennuksiaan.

PostgreSQL:n laajennukset

PostgreSQL lisää standardin päälle:

  • Kehittyneet datatyypit: JSON, JSONB, Arrays, UUID
  • Window functions: ROW_NUMBER(), RANK(), LAG()
  • CTEs (Common Table Expressions): WITH-lauseet
  • Inheritance: Taulut voivat periä toisista tauluista
  • Extensions: PostGIS (paikkatiedot), pg_trgm
  • Full-text search: Sisäänrakennettu tekstihaku
PostgreSQL vs MySQL:

PostgreSQL tukee paremmin JSON-dataa, window functions ja monimutkaisia kyselyitä kuin MySQL.

Käytännön esimerkit

Standardi SQL-kysely

Toimii kaikissa SQL-tietokannoissa:
sql — standard
SELECT name, email, age
FROM users
WHERE age > 25
ORDER BY name;

PostgreSQL-erityisominaisuus

JSON-datan käsittely (PostgreSQL only):
sql — postgresql
SELECT name,
  profile->>'city' as city,
  profile->'preferences' as prefs
FROM users
WHERE profile->>'age' > '25';

Miksi valita PostgreSQL?

Yrityskäyttö

  • Instagram (pääasiallinen tietokanta)
  • Spotify (käyttäjädata)
  • Uber (geolocation-data)
  • Reddit (kommentit ja postaukset)

Tekninen etu

  • Parempi suorituskyky
  • Monipuolisemmat datatyypit
  • Kehittyneemmät indeksit
  • Parempi concurrency

Käyttötapaukset

  • Web-sovellukset (JSON-data)
  • Analytiikka ja BI
  • Geospatial-sovellukset
  • E-commerce alustat
Vertailu

MongoDB vs SQL

SQL (Relaatiotietokannat)

  • Rakenne: Taulut, rivit, sarakkeet
  • Schema: Ennalta määritelty, jäykkä
  • Kyselykieli: SQL
  • ACID: Täysi tuki
  • Skaaalautuvuus: Vertikaalinen (scale-up)
  • Esimerkit: PostgreSQL, MySQL, SQLite

Esimerkki kysely:

SELECT u.name, u.email, p.title
FROM users u
JOIN posts p ON u.id = p.user_id
WHERE u.age > 25;

MongoDB (Dokumenttitietokanta)

  • Rakenne: Collections, dokumentit (JSON/BSON)
  • Schema: Joustava, dynaaminen
  • Kyselykieli: MongoDB Query Language
  • ACID: Osittainen tuki (v4.0+)
  • Skaaalautuvuus: Horisontaalinen (scale-out)
  • Esimerkit: MongoDB, CouchDB, Amazon DocumentDB

Esimerkki kysely:

db.users.aggregate([
{ $match: { age: { $gt: 25 } } },
{ $lookup: {
from: "posts",
localField: "_id",
foreignField: "userId",
as: "posts"
} }
]);

Milloin käyttää kumpaakin?

SQL soveltuu parhaiten:

  • Pankkisovellukset: Transaktiot, ACID-vaatimukset
  • ERP-järjestelmät: Rakenteelliset liiketoimintatiedot
  • Verkkokaupat: Tilaukset, asiakastiedot, varastot
  • CRM-järjestelmät: Asiakashallinta
  • Raportointijärjestelmät: Analytiikka, BI
  • Kirjanpitosovellukset: Tarkka tietojen eheys
Esimerkkiyritykset: PayPal, Uber (maksudata), Netflix (käyttäjätiedot)

MongoDB soveltuu parhaiten:

  • Sosiaalisen median alustat: Dynaamiset sisällöt
  • IoT-sovellukset: Vaihtelevan muotoiset sensoridatat
  • Sisällönhallintajärjestelmät: Joustavat rakenteet
  • Real-time analytiikka: Suuret datamäärät
  • Prototyypit: Nopea kehitys
  • Katalogisovellukset: Tuotteet eri ominaisuuksineen
Esimerkkiyritykset: Facebook (viestit), Adobe (sisältö), eBay (tuoteluettelot)

Suorituskyky

OminaisuusSQLMongoDB
LukutoiminnotOptimoitu kompleksisille kyselyilleNopea yksinkertaisissa hauissa
KirjoitustoiminnotACID-rajoitteet hidastavatNopeampi, vähemmän tarkistuksia
JOIN-operaatiotOptimoitu, nopeaLookup-operaatiot hitaampia
IndeksointiKypsä teknologiaJoustava, mutta monimutkaista
SkaaalautuvuusMaster-slave, rajoitettuAutomaattinen sharding

Kumpi valita projektiin?

Valitse SQL jos:
  • • Tarvitset ACID-ominaisuuksia
  • • Data on rakenteellista
  • • Kompleksiset kyselyt
  • • Taloudellinen sovellus
Valitse MongoDB jos:
  • • Joustava data-malli
  • • Nopea prototyyppien kehitys
  • • Horisontaalinen skaalaus
  • • JSON/dokumenttidata
Voit käyttää molempia:
  • • Hybridiarkkitehtuuri
  • • SQL analytiikkaan
  • • MongoDB real-time dataan
  • • Mikropalveluarkkitehtuuri
Turvallisuus

Turvallisuusnäkökulma

SQL Injection

SQL-tietokantojen suurin turvallisuusriski:

Vaarallinen koodi:
vulnerable — injection
query = "SELECT * FROM users WHERE name = '" + userInput + "'"
// Jos userInput = "'; DROP TABLE users; --"
// Koko taulu voi tuhoutua!
Turvallinen ratkaisu:
secure — prepared
// Prepared statements
PreparedStatement ps = connection.prepareStatement(
  "SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);

NoSQL Injection

MongoDB:n turvallisuushaasteet:

Vaarallinen koodi:
vulnerable — nosql
// JavaScript injection
db.users.find({ $where: userInput });
// Jos userInput sisältää haitallista JS-koodia
Turvallinen ratkaisu:
secure — nosql
// Validoi syötteet, käytä whitelist
db.users.find({ name: sanitizedInput });
// Vältä $where operaattoria

Yleisiä turvallisuuskäytäntöjä:

  • Validoi kaikki käyttäjäsyötteet
  • Käytä pienimmän oikeuden periaatetta
  • Salaa tiedot tallennettuna ja siirron aikana
  • Säännölliset tietoturvaauditit
  • Rajoita tietokantayhteydet
  • Päivitä järjestelmät säännöllisesti
  • Monivaiheinen autentikointi
  • Lokita ja monitoroi aktiivisuutta
ORM

Prisma & ORM - JavaScript/TypeScript ↔ SQL

ORM (Object-Relational Mapping) on tapa yhdistää ohjelmointikielten objektit tietokantakyselyihin. Prisma on moderni TypeScript/JavaScript ORM, joka kääntää koodisi SQL-komennoiksi automaattisesti.

Ennen: Perinteinen SQL

traditional — javascript
// Perinteinen tapa: käsin kirjoitettu SQL
const query = 'SELECT * FROM users WHERE age > ?';
const results = await db.query(query, [18]);
// Ei type-safety, virhealtis

Ongelmat: SQL-virheet huomataan vasta runtime-aikana, ei type-safety tai IntelliSense-tukea.

Jälkeen: Prisma ORM

prisma — typescript
// Prisma: type-safe, IntelliSense
const adults = await prisma.user.findMany({
  where: { age: { gt: 18 } }
});
// Täysi type-safety ✅

Etu: Compile-time tarkistus, automaattinen IntelliSense, type-safety.

Kuinka Prisma toimii?

1. Schema

Kirjoita Prisma schemassa datamalli

2. Generate

Prisma generoi TypeScript-tyypit ja clientin

3. SQL käännös

Runtime: Prisma kääntää metodikutsut optimoiduiksi SQL-kyselyiksi

Prisma tukee: PostgreSQL, MySQL, SQLite, SQL Server, MongoDB

Esimerkit

Käytännön SQL-esimerkit

1. Perushaku

sql — query
-- Hae kaikki käyttäjät jotka ovat yli 18-vuotiaita
SELECT name, email, age 
FROM users 
WHERE age > 18 
ORDER BY name;

2. Taulujen yhdistäminen

sql — join
-- Hae käyttäjät ja heidän tilauksensa
SELECT u.name, u.email, o.order_date, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.order_date > '2024-01-01';

3. Ryhmittely ja laskenta

sql — aggregate
-- Laske tilausten määrä ja kokonaissumma asiakkaittain
SELECT u.name, 
       COUNT(o.id) as order_count,
       SUM(o.total) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 0;

SQL Oppimiskeskus

Ilmainen opetusresurssi SQL:n, PostgreSQL:n ja tietokantojen oppimiseen. Suunniteltu opiskelijoille ja opettajille.

Kaikki esimerkit ja oppimateriaali on tarkoitettu opetuskäyttöön. Sisältö on avointa ja vapaasti käytettävissä.

(Tämä sivusto voi sisältää virheitä - tarkista aina tiedot virallisista lähteistä)

`