Skip to content

Baza danych

anagorko edited this page Jan 5, 2017 · 19 revisions

Materiały wstępne: uczę się

Podstawowe komendy i instalacja MySQL

SQL

Logowanie do MySQL

mysql -ulogin -ppassword -h localhost --local-infile

Wybór bazy danych

USE biblioteka_podrecznikow;

Tworzenie tabel i import danych

DROP TABLE IF EXISTS studenci;
CREATE TABLE studenci (
  pesel BIGINT,
  nazwisko VARCHAR(100),
  imie VARCHAR(100)
);

LOAD DATA LOCAL INFILE 'studenci.txt' INTO TABLE studenci IGNORE 1 LINES;

Potrzebne typy danych:

  • VARCHAR(maksymalny rozmiar) - napis
  • INT, BIGINT - liczby całkowite (INT w zakresie do 2147483647, BIGINT w zakresie do 9223372036854775807)
  • DECIMAL(5,2) - ułamki dziesiętne o ustalonej dokładności (w tym przypadku 5 cyfr, w tym 2 po przecinku, np 999.99)
  • DOUBLE - liczby zmiennoprzecinkowe
  • DATE, TIME, DATETIME - '0000-00-00', '00:00:00', '0000-00-00 00:00:00'

Funkcje działające na pojedynczych wartościach

Funkcje działające na napisach

Funkcje działające na liczbach

  • FLOOR
  • CEILING
  • DIV
  • MOD
  • TRUNCATE, ROUND - obcinanie, zaokrąglanie do zadanej liczby miejsc po przecinku

Funkcje działające na datach

Kwerendy (instrukcja SELECT)

Schemat ogólny: łączenie tabel (, aka JOIN) -> filtrowanie (WHERE) -> grupowanie (GROUP BY) -> filtrowanie pogrupowanych (HAVING) -> sortowanie (ORDER BY).

Funkcje agregujące dane (wewnątrz grup)

  • COUNT
  • AVG
  • MIN
  • MAX
  • SUM

Utworzone kolumny można nazwać używając instrukcji AS

Konwersje typów

  • CAST(kolumna AS typ)

Operator LIKE

  • % - dopasowanie dowolnego ciągu znaków
  • _ - dopasowanie pojedynczego znaku
  • [zbiorznakow] - dopasowanie znaków z danego zbioru
  • [!zbiorznakow] - dopasowanie znaków spoza danego zbioru

SELECT z SELECTa

SELECT ... FROM ( ... ) ...;

SELECT nowa_tabela.a FROM (SELECT COUNT(*) as a FROM tabela) nowa_tabela;

Różnica tabel (wyszukiwanie danych, których nie ma) - operator NOT IN

SELECT * FROM Table1 WHERE Table1.principal NOT IN (SELECT principal FROM table2)

Zadania domowe

Wzór

  SELECT * FROM wypadki; (AN)

Formuła 1

a)

  SELECT "Rok", "GrandPrix", "Wyniki"."Punkty" FROM "Wyniki", "Wyscigi", "Kierowcy" WHERE "Wyscigi"."Id_wyscigu" = "Wyniki"."Id_wyscigu" AND "Wyniki"."Id_kierowcy" = "Kierowcy"."Id_kierowcy" AND "Kierowcy"."Imie" = 'Robert' ORDER BY "Wyniki"."Punkty"; (KM)

b)

  SELECT "GrandPrix", COUNT( 'GrandPrix' ) AS "ile" FROM "Wyscigi" GROUP BY "GrandPrix" ORDER BY "ile"; (KM)

c)

  SELECT "Kierowcy"."Imie", "Kierowcy"."Nazwisko", "Wyscigi"."Rok", SUM( CAST( "Wyniki"."Punkty" AS INTEGER ) ) AS "point" FROM "Kierowcy", "Wyniki", "Wyscigi" WHERE "Wyniki"."Id_wyscigu" = "Wyscigi"."Id_wyscigu" AND "Wyniki"."Id_kierowcy" = "Kierowcy"."Id_kierowcy" AND ( "Wyscigi"."Rok" = '2000' OR "Wyscigi"."Rok" = '2006' OR "Wyscigi"."Rok" = '2012' ) GROUP BY "Kierowcy"."Imie", "Kierowcy"."Nazwisko", "Wyscigi"."Rok" ORDER BY "point" DESC; (KM)

d)

  SELECT "Kraj", COUNT( "Kierowcy"."Kraj" ) AS "ile" FROM "Kierowcy", "Wyniki", "Wyscigi" WHERE "Wyniki"."Id_kierowcy" = "Kierowcy"."Id_kierowcy" AND "Wyscigi"."Rok" = '2012' AND "Wyniki"."Id_wyscigu" = "Wyscigi"."Id_wyscigu" GROUP BY "Kraj" ORDER BY "ile"; (KM)

Wypadki

a) Odpowiedź: 326

  SELECT COUNT( DISTINCT "Numer" ) FROM "Wypadki"; (KM)

b) Odpowiedź: PKR9139 Tomasz Misiak 10486

  SELECT "Imie", "Nazwisko", "Numer", SUM( CAST( "Odszkodowanie" AS FLOAT ) ) AS "ile" FROM "Wypadki", "Osoby", "Auta" WHERE "Wypadki"."Numer" = "Auta"."Numer" AND "Osoby"."PESEL" = "Auta"."PESEL" GROUP BY "Nazwisko", "Imie", "PESEL", "Numer" ORDER BY "ile" DESC; (KM)

c) Odpowiedź: 2006 194741 2007 227446

  SELECT YEAR( "Data" ) AS "rok", SUM( CAST( "Odszkodowanie" AS FLOAT ) ) FROM "Wypadki" WHERE ( "rok" = '2006' OR "rok" = '2007' ) GROUP BY "rok"; (KM)

d) Odpowiedź: fiat 145

  SELECT "Marka", COUNT( "Marka" ) AS "ile" FROM "Auta", "Wypadki" WHERE "Wypadki"."Numer" = "Auta"."Numer" GROUP BY "Marka" ORDER BY "ile"; (KM)

e) Odpowiedź: A 138, B 115, C 133, D 114

  SELECT "Rodzaj_miasta", COUNT( "Rodzaj_miasta" ) FROM "Auta", "Osoby", "Wypadki" WHERE "Wypadki"."Numer" = "Auta"."Numer" AND "Osoby"."PESEL" = "Auta"."PESEL" GROUP BY "Rodzaj_miasta" ORDER BY "Rodzaj_miasta"; (KM)