S Q L
SQL SQL – Structured Query Language Język komunikacji użytkownika z oprogramowaniem zarządzającym relacyjnymi bazami danych Ujęty w normie ANSI/ISO w roku 1986 Aktualizacje: SQL-89, SQL-92 Język SQL danej bazy, np. mySQL, zawiera: polecenia SQL ujęte w standardzie rozszerzenia standardu – polecenia specyficzne dla konkretnego systemu baz danych
Rodzaje poleceń SQL Polecenia SQL dotyczą: tworzenia i usuwania baz danych, tabel, kluczy wprowadzania, uaktualniania i usuwania danych wyszukiwania danych ustawiania praw dostępu do danych administracji bazą danych zarządzania transakcjami
SQL – liczby i napisy Łańcuchy znaków: 'napis' lub "napis" użycie backslasha (\): 'napis \'03' Liczby całkowite: Liczby zmiennoprzecinkowe: e+10 Liczby szesnastkowe: x'4D C' 0x c Wartość pusta: NULL
Wprowadzanie komend SQL Sposób wprowadzania do bazy poleceń SQL: w programie działającym z linii poleceń (np. mySQL monitor) w programie z graficznym interfejsem użytkownika (np. mySQL Navigator) w skryptach i programach komunikujących się z bazą danych (np. skrypty PHP) pośrednio, przy użyciu graficznego interfejsu użytkownika (np. Access)
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.
Typy danych Typy danych mySQL – liczby całkowite: 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 ( :00:12) DATE – data ( ) TIME – czas (15:00:12) YEAR – rok (2003 lub 03) TIMESTAMP (n) – znacznik czasu (n – liczba znaków)
Typy danych Typy danych mySQL – łańcuchy tekstowe: CHAR (n) – stała długość n (max. 255) VARCHAR (n) – zmienna długość, max. n (do 255) TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT – dane tekstowe ASCII TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB – dane binarne ENUM – typ wyliczeniowy SET – zbiór wartości
Tworzenie tabel Utworzenie tabeli wymaga podania nazw pól (kolumn) oraz ich typów. CREATE TABLE albumy ( idINT NOT NULL, wykonawcaVARCHAR(30), tytułVARCHAR(30), rokYEAR, liczba-utwSMALLINT, opisTEXT );
Wstawianie danych do tabeli Wstawianie danych z podaniem wszystkich kolumn tabeli (należy zachować kolejność!) Wstawianie danych do wybranych kolumn tabeli INSERT INTO albumy VALUES (1, ‘Pink Floyd’, ‘The Division Bell’, 1994, 11, ‘Ostatni studyjny album’); INSERT INTO albumy (id, album, wykonawca) VALUES (2, ‘The Wall’, ‘Pink Floyd’);
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 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;
Wyszukiwanie – wybór wierszy Wyszukiwanie rekordów spełniających zadany warunek – instrukcja WHERE Przykłady: SELECT tytuł FROM albumy WHERE wykonawca = 'Pink Floyd'; SELECT wykonawca, rok FROM albumy WHERE tytuł = 'The Best Of' AND rok < 1970;
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) 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 Operator symboli wieloznacznych: LIKE, NOT LIKE Wyrażenia regularne – operator REGEXP (mySQL) SELECT * FROM albumy WHERE wykonawca LIKE 'The %s'; SELECT * FROM albumy WHERE album NOT LIKE 'The Best in 197_';
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;
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): IDAWykonawcaAlbumRokGatunek IDUUtwórCzasIDA 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; IDAWykonawcaAlbumRokGatunek IDUUtwórCzasIDA
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;
Usuwanie rekordów Usunięcie rekordów spełniających zadane kryteria – instrukcja DELETE. Warunki takie same jak w SELECT. Usuwane są zawsze całe rekordy. Przykład: UWAGA! Te komendy czyszczą całą tabelę: DELETE FROM albumy WHERE wykonawca = 'Pink Floyd'; DELETE FROM albumy; TRUNCATE TABLE albumy;
Uaktualnianie rekordów Zmiana danych rekordów już istniejących w tabeli – komenda UPDATE. Nowe wartości określane są komendą SET. Przykład: UWAGA! Ta komenda uaktualni WSZYSTKIE rekordy: UPDATE albumy SET wykonawca = 'Pink Floyd' WHERE wykonawca = 'Fink Ployd'; UPDATE albumy SET wykonawca = 'Pink Floyd';
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;
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;
Operacje na tabelach Zmiana nazwy: 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') CREATE TABLE wykonawcy { idINT NOT NULL AUTO_INCREMENT, wykonawcaVARCHAR(30), opisTEXT DEFAULT 'brak opisu' }; INSERT INTO wykonawcy (wykonawca) VALUES ('XYZ');
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.
Sprawdzanie poprawności danych NOT NULL – w tej kolumnie muszą być wpisane dane CHECK (wyrażenie) – dane muszą spełniać podany warunek CHECK nie jest obecnie zaimplementowane w MySQL. CREATE TABLE dane { nazwiskoVARCHAR(30) NOT NULL, rok_urINT, CHECK(rok_ur BETWEEN 1900 AND 2040) };
Indeksowanie tabel Na wybrane kolumny tabeli mogą być nakładane indeksy (klucze) w celu: przyspieszenia wyszukiwania zdefiniowania relacji pomiędzy tabelami Typy indeksów w MySQL: KEY, INDEX UNIQUE PRIMARY KEY FULLTEXT
Tworzenie indeksów Tworzenie indeksu podczas definiowania tabeli – komenda INDEX lub KEY (obie są równoważne): KEY nazwa (kolumny) Indeks może obejmować wiele kolumn CREATE TABLE dane { nazwiskoVARCHAR(30) NOT NULL, rok_urINT, KEY indeks (nazwisko) };
Tworzenie indeksów Tworzenie indeksu w już istniejącej tabeli: Indeks wielokolumnowy, indeksowanych 10 pierwszych znaków pola nazwisko: Usunięcie indeksu (nie usuwa danych!): CREATE INDEX indeks ON dane(nazwisko); CREATE INDEX indeks ON dane (nazwisko(10), rok_ur); DROP INDEX indeks ON dane;
Wartości niepowtarzalne UNIQUE – żadne dwa rekordy w tabeli nie mogą mieć jednakowych danych w indeksowanej kolumnie. Jest to jednocześnie INDEX. Jeżeli indeksowana kolumna ma atrybut NOT NULL, dane w kolumnie muszą być unikatowe i muszą być wprowadzone. Jeżeli indeksowana kolumna ma atrybut NULL, dane w kolumnie muszą być unikatowe, ale mogą nie być wprowadzane (pole może pozostać puste).
Tworzenie indeksu UNIQUE Tworzenie indeksu podczas definiowania tabeli: Tworzenie indeksu w istniejącej tabeli: CREATE TABLE dane { nazwiskoVARCHAR(30) NOT NULL, peselCHAR(11), UNIQUE indeks (pesel) }; CREATE UNIQUE INDEX indeks ON dane (pesel);
Indeks główny Indeks główny – PRIMARY KEY identyfikuje jednoznacznie każdy rekord w tabeli może istnieć tylko jeden w tabeli jest typu UNIQUE indeksowana kolumna otrzymuje automatycznie atrybut NOT NULL ma nazwę PRIMARY (nie można podać własnej) bierze domyślnie udział w relacjach z innymi tabelami
Tworzenie indeksu głównego Tworzenie indeksu głównego podczas definiowania tabeli – w definicji kolumny: To samo w definicji tabeli (może to być ind. wielokolumn.) CREATE TABLE dane { nazwiskoVARCHAR(30) NOT NULL, peselCHAR(11) PRIMARY KEY, }; CREATE TABLE dane { nazwiskoVARCHAR(30) NOT NULL, peselCHAR(11), PRIMARY KEY (pesel) };
Tworzenie indeksu głównego Tworzenie indeksu głównego w już istniejącej tabeli: Usuwanie indeksu głównego w tabeli (nie usuwa danych!): ALTER TABLE dane ADD PRIMARY KEY (pesel); ALTER TABLE dane DROP PRIMARY KEY;
Wyszukiwanie w całym tekście MySQL posiada specjalny typ klucza FULLTEXT, umożliwiający wyszukiwanie informacji w polach tekstowych. Indeks ten nie wchodzi w skład standardu SQL. Tworzenie indeksu FULLTEXT (dwie metody): CREATE TABLE albumy { tytulVARCHAR(30) PRIMARY KEY, wykonawcaVARCHAR(30), recenzjaTEXT, FULLTEXT indeks (tytul, recenzja) }; ALTER TABLE albumy ADD FULLTEXT ind (recenzja);
Wyszukiwanie w całym tekście Wyszukiwanie dosłowne: MATCH (kolumny) AGAINST (napis) Dla każdego zwróconego rekordu baza oblicza wskaźnik podobieństwa (score) – im większa liczba, tym lepsze dopasowanie szukanego ciągu. Znalezione rekordy są sortowane w kolejności od najwyższego wyniku. SELECT * FROM albumy WHERE MATCH (tytul, recenzja) AGAINST ('best of');
Wyszukiwanie w całym tekście Wyświetlenie kolumny z wynikiem dopasowania wymaga dwukrotnego użycia tej samej komendy MATCH: SELECT tytul, recenzja, MATCH (tytul, recenzja) AGAINST ('best of') AS score FROM albumy WHERE MATCH (tytul, recenzja) AGAINST ('best of');
Wyszukiwanie w trybie logicznym Wyszukiwanie w trybie logicznym – operator IN BOOLEAN MODE Operatory wyszukiwania: +słowo – słowo musi wystąpić –słowo – słowo nie może wystąpić "całe zdanie" – musi wystąpić podana fraza słow* – słowo zaczynające się od podanych liter () – grupowanie operatorów ~ – zaprzeczenie
Wyszukiwanie w trybie logicznym Przykłady: rock jazzsłowa rock LUB jazz +rock +jazzsłowa rock ORAZ jazz +rock jazzsłowo rock musi wystąpić, słowo jazz zwiększa score +rock -jazzsłowo rock musi wystąpić, słowo jazz nie może wystąpić "rock music"musi wystąpić fraza rock music rock*pasują m.in. rock, rocks, rocking
Wyszukiwanie w trybie logicznym Przykład wyszukiwania w trybie logicznym: Algorytm wyszukiwania pomija słowa: złożone z mniej niż 4 liter znajdujące się na liście "stopwords" (pospolite) występujące w więcej niż połowie rekordów tabeli SELECT * FROM albumy WHERE MATCH (tytul, recenzja) AGAINST ('+rock +"debut album" -awful' IN BOOLEAN MODE);
Wyszukiwanie w całym tekście Indeksy FULLTEXT znacznie zwiększają możliwości wyszukiwania danych w bazie. Jednocześnie spowalniają one jednak operacje na rekordach (wstawianie, zmiana) – konieczność uaktualniania indeksu. Wyszukiwanie w całym tekście w bazie MySQL jest w trakcie opracowywania i optymalizacji. Operatory logiczne działają od wersji
Funkcje SQL Język SQL udostępnia szereg funkcji umożliwiających wykonywanie operacji na danych w zapytaniach. Funkcje: matematyczne tekstowe daty i czasu Funkcje te mogą być wykorzystywane w instrukcji SELECT, w warunku wyboru kolumn lub w warunku wyboru wierszy.
Funkcje SQL Przykład stosowania funkcji w instrukcji SELECT Funkcja UPPER() zamienia litery na wielkie. Użycie w warunku wyboru kolumn – zamienia litery na wielkie w zwracanych danych: Użycie w warunku wyboru rekordu – zawartość pola po konwersji musi odpowiadać warunkowi: SELECT UPPER(wykonawca) FROM albumy; SELECT * FROM albumy WHERE UPPER(wykonawca)='U2';
Funkcje matematyczne (1) ABS(x) – wartość bezwzględna SIGN(x) – znak liczby (-1, 0, 1) MOD(m,n) – reszta z dzielenia M/N FLOOR(x) – zaokrąglenie w dół CEIL(x) – zaokrąglenie w górę ROUND(x) – zaokrąglenie do najbliższej l. całkowitej m DIV n – część całkowita z dzielenia m/n EXP(x) – e x LN(x), LOG2(x), LOG10(x), LOG(b,x) – logarytmy POWER(x,y) = x y
Funkcje matematyczne (2) SQRT(x) – pierwiastek kwadratowy PI() – wartość SIN(x), COS(x), TAN(x), COT(x) – funkcje trygonometr. ASIN(x), ACOS(x), ATAN(x) – odwrotne funkcje tryg. CRC32('wyr') – kod CRC wyrażenia wyr RAND() – liczba losowa od 0 do 1 LEAST(x,y,...) – najmniejsza wartość z listy GREATEST(x,y,...) – największa wartość z listy DEGREES(x), RADIANS(x) – konwersja stopnie/radiany TRUNCATE(x,d) – skrócenie x do d miejsc po przecinku
Funkcje tekstowe (1) ASCII(x) – kod ASCII znaku ORD(x) – suma na podstawie kodów ASCII CONV(x,m,n) – konwersja między systemami liczbowymi BIN(x), OCT(x), HEX(x) – konwersja między systemami CHAR(x) – ciąg złożony ze znaków o podanych kodach CONCAT(s1,s2,...) – łączy podane napisy w jeden CONCAT_WS(sep,s1,s2,...) – łączy napisy separatorem LENGTH(s) – długość napisu LOCATE(s1,s2,p) – pozycja napisu s1 w s2 (szuk. od p) INSTR(s1,s2) – pozycja napisu s2 w s1
Funkcje tekstowe (2) LPAD(s1,n,s2) – poprzedza s1 ciągiem s2 do długości n RPAD(s1,n,s2) – dopisuje do s1 ciąg s2 do długości n LEFT(s,n) – n pierwszych znaków z napisu s RIGHT(s,n) – n ostatnich znaków z napisu s SUBSTRING(s,m,n) – n znaków z napisu s od poz. m SUBSTRING_INDEX(s,sep,n) – część napisu s przed n-tym wystąpieniem separatora sep LTRIM(s) – usuwa początkowe spacje RTRIM(s) – usuwa końcowe spacje TRIM(s) – usuwa początkowe i końcowe spacje SPACE(n) – napis złożony z n spacji
Funkcje tekstowe (3) REPLACE(s1,s2,s3) – zamień s2 na s3 w napisie s1 REPEAT(s,n) – napis z n powtórzeń s REVERSE(s) – odwraca napis s INSERT(s1,m,n,s2) – wstawia n znaków s2 do s1 na poz. m ELT(n,s1,s2,...) – zwraca n-ty napis ze zbioru FIELD(s,s1,s2,...) – zwraca indeks napisu s w zbiorze LOWER(s) – zmienia litery na małe UPPER(s) – zmienia litery na wielkie LOAD_FILE(plik) – odczytuje zawartość pliku QUOTE(s) – poprzedza znaki specjalne znakiem '\' STRCMP(s1,s2) – porównanie dwóch napisów
Funkcje daty i czasu (1) DATE(s) – pobiera datę z wyrażenia s TIME(s) - pobiera czas z wyrażenia s TIMESTAMP(s) – pobiera datę i czas z wyrażenia s DAYOFWEEK(data) – podaje dzień tygodnia DAYOFMONTH(data) – podaje dzień miesiąca DAYOFYEAR(data) – podaje dzień w roku MONTH(data) – podaje numer miesiąca DAYNAME(data) – podaje nazwę dnia MONTHNAME(data) – podaje nazwę miesiąca WEEK(data) – podaje numer tygodnia (od 0) WEEKOFYEAR(data) – podaje numer tygodnia (od 1)
Funkcje daty i czasu (2) YEAR(data) – podaje rok YEARWEEK(data) – podaje rok i numer tygodnia HOUR(data) – podaje godzinę MINUTE(data) – podaje minutę SECOND(data) – podaje sekundę MICROSECOND(data) – podaje ułamki sekundy PERIOD_ADD(p,m) – dodaje m miesięcy do daty p PERIOD_DIFF(p1,p2) – różnica dwóch dat DATE_ADD(data, INTERVAL wyr typ) – dodaje do daty podany czas DATE_SUB(data, INTERVAL wyr typ) – odejmowanie daty
Funkcje daty i czasu (3) ADDDATE(data,n) – dodaje n dni do daty SUBDATE(data,n) – odejmuje n dni od daty ADDTIME(s1,s2) – dodawanie czasu SUBTIME(s1,s2) – odejmowanie czasu EXTRACT(typ FROM data) – pobranie części daty TO_DAYS(data) – zamienia datę na numer dnia FROM_DAYS(n) – zamienia numer dnia na datę DATE_FORMAT(data,format) – formatowanie daty TIME_FORMAT(czas,format) – formatowanie czasu
Funkcje daty i czasu (4) MAKEDATE(rok,dzień) – podaje datę MAKETIME(godz,min,sek) – podaje czas CURDATE() – bieżąca data CURTIME() – bieżący czas NOW() – bieżąca data i czas UNIX_TIMESTAMP() – bieżąca data i czas w formacie UNIX SEC_TO_TIME(sek) – konwersja sekund na czas TIME_TO_SEC(czas) – konwersja czasu na sekundy
Przykład operacji na datach Dodawanie i odejmowanie DATE_ADD(' :59:59', INTERVAL 1 DAY); DATE_ADD(' :59:59', INTERVAL '1:1' MINUTE_SECOND); DATE_SUB(' ', INTERVAL 31 DAY); Pobranie części daty EXTRACT(YEAR FROM " "); Formatowanie daty DATE_FORMAT(' :23:00', '%W %M %Y');
Funkcje konwersji Konwersje typów danych CAST(wyr AS typ) – zmiana wyr na typ CONVERT(wyr,typ) – jw. CONVERT(wyr USING kod) – zmiana strony kodowej Typy: BINARY, CHAR, DATE, DATETIME, SIGNED, TIME, UNSIGNED
Inne funkcje (1) DATABASE() – nazwa bieżącej bazy danych USER() – nazwa bieżącego użytkownika PASSWORD(s) – koduje napis s jako hasło ENCRYPT(s) – koduje napis s ENCODE(s,pass) – koduje napis s przy użyciu hasła pass DECODE(s,pass) – dekoduje napis s przy użyciu hasła pass COMPRESS(s) – kompresja napisu s UNCOMPRESS(s) – dekompresja napisu s LAST_INSERT_ID() – ostatnio użyta wartość AUTO_INCREMENT
Inne funkcje (2) FORMAT(n,d) – formatuje liczbę n do d miejsc dziesiętnych VERSION() – wersja bazy danych MySQL CONNECTION_ID() – identyfikator połączenia BENCHMARK(n,wyr) – oblicza czas wykonania wyr (n razy) FOUND_ROWS() – liczba rekordów z ostatniego SELECT
Transakcje Domyślnie wszystkie instrukcje są wykonywane od razu po ich wprowadzeniu – zmiana danych w bazie. W pewnych sytuacjach nie chcemy aby wykonywane operacje modyfikowały fizyczny zbiór danych. Tryb transakcji – wprowadzane operacje zostaną wykonane dopiero po podaniu odpowiedniej komendy. MySQL obsługuje kilka typów tabel, nie wszystkie umożliwiają przeprowadzanie transakcji
Transakcje START TRANSACTION – rozpoczęcie transakcji Kolejne operacje są zapamiętywane, ale nie są wykonywane. COMMIT – wykonanie operacji z całej transakcji ROLLBACK – cofnięcie do początku transakcji Niektóre komendy automatycznie wykonują COMMIT, np. CREATE INDEX, DROP INDEX, DROP TABLE, DROP DATABASE, ALTER TABLE, RENAME TABLE, TRUNCATE
Transakcje Możliwe jest ustawienie w trakcie transakcji punktów zapisu za pomocą komendy SAVEPOINT nazwa Wykonanie komendy ROLLBACK TO SAVEPOINT nazwa powoduje cofnięcie do punktu zapisu o podanej nazwie COMMIT nadal wykonuje całą transakcję.
Blokowanie tabel W pewnych sytuacjach potrzebne jest czasowe zablokowanie tabeli, aby inny użytkownik nie zmodyfikował danych. Blokowanie: LOCK TABLES tabela1 typ, tabela2 typ,... ; Typ blokady: READ – blokada do odczytu WRITE – blokada do zapisu Odblokowanie tabel: UNLOCK TABLES;
Typy tabel w MySQL MySQL obsługuje różne standardy zapisywania tabel. Typy nie udostępniające mechanizmu transakcji: MyISAM (domyślny), ISAM (stary), HEAP, MERGE Typy udostępniające mechanizm transakcji i blokowania: InnoDB, BDB Indeks pełnego tekstu (FULLTEXT) działa tylko w tabelach MyISAM.
Typy tabel w MySQL CREATE TABLE tworzy domyślnie tabelę MyISAM. Aby utworzyć tabelę innego typu, należy podać żądany typ na końcu instrukcji: Zmiana typu tabeli (w praktyce utworzenie nowej tabeli, przepisanie danych i usunięcie starej tabeli): CREATE TABLE nazwa (definicja) TYPE=InnoDB; ALTER TABLE nazwa TYPE=InnoDB;
Autoryzacja dostępu do bazy System zarządzania bazą danych obsługuje tzw. system przywilejów (privilege system): autoryzacja użytkownika łączącego się z bazą z określonego komputera (login, hasło), określenie praw do wykonywania poszczególnych operacji na bazie danych (przywileje) Przywileje są ustalane na podstawie: nazwy użytkownika nazwy sieciowej komputera klienta operacji, którą chce wykonać użytkownik
Autoryzacja dostępu do bazy Sprawdzanie przywilejów odbywa się na dwóch poziomach Poziom 1 – połączenie z bazą Sprawdzanie czy użytkownik o podanej nazwie ma prawo połączyć się z bazą z danego komputera Poziom 2 – wykonanie operacji Sprawdzanie czy użytkownik ma prawo wykonać żądaną operację na danych w określonej tabeli.
Użytkownicy i hasła Użytkownik łącząc się z bazą podaje swój identyfikator (login) oraz hasło (jeżeli jest ustawione). Identyfikatory i hasła bazy MySQL są niezależne od identyfikatorów i haseł systemu operacyjnego. Połączenie z bazą z linii poleceń systemu: Jeżeli nie podany zostanie identyfikator użytkownika, (-u) przyjmowany jest identyfikator (login) systemowy bieżącego użytkownika. Opcja -p wymaga podania hasła mysql -h serwer -u użytkownik -p baza_danych
Nadawanie praw dostępu Nadanie praw wykonywania określonych operacji na danych w bazie: GRANT przywilej (kolumny_tabeli) ON baza_danych.tabela TO IDENTIFIED BY 'hasło'; Odbieranie praw dostępu: REVOKE przywilej (kolumny_tabeli) ON baza_danych.tabela FROM
Rodzaje przywilejów ALL – prawo do wykonywania wszystkich operacji ALTER – zmiana def. tabeli (ALTER TABLE) CREATE – tworzenie tabel (CREATE TABLE) DELETE – kasowanie danych z tabeli (DELETE) DROP – usuwanie tabel (DROP TABLE) FILE – ładowanie danych z/do plików INDEX – tworzenie i usuwanie indeksów INSERT – wstawianie danych (INSERT) SELECT – pobieranie danych (SELECT) UPDATE – uaktualnianie danych (UPDATE) USAGE – bez żadnych praw
Poziomy przywilejów Przywileje dostępu do danych (ON) mogą dotyczyć: wszystkich baz danych na serwerze (poziom globalny): GRANT... ON *.* wszystkich tabel w określonej bazie: GRANT... ON baza_danych.* określonej tabeli: GRANT... ON baza_danych.tabela pojedynczych kolumn w określonej tabeli
Przywileje dla użytkowników Przywileje dla użytkowników (TO) użytkownik user z dowolnego komputera: użytkownik user z komputera w domenie: użytkownik z określonego komputera:
Ustawianie hasła Domyślnie utworzony użytkownik nie posiada hasła, o ile nie użyta zostanie opcja IDENTIFIED BY. Ustalenie hasła przy nadawaniu praw: Inna instrukcja do nadania hasła: GRANT ALL ON *.* TO user IDENTIFIED BY 'hasło'; SET PASSWORD FOR user = PASSWORD('hasło');
Prawa dostępu – przykłady Nadanie wszystkich praw do bazy forum dla użytkownika www łączącego się z serwera Nadanie wybranych praw do tabeli dane użytkownikowi joe łączącemu się z podanej domeny Uwaga – ta instrukcja jest niebezpieczna! GRANT ALL ON forum.* TO www; GRANT SELECT,INSERT,UPDATE ON forum.dane TO IDENTIFIED BY 'alamakota'; GRANT ALL ON *.* TO
Administrator bazy danych Użytkownik root ma prawo dostępu do całej bazy – jest administratorem bazy. Po zainstalowaniu MySQL każdy może zalogować się jako root bez hasła. Zatem należy ustawić hasło z linii poleceń: Po połączeniu się z bazą systemową należy ustawić hasło: Można również użyć programu mysqladmin: mysql -u root mysql; SET PASSWORD FOR root = PASSWORD('tajnehaslo'); mysqladmin -u root password tajnehaslo;
Dodawanie użytkowników Dodanie użytkownika z jednoczesnym nadaniem praw dostępu do danych: Dodanie użytkownika bez nadania praw: Dodanie na końcu opcji WITH GRANT OPTION pozwala użytkownikowi na przekazywanie praw innym użytkownikom. GRANT ALL ON baza.* TO user IDENTIFIED BY 'haslo1'; GRANT USAGE ON baza.* TO user IDENTIFIED BY 'haslo2';