Tworzenie bazy danych – mySQL Sposób utworzenia bazy danych w mySQL: uruchomienie programu: mysql utworzenie bazy: CREATE DATABASE nazwa; przełączenie się do bazy: USE nazwa; teraz można utworzyć tabele – utworzenie tabeli wymaga podania nazw pól (kolumn) oraz ich typów.
Operacje na bazach danych Tworzenie bazy danych: Usuwanie całej bazy: Wyświetlenie istniejących baz danych: Przełączenie się na inną bazę danych: CREATE DATABASE baza; DROP DATABASE baza; SHOW DATABASES; USE baza;
Tworzenie bazy danych – mySQL CREATE DATABASE SQL_w_3_tygodnie; Use SQL_w_3_tygodnie; DROP DATABASE ............;
Typy danych Typy danych mySQL – liczby całkowite: Dodatkowe atrybuty: TINYINT (1 bajt) SMALLINT (2 bajty) MEDIUMINT (3 bajty) INT (4 bajty) BIGINT (8 bajtów) Dodatkowe atrybuty: UNSIGNED – liczba bez znaku ZEROFILL – dopełnienie zerami (M) – wyświetlenie M cyfr
Typy danych Typy danych mySQL – liczby zmiennoprzecinkowe: FLOAT (n) – pojedyncza precyzja, n liczb DOUBLE (M,D) – podwójna precyzja DECIMAL (M,D) – liczba zapisywana jako tekst Dodatkowe atrybuty: UNSIGNED – liczba bez znaku ZEROFILL – dopełnienie zerami (M) – wyświetlenie M cyfr (M,D) – wyświetlenie M cyfr, D cyfr po przecinku
Typy danych Typy danych mySQL – data i czas: DATETIME – data + czas (2003-10-15 15:00:12) DATE – data (2003-10-15) TIME – czas (15:00:12) YEAR – rok (2003 lub 03) TIMESTAMP (n) – znacznik czasu (n – liczba znaków)
SQL – liczby i napisy Łańcuchy znaków: 'napis' lub "napis" użycie backslasha (\): 'napis \'03' Liczby całkowite: 1221 0 -32 Liczby zmiennoprzecinkowe: 294.42 -32032.6809e+10 Liczby szesnastkowe: x'4D7953514C' 0x5061756c Wartość pusta: NULL
Operacje na tabelach Tworzenie tabeli (przykład): Usuwanie tabeli: Wyświetlenie istniejących baz danych: Wyświetlenie struktury tabeli: CREATE TABLE tabela (id INT, nazwa VARCHAR(30)); DROP TABLE tabela; SHOW TABLES; DESCRIBE tabela;
Tworzenie tabeli MySQL CREATE TABLE czeki ( nr_czeku INT AUTO_INCREMENT, odbiorca VARCHAR(30), kwota float, uwagi char(30), PRIMARY KEY (nr_czeku)); Usuń tabele ?
Operacje na tabelach Zmiana nazwy: RENAME TABLE tabela TO nowa_tabela; Zmiana struktury tabeli – ALTER TABLE Dodanie kolumny: Usuwanie kolumny: RENAME TABLE tabela TO nowa_tabela; ALTER TABLE tabela ADD (opis TEXT); ALTER TABLE tabela DROP opis;
Operacje na tabelach Modyfikacja typu kolumny (ograniczenia typu!): Zmiana nazwy kolumny: Za pomocą ALTER TABLE możliwe jest również dodawanie i usuwanie atrybutów pól. ALTER TABLE tabela MODIFY opis VARCHAR(50); ALTER TABLE tabela CHANGE opis info VARCHAR(50);
Atrybuty pól tabeli Przy tworzeniu lub zmianie tabeli można podać opcjonalne atrybuty pól (kolumn) tabeli: CREATE TABLE (pole typ atrybuty, ...); Dostępne atrybuty: NULL – można nie podawać wartości (domyślnie) NOT NULL – wartość musi być podana DEFAULT wartość – gdy nie podamy wartości AUTO_INCREMENT – automatycznie zwiększany licznik COMMENT 'opis' – komentarz PRIMARY KEY, KEY – indeksy główne
AUTO_INCREMENT i DEFAULT AUTO_INCREMENT – nie wpisujemy danych, baza wpisuje aktualny stan licznika i zwiększa go o 1. DEFAULT – jeżeli nie wprowadzimy danych, zostanie wpisana wartość domyślna Wynik: (1, 'XYZ', 'brak opisu')
AUTO_INCREMENT i DEFAULT CREATE TABLE wykonawcy { id INT NOT NULL AUTO_INCREMENT, wykonawca VARCHAR(30), opis TEXT DEFAULT 'brak opisu' };
TIMESTAMP Wartością domyślną dla kolumny o typie TIMESTAMP jest aktualny znacznik czasu (data i czas). Kolumna tego typu umożliwia zachowanie czasu wprowadzenia lub ostatniej modyfikacji rekordu. Jeżeli zostanie podana wartość – jest ona wpisywana. Jeżeli nie zostanie podana wartość (NULL) – wpisywany jest znacznik czasu.
(odbiorca, uwagi, kwota ) VALUES ('Ma Bell', 'Lepiej miec syna', 150); Wstawianie danych do tabeli INSERT INTO nazwa_tabeli (kolumna1, kolumna2,....) VALUES (wartość1, wartość2, wartość3); INSERT INTO CZEKI (odbiorca, uwagi, kwota ) VALUES ('Ma Bell', 'Lepiej miec syna', 150); Co z polem nr_czeku ?
Wypełnianie tabeli MySQL Tabela czeki : nr_czeku INT AUTO_INCREMENT PRIMARY KEY, odbiorca VARCHAR(30), kwota float, uwagi char(30), INSERT INTO CZEKI (odbiorca, uwagi, kwota ) VALUES ('Ma Bell', 'Lepiej miec syna', 150); Co z polem nr_czeku ?
Wyszukiwanie danych Wyszukiwanie danych w tabeli – instrukcja SELECT Ogólna postać instrukcji SELECT: SELECT które_kolumny FROM z_której_tabeli WHERE które_rekordy;
Wyszukiwanie danych SELECT [DISTINCT] { {funkcja agregująca | wyrażenie [ AS nazwa_kolumny ]} | {kwalifikator.*} | * INTO specyfikacja_obiektu_docelowego, ... FROM { {nazwa_tabeli [AS] {alias} [(nazwa_kolumny, ...]} | podzapytanie |tabela_złączona [ WHERE predykat]
Zdanie SELECT cd. [ GBROUP BY {nazwa tabeli | ALIAS }.nazwa kolumny] [HAVING predykat] [ORDER BY {{kolumna_wyjściowa {ASC | DESC]},..}];
Zdanie SELECT cd. INTO - określa obiekt docelowy FROM - wskazuje tabele z których zapytanie pobiera lub wylicza wartości WHERE - kryteria, których spełnienia wymaga się od wierszy wyjściowych GROUP BY - grupuje wyniki zapytania w oparciu o wartości w określonych kolumnach HAVING określa wymagania dotyczące grup wierszy określonych klauzulą GROUP BY ORDER BY - porządkuje wynik wg określonych kryteriów
Wyszukiwanie danych Najprostsza postać instrukcji SELECT Wyszukiwanie: w tabeli albumy wszystkich pól (kolumn) – „*” wszystkich rekordów (wierszy) – brak warunku WHERE SELECT * FROM albumy;
Wyszukiwanie – wybór kolumn Wyszukiwanie danych – wyświetlenie wybranych kolumn W ten sposób można uzyskać powtarzające się wyniki: Eliminacja powtórzeń wyników: SELECT rok, tytuł, wykonawca FROM albumy; SELECT wykonawca FROM albumy; SELECT DISTINCT wykonawca FROM albumy;
# Query: # select * from czeki # 'nr_czeku', ’odbiorca’, 'kwota', 'uwagi', '1', 'Ma Bell', '150', 'Lepiej miec syna', '2', 'Reading R.R', '245.34', 'pociag do Chicago', '3', 'Ma Bell', '200.32', 'telefon komórkowy', '4', 'Local utilities','98', 'Paliwo', '5', 'Joes Stale $ Dent','150', 'Artykuly spozywcze', '6', 'Cash', '25', 'Szalona noc', '7', 'Joan Gas', '25.1', 'Paliwo',
Jak pisać instrukcje select odbiorca, uwagi, kwota, nr_czeku from czeki; select odbiorca, uwagi, kwota, nr_czeku from czeki;
Wybieranie kolumn
Zapytania z rozróżnieniem
Zapytania z rozróżnieniem
Czy umiesz? Czy zdania są równoważne: SELECT * FROM CZEKI; Zapytania nie działają: Select * Select * from czeki Select kwota nazwisko odbiorca from czeki; Które zapytanie są dobre: select * from czeki; select * from czeki; select * from czeki
Wyszukiwanie – wybór wierszy Wyszukiwanie rekordów spełniających zadany warunek – instrukcja WHERE
Operatory Operatory używane w instrukcji SELECT ... WHERE: porównania: = <> < > <= >= <=> logiczne: NOT ! AND && OR || XOR IS NULL, IS NOT NULL expr BETWEEN min AND max (NOT BETWEEN) expr IN (lista) (NOT IN)
Wyszukiwanie – wybór wierszy SELECT tytuł FROM albumy WHERE wykonawca = 'Pink Floyd'; SELECT wykonawca, rok FROM albumy WHERE tytuł = 'The Best Of' AND rok < 1970;
Operatory SELECT * FROM albumy WHERE wykonawca IN ('Pink Floyd', ‘Dire Straits') AND (rok < 1975 OR rok BETWEEN 1979 AND 1983);
Symbole wieloznaczne Symbole wieloznaczne używane w instrukcji WHERE: % zastępuje dowolny ciąg znaków _ zastępuje jeden znak SELECT * FROM albumy WHERE wykonawca LIKE 'The %s';
Symbole wieloznaczne Symbole wieloznaczne używane w instrukcji WHERE: Operator symboli wieloznacznych: LIKE, NOT LIKE SELECT * FROM albumy WHERE album NOT LIKE 'The Best in 197_';
Operator podobieństwa LIKE
Sortowanie wyników Sortowanie wyników wg zadanej kolumny: ORDER BY pole – w porządku rosnącym ORDER BY pole ASC – jw. ORDER BY pole DESC – w porządku malejącym SELECT * FROM albumy ORDER BY rok DESC, wykonawca;
Sortowanie wyników wg pola ‘kwota’
Sortowanie wyników z frazą WHERE
Pytania, niejasności, powtórki
[1 1] ADD AGAINST ALL ALTER ANALYZE AND AS ASC BETWEEN BINARY BINLOG BOTH BY CASCADE CASE CHANGE CHARACTER COLUMN CONSTRAINT CREATE CROSS DATABASE DATABASES .... Syntax.txt: Należy podać lokalizację pliku i wtedy wybrane wyrazy pisze w kolorze niebieskim
Struktura zapytania (kwerendy) SELECT lista atrybutów wyświetlanych w odpowiedzi *, ALL wskazuje że wszystkie atrybuty mają być wyświetlone FROM tabela lub tabele do których jest zapytanie WHERE warunki wyboru;
Tabela Persons ( ahv, surname, forename, phone, fax, email, www) SELECT surname, email FROM Persons WHERE surname='Smith' AND forename='John' ; ze zmianą nazw atrybutów SELECT surname AS name, email AS contact
Eliminacja duplikatów SQL nie eliminuje duplikatów, chyba że użyjemy instrukcji DISTINCT Persons ( ahv, surname, forename, phone, fax, email, www) SELECT DISTINCT forename FROM Persons WHERE surname='Smith' ;
Porównywanie ciągów znakowych SELECT surname, forename, email FROM Persons WHERE email LIKE '%@inf.ethz.ch' ; WHERE surname < 'N' ;
System aliasów System aliasów można wykorzystać, jeśli chcemy porównywać zmienne z tej samej tabeli. jest wygodny, gdy chcemy uniknąć dwuznaczności używając powtarzających się nazw atrybutów. SELECT p1.surname, p2.surname FROM Persons p1, Persons p2 WHERE p1.phone = p2.phone
Połączenie typu ‘każdy z każdym’
Grouping Specify list of grouping attributes in GROUP BY clause Aggregate operations in SELECT clause applied within groups Persons ( ahv, surname, forename, phone, fax, email, www) SELECT forename, COUNT(ahv) FROM Persons GROUP BY forename ;
Funkcje agregujące COUNT - zwraca liczbę rekordów spełniających warunek SUM - zwraca sumę wartości w kolumnie AVG - znajduje wartość średnią w kolumnie MAX - zwraca wartość maksymalną MIN - zwraca wartość minimalną VARIANCE - zwraca kwadrat odchylenia standardowego STDDEV - podaje odchylenie standardowe
Funkcje arytmetyczne ABS - wartość bezwzględna CEIL - zaokrągla w górę FLOOR - zaokrągla w dół COS, COSH, SIN, SINH, TAN, TANH - funkcje trygonometryczne EXP, LN, LOG - funkcje logarytmiczne MOD - reszta z dzielenia SQRT - pierwiastek kwadratowy POWER - podnoszenie liczby do potęgi
Funkcje znakowe CHR - zwraca znak odpowiadający podanej liczbie w kodzie ASCII CONCAT - łączy dwa łańcuchy znakowe UPPER - wyświetla WIELKIMI LITERAMI LOWER - wyświetla małymi literami LPAD - dodaje tekst z lewej strony RPAD - dodaje tekst z prawej strony LTRIM - usuwa wybrany znak z tekstu z lewej strony RTRIM - usuwa wybrany znak z tekstu z prawej strony SUBSTR - wyjmuje ciąg znaków ze łańcucha
Frazy w SQL WHERE - wybiera rekordy z tabeli STARTING WITH - działa podobnie jak LIKE(wyrażenie) ORDER BY - określa kolumnę sortującą wyniki Group BY - pozwala wyświetlać i obliczać informacje dotyczące kilku rekordów HAVING - wybiera dane zwracane przez „GROUP BY’
Więcej niż jedna funkcja agregująca... Ile pieniędzy dostali odbiorcy i ile czeków wystawiono
Ile pieniędzy dostali odbiorcy na takie same okazje
Ile czeków wystawiono na tego samego odbiorcę:
Fraza WHERE wybiera REKORDY spełniające określone kryterium Fraza HAVING umożliwia wybieranie ROZWIĄZAŃ spełniających określone kryterium Fraza WHERE nie działa z funkcjami agregującymi !!!
Persons ( ahv, surname, forename, phone, fax, email, www) SELECT forename, COUNT(ahv) FROM Persons GROUP BY forename HAVING surname < 'N' ; ) ;
Pytania, niejasności, powtórki
Joins Persons ( ahv, surname, forename, phone, fax, email, www) Organisations ( orgname, phone, fax, email, www) Worksfor ( ahv, orgname) SELECT orgname, surname, forename FROM Persons, Worksfor, Organisations WHERE Persons.ahv=Worksfor.ahv AND Worksfor.orgname=Organisations.orgname
JOIN operations SQL standard also supports various JOIN operators r1 CROSS JOIN r2 cross product r1 JOIN r2 ON p theta-join with condition p r1 NATURAL JOIN r2 natural join
JOIN operations ... Various forms of OUTERJOIN operations also supported r1 NATURAL FULL OUTER JOIN r2 r1 NATURAL LEFT OUTER JOIN r2 r1 NATURAL RIGHT OUTER JOIN r2 r1 FULL OUTER JOIN r2 ON p r1 LEFT OUTER JOIN r2 ON p r1 RIGHT OUTER JOIN r2 ON p
Grupowanie wyników Tworzenie zestawień przez grupowanie wyników: użycie funkcji, np. COUNT, SUM, MAX, MIN, AVG nazwanie kolumny z wynikami (opcjonalnie) – AS zgrupowanie wyników – ORDER BY Przykład – obliczenie ilości albumów wszystkich wykonawców: SELECT wykonawca, COUNT(*) FROM albumy GROUP BY wykonawca; SELECT wykonawca, COUNT(*) AS ilosc FROM albumy GROUP BY wykonawca ORDER BY ilosc DESC;
Grupowanie wyników Ograniczenie rekordów uzyskanych w wyniku grupowania – operator HAVING Nie należy mylić instrukcji WHERE i HAVING! Przykład – obliczenie ilości albumów wszystkich wykonawców, wyświetlenie tylko tych, którzy mają więcej niż 5 albumów: SELECT wykonawca, COUNT(*) AS ilosc FROM albumy GROUP BY wykonawca HAVING ilosc > 5;
Ograniczenie liczby wyników Ograniczenie liczby zwracanych wyników – LIMIT LIMIT n – n pierwszych wyników LIMIT m,n – n wyników, pomijając m pierwszych Przykład: 10 wykonawców o największej liczbie albumów: 20 następnych wyników (11-30): SELECT wykonawca, COUNT(*) AS ilosc FROM albumy GROUP BY wykonawca LIMIT 10; SELECT wykonawca, COUNT(*) AS ilosc FROM albumy GROUP BY wykonawca LIMIT 10,20;
Wyszukiwanie w wielu tabelach Pobieranie danych w więcej niż jednej tabeli Przykład bazy danych – dwie tabele: albumy utwory Wybranie wszystkich możliwych kombinacji rekordów z obu tabel (iloczyn kartezjański): Gatunek Rok Album Wykonawca IDA IDA Czas Utwór IDU SELECT * FROM albumy, utwory;
Wyszukiwanie w wielu tabelach Uwzględnienie relacji między tabelami: Łączy ze sobą rekordy obu tabel mające takie same dane w polach, które są połączone relacją: albumy utwory SELECT * FROM albumy, utwory WHERE albumy.IDA = utwory.IDA; Gatunek Rok Album Wykonawca IDA IDA Czas Utwór IDU
Wyszukiwanie w wielu tabelach Wybór kolumn: Krótsza wersja – aliasy nazw tabel: SELECT albumy.wykonawca, albumy.album, utwory.utwor, utwory.czas FROM albumy, utwory WHERE albumy.IDA = utwory.IDA; SELECT a.wykonawca, a.album, u.utwor, u.czas FROM albumy a, utwory u WHERE a.IDA = u.IDA;
Wstawianie danych – inne metody Wstawianie do tabeli danych uzyskanych w wyniku zapytania: Wstawianie danych z pliku na komputerze klienta (pola rozdzielone tabulatorami, rekordy – znakiem nowej linii) – komenda mySQL (nie standard): INSERT INTO nowa (autor, dzielo) SELECT DISTINCT wykonawca, album FROM albumy; LOAD DATA LOCAL INFILE ‘dane.txt’ INTO nowa_tabela;