Podstawy baz danych. Laboratorium nr 1 i 2.

Zagadnienia poruszane podczas zajęć laboratoryjnych dotyczyć będą podstaw relacyjnych baz danych oraz języka SQL.

Język SQL

SQL to strukturalny język zapytań (ang. Structured Query Language). Jest to bardzo powszechny i standaryzowany język dostępu do systemów zarządzania relacyjnymi bazami danych. Służy do tworzenia i modyfikowania baz danych oraz do pobierania i zapisywania danych z i do bazy. Rozpoznawany jest przez wszystkie najpopularniejsze systemy baz danych takie jak np. MySQL, PostgreSQL, Microsoft SQL Server, Oracle, DB2.

Użycie SQL polega na wysyłaniu zapytań (query) do bazy i przekazywaniu użytkownikowi żądanych danych. Na początku pracy z bazą danych oraz językiem, warto wybrać sposób w jaki będzie się zapisywać nazwy tabeli, zapytania, warunki itd. Zasady przyjęte w materiałach:

nazwy tabel zapisywane są z wielkiej litery oraz składają się tylko z liter i znaku "_"
słowa kluczowe w zapytaniach są pisane wielkimi literami w odróżnieniu od np. nazw kolumn czy warunków

Podczas zajęć wykorzystywać będziemy system zarządzania bazami danych MySQL wraz z narzędziem MySQL Workbench w wersjach darmowych. (https://www.mysql.com/products/workbench/)

Połączenie z bazą danych

Podczas zajęć korzystać będziemy z przygotowanych baz danych na serwerze uczelnianym torus.uck.pk.edu.pl, dalatego na komputerach nie wymagany jest serwer mysql, wystarczy jedynie klient. Adres, nazwy urzytkowników, hasła oraz sposób połącznia z wykorzystaniem MySQL Workbench został podany na zajęciach. Jakiekolwiek problemy z logowaniem proszę zgłaszać na zajęciach lub poprzez kontakt mailowy.

Tworzenie bazy danych

Zapytanie składa się tylko z polecenia:

CREATE DATABASE nazwa_bazy

Usuwanie bazy danych

Jest to czynność równie prosta jak tworzenie bazy, jednak niosąca za sobą poważne konsekwencje w postaci utraty wszystkich danych zawartych w jej tabelach i samych tabel.

DROP DATABASE nazwa_bazy

Powyższych dwóch zapytań na zajęciach nie używamy, ponieważ baza juz istnieje i nie chcemy jej usuwać.

In [1]:
# kod pythona do połączenia z bazą i wykonywania zapytań sql w jupyter
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:*****@127.0.0.1:3306/DB19')
%load_ext sql_magic
%config SQL.conn_name = 'engine'

Wyświetlenie istniejących tabel w bazie

Do wylistowania istniejących tabel w bazie służy zapytanie

SHOW TABLES
In [2]:
%%read_sql
SHOW TABLES 
Query started at 10:30:23 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[2]:
Tables_in_db19

Baza jest pusta wobec czego otrzymujemy pustą tabele

Tworzenie nowej tabeli

Tabele w MySQL tworzymy przy użyciu polecenia

CREATE TABLE nazwa (kolumny typ danych atrybuty)

Pamiętać należy, żę kolumny w obrębie tabeli muszą mieć uniklane nazwy oraz zdefiniowany typ danych.

Podstawowe typy danych:

  • int
  • varchar(liczbazanaków)
  • date
  • float
  • real

Pozostałe można podglądnąć w interfejsie tworzenia tabeli w MySQL Workbench

Atrybuty kolumn w tabeli MySQL:

  • NOT NULL - powoduje, że wartość w danym polu nie może być null
  • AUTO_INCREMENT - auto numerowanie w kolumnie, kążdy rekord automatycznie podczas insertu odtrzymuje kolejny numer. Uwaga: ten atrybut może być użyty tylko z zawężeniem PRIMARY KEY
  • PRIMARY KEY - powoduje, że dane w kolumnie nie mogą sie powtarzać, służy do identyfikacji rekordu.
  • FOREIGN KEY - odwołanie do klucza głównego z innej tabeli.
  • UNIQUE - powoduje, że dane w kolumnie nie mogą sie powtarzać.
  • DEFAULT - domyślna wartość dla pola, w przypadku nie podania wartości dla kolumny w rekordzie zostanie zainsertowana wartość default
  • UNSIGNED - powoduje, że kolumna nie może przechowywać wartości na minusie przy czym zakres pozostaje taki sam, działa tylko dla typów przechowujących liczby całkowite
  • ZEROFILL - czyli zerowe wypełnienie, w przypadku gdy ilość liczb w polu będzie mniejsza niż ta zadeklarowana przy tworzeniu kolumny wartość pola będzie automatycznie "dopełniana" zerami na początku, działa tylko dla typów przechowujących liczby całkowite, automatycznie tworzy atrybut UNSIGNED

Przykład 1: Tabela: Studenci

In [3]:
%%read_sql
CREATE TABLE Studenci ( 
Nr_albumu int NOT NULL,
Imie varchar(15) NOT NULL,
Nazwisko varchar(20) NOT NULL,
Data_ur date NOT NULL,
Email varchar(50),
Miejscowosc varchar(50),
Zamieszkanie varchar(50),
Kierunek varchar(50),
Specjalnosc varchar(50),
PRIMARY KEY(Nr_albumu))
Query started at 10:32:13 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[3]:
<sql_magic.exceptions.EmptyResult at 0xc8eabce860>

Sprawdzamy czy tabela została utworzona

In [4]:
%%read_sql
SHOW TABLES
Query started at 10:33:17 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[4]:
Tables_in_db19
0 studenci

Przykład 2: Tabela: Pracownicy

In [5]:
%%read_sql
CREATE TABLE Pracownicy (
Pracownik_id int NOT NULL AUTO_INCREMENT,
Imie varchar(15) NOT NULL,
Nazwisko varchar(20) NOT NULL,
Tytul varchar(10),
Email varchar(50),
Przedmiot varchar(50),
Pokoj varchar(50),
Instytut varchar(50),
PRIMARY KEY(Pracownik_id));
Query started at 10:34:17 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[5]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfb2080>
In [6]:
%%read_sql
SHOW TABLES
Query started at 10:34:27 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[6]:
Tables_in_db19
0 pracownicy
1 studenci

DESCRIBE

Aby wyświetlić metadane tabeli można użyć zapytania DESCRIBE

In [7]:
%%read_sql
DESCRIBE Pracownicy
Query started at 10:35:22 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[7]:
Field Type Null Key Default Extra
0 Pracownik_id int(11) NO PRI None auto_increment
1 Imie varchar(15) NO None
2 Nazwisko varchar(20) NO None
3 Tytul varchar(10) YES None
4 Email varchar(50) YES None
5 Przedmiot varchar(50) YES None
6 Pokoj varchar(50) YES None
7 Instytut varchar(50) YES None

Usuwanie tabeli

Do usunięcia całej tabeli służy zapytanie

DROP TABLE nazwa_tabeli

Istnieje możliwość jedynie wyczyszczenia tabeli tzn. usunięcia wszystkich danych pozostawiając strukturę tabeli, służy do tego zapytanie

TURNCATE TABLE nazwa_tabeli

Ćwiczenie 1:

Stworzyć nową tabelę o nazwie 'Oceny' w której zawarte będą informacje o skali ocen. Kolumny: Ocena, Ocena_slownie, Ocena_symbol.

Rozwiązanie:

In [8]:
%%read_sql
CREATE TABLE Oceny (
Ocena real NOT NULL,
Ocena_slownie varchar(15),
Ocena_symbol varchar(1)
);
Query started at 10:42:06 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[8]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfbfb00>

Dodawanie klucza do tabeli

W każdej tabeli przynajmniej jedna z kolumn powinna posiadać atrybut klucza głównego. Aby dodać taki atrybut do już istniejącej kolumny należy wykonać następujące zapytanie

ALTER TABLE nazwa_tabeli 
ADD PRIMARY KEY (nazwa_kolumny);

Można również stworzyć klucz składający się z kilku kolumn

ALTER TABLE nazwa_tabeli 
ADD constraint nazwa_klucza
PRIMARY KEY (nazwa_kolumny1, ... , nazwa_kolumnyN);

Przykład 3: Dodanie klucza do tabeli Oceny

In [9]:
%%read_sql
ALTER TABLE Oceny 
ADD PRIMARY KEY (Ocena);
Query started at 10:49:59 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[9]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfbf208>

Sprawdzamy

In [11]:
%%read_sql
DESCRIBE Oceny
Query started at 10:50:50 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[11]:
Field Type Null Key Default Extra
0 Ocena double NO PRI None
1 Ocena_slownie varchar(15) YES None
2 Ocena_symbol varchar(1) YES None

Ćwiczenie 2:

Stworzyć nową tabelę o nazwie 'Przedmioty' w której zawarte będą informacje o przedmiotach. Kolumny: Nazwa, Typ, ECTS, Prowadzący_id, Termin, Zaliczenie. Kolumna Nazwa powinna być kluczem głównym.

Rozwiązanie:

In [12]:
%%read_sql
CREATE TABLE Przedmioty (
Nazwa varchar(30) NOT NULL,
Typ varchar(40),
ECTS int,
Prowadzacy_id int,
Termin varchar(50),
Zaliczenie varchar(50),
PRIMARY KEY(Nazwa));
Query started at 11:01:39 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[12]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfde4a8>

Dodawanie rekordów

Do dodawanie do tabeli nowych rekordów zawierających w odpowiednich kolumnach podane wartości służy zapytanie INSERT.

INSERT INTO tabela VALUES (wartość,wartość,..)

W powyższym zapytaniu wartości będą wstawiane pokolei do kolumn, jeśli chcemy dodać rekord w którym niektóre kolumny są puste piszemy:

INSERT INTO tabela (kolumna,kolumna..) VALUES (wartość,wartość,..)

Przykład 4:

In [13]:
%%read_sql
INSERT INTO Studenci 
VALUES(0, "Adam", "Marszalek", "1986-08-10", "amarszalek@pk.edu.pl", "Krakow", "Mieszkanie", 
       "Matematyka", "Modelowanie matematyczne")
Query started at 11:04:12 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[13]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfdee10>

Wyświetlanie zawartości tabeli, więcej o zapytaniu SELECT później

In [14]:
%%read_sql
SELECT * FROM Studenci
Query started at 11:05:33 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[14]:
Nr_albumu Imie Nazwisko Data_ur Email Miejscowosc Zamieszkanie Kierunek Specjalnosc
0 0 Adam Marszalek 1986-08-10 amarszalek@pk.edu.pl Krakow Mieszkanie Matematyka Modelowanie matematyczne

Przykład 5:

In [15]:
%%read_sql
INSERT INTO Pracownicy (Pracownik_id, Imie, Nazwisko, Instytut)
VALUES (0, "Adam", "Marszalek", "Instytut Informatyki")
Query started at 11:07:11 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[15]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfd4ef0>
In [16]:
%%read_sql
SELECT * FROM Pracownicy
Query started at 11:07:41 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[16]:
Pracownik_id Imie Nazwisko Tytul Email Przedmiot Pokoj Instytut
0 1 Adam Marszalek None None None None Instytut Informatyki

UWAGA: Kolumna Pracownik_id ma ustawiony atrybut AUTO_INCREMENT bez podanej wartości, domyślnie jest to 1 stąd pojawiła się jedynka w kolumnie Pracownik_id

Modyfikowanie rekordów

Polecenia UPDATE służy do zmiany wartości w istniejących już rekordach w tabeli. Zapytanie składa się z :

  • instrukcji UPDATE która oznacza rozpoczęcie operacji zmiany
  • nazwy tabeli
  • słowa kluczowego SET
  • listy z przypisaniami kolumna=wartość w której kolumnom przypisywane są ich nowe wartości
  • warunku WHERE który określe który rekord zostanie zmieniony
    UPDATE tabela SET kolumna1=wartość1, kolumna2=wartość2, ..
    WHERE kolumna=wartość
    

Przykład 6:

In [17]:
%%read_sql
UPDATE Pracownicy SET email='amarszalek@pk.edu.pl'
WHERE Pracownik_id=1 
Query started at 11:14:00 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[17]:
<sql_magic.exceptions.EmptyResult at 0xc8ebdb4198>
In [18]:
%%read_sql
SELECT * FROM Pracownicy
Query started at 11:14:26 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[18]:
Pracownik_id Imie Nazwisko Tytul Email Przedmiot Pokoj Instytut
0 1 Adam Marszalek None amarszalek@pk.edu.pl None None Instytut Informatyki

Usuwanie rekordów

Zapytanie DELETE służy do usuwania z bazy danych rekordów spełniających podane warunki. Zapytanie składa się z:

  • instrukcji DELETE oznaczającej zapytanie usuwające
  • części FROM w której podajemy nazwę tabeli
  • warunku WHERE w którym podajemy kryteria które musi spełniać rekord aby został usunięty
    DELETE FROM tabela WHERE warunek
    

Przy usuwaniu rekordów musimy zwrócić szczególną uwagę na klauzulę warunkową. Musi być ona poprawna i uwzględniać tylko te rekordy które faktycznie chcemy usunąć.

Przykład 7:

In [19]:
%%read_sql
DELETE FROM Studenci
WHERE Nr_albumu = 0
Query started at 11:24:53 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[19]:
<sql_magic.exceptions.EmptyResult at 0xc8ebfcdba8>
In [20]:
%%read_sql
SELECT * FROM Studenci
Query started at 11:25:23 PM ?rodkowoeuropejski czas letni; Query executed in 0.00 m
Out[20]:
Nr_albumu Imie Nazwisko Data_ur Email Miejscowosc Zamieszkanie Kierunek Specjalnosc

Ćwiczenie 3:

Wypełnić danymi tabele Stucenci, Pracownicy, Przedmioty, Oceny, co najmniej po 10 rekordów (nie dotyczy tabeli Oceny).