SQL/MySQL. Rafał Kern



Podobne dokumenty
Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Bazy danych 7. SQL podstawy

Paweł Rajba

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Bazy danych 6. Klucze obce. P. F. Góra

Relacyjne bazy danych. Podstawy SQL

Język SQL, zajęcia nr 1

Bazy danych 9. SQL Klucze obce Transakcje

Język SQL, zajęcia nr 2

Ref. 7 - Język SQL - polecenia DDL i DML

Systemy GIS Tworzenie zapytań w bazach danych

Bazy danych. Dr inż. Paweł Kasprowski

Bazy danych 5. Samozłaczenie SQL podstawy

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Bazy danych 9. Klucze obce Transakcje

Bazy danych 9. Klucze obce Transakcje. P. F. Góra

P o d s t a w y j ę z y k a S Q L

Wykład 6. SQL praca z tabelami 3

Wykład 5. SQL praca z tabelami 2

Relacyjne bazy danych. Podstawy SQL

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Bazy danych. Polecenia SQL

Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1

Bazy danych 10. SQL Widoki

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Projektowanie systemów baz danych

Wykład 8. SQL praca z tabelami 5

Bazy danych i usługi sieciowe

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

SQL - DDL. 1 Tabele systemowe. 2 Typy danych

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Bazy danych 4. SQL podstawy. P. F. Góra

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

SQL w praktyce. Miłej i owocnej nauki!!!

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Autor: Joanna Karwowska

Po prawidłowym podłączeniu do serwera MySQL należy wybrać bazę, na której będziesz pracować:

Wykład 05 Bazy danych

SQL DDL DML TECHNOLOGIE BAZ DANYCH. Wykład 5: Język DDL i DML. Małgorzata Krętowska

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Instrukcje DML INSERT, UPDATE, DELETE. COPY

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Wykład 2. SQL 1 Structured Query Lenguage

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

Bazy danych 4. SQL- podstawy

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

Internetowe bazy danych

Bazy danych 7. Klucze obce Transakcje. P. F. Góra

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

BAZY DANYCH wprowadzenie do języka SQL. Opracował: dr inż. Piotr Suchomski

Przestrzenne bazy danych Podstawy języka SQL

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Bazy danych 12. SQL Wyszukiwanie pełnotekstowe

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Projekt jest finansowany ze środków Unii Europejskiej, Europejskiego Funduszu Społecznego i budŝetu państwa. Studia Podyplomowe dla Nauczycieli

040 STRUCTURED QUERY LANGUAGE. Prof. dr hab. Marek Wisła

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

SQL 4 Structured Query Lenguage

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Aspekty aktywne baz danych

Bazy Danych i Usługi Sieciowe

Oracle11g: Wprowadzenie do SQL

Dr Michał Tanaś(

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych

SQL (ang. Structured Query Language)

Oracle PL/SQL. Paweł Rajba.

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Microsoft SQL Server Podstawy T-SQL

Wykład 4. SQL praca z tabelami 1

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Wstęp do relacyjnych baz danych. Jan Bartoszek

Bazy danych Ćwiczenia projektowe

Bazy danych. dr inż. Arkadiusz Mirakowski

Bazy danych i usługi sieciowe

Administracja bazami danych

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Bazy danych - Materiały do laboratoriów VIII

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Bazy danych i usługi sieciowe

Bazy Danych. SQL Podstawy języka III: powtórzenie. Krzysztof Regulski WIMiIP, KISiM, B5, pok. 408

Wprowadzenie do języka SQL

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Język SQL podstawy zapytań

Lab.8: Podstawy języka SQL.

BAZA DANYCH SIECI HOTELI

Transkrypt:

SQL/MySQL Rafał Kern 1

SQL (Structured Query Language) Deklaratywny - opisujemy warunki, jakie musi spełniać wynik Służy do zarządzania danymi w relacyjnych bazach danych

Składnia/zapytania SQL DML (Data Manipulation Language): insert/update/delete SQL DDL (Data Definition Language): create/drop/alter SQL DCL (Data Control Language): grant/revoke/deny SQL DQL (Data Query Language): select 3

Baza danych customers PK id_customer invoices PK id_invoice invoice_items PK id_item first_name id_customer id_invoice last_name date_create product email paid price id_country currency vat_rate SELECT customers.id_customer, email FROM customers WHERE id_country = 5; 4

JOIN SELECT customers.id_customer, email, date_create FROM customers JOIN invoices ON customers.id_customer = invoices.id_customer WHERE id_country = 5; JOIN == INNER JOIN == CROSS JOIN Dla zwykłego JOIN optymalizator wylicza kolejność łączenia tabel. LEFT/RIGHT JOIN wymusza kolejność łączenia tabel i może być nieefektywne. 5

GROUP BY SELECT customers.id_customer, email, COUNT(id_invoice) AS total FROM customers JOIN invoices ON customers.id_customer = invoices.id_customer WHERE id_country = 5 GROUP BY invoices.id_customer; id_customer email total 1 foo@example.com bar@example.com 5 3 example@example.com 3 6

GROUP BY WITH ROLLUP SELECT customers.id_customer, email, COUNT(id_invoice) AS total FROM customers JOIN invoices ON customers.id_customer = invoices.id_customer WHERE id_country = 5 GROUP BY invoices.id_customer WITH ROLLUP; id_customer email total 1 foo@example.com bar@example.com 5 3 example@example.com 3 NULL foo@example.com 10 7

HAVING SELECT customers.id_customer, email, COUNT(id_invoice) AS total FROM customers JOIN invoices ON customers.id_customer = invoices.id_customer WHERE id_country = 5 GROUP BY invoices.id_customer HAVING total > 10; dotyczy wyników zagregowanych, dlatego pojawia się po GROUP BY może zawierać kolumny nieagregowane, jeśli ONLY_FULL_GROUP_BY jest wyłączone 8

Explain EXPLAIN SELECT customers.id_customer, email, COUNT(id_invoice) AS total FROM customers JOIN invoices ON customers.id_customer = invoices.id_customer WHERE id_country = 5 GROUP BY invoices.id_customer; id select_t ype table type possible _keys key key_len ref rows Extra 1 SIMPLE invoices ALL NULL NULL NULL NULL 4598 Using temporary; Using filesort SIMPLE customers eq_ref PRIMARY PRIMARY 4 invoices. id_custom er 1 Using where 9

Indeksy http://pracownianatury.pl 10

Indeksy szybsze wyszukiwanie szybsze złączenia szybsze sortowanie MySQL używa tych indeksów, które determinują najmniejszą liczbę wierszy przebudowa indeksów - spowolniony zapis 11

Indeksy złożone INDEX name (last_name,first_name,email) Możliwości użycia indeksów: (last_name) (last_name,first_name) (last_name,first_name, email) Indeks nie zostanie użyty dla: SELECT email FROM customers WHERE first_name = 'Marek'; Indeks zostanie częściowo użyty dla: SELECT email FROM customers WHERE last_name= 'Nowak' OR first_name = 'Jacek'; 1

MySQL - fulltext char, varchar, text inverted index - wykorzystuje listę wyrazów oraz listę dokumentów, w których dany wyraz występuje zakładanie indeksu pełnotekstowego na dużych tabelach może być bardzo czasochłonne Sphinx, Xapian, Lucene 13

Cardinality & Selectivity Cardinality (liczność) - liczba wszystkich wierszy Selectivity (selektywność) - liczba pasujących wierszy w stosunku do wszystkich w tabeli (estymowana, nie wyliczana) Optymalizator MySQL-a z reguły nie stosuje indeksów przy selektywności powyżej 0% wczytywanie indeksów może być kosztowne 14

Explain raz jeszcze EXPLAIN SELECT customers.id_customer, email, COUNT(id_invoice) AS total FROM customers JOIN invoices ON customers.id_customer = invoices.id_customer WHERE id_country = 5 GROUP BY invoices.id_customer; id select_t ype table type possible _keys key key_len ref rows Extra 1 SIMPLE invoices ALL NULL NULL NULL NULL 4598 Using temporary; Using filesort SIMPLE customers eq_ref PRIMARY PRIMARY 4 invoices. id_custom er 1 Using where 15

Po dodaniu indeksów... ALTER TABLE `customers` ADD INDEX(`id_country`); ALTER TABLE `invoices` ADD INDEX(`id_customer`); id select_t ype table type possible_k key eys key_ len ref row s Extra 1 SIMPLE customers ref PRIMARY, id_country id_country 4 const 1156 Using where SIMPLE invoices ref id_customer id_customer 4 customers. id_customer Using index 16

Indeks nie zostanie użyty... różne zestawy znaków (character set) np. latin1, utf8 złożona konwersja (CAST, CONVERT) duża liczba wierszy (duża selektywność) 17

Transakcje http://www.barnhartlawplc.com/practice-areas/legal-practice-areas/financial-transactions 18

Transakcje (ACID) Atomicity - operacja jest wykonana w całości albo wcale Consistency - po wykonaniu operacji dane będą spełniały kryteria integralności Isolation- dwie współbieżne transakcje nie widzą zmian wprowadzonych przez siebie (z reguły tak jest, zależy od poziomu izolacji) Durability- po ponownym uruchomieniu wyniki transakcji są dostępne 19

Transakcje START TRANSACTION; UPDATE invoices SET paid = 1 WHERE id_invoice = 1543; UPDATE invoices SET paid = 0 WHERE id_invoice = 1541; COMMIT/ROLLBACK; 0

MyISAM vs InnoDB MyIsam bez transakcji bez kluczy obcych nie spełnia ACID lockowanie na poziomie tabeli InnoDB wspiera transakcje klucze obce spełnia ACID lockowanie na poziomie wiersza 1

Klucze obce http://archiwum.allegro.pl/oferta/mannesmann

Powiązania 3

Klucze obce pozwalają tworzyć powiązania między tabelami ten sam typ danych rozmiar i znak (signed/unsigned) stringi: długość, character set i collation unikać kluczy obcych na stringach! 4

Wywołania kaskadowe Gdy modyfikujesz lub usuwasz wiersz z tabeli głównej to: CASCADE - aktualizuj lub usuń powiązane z nią wiersze z tabeli potomnej, SET NULL - ustaw wartości powiązanych kolumn na null (kolumna nie może być zdefiniowana jako NOT NULL) NO ACTION/RESTRICT - brak akcji SET DEFAULT - MySQL rozpoznaje klauzulę ale NBD i InnoDB ignorują je i traktują jak RESTRICT 5

Wywołania kaskadowe DELETE FROM customers WHERE id_customer = ; customers invoices id_customer last_name id_invoice id_customer 1 Kowalski 1 Nowak 3 Zięba 3 3 4 Bąk 4 4 6

Normalizacja brak zduplikowanych danych w bazie kolumny w tabeli są zależne tylko od klucza głównego łatwa modyfikacja danych w tabeli mogą znajdować się klucze obce 7

Denormalizacja zduplikowanie wybranych danych trudniejsze zarządzanie danymi łatwiejsze wyszukiwanie mniej joinów ilość zapisów vs. ilość odczytów uzasadnione zwłaszcza, gdy istnieje obawa dezaktualizacji danych. 8

Denormalizacja 9

http://biernbaum.com/1-most-common-mistakes/ 30

Enum/Set Sortowane wg kolejności podanej w definicji ENUM( 3, 1, ), ENUM ( X, Z, Y ) Modyfikowane za pomocą ALTER - co z dużymi tabelami? Literówki podczas porównywania stringów Podczas wstawiania nieprawidłowej wartości zostanie ona podmieniona na. Jak pobrać listę opcji do selecta? 31

NOT IN SELECT c.id_contract, c.expiration_date FROM contracts AS c WHERE c.id_contract NOT IN(SELECT i.id_contract FROM invoices AS i); Query time: 36,189s lepiej tak: SELECT c.id_contract, c.expiration_date FROM contracts AS c WHERE NOT EXISTS (SELECT id_contract FROM invoices AS i WHERE i.id_contract = c.id_contract); Query time:,755s lub tak: SELECT c.id_contract, c.expiration_date FROM contracts AS c FROM contracts AS c LEFT JOIN invoices AS i ON i.id_contract = c.id_contract WHERE i.id_invoice IS NULL; Query time:,68s 3

Signed/unsigned SIGNED UNSIGNED ROZMIAR MIN MAX MIN MAX TINYINT -18 17 0 55 1 SMALLINT -3768 3767 0 65535 MEDIUMINT -8388608 8388607 0 1677715 3 INT -147483648 147483647 0 49496795 4 czy jest potrzebny int, może wystarczy smallint lub tinyint? 33

Join SELECT c.id_customer, i.id_invoice, ii.product FROM customers AS c LEFT JOIN invoices AS i LEFT JOIN invoice_items AS ii ON (i.id_invoice=ii.id_invoice) WHERE i.id_currency=1; Problem: całkowite złączenie tabel customers i invoices zanim zacznie się filtrowanie wierszy. Rozwiązanie: SELECT c.id_customer, i.id_invoice, ii.product FROM invoices AS i LEFT JOIN customers AS c LEFT JOIN invoice_items AS ii ON (i.id_invoice=ii.id_invoice) WHERE i.id_currency=1; 34

SELECT c.id_customer, i.id_invoice, ii.product FROM customers AS c LEFT JOIN invoices AS i LEFT JOIN invoice_items AS ii ON (i.id_invoice=ii.id_invoice) WHERE i.id_currency=1; invoices customers id_customer email 1 test@example.org 3 id_invoice id_customer id_currency 1 5 10 3 11 3 4 1 4 1 5 1 6 1 test@example.org test@example.org 4 test@example.org 5 test@example.org 35

SELECT c.id_customer, i.id_invoice, ii.product FROM invoices AS i LEFT JOIN customers AS c LEFT JOIN invoice_items AS ii ON (i.id_invoice=ii.id_invoice) WHERE i.id_currency=1; invoices customers id_invoice id_customer id_currency id_customer email 1 5 10 1 test@example.org 3 11 test@example.org 3 4 1 3 test@example.org 4 1 4 test@example.org 5 1 5 test@example.org 6 1 36

Wielokrotny JOIN Lepiej podzielić na mniejsze zapytania, wrzucić cache i łączyć na poziomie aplikacji 37

Float `price` float(10,5) unsigned NOT NULL, INSERT INTO `invoice_items` ('id_item`, `id_invoice`, `id_product`, `price`, `vat_rate`) VALUES (NULL, '606', '', '5000,4889', '3'); 38

Float - rozwiązanie `price` decimal(10,5) unsigned NOT NULL, INSERT INTO `invoice_items` ('id_item`, `id_invoice`, `id_product`, `price`, `vat_rate`) VALUES (NULL, '606', '', '5000,4889', '3'); 39

Typy kolumn 40

Typy kolumn zamiast typu string/varchar lepiej użyć id typu labelowanie dla poszczególnych id w osobnej tabeli słownikowej like jest relatywnie wolny użycie like %xxx% nie pozwala wykorzystać indeksów 41

Typy kolumn - rozwiązanie 4

Explain - podsumowanie minimalizować iloczyn liczby sprawdzanych wierszy unikać using temporary unikać ALL w joinach (pełny przegląd tabeli) łączyć przez eq_ref (jest najlepsze) 43

Dziękuję za uwagę Rafał Kern rafal.kern@rst.com.pl 44