Wydział Informatyki Politechnika Białostocka Plan wykładu Zaawansowane bazy danych i hurtownie danych 1. MySQL 2. Powtórzenie SQL studia zaoczne II stopnia, sem. I WYKŁAD 2: MySQL: podstawowe obiekty Powtórzenie SQL. Agnieszka Oniśko, Małgorzata Krętowska PHP a MySQL, 1/41 PHP a MySQL, 2/41 SQL (Structured Query Language) Użytkownicy bazy danych Administratorzy baz danych • Definiowanie danych (DDL:Data Definition Language) • Definiowanie zapytań (DQL: Data Query Language) • Modyfikowanie danych (DML: Data Manipulation Language) • Sterowanie danymi (DCL: Data Control Language) Baza danych Programiści Użytkownicy końcowi PHP a MySQL, 3/41 PHP a MySQL, 4/41 MySQL: Tworzenie bazy danych MySQL: Baza danych SHOW DATABASES; CREATE DATABASE | SCHEMA [IF NOT EXISTS] nazwa_bazy [[DEFAULT] CHARACTER SET [=] kodowanie] | [DEFAULT] COLLATE [=] collation_name ; mysql> SHOW CHARACTER SET LIKE 'latin%'; +---------+-----------------------------+-------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+-----------------------------+-------------------+--------+ | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | +---------+-----------------------------+-------------------+--------+ +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ Wynik po instalacji MySQL USE nazwa_bazy; - ustawia daną bazę jako domyślną dla późniejszych instrukcji USE db1; SELECT COUNT(*) FROM mytable; # wybiera z db1.mytable USE db2; SELECT COUNT(*) FROM mytable; # wybiera z db2.mytable PHP a MySQL, 5/41 MySQL: Modyfikacja/usuwanie bazy danych PHP a MySQL, 6/41 MySQL: Polecenia SHOW/DESCRIBE DESCRIBE nazwa_tabeli [nazwa_kolumny | ‘wartość’]; DESCRIBE user ‘%priv’; ALTER DATABASE nazwa_bazy [[DEFAULT] CHARACTER SET [=] kodowanie] | [DEFAULT] COLLATE [=] collation_name ; SHOW DATABASES; SHOW TABLES [FROM nazwa_bazy] [LIKE ‘wartość’]; SHOW GRANTS FOR użytkownik; DROP DATABASE [IF EXISTS] nazwa_bazy; SHOW TABLES FROM mysql LIKE ‘my%’; SHOW COLUMNS FROM user LIKE ‘priv%’; SHOW INDEX FROM user; PHP a MySQL, 7/41 PHP a MySQL, 8/41 MySQL: Tworzenie użytkowników bazy MySQL: Zmiana hasła użytkownika bazy CREATE USER użytkownik [IDENTIFIED BY [PASSWORD] ‘hasło'] [, użytkownik [IDENTIFIED BY [PASSWORD] ‘hasło']] ... SET PASSWORD [FOR użytkownik] = { PASSWORD(‘hasło') | OLD_PASSWORD(‘hasło') | ‘zaszyfrowane_hasło' } SET PASSWORD FOR nowy = PASSWORD(‘nowe_haslo'); CREATE USER nowy_użytkownik IDENTIFIED BY ‘tutaj_haslo‘; SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass'); Jest to równoznaczne z: UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='bob' AND Host='%.loc.gov'; FLUSH PRIVILEGES; PHP a MySQL, 9/41 MySQL: Instalacja Utworzenie bazy systemowej mysql MySQL Utworzenie bazy testowej test PHP a MySQL, 10/41 MySQL: information_schema Utworzenie bazy systemowej mysql mysql test MySQL Utworzenie użytkownika systemowego root Utworzenie bazy testowej test mysql test Utworzenie użytkownika systemowego root PHP a MySQL, 11/41 PHP a MySQL, 12/41 Bazy mysql i test Wybrane obiekty bazy mysql • Baza systemowa mysql • • Zawiera 23 tabele systemowe Tabele systemowe przechowują informacje na temat: – użytkowników bazy – uprawnień przydzielonych użytkownikom bazy Tabele kontrolujące dostęp do bazy — user — db — host* — columns_priv* — tables_priv* Baza testowa test • Nie zawiera żadnych tabel PHP a MySQL, 13/41 MySQL: Rodzaje uprawnień ALTER ALTER ROUTINE CREATE CREATE ROUTINE CREATE TEMPORARY TABLES CREATE USER CREATE VIEW DELETE DROP EXECUTE FILE GRANT OPTION INDEX INSERT LOCK TABLES PHP a MySQL, 14/41 Rodzaje kolumn PROCESS RELOAD SELECT SHOW DATABASES SHOW VIEW SHUTDOWN UPDATE select_priv insert_priv update_priv delete_priv create_priv alter_priv drop_priv index_priv table_priv column_priv ssl_type ssl_cipher PHP a MySQL, 15/41 shutdown_priv process_priv file_priv grant_priv show_db_priv reload_priv create_tmp_tables_priv lock_tables_priv execute_priv max_questions max_updates max_connections max_user_connections PHP a MySQL, 16/41 Tabela user: Kolumny host user password select_priv insert_priv update_priv delete_priv ........ Tabela user: Kolumny Kolumny określają, kto ma dostęp do serwera bazy i z jakiego hosta (Klucz główny (host, user)) ssl_type ssl_cipher ..... Kolumny określają rodzaj połączenia max_questions Kolumny określają uprawnienia max_updates dotyczące połącznia z bazą max_connections max_user_connections Uprawnienia PHP a MySQL, 17/41 PHP a MySQL, 18/41 Tabela db: Kolumny Tabela db: Przykład host db user select_priv insert_priv update_priv delete_priv ........ Kolumny określają, kto ma dostęp do konkretnej bazy i z jakiego hosta Klucz główny (host, db, user) mysql> select user, password from user; +------+-------------------------------------------+ | user | password | +------+-------------------------------------------+ | root | *70EADDEE29B2EDFA77EA589C9ED2D866FD9E79D5 | +------+-------------------------------------------+ Uprawnienia PHP a MySQL, 19/41 PHP a MySQL, 20/41 Tabela host: Kolumny Tabela tables_priv: Kolumny host db host db user table_name column_name grantor table_priv column_priv select_priv insert_priv update_priv delete_priv ........ Kolumny określają, z jakiego hosta do jakiej bazy mamy dostęp Klucz główny (host, db) Uprawnienia Kolumny określają, kto ma dostęp do tabeli Klucz główny (host, db, user, table_name) SELECT host, db, user, table_name, table_priv, column_priv FROM tables_priv; PHP a MySQL, 21/41 MySQL: Nadawanie uprawnień Tabela columns_priv: Kolumny host db user table_name column_name column_priv PHP a MySQL, 22/41 Kolumny określają kto ma dostęp do kolumn tabeli Klucz główny (host, db, user, table_name, column_name) GRANT typ_uprawnienia [(lista_kolumn)] [, typ_uprawnienia [(lista_kolumn)]] ... ON [typ_obiektu] poziom_uprawnienia TO użytkownik [IDENTIFIED BY [PASSWORD] ‘hasło'] [, użytkownik [IDENTIFIED BY [PASSWORD] 'hasło']] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH z_opcją [z_opcją] ...] ; SELECT host, db, user, table_name, column_name, column_priv FROM columns_priv; PHP a MySQL, 23/41 PHP a MySQL, 24/41 MySQL: Nadawanie uprawnień MySQL: Nadawanie uprawnień, przykład typ_obiektu: TABLE | FUNCTION | PROCEDURE poziom_uprawnienia: * | *.* | db_nazwa.* | db_nazwa.nazwa_tabeli | nazwa_tabeli | db_nazwa.nazwa_procedury z_opcją: GRANT OPTION | MAX_QUERIES_PER_HOUR liczba | MAX_UPDATES_PER_HOUR liczba | MAX_CONNECTIONS_PER_HOUR liczba | MAX_USER_CONNECTIONS liczba GRANT SELECT, UPDATE, INSERT ON test.tabela TO ‘kowalski’@’localhost’; GRANT SELECT, UPDATE (k1, k2) ON test.tabela TO ‘kowalski’@’localhost’; ssl_option: SSL | X509 | CIPHER 'cipher' | ISSUER 'issuer' | SUBJECT 'subject‘ GRANT SELECT, UPDATE (k1, k2) ON test.tabela TO ‘kowalski’@’localhost’ REQUIRE ssl WITH MAX_UPDATES_PER_HOUR 20; PHP a MySQL, 25/41 MySQL: Sprawdzanie uprawnień PHP a MySQL, 26/41 MySQL: Sprawdzanie uprawnień SELECT host, user, select_priv, update_priv FROM user WHERE user =‘kowalski’; SHOW GRANTS FOR ‘kowalski’@’localhost’; SELECT host, db, user, table_name, table_priv, column_priv FROM tables_priv WHERE user =‘kowalski’; SELECT host, db, user, table_name, column_name, column_priv FROM columns_priv WHERE user =‘kowalski’; SELECT host, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv FROM user WHERE user = ‘kowalski’; PHP a MySQL, 27/41 PHP a MySQL, 28/41 MySQL: Odbieranie uprawnień MySQL: Aktualizacja uprawnień REVOKE typ_uprawinienia [(lista_kolumn)] [, typ_uprawnienia [(lista_kolumn)]] ... ON [typ_obiektu] {nazwa_tabeli | * | *.* | nazwa_bazy.*} FROM użytkownik [, użytkownik] ... FLUSH PRIVILEGES REVOKE ALL PRIVILEGES, GRANT OPTION FROM użytkownik [, użytkownik] ... REVOKE UPDATE ON test.tabela FROM ‘kowalski’@’localhost’; PHP a MySQL, 29/41 Baza ćwiczeniowa PHP a MySQL, 30/41 Zapytania proste SELECT [ALL | DISTINCT] wyrażenie [[AS] alias], ... FROM nazwa_tabeli, ... [WHERE warunek] [ORDER BY wyrażenie ASC|DESC], ...]; PHP a MySQL, 31/41 31 PHP a MySQL, 32/41 Zapytania proste Zapytania proste [WHERE warunek] SELECT [ALL | DISTINCT] wyrażenie [[AS] alias], ... FROM nazwa_tabeli, ... ALL- pokazuje wszystkie wiersze (domyślny) DISTINCT - eliminuje powtarzające się wiersze wyrażenie - nazwa kolumny lub wyrażenie zawierające nazwy kolumn, zamiast wyrażenia może wystąpić znak '*’ oznaczający wszystkie kolumny alias - nazwa nadana wyrażeniu na liście SELECT, może mieć postać identyfikatora prostego (napis złożony z liter, cyfr i znaków podkreślenia) lub złożonego (dowolny napis ograniczony podwójnymi cudzysłowami, np. zawierający spacje), Operatory logiczne: =; <; >; >=; <= Operatory SQL: BETWEEN ... AND ... - między dwiema wartościami (włącznie z nimi) IN (lista) - zgodnie z jednym elementów listy LIKE - zgodnie z zadanym wzorcem (interpretacja znaków typu "wildcard": ‘%’ zastępuje ciąg znaków, ‘_’ zastępuje jeden znak) IS NULL - jest wartością NULL Operator negacji: NOT (NOT nazwa_kolumny = ...; NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL) Kryteria złożone: AND (i) OR (lub) PHP a MySQL, 33/41 Przykład Wypisać pracowników pracujących na stanowisku sprzedawcy lub informatyka. select nazwisko, stanowisko from pracownik where stanowisko in (‘SPRZEDAWCA’, ‘INFORMATYK’); NAZWISKO STANOWISKO ------------- ----------------Nazwisko1 SPRZEDAWCA Nazwisko2 SPRZEDAWCA Nazwisko11 INFORMATYK Nazwisko12 INFORMATYK Nazwisko14 SPRZEDAWCA PHP a MySQL, 34/41 Złączenia tabel SELECT [ALL | DISTINCT] wyrażenie [[AS] alias], ... FROM tabela_1, tabela_2, ..., tabela_n WHERE warunki_łączący_tabele minimalna liczba łączących warunków = liczba tabel -1 PHP a MySQL, 35/41 PHP a MySQL, 36/41 Przykład Przykład Wypisać nazwiska i nazwy departamentów pracowników. SELECT nazwisko, nazwa, p.nr_departamentu as nr_z_pr, d.nr_departamentu as nr_z_dep FROM pracownik p, departament d; NAZWISKO NAZWA NR_Z_DEP SELECT nazwisko, nazwa, p.nr_departamentu as nr_z_pr, d.nr_departamentu as nr_z_dep FROM pracownik p, departament d WHERE p.nr_departamentu=d.nr_departamentu; NR_Z_PR NAZWISKO ------------- --------------- ---------- ---------- NAZWA NR_Z_PR NR_Z_DEP ------------- --------------- ---------- ---------- Nazwisko1 Departament 1 1 1 Nazwisko1 Departament 1 1 1 Nazwisko2 Departament 1 1 1 Nazwisko9 Departament 1 1 1 Nazwisko3 Departament 1 2 1 Nazwisko8 Departament 1 1 1 Nazwisko4 Departament 1 2 1 Nazwisko14 Departament 1 1 1 Nazwisko5 Departament 1 3 1 Nazwisko2 Departament 1 1 1 Nazwisko6 Departament 1 3 1 Nazwisko13 Departament 2 2 2 Nazwisko7 Departament 1 3 1 Nazwisko4 Departament 2 2 2 Nazwisko3 Departament 2 2 2 Nazwisko11 Departament 2 2 2 Wypisać poziomy płac poszczególnych pracowników wraz z ich zarobkami SELECT nazwisko, pensja, nr_przedzialu FROM pracownik, poziom_zarobkow WHERE pensja between dolna_granica and gorna_granica; Wynik działania zapytania: Tabela poziom_zarobkow: NAZWISKO PENSJA NR_PRZEDZIALU ------------- ---------- ------------Nazwisko2 900 1 Nazwisko1 1000 1 Nazwisko14 1000 1 Nazwisko8 1200 1 Nazwisko9 1400 2 Nazwisko3 1500 3 Nazwisko4 2000 3 Nazwisko13 2000 3 Nazwisko5 3000 4 Nazwisko7 3500 5 Nazwisko11 3500 5 NR_PRZEDZIALU DOLNA_GRANICA GORNA_GRANICA ------------- ------------- ------------1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 PHP a MySQL, 37/41 Funkcje grupowe Przykład • Funkcje grupowe są przeznaczone do działania na grupach wierszy. Wynikiem działania funkcji grupowej jest pojedyncza wartość dla całej grupy, a nie jedna wartość dla każdego wiersza. • Przykłady funkcji: – – – – – – – – PHP a MySQL, 38/41 AVG ([DISTINCT] wyrażenie) COUNT ([DISTINCT] wyrażenie) COUNT(*) MAX ([DISTINCT] wyrażenie) MIN ([DISTINCT] wyrażenie) STDDEV ([DISTINCT] wyrażenie) SUM ([DISTINCT] wyrażenie) VARIANCE ([DISTINCT] wyrażenie) • Wyznacz średni zarobek w firmie – select avg(pensja) from pracownik; • Ilu pracowników jest zatrudnionych w departamencie numer 20? – Select count(*) from pracownik where nr_departamentu=20; • Wszystkie funkcje grupowe, z wyjątkiem count(*) ignorują NULL. PHP a MySQL, 39/41 PHP a MySQL, 40/41 Zapytania grupujące Zasady wykonania zapytania grupującego • Rozważ wszystkie kombinacje wierszy tabel występujących w klauzuli FROM • Do każdego wiersza zastosuj warunek WHERE • Podziel wiersze na grupy • Do każdej grupy zastosuj warunek w klauzuli HAVING • Dla każdego wiersza reprezenującego grupę oblicz wartości wyrażeń po SELECT SELECT lista pól FROM tabele WHERE warunki przed grupowaniem GROUP BY pola grupujące HAVING warunki po grupowaniu PHP a MySQL, 41/41 Zapytania grupujące - ograniczenia • Na liście wyboru polecenia SELECT używającego grupowania wolno umieszczać tylko te kolumny, które są przedmiotem działania klauzuli GROUP BY chyba, że występują one wewnątrz funkcji grupującej. • Każda kolumna lub wyrażenie występujące na liście SELECT, nie objęte funkcją grupową musi być przedmiotem grupowania klauzulą GROUP BY. PHP a MySQL, 43/41 PHP a MySQL, 42/41