SQL DML (Data Manipulation Language)
SELECT |
|
INSERT |
INSERT INTO tabela (kolumna1, kolumna2) VALUES ('wartość1', 'wartość2');
|
UPDATE |
UPDATE tabela SET kolumna1 = 'nowa_wartość' WHERE warunek;
|
DELETE |
DELETE FROM tabela WHERE warunek;
|
DML umożliwia manipulację danymi w bazie danych, obejmuje operacje takie jak wstawianie, modyfikowanie, usuwanie i pobieranie danych z bazy.
SQL DQL (Data Query Language)
SELECT |
SELECT kolumna1, kolumna2 FROM tabela WHERE warunek;
|
DISTINCT |
SELECT DISTINCT kolumna FROM tabela;
|
ORDER BY |
SELECT kolumna1, kolumna2 FROM tabela ORDER BY kolumna1 ASC;
|
GROUP BY |
SELECT kolumna, COUNT(*) FROM tabela GROUP BY kolumna;
|
DQL służy do pobierania danych z bazy danych, umożliwia formułowanie zapytań, które pozwalają na selekcję i wyszukiwanie określonych danych z tabel. SQL DQL oferuje również inne funkcje, takie jak filtrowanie danych za pomocą warunków, łączenie tabel, operatory logiczne i wiele innych. DQL umożliwia elastyczne i precyzyjne pobieranie danych z bazy danych.
SQL DDL (Data Definition Language)
CREATE (TABLE, DATABASE, ...) |
CREATE TABLE tabela ( kolumna1 typ_danych, kolumna2 typ_danych, ... );
|
CREATE VIEW |
CREATE VIEW widok AS SELECT kolumna1, kolumna2 FROM tabela WHERE warunek;
|
ALTER TABLE (ADD, DROP, ALTER) |
ALTER TABLE tabela ADD kolumna typ_danych;
|
DROP (TABLE, DATABASE, ...) |
|
DDL służy do definiowania struktury i organizacji bazy danych. DDL umożliwia tworzenie, modyfikację i usuwanie obiektów bazy danych, takich jak tabele, widoki, indeksy, sekwencje itp. SQL DDL oferuje również inne instrukcje, takie jak tworzenie indeksów, sekwencji, ograniczeń integralności, procedur składowanych i wiele innych. DDL umożliwia definiowanie struktury i organizacji bazy danych, co jest kluczowe dla tworzenia i zarządzania danymi w systemach baz danych.
SQL DCL (Data Control Language)
GRANT |
używana do udzielania uprawnień użytkownikom w bazie danych |
GRANT SELECT, INSERT ON tabela TO użytkownik;
|
REVOKE |
używana do cofania uprawnień użytkownikom w bazie danych |
REVOKE DELETE ON tabela FROM użytkownik;
|
GRANT ROLE |
używana do nadawania roli użytkownikowi w bazie danych |
GRANT rola TO użytkownik;
|
COMMIT |
używana do zatwierdzania transakcji, czyli trwałego zapisania zmian wprowadzonych w bazie danych |
|
DCL odpowiada za kontrolę dostępu do bazy danych, obejmuje instrukcje umożliwiające zarządzanie uprawnieniami użytkowników, zabezpieczeniami i transakcjami w bazie danych. SQL DCL jest ważnym elementem zarządzania bazą danych, umożliwiając kontrolę dostępu, zabezpieczenia i trwałość danych. DCL zapewnia mechanizmy niezbędne do zarządzania uprawnieniami użytkowników oraz zabezpieczeń w celu ochrony danych w bazie.
SQL TCL (Transactional Control Language)
COMMIT |
używana do zatwierdzania bieżącej transakcji, co oznacza trwałe zapisanie wprowadzonych zmian w bazie danych |
|
ROLLBACK |
jest używana do wycofywania bieżącej transakcji, czyli cofania wprowadzonych zmian do stanu poprzedniego |
|
SAVEPOINT |
używana do tworzenia punktu zapisu w trakcie trwania transakcji |
|
RELEASE SAVEPOINT |
używana do usunięcia punktu zapisu utworzonego za pomocą instrukcji SAVEPOINT |
RELEASE SAVEPOINT punkt_zapisu;
|
TCL obejmuje instrukcje do zarządzania transakcjami w bazie danych. TCL umożliwia rozpoczynanie, zatwierdzanie i wycofywanie transakcji oraz zarządzanie punktami zapisu. SQL TCL zapewnia kontrolę nad transakcjami w bazie danych, umożliwiając rozpoczynanie, zatwierdzanie i wycofywanie zmian. Dzięki instrukcjom TCL można zapewnić spójność i integralność danych oraz zarządzać punktami zapisu w celu odtworzenia stanu transakcji w przypadku potrzeby.
Widoki (Views)
Widoki (ang. views) to wirtualne tabele utworzone na podstawie wyników zapytań SQL. Są to logiczne reprezentacje danych, które można wykorzystać do uproszczenia złożonych zapytań, ukrycia szczegółów implementacyjnych i zapewnienia dostępu do odpowiednich danych dla różnych użytkowników.
Widoki są tworzone na podstawie istniejących tabel lub innych widoków, a ich struktura jest definiowana przez zapytanie SELECT. Po utworzeniu widoku można odwoływać się do niego tak, jakby był to zwykła tabela w bazie danych.
CREATE VIEW SalesReport AS
SELECT ProductID, SUM(Quantity * Price) AS TotalSales
FROM Sales
WHERE OrderDate BETWEEN '2022-01-01' AND '2022-12-31'
GROUP BY ProductID;
SELECT * FROM SalesReport;
|
Łączenie zbiorów (tabel)
UNION |
łączy wyniki dwóch zapytań SELECT i zwraca unikalne wiersze. Kolumny w obu zapytaniach muszą być zgodne pod względem liczby i typów danych |
SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2;
|
UNION ALL |
wykonuje łączenie wyników zapytań bez usuwania duplikatów |
SELECT column1, column2 FROM table1 WHERE condition UNION ALL SELECT column1, column2 FROM table2 WHERE condition;
|
INTERSECT |
zwraca tylko te wiersze, które występują jednocześnie w wynikach obu zapytań SELECT |
SELECT column1, column2 FROM table1 INTERSECT SELECT column1, column2 FROM table2;
|
EXCEPT (lub MINUS) |
zwraca tylko te wiersze, które występują w wyniku pierwszego zapytania SELECT, ale nie występują w wyniku drugiego zapytania SELECT |
SELECT column1, column2 FROM table1 EXCEPT SELECT column1, column2 FROM table2;
|
Łączenie tabel
JOIN (INNER JOIN) |
SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
|
LEFT JOIN |
SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
|
RIGHT JOIN |
SELECT Customers.CustomerName, Orders.OrderID FROM Customers RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
|
FULL JOIN |
SELECT Customers.CustomerName, Orders.OrderID FROM Customers FULL JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
|
Zagnieżdżone zapytania (subqueries) |
SELECT * FROM Table1 WHERE Column1 IN ( SELECT Column1 FROM Table2 WHERE Column2 = 'wartość' );
|
Warunki złączenia (JOIN conditions) w klauzuli WHERE |
SELECT * FROM Table1, Table2 WHERE Table1.Column1 = Table2.Column1;
|
Funkcje skalarne |
SELECT Table1.Column1, Table1.Column2, ( SELECT Column3 FROM Table2 WHERE Table2.Column1 = Table1.Column1) AS Column3 FROM Table1;
|
CROSS JOIN |
SELECT * FROM Table1 CROSS JOIN Table2;
|
NATURAL JOIN (automatycznie łączy dwie tabele na podstawie wspólnych nazw kolumn) |
SELECT * FROM Table1 NATURAL JOIN Table2;
|
Funkcje okna (window functions)
Funkcje okna (window functions) w SQL umożliwiają przeprowadzenie obliczeń na grupach wierszy, zwanych "oknami", wewnątrz wynikowego zestawu danych. Pozwalają na wykonywanie zaawansowanych operacji agregacyjnych, rankingowych i analitycznych w kontekście określonych grup wierszy. Oto kilka kluczowych informacji na temat funkcji okna wraz z przykładami:
1. Składnia:
Funkcje okna są zwykle wywoływane za pomocą specjalnej składni, która zawiera nawiasy okrągłe wokół funkcji oraz klauzulę OVER, która określa, na jakiej podstawie powinna być obliczana funkcja okna.
Przykład:
SELECT order_id, customer_id, order_total, SUM(order_total)
OVER (PARTITION BY customer_id) AS sum_order_total
FROM orders;
Rezultat:
order_id | customer_id | order_total | sum_order_total
-----------------------------------------------------
1 | 101 | 50.00 | 150.00
2 | 101 | 75.00 | 150.00
3 | 102 | 100.00 | 250.00
4 | 103 | 200.00 | 200.00
5 | 103 | 50.00 | 200.00
2. PARTITION BY:
Klauzula PARTITION BY w funkcji okna służy do podziału wynikowego zestawu danych na grupy, na podstawie których funkcje okna są obliczane. Każda grupa otrzymuje niezależne obliczenia funkcji okna.
Przykład:
SELECT column1, column2, AVG(column3)
OVER (PARTITION BY column1, column2) AS avg_column3
FROM table;
W tym przykładzie AVG() jest funkcją okna, która oblicza średnią wartości column3 dla każdej kombinacji unikalnych wartości column1 i column2.
3. ORDER BY:
Klauzula ORDER BY w funkcji okna służy do określenia porządku sortowania w obrębie każdej grupy wierszy. Określa to, na podstawie których kolumn mają być obliczane funkcje okna.
Przykład:
SELECT column1, column2, RANK()
OVER (PARTITION BY column1
ORDER BY column2 DESC) AS rank_column2
FROM table;
4. Funkcje okna vs group by
Funkcje okna są bardziej elastycznym narzędziem, które pozwala na wykonywanie obliczeń na grupach wierszy w obrębie wynikowego zestawu danych, zachowując jednocześnie pełną strukturę wynikową. Klauzula GROUP BY jest bardziej odpowiednia, gdy chcesz dokonać agregacji danych i otrzymać zredukowany wynik dla każdej grupy. |
Bardziej zaawansowane funkcje agregujące
RANK() / DENSE_RANK() / ROW_NUMBER() |
Przypisuje wartość rankingu, gęstego rankingu lub numeru wiersza do każdego wiersza w wynikach zapytania |
SELECT kolumna, RANK() OVER (ORDER BY kolumna DESC) AS Rank FROM tabela;
|
NTILE() |
Dzieli zestaw danych na równą liczbę grup i przypisuje numer grupy do każdego wiersza |
SELECT kolumna, NTILE(4) OVER (ORDER BY kolumna) AS GroupNumber FROM tabela;
|
CUME_DIST() |
Oblicza kumulacyjną wartość dystrybucji dla danego wiersza w zestawie danych |
SELECT kolumna, CUME_DIST() OVER (ORDER BY kolumna) AS CumulativeDistribution FROM tabela;
|
FIRST_VALUE() / LAST_VALUE() |
Zwraca pierwszą lub ostatnią wartość z określonej kolumny w ramach grupy |
SELECT kolumna, FIRST_VALUE(kolumna) OVER (PARTITION BY inna_kolumna ORDER BY kolejna_kolumna) AS FirstValue FROM tabela;
|
LAG() / LEAD() |
Zwraca wartość z poprzedniego lub następnego wiersza w zestawie danych |
SELECT kolumna, LAG(kolumna) OVER (ORDER BY kolejna_kolumna) AS PreviousValue FROM tabela;
|
NTH_VALUE() |
Zwraca wartość z określonego wiersza w określonym oknie, gdzie numer wiersza jest podany |
NTH_VALUE(column, n) OVER (PARTITION BY ...)
|
row_number() / rank() / dense_rank()
percent_rank() / cume_dist()
first_value(expr) / last_value(expr)
lead() / lag()
lead(expr, offset, default) - the value for the row offset rows after the current; offset and default are optional; default values: offset = 1, default = NULL
lag(expr, offset, default) - the value for the row offset rows before the current; offset and default are optional; default values: offset = 1, default = NULL
Funkcje WITHIN GROUP
Wyrażenie "WITHIN GROUP" jest często używane w kontekście funkcji agregujących do określania porządku sortowania w wynikach agregacji. Pozwala na kontrolę kolejności sortowania wartości w grupie. Within Group jest szczególnie przydatne, gdy chcemy kontrolować kolejność sortowania wartości wewnątrz grupy w wyniku agregacji i dostosować je do naszych wymagań.
- STRING_AGG, która łączy wartości w jednym łańcuchu znaków, zdefiniowanym separatorem.
Przykład:
SELECT customer_id, STRING_AGG(order_id, ', ' ORDER BY order_id) WITHIN GROUP (ORDER BY order_id) AS order_list
FROM orders
GROUP BY customer_id;
Wynik:
+-----------------+--------------+
| customer_id | order_list |
+-----------------+--------------+
| 1001 | 1, 2 |
| 1002 | 3, 4, 5 |
+-----------------+-----------------+
- PERCENTILE_CONT():
SELECT job_title, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary)
AS median_salary
FROM employees
GROUP BY job_title;
wynik:
+---------------+-----------------+
| job_title | median_salary |
+---------------+-----------------+
| Manager | 5500.00 |
| Developer | 4000.00 |
| Analyst | 3500.00 |
+---------------+-----------------+
-PERCENTILE_DISC() - służy do obliczania wartości procentylowej dyskretnego dla określonej grupy danych. Wartość procentylowa dyskretna to wartość danych, która odpowiada określonemu percentylowi.
SELECT PERCENTILE_DISC(0.75)
WITHIN GROUP (ORDER BY score)
AS percentile_value
FROM scores;
+-----------------+
| percentile_value |
+-----------------+
| 85 |
+-----------------+
select
percentile_disc(array[0.1, 0.5, 0.9])
within group (order by liczba_pasazerow) as
kwantyle from wnioski
- PERCENTILE_DISC() vs PERCENTILE_CONT()
Funkcja PERCENTILE_DISC() zwraca dyskretną wartość danych, która odpowiada określonemu percentylowi. Oznacza to, że wartość procentylowa jest jedną z istniejących wartości w zbiorze danych. Na przykład, jeśli mamy zbiór liczb [1, 2, 3, 4, 5], to wartość procentylowa dyskretna dla 75% będzie wynosić 4, ponieważ 4 jest jedną z wartości w zbiorze.
Funkcja PERCENTILE_CONT() zwraca wartość procentylową ciągłą, która jest interpolacją między wartościami w zbiorze danych. Oznacza to, że wartość procentylowa może być wartością, która nie występuje w zbiorze danych. Na przykład, dla zbioru liczb [1, 2, 3, 4, 5], wartość procentylowa ciągła dla 75% może wynosić 4.75, co oznacza interpolację między 4 a 5 na podstawie proporcji.
- MODE() - służy do znalezienia trybu (wartości, która występuje najczęściej) w zestawie danych. Oto przykład użycia funkcji MODE() wraz z wynikami
SELECT category, MODE() WITHIN GROUP (ORDER BY category)
AS mode_category
FROM products
GROUP BY category;
+----------+-----------------+
| category | mode_category |
+----------+-----------------+
| Electronics | Electronics |
| Clothing | Clothing |
| Books | Books |
+----------+-----------------+ |
Statystyczne funkcje agregujące
CORR(dependent, independent) |
Oblicza współczynnik korelacji między dwiema zmiennymi |
SELECT CORR(sales, advertising) AS correlation FROM sales_data;
|
COVAR_POP() / COVAR_SAMP() |
Oblicza kowariancję między dwiema zmiennymi |
SELECT COVAR_POP(income, expenditure) AS covariance FROM financial_data;
|
STDDEV_POP() / STDDEV_SAMP() / STDDEV() |
Oblicza odchylenie standardowe danych |
SELECT STDDEV_POP(temperature) AS population_stddev, STDDEV_SAMP(temperature) AS sample_stddev, STDDEV(temperature) AS stddev FROM weather_data;
|
VAR_POP() / VAR_SAMP() / VARIANCE() |
Oblicza wariancję danych |
SELECT VAR_POP(sales) AS population_variance, VAR_SAMP(sales) AS sample_variance, VARIANCE(sales) AS variance FROM sales_data;
|
REGR_INTERCEPT() |
Oblicza wartość punktu przecięcia linii regresji liniowej |
SELECT REGR_INTERCEPT(sales, advertising) AS intercept FROM sales_data;
|
REGR_SLOPE() |
Oblicza współczynnik nachylenia linii regresji liniowej. |
SELECT REGR_SLOPE(sales, advertising) AS slope FROM sales_data;
|
Operatory
- Operator IN: Operator IN służy do porównywania wartości z jednym lub więcej wyników podzapytania. Zwraca prawdę (true), jeśli wartość znajduje się w wynikach podzapytania, w przeciwnym razie zwraca fałsz (false).
Przykład:
SELECT column1
FROM table1
WHERE column2 IN (SELECT column3 FROM table2);
- Operator NOT IN, który wykonuje negację operatora IN. Operator NOT IN zwraca prawdę (true), jeśli wartość nie znajduje się w wynikach podzapytania.
Przykład:
SELECT column1
FROM table1
WHERE column2 NOT IN (1, 2, 3);
- Operator = / <> (NOT EQUAL): Operator = służy do porównywania równości między dwiema wartościami. Operator <> (lub !=) sprawdza, czy wartości są różne od siebie.
Przykład:
SELECT column1
FROM table1
WHERE column2 = 'value';
SELECT column1
FROM table1
WHERE column2 <> 'value';
- Operator EXISTS: Operator EXISTS sprawdza, czy podzapytanie zwraca jakiekolwiek wiersze. Jeśli podzapytanie zwraca wyniki, to operator EXISTS zwraca prawdę (true), w przeciwnym razie zwraca fałsz (false). Operator EXISTS jest często stosowany do sprawdzania istnienia rekordów w innej tabeli.
Przykład:
SELECT column1
FROM table1
WHERE EXISTS (SELECT column2 FROM table2 WHERE column2 = table1.column3);
- Operator ANY / ALL: Operator ANY porównuje wartość z wynikami podzapytania przy użyciu określonego operatora porównania (np. >, <, =). Operator ANY zwraca prawdę (true), jeśli porównanie jest prawdziwe dla co najmniej jednego wyniku podzapytania. Operator ALL zwraca prawdę (true), jeśli porównanie jest prawdziwe dla wszystkich wyników podzapytania.
Przykład:
SELECT column1
FROM table1
WHERE column2 > ANY (SELECT column3 FROM table2);
SELECT column1
FROM table1
WHERE column2 = ALL (SELECT column3 FROM table2);
- Operator BETWEEN: Operator BETWEEN służy do porównywania wartości w określonym zakresie. Sprawdza, czy wartość znajduje się pomiędzy dwiema innymi wartościami. Może być używany w klauzuli WHERE.
Przykład:
SELECT column1
FROM table1
WHERE column2 BETWEEN 10 AND 20;
- Operator LIKE: Operator LIKE jest używany do porównywania wartości z wyrażeniem regularnym lub wzorcem. Często stosuje się go w klauzuli WHERE w celu wyszukiwania wzorców w tekście.
Przykład:
SELECT column1
FROM table1
WHERE column2 LIKE 'A%';
- Operator ILIKE jest używany w niektórych systemach baz danych (np. PostgreSQL) i działa podobnie jak operator LIKE, ale jest nieczuły na wielkość liter. Operator ILIKE porównuje wartości z wyrażeniem regularnym lub wzorcem, ignorując różnice w wielkości liter.
Przykład:
SELECT column1
FROM table1
WHERE column2 ILIKE 'a%';
- Operator IS NULL / IS NOT NULL: Operator IS NULL służy do sprawdzania, czy wartość w kolumnie jest pusta (NULL). Operator IS NOT NULL sprawdza, czy wartość nie jest pusta.
Przykład:
SELECT column1
FROM table1
WHERE column2 IS NULL;
|
Transakcje SQL
Transakcje SQL to sekwencje operacji, które muszą być wykonane jako całość - albo wszystkie zostaną zatwierdzone i zapisane w bazie danych, albo żadna z nich zostanie zapisana. Transakcje są używane do zapewnienia spójności danych i utrzymania integralności bazy danych.
W SQL transakcje są zazwyczaj używane w kontekście operacji na bazie danych, takich jak wprowadzanie zmian, aktualizacja danych, czytanie i zapisywanie danych. Oto podstawowe pojęcia związane z transakcjami SQL:
1. BEGIN/START TRANSACTION: Rozpoczyna nową transakcję.
BEGIN TRANSACTION;
2. COMMIT: Zatwierdza transakcję i wprowadza wszystkie jej zmiany do bazy danych.
COMMIT;
3. ROLLBACK: Anuluje transakcję i cofa wszystkie jej zmiany, przywracając bazę danych do stanu przed rozpoczęciem transakcji.
ROLLBACK;
4. SAVEPOINT: Utworzenie punktu kontrolnego w trakcie transakcji, który można użyć do późniejszego przywrócenia transakcji do określonego stanu.
SAVEPOINT savepoint_name;
5. RELEASE SAVEPOINT: Usuwa określony punkt kontrolny utworzony w trakcie transakcji.
RELEASE SAVEPOINT savepoint_name;
6. ROLLBACK TO SAVEPOINT: Cofa transakcję do określonego punktu kontrolnego, usuwając wszystkie zmiany po tym punkcie.
ROLLBACK TO SAVEPOINT savepoint_name;
Transakcje SQL zapewniają spójność danych w przypadku błędów, awarii systemu lub konfliktów jednoczesnego dostępu do danych. Pozwalają również na grupowanie operacji w większe jednostki logiczne i wprowadzanie zmian do bazy danych w kontrolowany sposób.
Warto zauważyć, że nie wszystkie systemy bazodanowe obsługują transakcje w taki sam sposób, a składnia i zachowanie mogą się różnić. Należy skonsultować się z dokumentacją systemu bazodanowego, którego używasz, aby uzyskać szczegółowe informacje na temat transakcji SQL w danym systemie.
Najprostszą transkacją w SQL Server jest pojedyncza instrukcja modyfikacji danych.
UPDATE Person.Address
SET AddressLine1 = 'Prosta 51'
WHERE AddressID = 1
Transakcje z wieloma operacjami (Explicit Transactions)
BEGIN TRANSACTION
UPDATE Person.Address
SET AddressLine1 = 'Prosta 51'
WHERE AddressID = 1
UPDATE Person.Address
SET AddressLine1= 'Przyokopowa 31'
WHERE AddressID = 2`
COMMIT TRANSACTION` |
Procedury, funkcje i triggery
Procedury, funkcje i triggery są elementami języka SQL, które pozwalają na definiowanie i wykonywanie niestandardowych operacji i logiki w bazie danych. Oto ich krótkie opisy:
1. Procedury:
- Procedury to zbiorcze instrukcje SQL, które są zdefiniowane i przechowywane w bazie danych.
- Procedury mogą przyjmować parametry wejściowe, wykonywać operacje na danych, a następnie zwracać wyniki lub modyfikować dane w bazie.
- Procedury mogą być wywoływane przez inne zapytania SQL lub programy aplikacyjne.
- Przykład:
CREATE PROCEDURE GetCustomerOrders
@customerId INT
AS
BEGIN
SELECT * FROM Orders WHERE CustomerId = @customerId;
END;
2. Funkcje:
- Funkcje są podobne do procedur, ale różnią się sposobem użycia i zwracanymi wartościami.
- Funkcje zwracają wartość, która może być wykorzystana w zapytaniach SQL, wyrażeniach lub instrukcjach.
- Mogą być wykorzystywane jako część zapytań SELECT, warunków WHERE, wyrażeń CASE itp.
- Funkcje mogą być skalarnymi funkcjami (zwracające pojedynczą wartość) lub funkcjami tabelarycznymi (zwracające tabelę wynikową).
- Przykład:
CREATE FUNCTION GetOrderTotal
(@orderId INT)
RETURNS DECIMAL(10, 2)
AS
BEGIN
DECLARE @total DECIMAL(10, 2);
SELECT @total = SUM(Quantity * Price) FROM OrderItems WHERE OrderId = @orderId;
RETURN @total;
END;
3. Triggery:
- Triggery są automatycznymi reakcjami na zdarzenia lub operacje w bazie danych, takie jak wstawianie, aktualizacja lub usuwanie danych.
- Trigger to blok kodu SQL, który jest wywoływany w odpowiedzi na określone zdarzenie.
- Triggery mogą być definiowane dla tabel i uruchamiane przed lub po wykonaniu określonych operacji.
- Mogą być wykorzystywane do wprowadzania logiki biznesowej, sprawdzania warunków, synchronizacji danych itp.
- Przykład:
CREATE TRIGGER UpdateOrderTotal
ON OrderItems
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE Orders
SET TotalAmount = (SELECT SUM(Quantity * Price) FROM OrderItems WHERE OrderId = inserted.OrderId)
FROM Orders INNER JOIN inserted ON Orders.OrderId = inserted.OrderId;
END;
Procedury, funkcje i triggery są potężnymi narzędziami w SQL, które pozwalają na tworzenie bardziej zaawansowanych operacji, logiki biznesowej i automatyzacji w bazach danych. Ich zastosowanie zależy od konkretnych wymagań i scenariuszy w projekcie bazodanowym.
* "@" przed nazwą oznacza, że jest to nazwa parametru wejściowego funkcji. |
sprawdzanie typów danych
- Aby sprawdzić typy danych w tabeli, można skorzystać z polecenia DESCRIBE lub DESC. Oto przykład:
DESCRIBE tabela;
Lub
DESC tabela;
To polecenie wyświetli informacje o strukturze tabeli, w tym nazwy kolumn, typy danych, rozmiary kolumn itp.
- Alternatywnie, można również skorzystać z zapytania SHOW COLUMNS FROM tabela, które również zwróci informacje o typach danych w tabeli. Oto przykład:
SHOW COLUMNS FROM tabela;
Oba te polecenia zwrócą wyniki, które przedstawiają typy danych dla każdej kolumny w tabeli, wraz z innymi informacjami takimi jak nazwy kolumn, klucze główne, atrybuty null itp.
- Aby sprawdzić typ danych na konkretnej kolumnie w tabeli, można użyć polecenia DESCRIBE z podaniem nazwy kolumny. Oto przykład:
DESCRIBE tabela nazwa_kolumny;
Na przykład, jeśli chcemy sprawdzić typ danych kolumny "imie" w tabeli "uzytkownicy", użyjemy polecenia:
DESCRIBE uzytkownicy imie;
Polecenie to zwróci informacje dotyczące typu danych dla określonej kolumny, takie jak typ danych, rozmiar, atrybuty null itp. |
SELECT a SELECT ''
Różnica między SELECT FROM tabela a SELECT '' FROM tabela polega na tym, jak zostaną zwrócone dane.
- SELECT * FROM tabela: Wykonanie tego zapytania zwróci wszystkie kolumny (wszystkie dane) z tabeli. Każda kolumna zostanie zwrócona jako oddzielna kolumna wynikowa. Przykład:
CREATE TABLE osoba (
id INT,
imie VARCHAR(50),
nazwisko VARCHAR(50)
);
INSERT INTO osoba (id, imie, nazwisko)
VALUES (1, 'John', 'Doe'),
(2, 'Jane', 'Smith');
SELECT * FROM osoba;
Wynik:
| id | imie | nazwisko |
|----|------|----------|
| 1 | John | Doe |
| 2 | Jane | Smith |
- SELECT '*' FROM tabela: Wykonanie tego zapytania zwróci pojedynczą kolumnę, w której każdy wiersz będzie zawierał tekst '' (gwiazdkę). Oznacza to, że nie zostaną zwrócone rzeczywiste dane z tabeli, tylko powtórzony znak '', tyle razy, ile jest wierszy w tabeli. Przykład:
CREATE TABLE osoba (
id INT,
imie VARCHAR(50),
nazwisko VARCHAR(50)
);
INSERT INTO osoba (id, imie, nazwisko)
VALUES (1, 'John', 'Doe'),
(2, 'Jane', 'Smith');
SELECT '*' FROM osoba;
Wynik:
| '*' |
|-----|
| '*' |
| '*' |
Jak widać, w drugim przypadku zwracane są tylko powtórzone gwiazdki, nie uwzględniając rzeczywistych danych z tabeli.
Należy pamiętać, że SELECT '*' FROM tabela może mieć zastosowanie w niektórych specjalnych przypadkach, np. jako szybka metoda sprawdzenia, czy tabela zawiera dane, ale nie jest to typowe użycie przy wybieraniu rzeczywistych danych z tabeli. |
operator LIKE
W operatorze LIKE
w języku SQL można używać różnych wzorców. Oto kilka najczęściej stosowanych wzorców wraz z ich opisem:
1. %
(znak procentu):
Symbol %
odpowiada dowolnej liczbie znaków (również zero znaków). Może być używany na początku, na końcu lub w środku wzorca. Przykłady:
- '%abc'
- pasuje do ciągów, które kończą się na 'abc'
- 'abc%'
- pasuje do ciągów, które zaczynają się od 'abc'
- '%abc%'
- pasuje do ciągów, które zawierają 'abc' gdziekolwiek
2. _
(podkreślnik):
Symbol _
odpowiada dokładnie jednemu znakowi. Może być używany na początku, na końcu lub w środku wzorca. Przykłady:
- 'a_'
- pasuje do dwuznakowych ciągów, które zaczynają się od 'a'
- '_bc'
- pasuje do dwuznakowych ciągów, które kończą się na 'bc'
- '_b_'
- pasuje do trzyznakowych ciągów, które mają 'b' na drugiej pozycji
3. []
(klasy znaków):
Klasy znaków pozwalają na określenie zbioru dopuszczalnych znaków w danej pozycji. Przykłady:
- 'a[bc]d'
- pasuje do ciągów, które mają 'a', a następnie 'b' lub 'c', a potem 'd'
- '[0-9]abc'
- pasuje do ciągów, które mają cyfrę od 0 do 9, a następnie 'abc'
4. [^]
(negacja klasy znaków):
Negacja klasy znaków oznacza dopasowanie znaku, który nie jest w podanym zbiorze. Przykład:
- 'a[^bc]d'
- pasuje do ciągów, które mają 'a', a następnie znak, który nie jest 'b' ani 'c', a potem 'd'
Te wzorce można również łączyć i zagnieżdżać, aby tworzyć bardziej zaawansowane wyrażenia dopasowania w operatorze LIKE
. Warto pamiętać, że składnia i dostępność wzorców mogą się nieco różnić w zależności od używanej bazy danych.
W zwykłym operatorze LIKE w języku SQL nie ma wbudowanej składni [a-z], która reprezentuje zakres liter od "a" do "z" (czyli wszystkie małe litery w alfabecie angielskim). Operator LIKE obsługuje jedynie proste wzorce z wykorzystaniem symboli % i _, oraz klasy znaków [].
Jednak w niektórych bazach danych, takich jak PostgreSQL i MySQL, można użyć wyrażeń regularnych wraz z operatorem REGEXP lub RLIKE do bardziej zaawansowanych dopasowań, w tym zakresów liter.
Przykład z użyciem wyrażeń regularnych w PostgreSQL:
SELECT column_name
FROM table_name
WHERE column_name ~ '^[a-z]$';
Przykład z użyciem wyrażeń regularnych w MySQL:
SELECT column_name
FROM table_name
WHERE column_name REGEXP '^[a-z]$';
W powyższych przykładach wyrażenie regularne ^[a-z]$ oznacza dopasowanie jednej małej litery od "a" do "z" w kolumnie. Uwaga, że składnia i obsługa wyrażeń regularnych mogą się różnić w zależności od konkretnej bazy danych.
Wzorce takie jak % i _ wciąż mają takie same znaczenie w przypadku operatora ILIKE. Jednak operatory klasy znaków [ ] i [^ ] nie będą działać w dokładnie ten sam sposób jak w przypadku operatora LIKE. Zachowanie tych wzorców w kontekście ILIKE zależy od konkretnej bazy danych. |
is null = '', not null, <> ''
W przypadku pustych wartości (NULL) w języku SQL, operator IS NULL
jest używany do sprawdzania, czy wartość w kolumnie jest pusta (NULL), a operator IS NOT NULL
jest używany do sprawdzania, czy wartość w kolumnie nie jest pusta (nie jest NULL).
Natomiast porównanie pustej wartości z pustym ciągiem znaków ""
(empty string) jest czymś innym. Pusty ciąg znaków ""
jest traktowany jako niepusty (non-NULL) ciąg, ale nie ma żadnej zawartości. Oznacza to, że porównanie =
z pustym ciągiem znaków nie jest równoważne z operatorem IS NULL
.
Przykład:
SELECT column_name
FROM table_name
WHERE column_name = '';
W powyższym przykładzie, column_name = ''
porównuje wartość w kolumnie column_name
z pustym ciągiem znaków ''
. To sprawdzi, czy wartość jest pustym ciągiem, ale nie sprawdzi, czy jest NULL.
Podobnie, porównanie <>
z pustym ciągiem znaków nie jest równoważne z operatorem IS NOT NULL
. Porównanie <>
z pustym ciągiem znaków sprawdzi, czy wartość w kolumnie jest różna od pustego ciągu znaków, ale nadal może zawierać wartość NULL.
Jeśli chcesz sprawdzić, czy wartość w kolumnie jest pusta lub NULL, powinieneś nadal używać operatorów IS NULL
lub IS NOT NULL
.
Wniosek: Porównanie pustego ciągu znaków ''
nie jest równoważne z operatorem IS NULL
, a porównanie <> ''
nie jest równoważne z operatorem IS NOT NULL
. Dlatego zaleca się używanie operatorów IS NULL
i IS NOT NULL
do sprawdzania pustych wartości w SQL. |
Funkcje agregujące z groupby a w funkcji okna
Użycie funkcji agregujących z klauzulą GROUP BY
i w funkcjach okna ma kilka istotnych różnic:
1. Działanie na grupach: Użycie funkcji agregujących z klauzulą GROUP BY
pozwala na grupowanie danych na podstawie określonych kolumn i obliczanie agregatów dla każdej grupy. Wyniki są podzielone na grupy, a funkcje agregujące są obliczane dla każdej grupy osobno.
Przykład:
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
Użycie funkcji okna, z drugiej strony, nie grupuje danych w taki sposób. Funkcje okna obliczają wartości dla każdego wiersza w wyniku, niezależnie od grupowania. Funkcje okna działają na całym zbiorze wynikowym i nie powodują podziału na grupy.
Przykład:
SELECT employee_id, last_name, salary, SUM(salary)
OVER (PARTITION BY department) AS total_salary
FROM employees;
W powyższym przykładzie, funkcja okna SUM
jest używana do obliczania sumy wynagrodzenia dla każdego pracownika w ramach danego departamentu, ale nie powoduje to podziału na grupy.
2. Zakres obliczeń: Użycie funkcji agregujących z klauzulą GROUP BY
ogranicza wyniki do grup, dla których obliczone są agregaty. Każda grupa jest reprezentowana przez jeden wiersz wynikowy.
W przypadku funkcji okna, wynikowe wiersze odpowiadają wszystkim wierszom z wyniku zapytania, a funkcje okna obliczają wartości na podstawie określonych okien (partycji) i kolejności sortowania. Wynik zwracany przez funkcje okna zachowuje wszystkie wiersze, a nie tworzy jednego wiersza na grupę.
3. Składnia zapytania: Użycie funkcji agregujących z klauzulą GROUP BY
wymaga wyraźnego określenia kolumn, które mają być uwzględnione w grupowaniu. Natomiast użycie funkcji okna odbywa się za pomocą odpowiedniej składni w ramach klauzuli SELECT
, bez konieczności podawania klauzuli GROUP BY
.
Przykład:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
SELECT employee_id, last_name, salary, AVG(salary)
OVER (PARTITION BY department) AS avg_salary
FROM employees;
W przypadku funkcji okna, nie ma potrzeby podawania kolumny department
w klauzuli SELECT
. Funkcja okna jest wywoływana bezpośrednio w zapytaniu SELECT
, a wynik jest automatycznie obliczany dla każdego wiersza.
Podsumowując, użycie funkcji agregujących z klauzulą GROUP BY
jest skoncentrowane na grupowaniu danych i obliczaniu agregatów dla poszczególnych grup, podczas gdy funkcje okna działają na poziomie pojedynczego wiersza i pozwalają na obliczanie wartości w ramach zdefiniowanych okien i kolejności sortowania bez podziału na grupy. Ostateczny wybór między tymi podejściami zależy od wymagań zapytania i oczekiwanych wyników. |
Tabela DUAL
Tabela "DUAL" jest specjalną tabelą w niektórych bazach danych, takich jak Oracle, która jest często używana do wykonywania zapytań testowych, testowania wyrażeń SQL lub pobierania wartości bez odwoływania się do rzeczywistych tabel w bazie danych.
Tabela "DUAL" zawiera tylko jedną kolumnę o nazwie "DUMMY" i jedno zawsze jedno wiersz o wartości "X" lub "Y". Ta tabela jest zawsze dostępna w bazie danych i nie wymaga jej tworzenia.
Przykład użycia tabeli "DUAL":
SELECT 'Hello, World!' AS message FROM DUAL;
W tym przykładzie wykonujemy prosty zapytanie, które zwraca wartość 'Hello, World!' jako kolumnę "message". Ponieważ nie potrzebujemy się odwoływać do żadnej konkretnej tabeli, używamy tabeli "DUAL" jako źródła danych. Zapytanie to zwróci tylko jeden wiersz z jedną kolumną.
Tabela "DUAL" jest szczególnie przydatna w przypadkach, gdy chcemy wykonać prosty testowy zapytanie, przetestować składnię SQL lub wygenerować wartości stałe bez konieczności odwoływania się do istniejących tabel w bazie danych.
Warto jednak zaznaczyć, że nie wszystkie bazy danych obsługują tabelę "DUAL" jako domyślną tabelę specjalną. Niektóre bazy danych, takie jak MySQL czy SQL Server, nie mają wbudowanej tabeli "DUAL". W takich przypadkach można użyć innego podejścia, na przykład używając instrukcji SELECT
bez odwoływania się do jakiejkolwiek tabeli, lub tworząc tymczasową tabelę do testowania zapytań. |
Pseudo kolumny
Pseudo-kolumny to specjalne kolumny dostępne w języku SQL, które zawierają dodatkowe informacje na temat danych lub kontekstu zapytania. Pseudo-kolumny nie są fizycznymi kolumnami w tabeli, ale są dostępne do użycia w zapytaniach SQL. Poniżej przedstawiam kilka popularnych pseudo-kolumn:
1. ROWNUM
(Oracle) lub ROW_NUMBER()
(inny dialekt SQL):
Ta pseudo-kolumna zawiera numer porządkowy wiersza w zbiorze wynikowym. Jest szczególnie przydatna przy ograniczaniu wyników zapytania do określonej liczby wierszy lub wykonywaniu paginacji.
Przykład:
SELECT ROWNUM, first_name, last_name
FROM employees
WHERE ROWNUM <= 10;
2. ROWID
(Oracle) lub CTID
(PostgreSQL):
Ta pseudo-kolumna zawiera unikalny identyfikator wiersza w tabeli. Jest używana głównie do bezpośredniego odwoływania się do konkretnych wierszy w celu aktualizacji lub usunięcia.
Przykład:
UPDATE employees
SET salary = 5000
WHERE ROWID = 'AAABBBCCC';
3. SYSDATE
(Oracle) lub CURRENT_TIMESTAMP
(inny dialekt SQL):
Ta pseudo-kolumna zawiera aktualną datę i czas na serwerze bazy danych.
Przykład:
SELECT order_id, order_date, SYSDATE AS current_date
FROM orders;
4. LEVEL
(Oracle) lub GENERATION
(inny dialekt SQL):
Ta pseudo-kolumna jest używana w zapytaniach rekurencyjnych lub do określenia poziomu hierarchii w zapytaniach związanych z drzewem.
Przykład:
SELECT employee_id, last_name, LEVEL
FROM employees
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id;
5. OBJECT_ID
(Oracle): Pseudo-kolumna OBJECT_ID
jest używana w Oracle Database do zwracania identyfikatora obiektu bazy danych. Może być używana w zapytaniach dotyczących metadanych lub dostępu do informacji o konkretnym obiekcie bazy danych, takim jak tabela, widok, procedura, itp.
Przykład:
SELECT object_name, object_type
FROM all_objects
WHERE object_id = 12345;
6. OBJECT_VALUE
(Oracle): Pseudo-kolumna OBJECT_VALUE
jest używana w Oracle XML DB do zwracania wartości XML dla obiektu XML w bazie danych. Może być stosowana w zapytaniach, które operują na danych XML przechowywanych w bazie danych Oracle.
Przykład:
SELECT object_id, object_value
FROM xml_table;
7. ORA_ROWSCN
(Oracle): Pseudo-kolumna ORA_ROWSCN
jest używana w Oracle Database do zwracania System Change Number (SCN) dla wiersza. SCN jest unikalnym identyfikatorem przypisanym do każdego wiersza w bazie danych i może być używany do monitorowania zmian i śledzenia historii danych.
Przykład:
SELECT rowid, ora_rowscn
FROM my_table;
8. XMLDATA
(Oracle): Pseudo-kolumna XMLDATA
jest używana w Oracle XML DB do zwracania danych XML w formacie XMLType. Może być stosowana w zapytaniach, które operują na danych XML przechowywanych w bazie danych Oracle.
Przykład:
SELECT xmldata
FROM xml_table;
9. CURRVAL
i NEXTVAL
(Oracle): Pseudo-kolumny CURRVAL
i NEXTVAL
są używane w Oracle Database w połączeniu z sekwencjami (sequences) do pobierania bieżącej lub następnej wartości sekwencji. CURRVAL
zwraca bieżącą wartość sekwencji, podczas gdy NEXTVAL
zwraca następną wartość sekwencji.
Przykład:
SELECT my_sequence.NEXTVAL
FROM dual;
10. CONNECT_BY_ISCYCLE
(Oracle): Pseudo-kolumna CONNECT_BY_ISCYCLE
jest używana w Oracle Database w kontekście zapytań związanych z drzewami ( CONNECT BY
) do oznaczenia, czy wystąpił cykl w hierarchii. Zwraca wartość 1, jeśli wierzchołek jest częścią cyklu, lub 0 w przeciwnym razie.
Przykład:
SELECT employee_id, last_name, CONNECT_BY_ISCYCLE
FROM employees
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id;
Pseudo-kolumny różnią się w zależności od dialektu SQL i używanej bazy danych. Nie wszystkie pseudo-kolumny są dostępne we wszystkich bazach danych, dlatego zawsze warto sprawdzić dokumentację swojej konkretnej bazy danych, aby dowiedzieć się, jakie pseudo-kolumny są dostępne i jak ich używać. |
Self Join
Self join w języku SQL jest techniką polegającą na łączeniu tabeli z samą sobą. Oznacza to, że w zapytaniu używamy tej samej tabeli jako dwóch odrębnych instancji, które łączymy ze sobą na podstawie warunków zdefiniowanych w klauzuli ON.
Przykładem może być tabela "employees" zawierająca informacje o pracownikach, gdzie mamy kolumny "employee_id", "first_name", "last_name" i "manager_id", w której "manager_id" wskazuje na identyfikator przełożonego danego pracownika.
Przykład zapytania self join, które zwraca informacje o pracownikach i ich przełożonych, może wyglądać tak:
SELECT e.first_name AS employee_first_name, e.last_name AS employee_last_name,
m.first_name AS manager_first_name, m.last_name AS manager_last_name
FROM employees e
JOIN employees m ON e.manager_id = m.employee_id;
W powyższym przykładzie tabela "employees" jest łączona z samą sobą na podstawie warunku e.manager_id = m.employee_id. Otrzymujemy wynik, w którym dla każdego pracownika zostaje wyświetlone imię i nazwisko pracownika oraz imię i nazwisko jego przełożonego.
Self join jest przydatny w sytuacjach, gdy mamy hierarchię danych w jednej tabeli, na przykład struktury organizacyjnej lub relacji między danymi. Pozwala nam na skomplikowane zapytania, które wykorzystują powiązania między rekordami w tej samej tabeli. |
Typ danych złożonych
Typ danych złożony (composite data type) to typ danych, który pozwala na grupowanie i przechowywanie innych typów danych jako pojedynczej jednostki. Najczęściej używane typy złożone to rekordy (record) i tablice (array).
1. Rekordy (record):
- Rekord to struktura danych, która może zawierać wiele pól o różnych typach danych.
- Definicja rekordu wymaga zdefiniowania nazw pól i odpowiadających im typów danych.
- Przykład składni w PostgreSQL:
CREATE TYPE person_type AS (
first_name VARCHAR(50),
last_name VARCHAR(50),
age INT
);
- Przykład użycia rekordu:
DECLARE
person person_type;
BEGIN
person.first_name := 'John';
person.last_name := 'Doe';
person.age := 30;
...
END;
2. Tablice (array):
- Tablica to struktura danych, która pozwala na przechowywanie wielu wartości tego samego typu w jednym polu.
- Definicja tablicy wymaga określenia typu danych elementów tablicy.
- Przykład składni w PostgreSQL:
CREATE TYPE colors AS VARCHAR(20) ARRAY;
- Przykład użycia tablicy:
DECLARE
color_list colors := ARRAY['red', 'green', 'blue'];
...
END;
Warto zauważyć, że składnia i obsługiwane typy złożone mogą się różnić w zależności od konkretnego systemu zarządzania bazą danych. Przed użyciem konkretnego typu złożonego zaleca się zapoznanie się z dokumentacją systemu bazodanowego, aby uzyskać dokładne informacje na temat składni, zachowania i dostępnych funkcji dla danego typu złożonego. |
DECODE - mapowanie wartości
Funkcja DECODE
w języku SQL jest często używana do mapowania wartości na podstawie określonych równań lub warunków. Można to zakwalifikować jako operację warunkowego przypisania wartości. Funkcja DECODE
porównuje wartość wyrażenia z zestawem wartości i zwraca odpowiadający wynik dla pierwszej pasującej wartości.
Poniżej przedstawiam kilka zastosowań funkcji DECODE
:
1. Mapowanie wartości:
SELECT
column_name,
DECODE(column_name, value1, result1, value2, result2, default_result) AS mapped_value
FROM table_name;
Przykład:
SELECT
product_name,
DECODE(category_id, 1, 'Electronics', 2, 'Clothing', 'Other') AS category_name
FROM products;
2. Przypisanie wartości na podstawie warunków:
SELECT
column_name,
DECODE(condition, value1, result1, value2, result2, default_result) AS result
FROM table_name;
Przykład:
SELECT
order_date,
DECODE(SIGN(total_amount - 100), 1, 'Above', -1, 'Below', 'Equal') AS status
FROM orders;
Funkcja DECODE
jest często używana w starszych systemach baz danych, takich jak Oracle. W nowoczesnych bazach danych istnieją również inne konstrukcje, takie jak instrukcja CASE
, które zapewniają bardziej elastyczną i czytelną składnię do realizacji podobnych operacji warunkowych. |
Czym są sekwencje?
Sequences (sekwencje) w bazach danych są obiektami służącymi do generowania unikalnych numerów sekwencyjnych. Są one często używane do automatycznego generowania wartości kluczy głównych lub innych unikalnych identyfikatorów w tabelach.
Główne cechy sekwencji to:
1. Unikalność: Sekwencje zapewniają unikalność generowanych wartości. Każda wygenerowana wartość jest różna od poprzednich i następnych.
2. Bezstanowość: Sekwencje są bezstanowe, co oznacza, że nie przechowują żadnych informacji o poprzednio wygenerowanych wartościach. Przy każdym wywołaniu sekwencji generowana jest kolejna wartość zgodnie z zdefiniowanym przez nas krokiem.
3. Niezależność transakcji: Wywołania sekwencji są niezależne od transakcji. Oznacza to, że wartości sekwencji są generowane niezależnie od innych operacji wykonywanych w ramach transakcji.
Przykład tworzenia i użycia sekwencji w języku SQL (na przykładzie Oracle):
-- Tworzenie sekwencji
CREATE SEQUENCE seq_employee_id
START WITH 1
INCREMENT BY 1
NOCACHE;
-- Wykorzystanie sekwencji do generowania wartości
INSERT INTO employees (employee_id, employee_name)
VALUES (seq_employee_id.NEXTVAL, 'John Doe');
W powyższym przykładzie tworzona jest sekwencja seq_employee_id
, która rozpoczyna się od 1 i inkrementuje wartość o 1 przy każdym wywołaniu. Następnie sekwencja jest wykorzystywana do generowania wartości klucza głównego podczas wstawiania danych do tabeli employees
.
Sekwencje są dostępne w różnych systemach baz danych, takich jak Oracle, PostgreSQL, czy SQL Server. Składnia i opcje tworzenia sekwencji mogą się nieco różnić w zależności od konkretnego systemu bazodanowego. Należy sprawdzić dokumentację swojego systemu baz danych, aby dowiedzieć się więcej o tworzeniu i używaniu sekwencji. |
|
|
SKŁADNIA
W języku SQL, składnia zapytań zazwyczaj przyjmuje postać:
SELECT - określa, które kolumny mają zostać zwrócone lub jakie wyrażenia mają zostać obliczone.
FROM - wskazuje, z jakich tabel lub widoków mają zostać pobrane dane.
WHERE - określa warunki filtrujące wiersze, które mają zostać zwrócone na podstawie określonych kryteriów.
GROUP BY - grupuje wyniki według określonych kolumn.
HAVING - filtruje grupy na podstawie warunków.
ORDER BY - sortuje wyniki według określonych kolumn w określonej kolejności.
LIMIT/OFFSET (opcjonalne) - ogranicza liczbę zwracanych wierszy lub przesuwa wyniki o określoną liczbę wierszy.
Oczywiście, nie wszystkie klauzule muszą być obecne w każdym zapytaniu. Składnia i kolejność klauzul zależą od konkretnego rodzaju zapytania i wymagań.
Przykładowa składnia zapytania SELECT może wyglądać tak:
SELECT kolumny
FROM tabela
WHERE warunki
GROUP BY kolumny
HAVING warunki
ORDER BY kolumny
LIMIT liczba_wierszy
OFFSET przesuniecie;
Ważne jest przestrzeganie poprawnej składni SQL, aby zapewnić poprawne wykonanie zapytań i otrzymanie oczekiwanych wyników. |
Numeryczne typy danych
INTEGER |
Reprezentuje liczby całkowite o ograniczonym zakresie |
43 |
BIGINT |
Reprezentuje duże liczby całkowite. |
9876543210 |
DECIMAL(p, s) lub NUMERIC(p, s) |
Reprezentuje liczby zmiennoprzecinkowe o precyzji p (liczba całkowita) i skali s (liczba miejsc po przecinku). |
12.345 |
FLOAT(p) |
Reprezentuje liczby zmiennoprzecinkowe o podwójnej precyzji. |
3.14159 |
REAL |
Reprezentuje liczby zmiennoprzecinkowe o jednostronnej precyzji. |
2.71828 |
SMALLINT |
Reprezentuje małe liczby całkowite o ograniczonym zakresie. |
123 |
NUMERIC(p, s) |
Reprezentuje liczby zmiennoprzecinkowe o precyzji p i skali s. |
9876.54321 |
DOUBLE PRECISION |
Reprezentuje liczby zmiennoprzecinkowe o podwójnej precyzji. |
1.23456789012345 |
DEC |
Reprezentuje liczby zmiennoprzecinkowe o precyzji i skali dostosowanej do konkretnego systemu bazodanowego. |
456.789 |
NUM |
Reprezentuje liczby zmiennoprzecinkowe o precyzji i skali dostosowanej do konkretnego systemu bazodanowego. |
0.1234 |
Tekstowe typy danych
CHAR(n) |
Reprezentuje stałą długość łańcucha znakowego o rozmiarze n. |
'Hello' |
VARCHAR(n) |
Reprezentuje zmienną długość łańcucha znakowego o maksymalnym rozmiarze n. |
'OpenAI' |
TEXT |
Reprezentuje łańcuch znakowy o zmiennej długości, bez określonego maksymalnego |
'Lorem ipsum dolor sit amet...' |
NCHAR(n) |
Reprezentuje stałą długość łańcucha znakowego w formacie Unicode o rozmiarze n. |
'Привет' |
NVARCHAR(n) |
Reprezentuje zmienną długość łańcucha znakowego w formacie Unicode o maksymalnym rozmiarze n. |
'こんにちは' |
CLOB |
Reprezentuje dużą ilość tekstu o zmiennej długości. |
Długi łańcuch znakowy zawierający wiele paragrafów lub rozległe dane tekstowe. |
BLOB |
Reprezentuje duże binarne dane, takie jak obrazy, dźwięk, wideo itp. |
Dane binarne reprezentujące plik graficzny JPEG. |
ENUM |
Reprezentuje zestaw wartości tekstowych, z których można wybrać jedną. |
'Male', 'Female', 'Other' |
SET |
Reprezentuje zbiór wartości tekstowych, z których można wybrać więcej niż jedną. |
'Red', 'Green', 'Blue' |
Data i czas
DATE |
Reprezentuje datę (bez czasu) w formacie 'RRRR-MM-DD' |
'2023-07-04' |
TIME |
Reprezentuje czas (bez daty) w formacie 'HH:MI:SS' |
'12:34:56' |
DATETIME lub TIMESTAMP: |
Reprezentuje datę i czas w formacie 'RRRR-MM-DD HH:MI:SS' |
'2023-07-04 12:34:56' |
YEAR |
Reprezentuje rok w formacie 'RRRR' |
'2023' |
INTERVAL |
Reprezentuje pewien przedział czasu, np. ilość dni, godzin, minut itp. |
INTERVAL '1 day' (reprezentuje 1 dzień) |
TIME WITH TIME ZONE |
Reprezentuje czas wraz z informacją o strefie czasowej w formacie 'HH:MI:SS +/-HH:MI' |
'12:34:56 +03:00' (czas w strefie czasowej GMT+03:00) |
TIMESTAMP WITH TIME ZONE |
Reprezentuje datę i czas wraz z informacją o strefie czasowej w formacie 'RRRR-MM-DD HH:MI:SS +/-HH:MI' |
'2023-07-04 12:34:56 +03:00' (data i czas w strefie czasowej GMT+03:00) |
Pozostałe typy danych
BOOLEAN |
Reprezentuje wartość logiczną true lub false |
TRUE |
BINARY |
Reprezentuje dane binarne o stałej długości |
01101001 |
VARBINARY |
Reprezentuje dane binarne o zmiennej długości |
11001100 |
BIT |
Reprezentuje pojedynczy bit o wartości 0 lub 1 |
1 |
UUID |
Reprezentuje unikalny identyfikator, często używany do identyfikacji rekordów w tabelach |
'550e8400-e29b-41d4-a716-446655440000' |
XML |
Reprezentuje dane w formacie XML |
'<person><name>John</name><age>30</age></person>' |
JSON |
Reprezentuje dane w formacie JSON (JavaScript Object Notation) |
'{"name": "John", "age": 30}' |
GEOMETRY |
Reprezentuje dane geometrii przestrzennej, takie jak punkty, linie, poligony itp. |
POINT(1 2) |
ARRAY |
Reprezentuje tablicę wartości jednego typu danych |
[1, 2, 3, 4] |
Count
COUNT(*) |
Zlicza wszystkie wiersze w wyniku zapytania, niezależnie od wartości w poszczególnych kolumnach |
SELECT COUNT(*) FROM Customers;
|
COUNT(1) |
Zlicza wszystkie wiersze w wyniku zapytania, używając stałej wartości |
SELECT COUNT(1) FROM Customers;
|
COUNT(column_name) |
Zlicza liczbę niepustych wartości w określonej kolumnie |
SELECT COUNT(Quantity) FROM Orders;
|
COUNT(DISTINCT column_name) |
Zlicza liczbę unikalnych niepustych wartości w określonej kolumnie |
SELECT COUNT( DISTINCT CustomerID) FROM Orders;
|
COUNT(expression) |
Zlicza liczbę niepustych wartości zwracanych przez określone wyrażenie |
SELECT COUNT(CASE WHEN Quantity > 10 THEN 1 END) FROM Orders;
|
COUNT(DISTINCT expression) |
Zlicza liczbę unikalnych niepustych wartości zwracanych przez określone wyrażenie. |
SELECT COUNT(DISTINCT CONCAT( FirstName, LastName )) FROM Customers;
|
IS NOT NULL |
Zliczanie niepustych wartości w kolumnie |
SELECT COUNT(*) FROM Customers WHERE City IS NOT NULL;
|
IS NULL |
Zliczanie wartości NULL w kolumnie |
SELECT COUNT(*) FROM Customers WHERE City IS NULL;
|
String functions
CONCAT() |
Łączy dwa lub więcej łańcuchów znakowych |
SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Customers;
|
LENGTH() / LEN() |
Zwraca długość łańcucha znakowego |
SELECT LENGTH(FirstName) AS NameLength FROM Customers;
|
UPPER() |
Konwertuje łańcuch znakowy na wielkie litery |
SELECT UPPER(FirstName) AS UpperName FROM Customers;
|
LOWER() |
Konwertuje łańcuch znakowy na małe litery |
SELECT LOWER(LastName) AS LowerName FROM Customers;
|
SUBSTRING() |
Wyodrębnia podłańcuch znakowy z danego łańcucha na podstawie określonego indeksu i długości |
SELECT SUBSTRING(Description, 1, 10) AS SubstringDesc FROM Products;
|
REPLACE() |
Zamienia wszystkie wystąpienia określonego podłańcucha na inny podłańcuch w łańcuchu |
SELECT REPLACE(Description, 'old', 'new') AS UpdatedDesc FROM Products;
|
TRIM() / LTRIM() / RTRIM() |
Usuwa początkowe i końcowe białe znaki z łańcucha |
SELECT TRIM(FirstName) AS TrimmedName FROM Customers;
|
LEFT() |
Zwraca określoną liczbę znaków z lewej strony łańcucha |
SELECT LEFT(FirstName, 3) AS LeftChars FROM Customers;
|
RIGHT() |
Zwraca określoną liczbę znaków z prawej strony łańcucha |
SELECT RIGHT(LastName, 2) AS RightChars FROM Customers;
|
SPLIT_PART(string, delimiter, position) |
Dzieli podany ciąg znaków na części na podstawie określonego separatora i zwraca część o określonej pozycji |
SELECT SPLIT_PART('John,Doe,42', ',', 2); -- 'Doe'
|
SUBSTRING(string FROM start [FOR length]) |
Zwraca podciąg znaków z określonego ciągu na podstawie podanego początkowego indeksu i, opcjonalnie, długości. |
SELECT SUBSTRING('Hello, World', 1, 5); -- 'Hello'
|
INITCAP(string) |
Zamienia pierwszą literę każdego wyrazu w ciągu na wielką literę, a pozostałe litery na małe litery. |
SELECT INITCAP('hello world'); --'Hello World'
|
REVERSE(string) |
Odwraca kolejność znaków w podanym ciągu. |
SELECT REVERSE('Hello'); -- 'olleH'
|
Number funcktions
ABS() |
Zwraca wartość bezwzględną liczby |
SELECT ABS(-10) AS AbsoluteValue;
|
ROUND() |
Zaokrągla liczbę do określonej liczby miejsc po przecinku |
SELECT ROUND(3.14159, 2) AS RoundedNumber;
|
CEILING() |
Zwraca najmniejszą liczbę całkowitą większą lub równą danej liczbie |
SELECT CEILING(4.25) AS CeilingNumber;
|
FLOOR() |
Zwraca największą liczbę całkowitą mniejszą lub równą danej liczbie |
SELECT FLOOR(4.75) AS FloorNumber;
|
SQRT() |
Zwraca pierwiastek kwadratowy z liczby |
SELECT SQRT(25) AS SquareRoot;
|
POWER() |
Podnosi daną liczbę do określonej potęgi |
SELECT POWER(2, 3) AS PowerResult;
|
MOD() |
Zwraca resztę z dzielenia jednej liczby przez drugą |
SELECT MOD(10, 3) AS ModuloResult;
|
RAND() |
Zwraca losową liczbę z zakresu od 0 do 1 |
SELECT RAND() AS RandomNumber;
|
SIGN() |
Zwraca znak liczby (-1 dla liczby ujemnej, 0 dla zera, 1 dla liczby dodatniej) |
SELECT SIGN(-15) AS SignNumber;
|
RANDOM() |
Zwraca losową liczbę z określonego zakresu |
SELECT RANDOM() AS RandomNumber;
|
PI() |
Zwraca wartość liczby π (pi) |
|
LOG() |
Oblicza logarytm o podstawie 10 z danej liczby |
SELECT LOG(100) AS Logarithm;
|
LN() |
Oblicza logarytm naturalny (o podstawie e) z danej liczby |
SELECT LN(2.71828) AS NaturalLogarithm;
|
EXP() |
Oblicza wartość wykładniczą liczby (e) podniesionej do danej potęgi |
SELECT EXP(1) AS ExponentialValue;
|
GREATEST() |
Zwraca największą wartość spośród podanych argumentów |
SELECT GREATEST(5, 8, 2) AS MaxValue;
|
LEAST() |
Zwraca najmniejszą wartość spośród podanych argumentów |
SELECT LEAST(5, 8, 2) AS MinValue;
|
Date functions
CURRENT_DATE() |
Zwraca aktualną datę |
SELECT CURRENT_DATE() AS CurrentDate;
|
CURRENT_TIME() |
Zwraca aktualny czas |
SELECT CURRENT_TIME() AS CurrentTime;
|
CURRENT_TIMESTAMP() |
Zwraca aktualną datę i czas |
SELECT CURRENT_TIMESTAMP() AS CurrentDateTime;
|
DATE() |
Zwraca tylko datę z wartości daty i czasu |
SELECT DATE('2023-07-04 10:30:00') AS DateOnly;
|
EXTRACT() |
Wyodrębnia określony komponent z daty i czasu, takie jak rok, miesiąc, dzień, godzina itp. |
SELECT EXTRACT(YEAR FROM '2023-07-04') AS ExtractedYear;
|
DATEADD() |
Dodaje określoną wartość do daty |
SELECT DATEADD(DAY, 7, '2023-07-04') AS AddedDate;
|
DATEDIFF() |
Oblicza różnicę między dwiema datami w określonej jednostce (np. dni, miesiące, lata) |
SELECT DATEDIFF(DAY, '2023-07-01', '2023-07-10') AS DateDifference;
|
DATE_FORMAT() |
Formatuje datę według określonego formatu |
SELECT DATE_FORMAT('2023-07-04', '%Y-%m-%d') AS FormattedDate;
|
DATE_PART() |
Zwraca wartość określonej części daty i czasu, takiej jak rok, miesiąc, dzień, godzina itp. |
SELECT DATE_PART('year', '2023-07-04') AS Year;
|
DATE_TRUNC() |
Skraca datę do określonej jednostki, np. do miesiąca, roku itp. |
SELECT DATE_TRUNC('month', '2023-07-04') AS TruncatedDate;
|
NOW() |
Zwraca aktualną datę i czas |
SELECT NOW() AS CurrentDateTime;
|
SYSDATE |
Zwraca aktualną datę i czas |
SELECT SYSDATE AS CurrentDateTime;
|
HOW TIMEZONE |
Zwraca bieżącą strefę czasową ustawioną w bazie danych |
|
TIME |
Typ danych TIME reprezentuje wartość czasu bez daty |
SELECT TIME '10:30:45' AS TimeValue;
|
date_part( 'unit', date ) - unit
day |
Day of the month (1 to 31) |
decade |
Year divided by 10 |
dow |
Day of the week (0=Sunday, 1=Monday, 2=Tuesday, ... 6=Saturday) |
doy |
Day of the year (1=first day of year, 365/366=last day of the year, depending if it is a leap year) |
epoch |
Number of seconds since '1970-01-01 00:00:00 UTC', if date value. Number of seconds in an interval, if interval value |
hour |
Hour (0 to 23) |
isodow |
Day of the week (1=Monday, 2=Tuesday, 3=Wednesday, ... 7=Sunday) |
isoyear |
ISO 8601 year value (where the year begins on the Monday of the week that contains January 4th) |
minute |
Minute (0 to 59) |
month |
Number for the month (1 to 12), if date value. Number of months (0 to 11), if interval value |
quarter |
Quarter (1 to 4) |
second |
Seconds (and fractional seconds) |
timezone |
ime zone offset from UTC, expressed in seconds |
timezone_hour |
Hour portion of the time zone offset from UTC |
timezone_minute |
Minute portion of the time zone offset from UTC |
week |
Number of the week of the year based on ISO 8601 (where the year begins on the Monday of the week that contains January 4th) |
year |
Year as 4-digits |
null functions
IS NULL |
Sprawdza, czy określona wartość jest NULL-em |
SELECT * FROM tabela WHERE kolumna IS NULL;
|
IS NOT NULL |
Sprawdza, czy określona wartość nie jest NULL-em |
SELECT * FROM tabela WHERE kolumna IS NOT NULL;
|
COALESCE() |
Zwraca pierwszą nie-NULL-ową wartość z listy wartości |
SELECT COALESCE(kolumna1, kolumna2, kolumna3) AS NonNullValue FROM tabela;
|
NULLIF() |
Zwraca NULL, jeśli dwa wyrażenia są równe, w przeciwnym razie zwraca pierwsze wyrażenie |
SELECT NULLIF(kolumna1, 0) AS Result FROM tabela;
|
NVL() |
Zwraca drugie wyrażenie, jeśli pierwsze jest NULL-em |
SELECT NVL(kolumna1, 'Brak wartości') AS Result FROM tabela;
|
IFNULL() |
Zwraca drugie wyrażenie, jeśli pierwsze jest NULL-em |
SELECT IFNULL(kolumna1, 'Brak wartości') AS Result FROM tabela;
|
Funkcje agregujące
COUNT() |
Zlicza liczbę wierszy lub wartości w danej kolumnie. |
SELECT COUNT(*) AS TotalRows FROM tabela;
|
SUM() |
Oblicza sumę wartości w danej kolumnie numerycznej. |
SELECT SUM(kolumna) AS TotalSum FROM tabela;
|
AVG() |
Oblicza średnią wartość w danej kolumnie numerycznej. |
SELECT AVG(kolumna) AS AverageValue FROM tabela;
|
MIN() |
Zwraca najmniejszą wartość w danej kolumnie. |
SELECT MIN(kolumna) AS MinValue FROM tabela;
|
MAX() |
Zwraca największą wartość w danej kolumnie. |
SELECT MAX(kolumna) AS MaxValue FROM tabela;
|
GROUP_CONCAT (MySQL, MariaDB) |
Konkatenacja wartości napisowych z grupy w jedną wartość napisową, rozdzieloną separatorem. |
SELECT GROUP_CONCAT(nazwa_kolumny SEPARATOR ', ') AS ConcatenatedValues FROM tabela GROUP BY kolumna;
|
LISTAGG (Oracle) |
Konkatenacja wartości napisowych z grupy w jedną wartość napisową, rozdzieloną separatorem. |
SELECT LISTAGG(nazwa_kolumny, ', ') WITHIN GROUP (ORDER BY kolumna) AS ConcatenatedValues FROM tabela;
|
GROUP BY |
Grupuje wyniki zapytania według wartości określonych kolumn. |
SELECT kolumna, COUNT(*) FROM tabela GROUP BY kolumna;
|
GROUP BY ROLLUP |
pozwala na generowanie zestawu wyników hierarchicznych w oparciu o różne poziomy podsumowania, generuje wyniki dla wszystkich kombinacji wartości w kolumnach podsumowania, tworząc hierarchię podsumowań |
SELECT kolumna1, kolumna2, SUM(wartosc) AS Suma FROM tabela GROUP BY ROLLUP(kolumna1, kolumna2);
|
GROUP BY CUBE |
generuje wszystkie możliwe kombinacje wartości w kolumnach podsumowania, tworząc tzw. kostkę (cube) |
SELECT kolumna1, kolumna2, SUM(wartosc) AS Suma FROM tabela GROUP BY CUBE(kolumna1, kolumna2);
|
HAVING |
służy do filtrowania wyników zapytania po grupowaniu, na podstawie warunków logicznych |
SELECT kolumna, SUM(wartosc) AS Suma FROM tabela GROUP BY kolumna HAVING SUM(wartosc) > 100
|
GROUP BY ROLLUP vs GROUP BY CUBE
Przedstawmy porównanie klauzul GROUP BY ROLLUP i CUBE na podstawie wyników zapytania dla uproszczonej tabeli zawierającej dane o sprzedaży produktów w różnych regionach:
Tabela "Sales":
+---------+------------+----------+
| Product | Region | Quantity |
+---------+------------+----------+
| A | North | 10 |
| A | South | 5 |
| B | North | 8 |
| B | South | 12 |
+---------+------------+----------+
Group by ROLLUP:
SELECT Product, Region, SUM(Quantity) AS TotalQuantity FROM Sales GROUP BY ROLLUP(Product, Region);
Wyniki zapytania:
+---------+------------+---------------+
| Product | Region | TotalQuantity |
+---------+------------+---------------+
| A | North | 10 |
| A | South | 5 |
| A | NULL | 15 |
| B | North | 8 |
| B | South | 12 |
| B | NULL | 20 |
| NULL | NULL | 35 |
+---------+------------+---------------+
Klauzula GROUP BY ROLLUP generuje zestaw wyników z hierarchią podsumowań, w którym uwzględnia podsumowanie dla poszczególnych wartości w kolumnach Product i Region oraz ogólne podsumowanie dla każdej kolumny i całkowite podsumowanie.
Group by CUBE:
SELECT Product, Region, SUM(Quantity) AS TotalQuantity FROM Sales GROUP BY CUBE(Product, Region);
Wyniki zapytania:
+---------+------------+---------------+
| Product | Region | TotalQuantity |
+---------+------------+---------------+
| A | North | 10 |
| A | South | 5 |
| A | NULL | 15 |
| B | North | 8 |
| B | South | 12 |
| B | NULL | 20 |
| NULL | North | 18 |
| NULL | South | 17 |
| NULL | NULL | 35 |
+---------+------------+---------------+
Klauzula GROUP BY CUBE generuje zestaw wyników, w którym uwzględnia wszystkie możliwe kombinacje wartości w kolumnach Product i Region, włączając podsumowania dla poszczególnych kolumn oraz całkowite podsumowanie.
Podsumowując:
GROUP BY ROLLUP generuje zestaw wyników z hierarchią podsumowań, w którym uwzględnia podsumowania dla poszczególnych kolumn i ich kombinacji.
GROUP BY CUBE generuje zestaw wyników, który zawiera wszystkie możliwe kombinacje podsumowań dla kolumn, włączając podsumowania dla poszczególnych kolumn.
Warto zauważyć, że w obu przypadkach wyniki zawierają dodatkowe wiersze i kolumny, które reprezentują ogólne podsumowania |
Podzapytania (subquery)
Podzapytanie (ang. subquery) w SQL to zapytanie umieszczone wewnątrz innego zapytania. Może być używane w różnych częściach zapytania, takich jak klauzula SELECT, FROM, WHERE, HAVING lub JOIN, w celu uzyskania dodatkowych informacji lub filtrowania danych.
Oto kilka ważnych informacji na temat podzapytań:
Cel podzapytań: Podzapytania służą do uzyskania danych z innej tabeli lub wyników innych zapytań wewnątrz głównego zapytania. Mogą dostarczać dodatkowe informacje, filtrować wyniki, dokonywać obliczeń lub dostarczać wyniki dla innych części zapytania.
Składnia: Podzapytania są umieszczane wewnątrz nawiasów okrągłych lub klamrowych i są traktowane jako oddzielne zapytania. Mogą być umieszczone w różnych częściach zapytania, w zależności od potrzeb.
Przykład:
SELECT column1
FROM table1
WHERE column2 IN (SELECT column3 FROM table2);
Związki z innymi zapytaniami: Podzapytania mogą być łączone z innymi zapytaniami przy użyciu operatorów takich jak IN, EXISTS, ANY, ALL, czy nawet z innymi podzapytaniami, w celu tworzenia bardziej zaawansowanych zapytań.
Przykład:
SELECT column1
FROM table1
WHERE column2 IN (SELECT column3 FROM table2 WHERE column4 > 100);
Wydajność: Podzapytania mogą mieć wpływ na wydajność zapytań, zwłaszcza gdy są używane wewnątrz klauzuli WHERE lub HAVING. Ważne jest optymalizowanie zapytań zawierających podzapytania, aby uniknąć zbędnych obliczeń i nadmiernego przetwarzania danych.
Podzapytania są potężnym narzędziem w SQL, pozwalającym na bardziej zaawansowane manipulowanie danymi i tworzenie bardziej precyzyjnych zapytań. Ich zastosowanie zależy od konkretnego przypadku i wymagań zapytania, dlatego warto zapoznać się z nimi i zrozumieć ich składnię i możliwości. |
Podzapytania CTE
Podzapytania CTE (Common Table Expressions) to narzędzie w SQL, które umożliwia tworzenie tymczasowych, nazwanych zestawów wyników, które można następnie wykorzystać w głównym zapytaniu. CTE są szczególnie przydatne w przypadku bardziej skomplikowanych zapytań, gdzie wymagane jest wielokrotne użycie tego samego podzapytania.
Składnia CTE wygląda następująco:
WITH nazwa_cte (kolumna1, kolumna2, ...)
AS (
SELECT kolumna1, kolumna2, ...
FROM tabela
WHERE warunek
)
Przykład:
WITH sales_cte (product_id, total_sales)
AS (
SELECT product_id, SUM(quantity * price) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT product_id, total_sales
FROM sales_cte
WHERE total_sales > 1000;
W tym przykładzie tworzymy CTE o nazwie "sales_cte", która zawiera wyniki sumy sprzedaży dla każdego produktu. Następnie w głównym zapytaniu wybieramy dane z CTE, gdzie wartość sprzedaży jest większa niż 1000.
WITH cte1 AS (
SELECT column1, column2
FROM table1
WHERE condition1
),
cte2 AS (
SELECT column3, column4
FROM table2
WHERE condition2
)
SELECT cte1.column1, cte1.column2, cte2.column3, cte2.column4
FROM cte1
JOIN cte2 ON cte1.column1 = cte2.column3;
W powyższym przykładzie definiujemy dwie CTE: "cte1" i "cte2". CTE "cte1" wybiera kolumny "column1" i "column2" z "table1" spełniające określony warunek. CTE "cte2" wybiera kolumny "column3" i "column4" z "table2" spełniające inny warunek. Następnie wykonujemy złączenie (JOIN) między wynikami obu CTE, używając kolumny "column1" z "cte1" i kolumny "column3" z "cte2".
Podzapytania CTE mogą znacznie ułatwić czytelność i zarządzanie bardziej skomplikowanymi zapytaniami, pozwalając na ich modularyzację i ponowne wykorzystanie.
Klauzula WITH RECURSIVE w języku SQL umożliwia tworzenie rekurencyjnych zapytań, które mogą być używane do przetwarzania danych hierarchicznych lub grafowych. Pozwala na iteracyjne wykonywanie zapytań z użyciem wyników poprzednich iteracji jako dane wejściowe dla kolejnych iteracji.
Składnia ogólna WITH RECURSIVE wygląda następująco:
WITH RECURSIVE nazwa (kolumny) AS (
Zapytanie_nie_rekurencyjne
UNION [ALL]
Zapytanie_rekurencyjne
)
Zapytanie_główne
Przykład:
Załóżmy, że mamy tabelę "employees" zawierającą dane pracowników, w której istnieje hierarchia kierownicza. Chcemy wykonać rekurencyjne zapytanie, które zwróci wszystkich pracowników, którzy podlegają danemu kierownikowi (w dowolnym stopniu hierarchii).
WITH RECURSIVE employee_hierarchy (employee_id, full_name, manager_id) AS (
SELECT employee_id, full_name, manager_id
FROM employees
WHERE employee_id = 1 -- Przykładowy identyfikator kierownika
UNION ALL
SELECT e.employee_id, e.full_name, e.manager_id
FROM employees e
JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT *
FROM employee_hierarchy;
W tym przykładzie używamy WITH RECURSIVE do stworzenia rekurencyjnego zapytania o nazwie "employee_hierarchy". W początkowym zapytaniu wybieramy dane kierownika o określonym identyfikatorze. Następnie używamy operatora UNION ALL i dołączamy zapytanie rekurencyjne, które odwołuje się do "employee_hierarchy" i łączy pracowników, których identyfikator kierownika jest równy identyfikatorowi z poprzedniej iteracji.
W rezultacie zapytanie zwróci wszystkich pracowników, którzy są podlegli danemu kierownikowi, bez względu na poziom hierarchii. |
Losowa próbka rekordów
Aby pobrać losową próbkę rekordów z tabeli, można skorzystać z różnych technik, w zależności od używanego systemu bazodanowego. Oto kilka przykładów:
- Przykład dla systemu PostgreSQL:
SELECT *
FROM table_name
ORDER BY RANDOM()
LIMIT 10;
W powyższym przykładzie używamy funkcji RANDOM() w instrukcji ORDER BY, aby przemieszać rekordy w tabeli, a następnie ograniczamy wyniki do 10 przy użyciu LIMIT, co daje nam losową próbkę 10 rekordów.
Przykład dla systemu MySQL:
SELECT *
FROM table_name
ORDER BY RAND()
LIMIT 10;
W przypadku MySQL używamy funkcji RAND() w instrukcji ORDER BY do przemieszania rekordów, a następnie ograniczamy wyniki do 10 przy użyciu LIMIT.
Przykład dla systemu Microsoft SQL Server:
SELECT TOP 10 *
FROM table_name
ORDER BY NEWID();
W przypadku SQL Servera możemy użyć funkcji NEWID() w instrukcji ORDER BY, która generuje unikalne identyfikatory GUID, co daje nam losowe sortowanie rekordów. Następnie używamy TOP do ograniczenia wyników do 10 rekordów.
- WHERE RANDOM() < 0.01: Ta metoda wykorzystuje funkcję RANDOM() w warunku WHERE, aby wybrać tylko te rekordy, których wartość losowa jest mniejsza niż 0.01. Można dostosować wartość 0.01, aby uzyskać różne wielkości próbek.
Przykład:
SELECT *
FROM table_name
WHERE RANDOM() < 0.01;
- TABLESAMPLE SYSTEM(1): Ta metoda wykorzystuje klauzulę TABLESAMPLE w zapytaniu, która umożliwia losowe pobranie próbki rekordów na podstawie procentowego udziału w tabeli.
Przykład:
SELECT *
FROM table_name TABLESAMPLE SYSTEM(1);
W powyższym przykładzie SYSTEM(1) oznacza, że zostanie pobrana próbka o wielkości około 1% całej tabeli. Można dostosować wartość procentową, aby uzyskać różne rozmiary próbek. |
PIVOT
Pivot w SQL to operacja, która umożliwia transformację danych w pionowy format (kolumny w wiersze) na poziomy format (wiersze w kolumny). Jest to przydatne, gdy chcemy dokonać agregacji danych wokół określonej kolumny lub zestawić dane w bardziej zrozumiały sposób.
Operacja Pivot wymaga zdefiniowania, które kolumny zostaną transponowane na wartości kolumn w nowej tabeli wynikowej. Oto przykładowe zapytanie wykorzystujące operację Pivot:
SELECT *
FROM (
SELECT category, product, quantity
FROM sales
) AS src
PIVOT (
SUM(quantity)
FOR product IN ([ProductA], [ProductB], [ProductC])
) AS pivot_table;
W powyższym przykładzie mamy tabelę "sales" zawierającą kolumny "category", "product" i "quantity". Chcemy dokonać transpozycji wartości kolumny "product" na nowe kolumny w tabeli wynikowej. W zapytaniu definiujemy listę produktów, dla których chcemy dokonać transpozycji ([ProductA], [ProductB], [ProductC]). Następnie używamy funkcji agregującej (w tym przypadku SUM) do obliczenia wartości dla każdego produktu w ramach danej kategorii.
Takie zapytanie Pivot zwróci tabelę wynikową, w której poszczególne produkty zostaną przedstawione jako osobne kolumny, a wartości będą agregowane dla każdej kategorii.
category | ProductA | ProductB | ProductC
-------------------------------------------
CategoryA | 10 | 5 | 3
CategoryB | 8 | 2 | 6
Warto zauważyć, że składnia zapytania Pivot może się różnić w zależności od konkretnego systemu bazodanowego. Przykład powyżej jest ogólnym przykładem, ale warto sprawdzić dokumentację systemu bazodanowego, którego używasz, aby poznać szczegóły i składnię dotyczącą operacji Pivot w danym systemie.
a) SELECT *
FROM crosstab(‘SQL tworzący tabelę w postaci tekstu’)
AS nazwa_tabeli(definicja kolumn wynikowych tabeli);
b) SELECT *
FROM crosstab('select jezyk::text, stan_wniosku::text, count(*)::numeric
FROM wnioski group by 1, 2')
AS final_result(“jezyk” text, "odrzucony prawnie" numeric, "odrzucony po analizie" numeric, "zaakceptowany przez operatora" numeric, "wyplacony" numeric, "zamkniety" numeric, "akcja sadowa" numeric, "nowy" numeric, "analiza zaakceptowana" numeric, "przegrany w sadzie" numeric, "wyslany do operatora" numeric, "odrzucony przez operatora" numeric, "wygrany w sadzie" numeric);
|
Indeksowanie
Indeksy są strukturami danych w bazach danych, które pomagają przyspieszyć wyszukiwanie i sortowanie danych. Są to specjalne obiekty, które są tworzone na jednym lub wielu kolumnach tabeli i umożliwiają szybkie odnajdywanie odpowiednich rekordów na podstawie wartości w tych kolumnach. Oto kilka podstawowych informacji o indeksach:
Rodzaje indeksów:
Indeksy jednokolumnowe: tworzone na pojedynczej kolumnie tabeli.
Indeksy wielokolumnowe: tworzone na kilku kolumnach tabeli.
Unikalne indeksy: zapewniają, że wartości w indeksowanych kolumnach są unikalne.
Indeksy skupione (clustered): określają fizyczną organizację danych w tabeli na podstawie wartości indeksowanych kolumn.
Indeksy niestrukture (non-clustered): mają oddzielną strukturę od tabeli i zawierają odnośniki do fizycznych miejsc, gdzie dane są przechowywane.
Korzyści wynikające z indeksowania:
Szybsze wyszukiwanie danych: indeksy umożliwiają bezpośrednie odnalezienie pasujących rekordów, co przyspiesza zapytania wyszukiwania.
Szybsze sortowanie danych: indeksy ułatwiają sortowanie danych według indeksowanych kolumn.
Zmniejszone obciążenie zapytań: efektywne indeksowanie może zmniejszyć obciążenie na serwerze baz danych poprzez skrócenie czasu wykonywania zapytań.
Tworzenie i zarządzanie indeksami:
Indeksy można tworzyć podczas tworzenia tabeli lub po jej utworzeniu.
Tworzenie indeksów powinno być odpowiednio przemyślane, uwzględniając często wykonywane zapytania i typ operacji, które będą wykonywane na danych.
Indeksy należy utrzymywać i aktualizować wraz z danymi w tabelach, aby zapewnić ich skuteczność.
Przykład tworzenia indeksu na jednej kolumnie:
CREATE INDEX idx_customer_name ON Customers (customer_name);
Przykład tworzenia indeksu na wielu kolumnach:
CREATE INDEX idx_customer_location ON Customers (city, state);
Indeksy są ważnym elementem optymalizacji baz danych, które pomagają w poprawie wydajności zapytań i operacji na danych. Ważne jest jednak odpowiednie projektowanie i zarządzanie indeksami, aby uniknąć nadmiernego indeksowania, które może prowadzić do spadku wydajności podczas modyfikacji danych.
Indeksy nie są bezpośrednio widoczne po wywołaniu tabeli, ale mają wpływ na wydajność zapytań, szczególnie podczas wyszukiwania, sortowania i łączenia danych. Przykład poniżej ilustruje, jak indeksy mogą przyspieszyć zapytania:
Mamy tabelę "Customers" z indeksem na kolumnie "customer_name". Wykonajmy zapytanie wyszukujące klienta o nazwie "John Smith":
SELECT * FROM Customers WHERE customer_name = 'John Smith';
Bez indeksu, silnik bazy danych musiałby przeszukać całą tabelę w poszukiwaniu rekordów spełniających warunek. Jeśli tabela ma dużą liczbę rekordów, zapytanie może być wolne.
Z indeksem na kolumnie "customer_name", silnik bazy danych może skorzystać z indeksu, aby bezpośrednio odnaleźć rekordy o nazwie "John Smith", nie musząc przeszukiwać całej tabeli. Wykonanie zapytania będzie znacznie szybsze.
Indeksy są tworzone dla optymalizacji zapytań i ukryte są wewnętrznie w silniku bazy danych. Nie są one bezpośrednio widoczne jako kolumny lub dane, ale mają wpływ na wydajność zapytań, a wyniki mogą być widoczne w czasie wykonywania zapytań.
|
łączenie (konkatenacja) stringów
W SQL istnieje kilka sposobów łączenia (konkatenacji) stringów. Oto kilka przykładów:
- Operator konkatenacji (+):
Możesz użyć operatora "+" do połączenia dwóch stringów w jedną wartość. Przykład:
SELECT 'Hello' + ' ' + 'World' AS concatenated_string;
Wynik: "Hello World"
- Funkcja CONCAT():
Funkcja CONCAT() pozwala na łączenie wielu stringów w jeden. Przykład:
SELECT CONCAT('Hello', ' ', 'World') AS concatenated_string;
Wynik: "Hello World"
- Operator ||:
W niektórych bazach danych, takich jak Oracle, PostgreSQL czy SQLite, można użyć operatora "||" do konkatenacji stringów. Przykład:
SELECT 'Hello' || ' ' || 'World' AS concatenated_string;
Wynik: "Hello World"
- Funkcja CONCAT_WS():
Funkcja CONCAT_WS() służy do konkatenacji stringów z użyciem określonego separatora. Przykład:
SELECT CONCAT_WS(', ', 'John', 'Doe', 'New York') AS concatenated_string;
Wynik: "John, Doe, New York"
- Funkcja STUFF() (dla SQL Server):
Funkcja STUFF() w SQL Server umożliwia zamianę fragmentu stringa innym stringiem. Może być używana do łączenia stringów. Przykład:
SELECT STUFF('Hello World', 6, 0, ', ') AS concatenated_string;
Wynik: "Hello, World" |
Konwersja danych
w zapytaniu SELECT istnieją pewne funkcje konwersji danych, które mogą służyć do przekształcenia wartości jednego typu danych na inny typ danych w wynikach zapytania. Oto kilka przykładów:
- CAST() lub CONVERT() umożliwiają konwersję jednego typu danych na inny. Przykład:
SELECT CAST(kolumna AS nowy_typ) AS nowa_kolumna
FROM tabela;
lub
SELECT CONVERT(nowy_typ, kolumna) AS nowa_kolumna
FROM tabela;
Należy zastąpić "kolumna" nazwą kolumny, którą chcesz przekonwertować, a "nowy_typ" docelowym typem danych.
*Convert z unicode
convert(name, 'AL32UTF8', 'WE8MSWIN1252')
SELECT CONVERT(name, 'UTF8', 'AL32UTF8') FROM nazwa_tabeli
- funkcje konwersji typów danych:
W zależności od używanej bazy danych, mogą istnieć specyficzne funkcje konwersji typów danych, takie jak TO_NUMBER(), TO_DATE(), TO_CHAR() itp. Możesz użyć tych funkcji w zapytaniu SELECT, aby przekonwertować wartości na określony typ danych. Przykład:
SELECT TO_NUMBER(kolumna) AS nowa_kolumna
FROM tabela;
W powyższym przykładzie używamy funkcji TO_NUMBER(), aby przekonwertować wartość kolumny na typ liczbowy.
-Składnia wyrażenie::typ_danych lub wyrażenie::typ_danych(n) służy do jawnego rzutowania (explicit cast) wartości wyrażenia na określony typ danych. Przykład:
SELECT kolumna::integer AS nowa_kolumna
FROM tabela;
W powyższym przykładzie używamy ::integer, aby przekonwertować wartość kolumny na typ całkowitoliczbowy (integer).
Warto zauważyć, że ten zapis ::typ_danych jest specyficzny dla niektórych baz danych, takich jak PostgreSQL, i nie jest powszechnie obsługiwany we wszystkich bazach danych. Dlatego zawsze warto sprawdzić dokumentację konkretnej bazy danych, aby upewnić się, czy ten zapis jest dostępny i poprawnie obsługiwany w danym systemie bazodanowym. |
trim
Funkcja TRIM w języku SQL jest używana do usuwania spacji lub innych określonych znaków z początku i końca ciągu znaków. Funkcja TRIM może być również rozszerzona o specyfikację konkretnych znaków, które mają być usunięte z ciągu.
Składnia ogólna funkcji TRIM jest następująca:
TRIM([ [ LEADING | TRAILING | BOTH ] [ characters_to_remove ] FROM ] string_expression)
Argumenty funkcji TRIM:
- LEADING: Usuwa określone znaki z początku ciągu.
- TRAILING: Usuwa określone znaki z końca ciągu.
- BOTH (domyślne): Usuwa określone znaki zarówno z początku, jak i końca ciągu.
- characters_to_remove (opcjonalny): Określa konkretne znaki, które mają być usunięte. Może to być ciąg znaków lub kolumna zawierająca znaki.
- string_expression: Wyrażenie tekstowe, z którego mają być usunięte znaki.
Przykłady:
Usunięcie spacji z początku i końca ciągu:
SELECT TRIM(' Hello World ');
Wynik: 'Hello World'
Usunięcie określonych znaków z początku i końca ciągu:
SELECT TRIM('.,?!' FROM '...Hello, World?!...');
Wynik: 'Hello, World'
Usunięcie spacji tylko z początku ciągu:
SELECT TRIM(LEADING ' ' FROM ' Hello World ');
Wynik: 'Hello World '
Usunięcie spacji tylko z końca ciągu:
SELECT TRIM(TRAILING ' ' FROM ' Hello World ');
Wynik: ' Hello World'
Funkcja TRIM jest przydatna do usuwania zbędnych białych znaków z ciągów, takich jak spacje, które mogą wpływać na porównania, grupowanie lub inne operacje na danych tekstowych.
Warto pamiętać, że dostępność i składnia funkcji TRIM mogą się różnić w zależności od używanej bazy danych. Należy zawsze sprawdzić dokumentację konkretnej bazy danych w celu uzyskania dokładnej składni i zachowania funkcji TRIM. |
Różnica między EXISTS a IN
Klauzula EXISTS i IN służą do filtrowania danych w zapytaniu na podstawie wartości w innym podzapytaniu lub zbiorze wartości. Oto różnica między nimi:
1. EXISTS:
- Klauzula EXISTS sprawdza, czy podzapytanie zwraca jakiekolwiek wyniki.
- Jeśli podzapytanie zwraca przynajmniej jeden wiersz, to warunek EXISTS jest spełniony.
- Klauzula EXISTS jest zwykle używana w warunku WHERE, aby sprawdzić, czy istnieją powiązane wiersze w innych tabelach.
- Może być bardziej wydajna niż IN w przypadku dużych zbiorów danych, ponieważ po znalezieniu pierwszego pasującego wiersza, dalsze poszukiwania są przerwane.
Przykład użycia klauzuli EXISTS:
SELECT column1, column2, ...
FROM table1
WHERE EXISTS (SELECT column1 FROM table2 WHERE condition);
2. IN:
- Klauzula IN porównuje wartość wyrażenia z zestawem wartości dostarczonych w podzapytaniu lub liście wartości.
- Jeśli wartość jest równa jednej z wartości z podzapytania lub listy, warunek IN jest spełniony.
- Klauzula IN jest zwykle używana w warunku WHERE, aby sprawdzić, czy wartość znajduje się w określonym zestawie.
- Może być łatwiejsza do zrozumienia i zapisu niż EXISTS, ale może być mniej wydajna dla dużych zbiorów danych.
Przykład użycia klauzuli IN:
SELECT column1, column2, ...
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);
Podsumowując, klauzula EXISTS sprawdza istnienie przynajmniej jednego pasującego wiersza w podzapytaniu, podczas gdy klauzula IN porównuje wartość do zestawu wartości z podzapytania lub listy. Wybór między nimi zależy od konkretnego przypadku i preferencji programisty. |
Różnice między DELETE a TRUNCATE
Różnica między operacjami DELETE i TRUNCATE dotyczy sposobu usuwania danych w bazie danych. Oto główne różnice między nimi:
DELETE:
- DELETE jest operacją DML (Data Manipulation Language), która służy do usuwania jednego lub więcej wierszy z tabeli.
- Operacja DELETE jest rejestrowana w dzienniku transakcji (ang. transaction log), co oznacza, że można cofnąć operację DELETE w ramach transakcji.
- DELETE można stosować z dodatkowymi warunkami (WHERE), aby precyzyjnie określić, które wiersze mają być usunięte.
- DELETE wywołuje wyzwalacze (triggery) zdefiniowane na tabeli, które mogą wykonywać określone działania przed lub po usunięciu danych.
Przykład użycia DELETE:
DELETE FROM tabela WHERE warunek;
TRUNCATE:
- TRUNCATE jest operacją DDL (Data Definition Language), która służy do usuwania wszystkich wierszy z tabeli.
- Operacja TRUNCATE nie jest rejestrowana w dzienniku transakcji, co oznacza, że nie można cofnąć operacji TRUNCATE w ramach transakcji.
- TRUNCATE nie używa warunków (WHERE), ponieważ usuwa wszystkie wiersze z tabeli.
- TRUNCATE nie wywołuje wyzwalaczy (triggers) zdefiniowanych na tabeli.
Przykład użycia TRUNCATE:
TRUNCATE TABLE tabela;
Podsumowując, DELETE jest operacją bardziej precyzyjną, która umożliwia usuwanie wybranych wierszy z tabeli, rejestrowanie w dzienniku transakcji i wywoływanie wyzwalaczy. TRUNCATE jest szybszą operacją, która usuwa wszystkie wiersze z tabeli, nie rejestruje się w dzienniku transakcji i nie wywołuje wyzwalaczy. Wybór między nimi zależy od konkretnego przypadku i wymagań dotyczących operacji usuwania danych. |
Usuwanie duplikatów z tabeli
Aby usunąć duplikaty z tabeli, można skorzystać z kombinacji operacji SELECT DISTINCT i INSERT INTO lub operacji DELETE z użyciem klauzuli EXISTS lub CTE (Common Table Expression). Oto kilka przykładów:
Przykład 1: Użycie operacji SELECT DISTINCT i INSERT INTO
CREATE TABLE tabela2 AS
SELECT DISTINCT *
FROM tabela;
W tym przykładzie tworzymy nową tabelę tabela2, która zawiera tylko unikalne wiersze z tabeli oryginalnej.
Przykład 2: Użycie operacji DELETE z klauzulą EXISTS
DELETE FROM tabela a
WHERE EXISTS (
SELECT 1
FROM tabela b
WHERE a.kolumna = b.kolumna
AND a.id < b.id
);
W tym przykładzie usuwamy wiersze, dla których istnieje inny wiersz o tej samej wartości kolumny, ale z niższym identyfikatorem (id).
Przykład 3: Użycie operacji DELETE z wykorzystaniem CTE
WITH duplicates AS (
SELECT kolumna, COUNT(*) AS count
FROM tabela
GROUP BY kolumna
HAVING COUNT(*) > 1
)
DELETE FROM tabela
WHERE (kolumna) IN (
SELECT kolumna
FROM duplicates
);
W tym przykładzie tworzymy wspólne wyrażenie tabeli (CTE) o nazwie "duplicates", które identyfikuje kolumny, które mają więcej niż jedno powtórzenie. Następnie wykonujemy operację DELETE, usuwając wiersze, które mają wartości kolumny zawarte w wynikach CTE.
Należy pamiętać, że przed wykonaniem operacji usuwania zawsze warto zrobić kopię zapasową danych lub przetestować zapytanie na kopii testowej bazy danych, aby upewnić się, że operacja usunięcia działa zgodnie z oczekiwaniami i nie spowoduje utraty niepożądanych danych. |
Fuzzy Matching
Fuzzy matching, czyli dopasowywanie przybliżone, może być realizowane w języku SQL za pomocą różnych technik. Oto kilka popularnych sposobów realizacji fuzzy matching w SQL:
- Operator LIKE z użyciem symbolu %: Operator LIKE w połączeniu z symbolem % umożliwia dopasowywanie wzorców z użyciem kawałków tekstu. Symbol % reprezentuje dowolną liczbę znaków (również zero znaków). Przykład:
SELECT column_name
FROM table_name
WHERE column_name LIKE '%fraza%';
W powyższym przykładzie, '%fraza%' dopasuje wartości w kolumnie column_name, które zawierają "fraza" gdziekolwiek wewnątrz ciągu.
- Funkcja SOUNDEX: Funkcja SOUNDEX w niektórych bazach danych (np. MySQL, SQL Server) generuje kod dźwiękowy dla podanego wyrażenia. Działa na podstawie podobieństwa dźwiękowego słów. Może być używana do porównywania słów w celu znalezienia podobnych wyników. Przykład:
SELECT column_name
FROM table_name
WHERE SOUNDEX(column_name) = SOUNDEX('wyrażenie');
W powyższym przykładzie, SOUNDEX(column_name) = SOUNDEX('wyrażenie') porównuje dźwiękowe kody słów w kolumnie column_name z dźwiękowym kodem słowa "wyrażenie".
Funkcje tekstowe: W niektórych bazach danych istnieją specjalne funkcje tekstowe do przeprowadzania dopasowania przybliżonego, takie jak DIFFERENCE w SQL Server. Te funkcje obliczają podobieństwo między dwoma wyrażeniami i zwracają wartość liczbową reprezentującą stopień dopasowania.
- Przykład z użyciem DIFFERENCE w SQL Server:
SELECT column_name
FROM table_name
WHERE DIFFERENCE(column_name, 'wyrażenie') >= 3;
W powyższym przykładzie, DIFFERENCE(column_name, 'wyrażenie') >= 3 porównuje podobieństwo między słowami w kolumnie column_name a słowem "wyrażenie". Wartość 3 lub wyższa wskazuje na wystarczająco wysokie dopasowanie.
Warto pamiętać, że dostępność i składnia funkcji do fuzzy matching mogą się różnić w zależności od używanej bazy danych. Należy sprawdzić dokumentację konkretnej bazy danych w celu uzyskania informacji na temat dostępnych funkcji i ich zastosowania. |
Operator NOT
Operator NOT jest używany w języku SQL do negacji logicznej warunku. Może być stosowany zarówno w warunkach logicznych, jak i w połączeniu z innymi operatorami.
Podstawowym zastosowaniem operatora NOT jest odwrócenie wartości logicznej wyrażenia. Jeśli wyrażenie logiczne jest prawdziwe, operator NOT zwróci wartość fałszu, a jeśli wyrażenie logiczne jest fałszywe, operator NOT zwróci wartość prawdy.
Przykład:
SELECT *
FROM tabela
WHERE NOT kolumna = 'wartosc';
W powyższym przykładzie, operator NOT jest używany do odwrócenia wyniku porównania wartości w kolumnie kolumna z określoną wartością. Jeśli wartość w kolumnie nie jest równa 'wartosc', warunek zostanie spełniony i wiersz zostanie zwrócony.
Operator NOT może być również używany do negacji warunków logicznych, takich jak AND i OR. Na przykład:
SELECT *
FROM tabela
WHERE NOT (warunek1 AND warunek2);
W powyższym przykładzie, operator NOT jest używany do negacji całego warunku logicznego (warunek1 AND warunek2). Jeśli warunek ten jest prawdziwy, operator NOT zwróci wartość fałszu, co oznacza, że warunek zostanie spełniony i wiersz zostanie zwrócony.
Operator NOT może być również łączony z innymi operatorami logicznymi, takimi jak LIKE, BETWEEN, IN itp., aby tworzyć bardziej złożone wyrażenia warunkowe.
Warto pamiętać, że składnia i zachowanie operatora NOT mogą się różnić w zależności od konkretnej bazy danych. Należy zawsze sprawdzić dokumentację danej bazy danych w celu uzyskania dokładnej składni i zachowania operatora NOT. |
IF ELSE
1. Konstrukcja CASE WHEN
:
SELECT
column_name,
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result_default
END AS result
FROM table_name;
Przykład:
SELECT
product_name,
CASE
WHEN units_sold > 1000 THEN 'High'
WHEN units_sold > 500 THEN 'Medium'
ELSE 'Low'
END AS sales_category
FROM products;
2. Funkcja IF
:
SELECT
column_name,
IF(condition, result_true, result_false) AS result
FROM table_name;
Przykład:
SELECT
product_name,
IF(units_sold > 1000, 'High', 'Low') AS sales_category
FROM products;
3. Konstrukcja IIF
(dostępna w niektórych systemach baz danych):
SELECT
column_name,
IIF(condition, result_true, result_false) AS result
FROM table_name;
Przykład:
SELECT
product_name,
IIF(units_sold > 1000, 'High', 'Low') AS sales_category
FROM products;
Wszystkie te opcje pozwalają na definiowanie warunków i przypisywanie wartości w zależności od spełnienia tych warunków. Wybór odpowiedniej opcji zależy od systemu bazodanowego, który używasz, ponieważ nie wszystkie bazy danych obsługują wszystkie te konstrukcje. Należy sprawdzić dokumentację konkretnego systemu bazodanowego, aby dowiedzieć się, które opcje są dostępne i jak je prawidłowo używać. |
co to jest Constraint?
Constraint (ograniczenie) w kontekście baz danych odnosi się do reguł i warunków, które są narzucane na dane w tabelach w celu zapewnienia integralności danych i utrzymania spójności bazy danych. Ograniczenia określają pewne reguły, którym muszą odpowiadać dane wprowadzane do tabeli. Główne typy ograniczeń w bazach danych to:
1. Primary Key (Klucz podstawowy): Ograniczenie primary key zapewnia unikalność wartości w kolumnie lub grupie kolumn w tabeli. Pozwala to na jednoznaczne identyfikowanie każdego wiersza w tabeli.
Przykład:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(50)
);
2. Foreign Key (Klucz obcy): Ograniczenie foreign key definiuje relacje między tabelami. Określa, że wartości w kolumnie lub grupie kolumn w jednej tabeli muszą odpowiadać wartościom klucza podstawowego w innej tabeli.
Przykład:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);
3. Unique Key (Klucz unikalny): Ograniczenie unique key zapewnia unikalność wartości w kolumnie lub grupie kolumn, ale pozwala na obecność wartości null.
Przykład:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(50),
email VARCHAR(50) UNIQUE
);
4. Check Constraint (Ograniczenie sprawdzające): Ograniczenie check definiuje warunek, który musi zostać spełniony przez wartości w kolumnie.
Przykład:
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(50),
quantity INT,
price DECIMAL(10, 2),
CHECK (quantity >= 0 AND price > 0)
);
Ograniczenia są ważnym elementem projektowania bazy danych i pomagają utrzymać spójność i integralność danych. Zapewniają również ochronę przed wprowadzaniem nieprawidłowych lub niepożądanych danych do tabel. |
|
Created By
Metadata
Comments
No comments yet. Add yours below!
Add a Comment
Related Cheat Sheets