040 STRUCTURED QUERY LANGUAGE Prof. dr hab. Marek Wisła
SQL strukturalny język zapytań SQL (Structured Query Language) strukturalny język zapytań używany do tworzenia, modyfikowania relacyjnych baz danych oraz do umieszczania, modyfikowania i wyszukiwania danych w tych bazach (standard od 1986 r). SQL jest językiem deklaratywnym - decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi zarządzania bazą danych (SZBD) (użytkownik deklaruje, co chce uzyskać, a nie jak to chce realizować). SQL jest językiem wysokiego poziomu (4GL) opartym na języku angielskim.
SQL - historia Początek lat 70-tych XX w. System/R z językiem SEQUEL (IBM) (Structured English Query Language) Koniec lat 70-tych XX w. ORACLE pierwszy SZBD oparty na SQL 1986 pierwszy standard SQL (SQL-86) (ANSI) 1987 standard SQL-1 (ISO) 1989 SQL-89 1992 SQL-2 (SQL-92) (ANSI, ISO) (m.in. sterowanie transakcjami, sesjami) 1999 SQL-3 (SQL-99) (elementy obiektowości) 2003 SQL-2003 2006 SQL-2006 2008 SQL-2008 2011 SQL-2011
Transact-SQL (T-SQL) Zmodyfikowana wersja standardu SQL-92 wykorzystywana w produktach Microsoft SQL Server, uzupełniona o elementy typowe dla proceduralnych języków programowania, takie jak zmienne i instrukcje sterujące.
Podzbiory języka SQL SQL DDL (Data Definition Language) umożliwia tworzenie, modyfikowanie i usuwanie baz i tabel - struktur, w których przechowywane są dane (CREATE, DROP, ALTER) SQL DML (Data Manipulation Language) umożliwia operowanie na danych, ich umieszczanie w bazie, wyszukiwanie, modyfikowanie i usuwanie (INSERT, SELECT, UPDATE, DELETE) SQL DCL (Data Control Language) pozwala na kontrolowanie dostępu użytkowników do obiektów bazy danych (GRANT, DENY, REVOKE)
Alfabet języka SQL Zestaw znaków SQL jest zwykle charakterystyczny dla implementacji - obejmuje duże i małe litery, cyfry, oraz znaki specjalne:, ; ( ). % _ > < = + - * /? :! spacja itd. Identyfikatory (nazwy) umożliwiają dostęp do obiektów bazodanowych: tabel, kolumn (atrybutów), widoków, schematów, itp. Polecenia i funkcje rozpoczynają się słowem kluczowym (tradycyjnie zapisywanym dużymi literami (nie jest to wymóg) i mogą zawierać tzw. modyfikatory - polecenia kończą się średnikiem (nie jest to konieczne w Transact- SQL). Stałe tekstowe zapisywane są w pojedynczych cudzysłowach, np. 'Warszawa'.
Alfabet języka SQL Znak * oznacza wszystkie kolumny (atrybuty) tabeli. Komentarze: Dwa minusy (--) powodują ignorowanie wszystkich pozostałych znaków w tej linii, np. -- To jest komentarz Znaki /* i */ ograniczają blok znaków (być może w kilku wierszach), który jest pomijany przez kompilator, np.. /* Pierwsza linia komentarza Druga linia komentarza itd... */
Notacje Notacje, które będą wykorzystywane w dalszym ciągu wykładu:: [element] oznacza opcjonalne (może, ale nie musi) wystąpienie elementu {element} oznacza wielokrotne wystąpienie elementu lub jego brak element1 element2 oznacza albo element1, albo element2
Zasada poprawnych skryptów DDL Podstawowa zasada prawidłowo napisanych skryptów manipulujących obiektami SQL: Każdy skrypt musi dopuszczać możliwość jego wielokrotnego uruchamiania bez wystąpienia błędów. W szczególności przed utworzeniem lub usunięciem każdego obiektu musi być wykonane sprawdzenie czy tworzony obiekt nie istnieje lub czy usuwany obiekt istnieje.
DDL Tworzenie i usuwanie baz danych Tworzenie bazy danych o podanej nazwie IF DB_ID('MojaBaza') IS NULL CREATE DATABASE MojaBaza; Usuwanie bazy o podanej nazwie IF DB_ID('MojaBaza') IS NOT NULL DROP DATABASE MojaBaza
DDL Tworzenie tabeli CREATE TABLE nazwa-tabeli ( nazwa-kolumny typ-danych [NOT NULL] [UNIQUE] [CHECK (warunek)] {, nazwa-kolumny typ-danych [NOT NULL] [UNIQUE] [CHECK (warunek)]} [, PRIMARY KEY (nazwa-kolumny {, nazwa-kolumny} )] [, FOREIGN KEY (nazwa-kolumny {, nazwa-kolumny} ) REFERENCES nazwa-tabeli (nazwa-kolumny {, nazwa-kolumny} )] ); Zapytanie tworzy tabelę o podanej nazwie i określonych nazwach kolumn, określa ograniczenia nakładane na charakter i wartości danych, które mogą wystąpić w poszczególnych kolumnach oraz definiuje powiązania z innymi tabelami.
Typy danych Typ danych charakteryzuje, jakiego rodzaju wartość możemy umieścić jako wartość danej w określonej kolumnie. Poszczególne typy danych można zakwalifikować do różnych grup, według funkcjonalności, jaką mogą spełniać: dane tekstowe: CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, NTEXT dane liczbowe: INT, SMALLINT, BIGINT, TINYINT, FLOAT, REAL, DECIMAL, NUMERIC dane typu data/czas: DATETIME, SMALLDATETIME dane binarne: BINARY, VARBINARY, BLOB dane walutowe (pieniężne): MONEY, SMALLMONEY dane specjalne: IMAGE, XML, UNIQUEIDENTIFIER, TIMESTAMP. Konkretne implementacje różnią się wykorzystywanymi typami danych
Przykłady typów danych SMALLINT dwubajtowa liczba całkowita INT czterobajtowa liczba całkowita FLOAT liczba rzeczywista DOUBLE liczba rzeczywista podwójnej precyzji DECIMAL (m,n) liczba zapisywana na m pozycjach z n cyframi po kropce CHAR (n) ciąg znaków o stałej długości n VARCHAR (n) ciąg znaków o zmiennej długości, maksymalnie n TEXT ciąg znaków ASCII BLOB dane binarne DATE dane określające datę TIME dane określające czas DATETIME dane określające datę i czas
Ograniczenia Poszczególne kolumny w tworzonej tabeli mogą posiadać ograniczenia co do dopuszczalnych danych: NOT NULL zastosowanie tego ograniczenia wymusi, aby w każdej krotce występująca w tej kolumnie wartość była niepusta, UNIQUE zastosowanie tego ograniczenia wymusi, aby w każdej krotce występująca w tej kolumnie wartość była unikalna dla tej kolumny, CHECK (warunek) zastosowanie tego ograniczenia wymusi, aby w każdej krotce występująca w tej kolumnie wartość spełniała podany warunek (do budowy warunku możemy użyć operatorów logicznych, between, in, like itp.).
Powiązania Fraza PRIMARY KEY określa nazwy kolumn, które w danej tabeli tworzą klucz główny. Fraza FOREIGN KEY określa nazwy kolumn, które w danej tabeli tworzą klucz obcy. Fraza REFERENCES określa nazwę tabeli powiązaną z tworzoną tabelą podanym kluczem obcym, określając jednocześnie nazwy kolumn odpowiadających temu powiązaniu.
Zasady tworzenia tabel Każda tabela powinna posiadać autoinkrementowaną kolumnę ID typu INT. Pozwala ona w łatwy sposób posortować wiersze wg kolejności ich wstawiania do tabeli. Tylko w wyjątkowych przypadkach kolumna ID może być kluczem własnym tabeli. Klucz własny tabeli powinien być oparty albo o wyróżniający unikalny atrybut (np. numer indeksu) lub, w przypadku braku takiego atrybutu, o kolumnę sysguid opisaną poniżej.
Zasady tworzenia tabel Każda tabela powinna posiadać kolumnę Sysguid automatycznie wypełnianą wartościami typu UNIQUEIDENTIFIER. Tego typu kolumna może być wykorzystywana jako klucz własny tabeli i automatycznie zapewnia 2NF bazy danych. Każda tabela powinna posiadać kolumny DataUtworzenia (Syscreated) i DataModyfikacji (sysmodified) typu DATETIME. Każda tabela powinna posiadać kolumny Utworzył (Syscreator) i Zmodyfikował (Sysmodifier) typu VARCHAR. Kolumny te pozwalają na wprowadzenie podstawowych mechanizmów śledzenia zmian na tabelach.
Zasady tworzenia tabel Podczas tworzenia tabeli powinien być wyspecyfikowany jej właściciel. Zwykle tym właścicielem jest dbo (database owner). Jeśli właściciel nie zostanie podany w definicji tabeli, automatycznie właścicielem staje się użytkownik tworzący tabelę. W konsekwencji tabela może nie być dostępna dla żadnego innego użytkownika poza właścicielem, co w zdecydowanej większości przypadków nie jest pożądane. Jeśli tabela ma być porównywana lub replikowana z inną tabelą, wtedy należy do niej dodać kolumnę typu TIMESTAMP. Ta kolumna będzie automatycznie wypełniana znacznikiem czasu przy każdej zmianie wartości w danym wierszu.
TIMESTAMP Timestamp jest autoinkrementowaną wartością zależną od bazy danych. Nie jest ona w żaden sposób związana z fizycznym czasem utworzenia lub zmiany kolumny w wierszu tabeli. Ostatnio wykorzystaną wartość Timestamp można sprawdzić komendą SELECT @@DBTS.
Przykład 1 IF OBJECT_ID('MojaBaza.dbo.Miasta','U') IS NULL CREATE TABLE MojaBaza.dbo.Miasta ( ID INT IDENTITY(1,1), ); Miasto VARCHAR (20) NOT NULL UNIQUE, Wojewodztwo VARCHAR (20) NOT NULL, Utworzyl VARCHAR (20) NOT NULL, DataUtworzenia DATETIME DEFAULT GETDATE(), Zmodyfikowal VARCHAR (20) NOT NULL, DataModyfikacji DATETIME DEFAULT GETDATE(), Sysguid UNIQUEIDENTIFIER DEFAULT NEWID(), Timestamp TIMESTAMP, PRIMARY KEY (Miasto)
Przykład 2 IF OBJECT_ID('dbo.Studenci','U') IS NULL CREATE TABLE dbo.studenci ( ID INT IDENTITY(1,1), NrIndeksu INT NOT NULL UNIQUE, Imie VARCHAR (15) NOT NULL, Nazwisko VARCHAR (20) NOT NULL, Miasto VARCHAR (20) NOT NULL, Utworzyl VARCHAR (20) NOT NULL, DataUtworzenia DATETIME DEFAULT GETDATE(), Zmodyfikowal VARCHAR (20) NOT NULL, DataModyfikacji DATETIME DEFAULT GETDATE(), Sysguid UNIQUEIDENTIFIER DEFAULT NEWID(), Timestamp TIMESTAMP, PRIMARY KEY (NrIndeksu), FOREIGN KEY (Miasto) REFERENCES Miasta (Miasto) );
Przykład 3 IF OBJECT_ID('dbo.Egzaminy','U') IS NULL CREATE TABLE dbo.egzaminy ( ID INT IDENTITY(1,1), NrIndeksu INT NOT NULL, Przedmiot VARCHAR (20) NOT NULL, DataEgzaminu DATETIME NOT NULL, Ocena DECIMAL (3,1) NOT NULL, Utworzyl VARCHAR (20) NOT NULL, DataUtworzenia DATETIME DEFAULT GETDATE(), Zmodyfikowal VARCHAR (20) NOT NULL, DataModyfikacji DATETIME DEFAULT GETDATE(), Sysguid UNIQUEIDENTIFIER DEFAULT NEWID(), Timestamp TIMESTAMP, PRIMARY KEY (NrIndeksu, Przedmiot, DataEgzaminu), FOREIGN KEY (NrIndeksu) REFERENCES Studenci (NrIndeksu) );
DDL Modyfikowanie tabeli ALTER TABLE nazwa-tabeli [ADD nazwa-kolumny typ-danych [NOT NULL] [UNIQUE] [CHECK (warunek)]] [ADD nazwa-ograniczenia] [ALTER [COLUMN] stara-nazwa-kolumny nowa-nazwakolumny typ-danych [NOT NULL] [UNIQUE] [CHECK (warunek)]] [DROP nazwa-kolumny] [DROP CONSTRAINT nazwa-ograniczenia]
Modyfikowanie tabeli Komenda ALTER TABLE pozwala modyfikować strukturę tabeli o podanej nazwie, w szczególności: dodawać nowe kolumny i określać dla ich ograniczenia dodawać nowe ograniczenia dla istniejących kolumn zmieniać kolumny i określone dla nich ograniczenia usuwać kolumny
Przykład dodania kolumny IF OBJECT_ID('dbo.Miasta','U') IS NOT NULL IF COL_LENGTH ('Miasta', 'KodPocztowy') IS NULL ALTER TABLE Miasta ADD KodPocztowy VARCHAR(10) NULL
DDL - Usuwanie tabeli DROP TABLE MojaTabela Przykład: Usunąć tabelę Egzaminy. IF OBJECT_ID('dbo.Egzaminy','U') IS NOT NULL DROP TABLE dbo.egzaminy
Usuwanie zawartości tabeli Poniższa komenda usuwa całą zawartość tabeli, ale nie usuwa samej tabeli. Dodatkowo kolumny autoinkrementowane typu całkowitego (np. ID) są resetowane do początkowej wartości. TRUNCATE TABLE MojaTabela Przykład: Usunąć zawartość tabeli Egzaminy. IF OBJECT_ID('dbo.Egzaminy','U') IS NOT NULL TRUNCATE TABLE dbo.egzaminy
Usuwanie wybranych wierszy z tabeli Poniższa komenda usuwa te wiersze z tabeli, które spełniają podany warunek. Jeśli warunek jest spełniony dla wszystkich wierszy (np. 1=1), to z tabeli usunięte zostaną wszystkie wiersze, ale sama tabela nie zostanie usunięta. Uwaga: w tym przypadku kolumny autoinkrementowane typu całkowitego (np. ID) nie są resetowane do początkowych wartości. DELETE FROM MojaTabela WHERE MojWarunek Przykład: Usunąć z tabeli Egzaminy informacje o egzaminach studenta o numerze indeksu 2100089. IF OBJECT_ID('dbo.Egzaminy','U') IS NOT NULL DELETE FROM TABLE dbo.egzaminy WHERE NrIndeksu = 2100089
Zasady usuwania danych Nigdy nie usuwaj danych z tabeli opierając się na warunku w którym nie występuje klucz własny tej tabeli. Taki sposób usuwania danych prowadzi do zablokowania całej tabeli na czas usuwania, a w konsekwencji grozi zablokowaniem (deadlock) całej bazy danych. Przed wywołaniem komendy DELETE należy wstępnie wyznaczyć klucze wierszy, które mają zostać usunięte i dopiero wtedy rozpocząć usuwanie danych. Najbardziej optymalną metodą jest posłużenie się tabelą tymczasową, w której zapisujemy klucze wierszy do usunięcia.
Usuwanie danych przykład Usunąć miasta z tych województw, których nazwy zawierają tekst polska. IF OBJECT_ID('tempdb.dbo.#MiastaDoUsuniecia','U') IS NOT NULL DROP TABLE #MiastaDoUsuniecia CREATE TABLE #MiastaDoUsuniecia ( Miasto VARCHAR (20) COLLATE DATABASE_DEFAULT, PRIMARY KEY (Miasto)) INSERT INTO #MiastaDoUsuniecia SELECT Miasto FROM Miasta WITH (NOLOCK) WHERE Wojewodztwo LIKE '%polska' DELETE FROM Miasta WHERE Miasto IN (SELECT Miasto FROM #MiastaDoUsuniecia) IF OBJECT_ID('tempdb.dbo.#MiastaDoUsuniecia','U') IS NOT NULL DROP TABLE #MiastaDoUsuniecia
Zasady wstawiania danych Przed wstawieniem wiersza należy obowiązkowo sprawdzić, czy wstawiany wiersz posiada klucz, który jeszcze nie pojawił się w tabeli. Jeśli klucz wstawianego wiersza nie jest nowym kluczem, wstawianie zakończy się błędem. W takim przypadku zamiast wstawiania zwykle wykonujemy modyfikację istniejącego wiersza w tabeli w oparciu o nowe dane. Kolumny autoinkrementowane i typu TIMESTAMP nie mogą mieć ręcznie przypisanych wartości.
DML Wstawianie pojedynczych wierszy INSERT INTO nazwa-tabeli [(nazwa-kolumny {, nazwa-kolumny} )] VALUES (wartość {, wartość} [(wartość {, wartość}] ); Powyższa komenda wstawia nowy wiersz (rekord) w tabeli o podanej nazwie, złożony z podanych wartości umieszczonych w kolumnach o podanych nazwach lub wszystkich kolumnach w przypadku, gdy nie podamy nazw kolumn (lista wartości musi być zgodna z listą nazw kolumn co do ilości, jak i typów danych).
DML Wstawianie wielu wierszy INSERT INTO nazwa-tabeli [(nazwa-kolumny {, nazwakolumny} )] SELECT [(nazwa-kolumny {, nazwa-kolumny} )] FROM nazwa-tabeli2 WHERE warunek ; Ta komenda wstawia nowe wiersze do tabeli o podanej nazwie, złożone z wyników podanego zapytania SELECT
Przykład 1 Usunąć całą zawartość tabeli Miasta i wstawić nowe trzy wiersze. IF OBJECT_ID('dbo.Miasta','U') IS NOT NULL BEGIN TRUNCATE TABLE dbo.miasta INSERT INTO dbo.miasta (Miasto,Wojewodztwo) VALUES ('Konin','Wielkopolskie'), ('Poznan','Wielkopolskie'), ('Warszawa','Małopolskie') END
Przykład 2 Wstawić do tabeli Studenci nowego studenta Adama Kowalskiego urodzonego w Koninie. Nadać mu numer indeksu 103628. IF OBJECT_ID('dbo.Studenci','U') IS NOT NULL BEGIN IF NOT EXISTS (SELECT ID FROM Studenci WITH (NOLOCK) WHERE NrIndeksu = 103628) INSERT INTO Studenci (NrIndeksu, Imie, Nazwisko, Miasto) VALUES (103628, 'Adam', 'Kowalski', 'Konin') END
Zasady aktualizowania danych Aktualizowanie danych zawsze związane jest z zablokowaniem wiersza (lub całej tabeli!) dla innych użytkowników. Dlatego konieczne jest wstępne ustalenie klucza lub kluczy wyznaczającej wiersze, które mają zostać uaktualnione i wykonanie aktualizacji dokładnie na tych wierszach, które mają być zmienione. Warunek w komendzie UPDATE musi odnosić się do klucza tabeli (chociaż nie jest to wymagane przez standard języka SQL).
DML Aktualizacja danych UPDATE nazwa-tabeli SET nazwa-kolumny = nowa-wartość {, nazwa-kolumny = nowa-wartość} [WHERE warunek]; Powyższa komenda w tabeli o podanej nazwie zmienia wartości na nowe w kolumnach o podanych nazwach w wierszach określonych przez warunek.. Gdy nie podamy warunku selekcji, zmienione zostaną wartości w podanych kolumnach we wszystkich wierszach.
Przykład 1 Zmienić miasto urodzenia studenta Adama Kowalskiego na Kraków. DECLARE @NrIndeksu VARCHAR(20) IF OBJECT_ID('dbo.Studenci','U') IS NOT NULL BEGIN SET @NrIndeksu = (SELECT NrIndeksu FROM Studenci WITH (NOLOCK) WHERE Imie = 'Adam' AND Nazwisko = 'Kowalski'); UPDATE Studenci SET Miasto = 'Kraków' WHERE NrIndeksu = @NrIndeksu; END Uwaga: NrIndeksu jest kluczem własnym tabeli Studenci.
Przykład 2 Uaktualnić dane w tabeli Miasta dodać informację, że wpisy o miastach z tych województw, których nazwy zawierają tekst polska, zostały utworzone przez użytkownika Kowalski. IF OBJECT_ID('tempdb.dbo.#MiastaDoAktualizacji','U') IS NOT NULL DROP TABLE #MiastaDoAktualizacji CREATE TABLE #MiastaDoAktualizacji ( Miasto VARCHAR (20) COLLATE DATABASE_DEFAULT, PRIMARY KEY (Miasto)) INSERT INTO #MiastaDoAktualizacji SELECT Miasto FROM Miasta WITH (NOLOCK) WHERE Wojewodztwo LIKE '%polska' UPDATE Miasta SET Utworzył = 'Kowalski' WHERE Miasto IN (SELECT Miasto FROM #MiastaDoAktualizacji) IF OBJECT_ID('tempdb.dbo.#MiastaDoAktualizacji','U') IS NOT NULL DROP TABLE #MiastaDoAktualizacji
Wyszukiwanie informacji SELECT [DISTINCT] * nazwa-kolumny {, nazwakolumny} FROM nazwa-tabeli {, nazwa-tabeli} [WHERE warunek] [GROUP BY nazwa-kolumny {, nazwa-kolumny}] [HAVING warunek] [ORDER BY nazwa-kolumny [ASC DESC] {, nazwakolumny [ASC DESC]}]
Komenda SELECT Wyszukuje i zwraca jako wyniki dane zapisane w kolumnach o nazwach podanych po SELECT, zawarte w tabelach o nazwach podanych po FROM, spełniające warunek podany po WHERE, przy czym wyniki mogą być grupowane wg kolumn, których nazwy podano po GROUP BY, po zgrupowaniu spełniające warunek podany po HAVING i uporządkowane rosnąco (ASC) lub malejąco (DESC) wg kolumn, których nazwy podano po ORDER BY DISTINCT powoduje usuwanie powtarzających się wierszy wyniku.
Przykłady SELECT * FROM Studenci; SELECT Miasto FROM Miasta WHERE Wojewodztwo = 'wielkopolskie'; SELECT Studenci.NrIndeksu, Imie, Nazwisko, Przedmiot, Ocena FROM Studenci, Egzaminy WHERE Studenci.NrIndeksu = Egzaminy.NrIndeksu;
Projekcja i selekcja Projekcja: SELECT nazwa-kolumny {, nazwa-kolumny} FROM nazwa-tabeli; Selekcja: SELECT * FROM nazwa-tabeli WHERE warunek;
Złączenie tabel SELECT nazwa-kolumny {, nazwa-kolumny} FROM nazwa-tabeli1 INNER JOIN nazwa-tabeli2 ON nazwa-tabeli1.nazwa-kolumny = nazwatabeli2.nazwa-kolumny;
Zasady łączenia tabel Złączenia tabel wykonuj przede wszystkim na kolumnach, które są kluczami własnymi tabel. Złączenia wykonane na kolumnach, które nie są kluczami własnymi niesie niebezpieczeństwa: Znacznego wydłużenia czasu wykonania zapytania (może być konieczne przeskanowanie całych tabel). Nieoczekiwanego przez programistę zwielokrotnienia wyników zapytania. Po złączeniu tabel zawsze sprawdzaj ilość zwracanych wierszy kontroluj czy nie zostały one zwielokrotnione.
Wyrażenia i funkcje agregujące W zapytaniu SELECT zamiast nazwy-kolumny możemy napisać wyrażenie zbudowane z nazw kolumn połączonych operatorami arytmetycznymi (+, -, *, /) lub użyć wywołania funkcji agregującej: MIN (nazwa-kolumny) najmniejsza wartość w podanej kolumnie MAX (nazwa-kolumny) największa wartość w podanej kolumnie COUNT (*) liczba wierszy w tabeli SUM (nazwa-kolumny) suma wartość w podanej kolumnie AVG (nazwa-kolumny) średnia arytmetyczna wartość w podanej kolumnie.
Zmiana nazwy kolumny Gdy w poleceniu SELECT, zamiast nazwy-kolumny napiszemy wyrażenie zbudowane z nazw kolumn połączonych operatorami arytmetycznymi lub użyjemy wywołania funkcji agregującej, możemy po słowie AS podać nazwę, która zostanie przyjęta dla kolumny wyniku, np. SELECT Przedmiot, AVG (Ocena) AS [Średnia ocena] FROM Egzaminy GROUP BY Przedmiot; SELECT Przedmiot, [Średnia ocena] = AVG (Ocena) FROM Egzaminy GROUP BY Przedmiot;
Aliasy W przypadku złączeń kilku tabel możemy określić aliasy (skrótowe nazwy tych tabel), aby wykorzystać je przed nazwą kolumny, w celu określenia, z której tabeli pochodzi dana kolumna. Aliasy są niezbędne, gdy łączona jest ze sobą ta sama tabela. SELECT nazwa-kolumny {, nazwa-kolumny} FROM nazwa-tabeli1 INNER JOIN nazwa-tabeli2 WHERE nazwa-tabeli1.nazwa-kolumny = nazwa-tabeli2.nazwakolumny; możemy zastąpić poleceniem z aliasami SELECT nazwa-kolumny {, nazwa-kolumny} FROM nazwa-tabeli1 t1, nazwa-tabeli2 t2 WHERE t1.nazwa-kolumny = t2.nazwa-kolumny;
Warunek WHERE Do budowy warunku po słowie WHERE możemy wykorzystać: operatory porównania: =, <>,!=, <, <=, >, >= operatory logiczne: AND, OR, NOT operator BETWEEN wartość AND wartość operator IN (wartość {, wartość}) operator IS NULL operator LIKE ciąg-znaków - sprawdza, czy dana wartość tekstowa jest zgodna ze wzorcem podanego ciągu znaków (we wzorcu % oznacza dowolny ciąg znaków, a _ oznacza dowolny, pojedynczy znak)
Zasady filtrowania danych Zawsze w warunku WHERE staraj się korzystać z pól zawartych w kluczu własnym tabeli (lub w kluczach tabel złączonych). Jeśli to nie jest możliwe rozważ dodanie nowego indeksu do tabeli tak, aby kolumny użyte w warunku WHERE były elementami nowego indeksu.
GROUP BY Aby pogrupować wyniki polecenia SELECT wg określonych nazw kolumn, używamy GROUP BY. Najczęściej wykorzystujemy wówczas funkcje agregujące. Lista nazw kolumn występujących po słowie SELECT a nie będących funkcjami agregującymi, musi zostać powtórzona po słowie GROUP BY, przy czym kolejność nazw kolumn tu występujących będzie określała kolejność grupowania. SELECT Przedmiot, [Średnia ocena] = AVG (Ocena) FROM Egzaminy GROUP BY Przedmiot
HAVING HAVING występuje wyłącznie w połączeniu z GROUP BY i służy do selekcji (przy pomocy podanego warunku) zbioru pogrupowanych wyników. SELECT Przedmiot, Egzaminator, [Średnia ocena] = AVG (Ocena) FROM Egzaminy WHERE Przedmiot = 'Bazy danych' GROUP BY Przedmiot, Egzaminator HAVING AVG (Ocena) > 3.8
Zasady filtrowania danych Bez wyraźnej konieczności nie używaj warunków HAVING. Warunki HAVING wpływają na znaczne zmniejszenie prędkości wykonywania zapytania.
ORDER BY Wyniki wykonania polecenia SELECT mogą zostać uporządkowane wg określonych nazw kolumn przy pomocy ORDER BY. Porządek może być rosnący (ASC) (domyślny) lub malejący (DESC), dla każdej nazwy kolumny z osobna. Kolejność nazw kolumn po słowie ORDER BY będzie określała kolejność porządkowania. SELECT Przedmiot, Egzaminator, [Średnia ocena] = AVG (Ocena) FROM Egzaminy GROUP BY Przedmiot, Egzaminator HAVING AVG (Ocena) > 3.8 ORDER BY Przedmiot
Kontrola dostępu DCL - GRANT GRANT prawo-do-operacji (nazwa-kolumny {, nazwakolumny} ) ON nazwa-tabeli TO użytkownik IDENTIFIED BY 'haslo'; Powyższa komenda nadaje prawo do wykonywania określonych operacji określonemu użytkownikowi
DENY Komenda odmawiająca prawa do wykonywania określonych operacji określonemu użytkownikowi: DENY prawo-do-operacji (nazwa-kolumny {, nazwakolumny} ) ON nazwa-tabeli TO użytkownik;
REVOKE REVOKE prawo-do-operacji (nazwa-kolumny {, nazwakolumny} ) ON nazwa-tabeli TO użytkownik; Komenda wycofująca nadanie prawa lub odebranie prawa do wykonywania określonych operacji określonemu użytkownikowi.
Wybrane prawa do operacji ALL wszystkie operacje, CREATE tworzenie tabeli ALTER zmiana struktury tabeli, DROP usuwanie tabeli, INSERT wstawianie danych SELECT wyszukiwanie danych, UPDATE modyfikowanie danych DELETE usuwanie danych z tabeli