składania SQL z zapytaniami
|
SELECT
|
SELECT * FROM tabela; |
|
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; |
|
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; |
|
CREATE (TABLE, DATABASE, ...)
|
CREATE TABLE tabela ( |
|
CREATE VIEW
|
CREATE VIEW widok AS |
|
ALTER TABLE (ADD, DROP, ALTER)
|
ALTER TABLE tabela |
|
DROP (TABLE, DATABASE, ...)
|
DROP TABLE tabela; |
|
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
|
COMMIT; |
|
COMMIT
|
używana do zatwierdzania bieżącej transakcji, co oznacza trwałe zapisanie wprowadzonych zmian w bazie danych
|
COMMIT; |
|
ROLLBACK
|
jest używana do wycofywania bieżącej transakcji, czyli cofania wprowadzonych zmian do stanu poprzedniego
|
ROLLBACK; |
|
SAVEPOINT
|
używana do tworzenia punktu zapisu w trakcie trwania transakcji
|
SAVEPOINT punkt_zapisu; |
|
RELEASE SAVEPOINT
|
używana do usunięcia punktu zapisu utworzonego za pomocą instrukcji SAVEPOINT
|
RELEASE SAVEPOINT punkt_zapisu; |
CREATE VIEW SalesReport ASSELECT ProductID, SUM(Quantity Price) AS TotalSalesFROM SalesWHERE OrderDate BETWEEN '2022-01-01' AND '2022-12-31'GROUP BY ProductID;SELECT FROM SalesReport;|
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, |
|
UNION ALL
|
wykonuje łączenie wyników zapytań bez usuwania duplikatów
|
SELECT column1, |
|
INTERSECT
|
zwraca tylko te wiersze, które występują jednocześnie w wynikach obu zapytań SELECT
|
SELECT column1, |
|
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, |
|
JOIN (INNER JOIN)
|
SELECT Orders.OrderID, |
|
LEFT JOIN
|
SELECT Customers.CustomerName, |
|
RIGHT JOIN
|
SELECT Customers.CustomerName, |
|
FULL JOIN
|
SELECT Customers.CustomerName, |
|
Zagnieżdżone zapytania (subqueries)
|
SELECT * |
|
Warunki złączenia (JOIN conditions) w klauzuli WHERE
|
SELECT * |
|
Funkcje skalarne
|
SELECT Table1.Column1, |
|
CROSS JOIN
|
SELECT * |
|
NATURAL JOIN (automatycznie łączy dwie tabele na podstawie wspólnych nazw kolumn)
|
SELECT * |
SELECT order_id, customer_id, order_total, SUM(order_total)OVER (PARTITION BY customer_id) AS sum_order_totalFROM orders;SELECT column1, column2, AVG(column3) OVER (PARTITION BY column1, column2) AS avg_column3FROM table;SELECT column1, column2, RANK() OVER (PARTITION BY column1 ORDER BY column2 DESC) AS rank_column2FROM table;|
RANK() / DENSE_RANK() / ROW_NUMBER()
|
Przypisuje wartość rankingu, gęstego rankingu lub numeru wiersza do każdego wiersza w wynikach zapytania
|
SELECT kolumna, |
|
NTILE()
|
Dzieli zestaw danych na równą liczbę grup i przypisuje numer grupy do każdego wiersza
|
SELECT kolumna, |
|
CUME_DIST()
|
Oblicza kumulacyjną wartość dystrybucji dla danego wiersza w zestawie danych
|
SELECT kolumna, |
|
FIRST_VALUE() / LAST_VALUE()
|
Zwraca pierwszą lub ostatnią wartość z określonej kolumny w ramach grupy
|
SELECT kolumna, |
|
LAG() / LEAD()
|
Zwraca wartość z poprzedniego lub następnego wiersza w zestawie danych
|
SELECT kolumna, |
|
NTH_VALUE()
|
Zwraca wartość z określonego wiersza w określonym oknie, gdzie numer wiersza jest podany
|
NTH_VALUE(column, n) |
SELECT customer_id, STRING_AGG(order_id, ', ' ORDER BY order_id) WITHIN GROUP (ORDER BY order_id) AS order_listFROM ordersGROUP BY customer_id;SELECT job_title, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salaryFROM employeesGROUP BY job_title;SELECT PERCENTILE_DISC(0.75) WITHIN GROUP (ORDER BY score) AS percentile_valueFROM scores;selectpercentile_disc(array[0.1, 0.5, 0.9])within group (order by liczba_pasazerow) askwantyle from wnioskiSELECT category, MODE() WITHIN GROUP (ORDER BY category) AS mode_categoryFROM productsGROUP BY category;|
CORR(dependent, independent)
|
Oblicza współczynnik korelacji między dwiema zmiennymi
|
SELECT CORR(sales, advertising) AS correlation |
|
COVAR_POP() / COVAR_SAMP()
|
Oblicza kowariancję między dwiema zmiennymi
|
SELECT COVAR_POP(income, expenditure) AS covariance |
|
STDDEV_POP() / STDDEV_SAMP() / STDDEV()
|
Oblicza odchylenie standardowe danych
|
SELECT STDDEV_POP(temperature) AS population_stddev, |
|
VAR_POP() / VAR_SAMP() / VARIANCE()
|
Oblicza wariancję danych
|
SELECT VAR_POP(sales) AS population_variance, |
|
REGR_INTERCEPT()
|
Oblicza wartość punktu przecięcia linii regresji liniowej
|
SELECT REGR_INTERCEPT(sales, advertising) AS intercept |
|
REGR_SLOPE()
|
Oblicza współczynnik nachylenia linii regresji liniowej.
|
SELECT REGR_SLOPE(sales, advertising) AS slope |
SELECT column1FROM table1WHERE column2 IN (SELECT column3 FROM table2);SELECT column1FROM table1WHERE column2 NOT IN (1, 2, 3);SELECT column1FROM table1WHERE column2 = 'value';SELECT column1FROM table1WHERE column2 <> 'value';SELECT column1FROM table1WHERE EXISTS (SELECT column2 FROM table2 WHERE column2 = table1.column3);SELECT column1FROM table1WHERE column2 > ANY (SELECT column3 FROM table2);SELECT column1FROM table1WHERE column2 = ALL (SELECT column3 FROM table2);SELECT column1FROM table1WHERE column2 BETWEEN 10 AND 20;SELECT column1FROM table1WHERE column2 LIKE 'A%';SELECT column1FROM table1WHERE column2 ILIKE 'a%';SELECT column1FROM table1WHERE column2 IS NULL;BEGIN TRANSACTION;COMMIT;ROLLBACK;SAVEPOINT savepoint_name;RELEASE SAVEPOINT savepoint_name;ROLLBACK TO SAVEPOINT savepoint_name;UPDATE Person.AddressSET AddressLine1 = 'Prosta 51'WHERE AddressID = 1BEGIN TRANSACTIONUPDATE Person.AddressSET AddressLine1 = 'Prosta 51'WHERE AddressID = 1UPDATE Person.AddressSET AddressLine1= 'Przyokopowa 31'
COMMIT TRANSACTIONCREATE PROCEDURE GetCustomerOrders @customerId INTASBEGIN SELECT FROM Orders WHERE CustomerId = @customerId;END;CREATE FUNCTION GetOrderTotal (@orderId INT)RETURNS DECIMAL(10, 2)ASBEGIN DECLARE @total DECIMAL(10, 2); SELECT @total = SUM(Quantity Price) FROM OrderItems WHERE OrderId = @orderId; RETURN @total;END;CREATE TRIGGER UpdateOrderTotalON OrderItemsAFTER INSERT, UPDATE, DELETEASBEGIN 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;DESCRIBE tabela;DESC tabela;SHOW COLUMNS FROM tabela;DESCRIBE tabela nazwa_kolumny;DESCRIBE uzytkownicy imie;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;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;LIKE w języku SQL można używać różnych wzorców. Oto kilka najczęściej stosowanych wzorców wraz z ich opisem:% (znak procentu):% 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_ (podkreślnik):_ 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[] (klasy znaków):'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'[] (negacja klasy znaków):'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'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.SELECT column_nameFROM table_nameWHERE column_name ~ '[a-z]$';SELECT column_nameFROM table_nameWHERE column_name REGEXP '[a-z]$';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)."" (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.SELECT column_nameFROM table_nameWHERE column_name = '';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.<> 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.IS NULL lub IS NOT NULL.'' 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.GROUP BY i w funkcjach okna ma kilka istotnych różnic: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.SELECT department, SUM(salary) AS total_salaryFROM employeesGROUP BY department;SELECT employee_id, last_name, salary, SUM(salary) OVER (PARTITION BY department) AS total_salaryFROM employees;SUM jest używana do obliczania sumy wynagrodzenia dla każdego pracownika w ramach danego departamentu, ale nie powoduje to podziału na grupy.GROUP BY ogranicza wyniki do grup, dla których obliczone są agregaty. Każda grupa jest reprezentowana przez jeden wiersz wynikowy.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.SELECT department, AVG(salary) AS avg_salaryFROM employeesGROUP BY department;SELECT employee_id, last_name, salary, AVG(salary) OVER (PARTITION BY department) AS avg_salaryFROM employees;department w klauzuli SELECT. Funkcja okna jest wywoływana bezpośrednio w zapytaniu SELECT, a wynik jest automatycznie obliczany dla każdego wiersza.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.SELECT 'Hello, World!' AS message FROM DUAL;SELECT bez odwoływania się do jakiejkolwiek tabeli, lub tworząc tymczasową tabelę do testowania zapytań.ROWNUM (Oracle) lub ROW_NUMBER() (inny dialekt SQL):SELECT ROWNUM, first_name, last_nameFROM employeesWHERE ROWNUM <= 10;ROWID (Oracle) lub CTID (PostgreSQL):UPDATE employeesSET salary = 5000WHERE ROWID = 'AAABBBCCC';SYSDATE (Oracle) lub CURRENT_TIMESTAMP (inny dialekt SQL):SELECT order_id, order_date, SYSDATE AS current_dateFROM orders;LEVEL (Oracle) lub GENERATION (inny dialekt SQL):SELECT employee_id, last_name, LEVELFROM employeesSTART WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_id;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.SELECT object_name, object_typeFROM all_objectsWHERE object_id = 12345;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.SELECT object_id, object_valueFROM xml_table;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.SELECT rowid, ora_rowscnFROM my_table;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.SELECT xmldataFROM xml_table;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.SELECT my_sequence.NEXTVALFROM dual;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.SELECT employee_id, last_name, CONNECT_BY_ISCYCLEFROM employeesSTART WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_id;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_nameFROM employees eJOIN employees m ON e.manager_id = m.employee_id;CREATE TYPE person_type AS ( first_name VARCHAR(50), last_name VARCHAR(50), age INT);DECLARE person person_type;BEGIN person.first_name := 'John'; person.last_name := 'Doe'; person.age := 30; ...END;CREATE TYPE colors AS VARCHAR(20) ARRAY;DECLARE color_list colors := ARRAY['red', 'green', 'blue']; ...END;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.DECODE:SELECT column_name, DECODE(column_name, value1, result1, value2, result2, default_result) AS mapped_valueFROM table_name;SELECT product_name, DECODE(category_id, 1, 'Electronics', 2, 'Clothing', 'Other') AS category_nameFROM products;SELECT column_name, DECODE(condition, value1, result1, value2, result2, default_result) AS resultFROM table_name;SELECT order_date, DECODE(SIGN(total_amount - 100), 1, 'Above', -1, 'Below', 'Equal') AS statusFROM orders;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.-- Tworzenie sekwencjiCREATE SEQUENCE seq_employee_id START WITH 1 INCREMENT BY 1 NOCACHE;-- Wykorzystanie sekwencji do generowania wartościINSERT INTO employees (employee_id, employee_name)VALUES (seq_employee_id.NEXTVAL, 'John Doe');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.SELECT kolumnyFROM tabelaWHERE warunkiGROUP BY kolumnyHAVING warunkiORDER BY kolumnyLIMIT liczba_wierszyOFFSET przesuniecie;|
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
|
|
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'
|
|
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)
|
|
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(*)
|
Zlicza wszystkie wiersze w wyniku zapytania, niezależnie od wartości w poszczególnych kolumnach
|
SELECT COUNT(*) |
|
COUNT(1)
|
Zlicza wszystkie wiersze w wyniku zapytania, używając stałej wartości
|
SELECT COUNT(1) |
|
COUNT(column_name)
|
Zlicza liczbę niepustych wartości w określonej kolumnie
|
SELECT COUNT(Quantity) |
|
COUNT(DISTINCT column_name)
|
Zlicza liczbę unikalnych niepustych wartości w określonej kolumnie
|
SELECT COUNT( |
|
COUNT(expression)
|
Zlicza liczbę niepustych wartości zwracanych przez określone wyrażenie
|
SELECT COUNT(CASE |
|
COUNT(DISTINCT expression)
|
Zlicza liczbę unikalnych niepustych wartości zwracanych przez określone wyrażenie.
|
SELECT COUNT(DISTINCT CONCAT( |
|
IS NOT NULL
|
Zliczanie niepustych wartości w kolumnie
|
SELECT COUNT(*) |
|
IS NULL
|
Zliczanie wartości NULL w kolumnie
|
SELECT COUNT(*) |
|
CONCAT()
|
Łączy dwa lub więcej łańcuchów znakowych
|
SELECT CONCAT(FirstName, ' ', LastName) |
|
LENGTH() / LEN()
|
Zwraca długość łańcucha znakowego
|
SELECT LENGTH(FirstName) |
|
UPPER()
|
Konwertuje łańcuch znakowy na wielkie litery
|
SELECT UPPER(FirstName) |
|
LOWER()
|
Konwertuje łańcuch znakowy na małe litery
|
SELECT LOWER(LastName) |
|
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) |
|
REPLACE()
|
Zamienia wszystkie wystąpienia określonego podłańcucha na inny podłańcuch w łańcuchu
|
SELECT REPLACE(Description, 'old', 'new') |
|
TRIM() / LTRIM() / RTRIM()
|
Usuwa początkowe i końcowe białe znaki z łańcucha
|
SELECT TRIM(FirstName) |
|
LEFT()
|
Zwraca określoną liczbę znaków z lewej strony łańcucha
|
SELECT LEFT(FirstName, 3) |
|
RIGHT()
|
Zwraca określoną liczbę znaków z prawej strony łańcucha
|
SELECT RIGHT(LastName, 2) |
|
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' |
|
ABS()
|
Zwraca wartość bezwzględną liczby
|
SELECT ABS(-10) |
|
ROUND()
|
Zaokrągla liczbę do określonej liczby miejsc po przecinku
|
SELECT ROUND(3.14159, 2) |
|
CEILING()
|
Zwraca najmniejszą liczbę całkowitą większą lub równą danej liczbie
|
SELECT CEILING(4.25) |
|
FLOOR()
|
Zwraca największą liczbę całkowitą mniejszą lub równą danej liczbie
|
SELECT FLOOR(4.75) |
|
SQRT()
|
Zwraca pierwiastek kwadratowy z liczby
|
SELECT SQRT(25) |
|
POWER()
|
Podnosi daną liczbę do określonej potęgi
|
SELECT POWER(2, 3) |
|
MOD()
|
Zwraca resztę z dzielenia jednej liczby przez drugą
|
SELECT MOD(10, 3) |
|
RAND()
|
Zwraca losową liczbę z zakresu od 0 do 1
|
SELECT RAND() |
|
SIGN()
|
Zwraca znak liczby (-1 dla liczby ujemnej, 0 dla zera, 1 dla liczby dodatniej)
|
SELECT SIGN(-15) |
|
RANDOM()
|
Zwraca losową liczbę z określonego zakresu
|
SELECT RANDOM() |
|
PI()
|
Zwraca wartość liczby π (pi)
|
SELECT PI() AS PiValue; |
|
LOG()
|
Oblicza logarytm o podstawie 10 z danej liczby
|
SELECT LOG(100) |
|
LN()
|
Oblicza logarytm naturalny (o podstawie e) z danej liczby
|
SELECT LN(2.71828) |
|
EXP()
|
Oblicza wartość wykładniczą liczby (e) podniesionej do danej potęgi
|
SELECT EXP(1) |
|
GREATEST()
|
Zwraca największą wartość spośród podanych argumentów
|
SELECT GREATEST(5, 8, 2) |
|
LEAST()
|
Zwraca najmniejszą wartość spośród podanych argumentów
|
SELECT LEAST(5, 8, 2) |
|
CURRENT_DATE()
|
Zwraca aktualną datę
|
SELECT CURRENT_DATE() |
|
CURRENT_TIME()
|
Zwraca aktualny czas
|
SELECT CURRENT_TIME() |
|
CURRENT_TIMESTAMP()
|
Zwraca aktualną datę i czas
|
SELECT CURRENT_TIMESTAMP() |
|
DATE()
|
Zwraca tylko datę z wartości daty i czasu
|
SELECT DATE('2023-07-04 10:30:00') |
|
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') |
|
DATEADD()
|
Dodaje określoną wartość do daty
|
SELECT DATEADD(DAY, 7, '2023-07-04') |
|
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') |
|
DATE_FORMAT()
|
Formatuje datę według określonego formatu
|
SELECT DATE_FORMAT('2023-07-04', '%Y-%m-%d') |
|
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') |
|
DATE_TRUNC()
|
Skraca datę do określonej jednostki, np. do miesiąca, roku itp.
|
SELECT DATE_TRUNC('month', '2023-07-04') |
|
NOW()
|
Zwraca aktualną datę i czas
|
SELECT NOW() |
|
SYSDATE
|
Zwraca aktualną datę i czas
|
SELECT SYSDATE |
|
HOW TIMEZONE
|
Zwraca bieżącą strefę czasową ustawioną w bazie danych
|
SHOW TIMEZONE; |
|
TIME
|
Typ danych TIME reprezentuje wartość czasu bez daty
|
SELECT TIME '10:30:45' |
|
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
|
|
IS NULL
|
Sprawdza, czy określona wartość jest NULL-em
|
SELECT * |
|
IS NOT NULL
|
Sprawdza, czy określona wartość nie jest NULL-em
|
SELECT * |
|
COALESCE()
|
Zwraca pierwszą nie-NULL-ową wartość z listy wartości
|
SELECT COALESCE(kolumna1, |
|
NULLIF()
|
Zwraca NULL, jeśli dwa wyrażenia są równe, w przeciwnym razie zwraca pierwsze wyrażenie
|
SELECT NULLIF(kolumna1, 0) |
|
NVL()
|
Zwraca drugie wyrażenie, jeśli pierwsze jest NULL-em
|
SELECT NVL(kolumna1, |
|
IFNULL()
|
Zwraca drugie wyrażenie, jeśli pierwsze jest NULL-em
|
SELECT IFNULL(kolumna1, |
|
COUNT()
|
Zlicza liczbę wierszy lub wartości w danej kolumnie.
|
SELECT COUNT(*) |
|
SUM()
|
Oblicza sumę wartości w danej kolumnie numerycznej.
|
SELECT SUM(kolumna) |
|
AVG()
|
Oblicza średnią wartość w danej kolumnie numerycznej.
|
SELECT AVG(kolumna) |
|
MIN()
|
Zwraca najmniejszą wartość w danej kolumnie.
|
SELECT MIN(kolumna) |
|
MAX()
|
Zwraca największą wartość w danej kolumnie.
|
SELECT MAX(kolumna) |
|
GROUP_CONCAT (MySQL, MariaDB)
|
Konkatenacja wartości napisowych z grupy w jedną wartość napisową, rozdzieloną separatorem.
|
SELECT GROUP_CONCAT(nazwa_kolumny |
|
LISTAGG (Oracle)
|
Konkatenacja wartości napisowych z grupy w jedną wartość napisową, rozdzieloną separatorem.
|
SELECT LISTAGG(nazwa_kolumny, |
|
GROUP BY
|
Grupuje wyniki zapytania według wartości określonych kolumn.
|
SELECT 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, |
|
GROUP BY CUBE
|
generuje wszystkie możliwe kombinacje wartości w kolumnach podsumowania, tworząc tzw. kostkę (cube)
|
SELECT kolumna1, |
|
HAVING
|
służy do filtrowania wyników zapytania po grupowaniu, na podstawie warunków logicznych
|
SELECT kolumna, |
SELECT Product, Region, SUM(Quantity) AS TotalQuantity FROM Sales GROUP BY ROLLUP(Product, Region);SELECT Product, Region, SUM(Quantity) AS TotalQuantity FROM Sales GROUP BY CUBE(Product, Region);SELECT column1FROM table1WHERE column2 IN (SELECT column3 FROM table2);SELECT column1FROM table1WHERE column2 IN (SELECT column3 FROM table2 WHERE column4 > 100);WITH nazwa_cte (kolumna1, kolumna2, ...)AS ( SELECT kolumna1, kolumna2, ... FROM tabela WHERE warunek)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_salesFROM sales_cteWHERE total_sales > 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.column4FROM cte1JOIN cte2 ON cte1.column1 = cte2.column3;WITH RECURSIVE nazwa (kolumny) AS ( Zapytanie_nie_rekurencyjne UNION [ALL] Zapytanie_rekurencyjne)Zapytanie_główneWITH 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;SELECT FROM table_nameORDER BY RANDOM()LIMIT 10;SELECT FROM table_nameORDER BY RAND()LIMIT 10;SELECT TOP 10 FROM table_nameORDER BY NEWID();SELECT FROM table_nameWHERE RANDOM() < 0.01;SELECT *FROM table_name TABLESAMPLE SYSTEM(1);SELECT FROM ( SELECT category, product, quantity FROM sales ) AS src PIVOT ( SUM(quantity) FOR product IN ([ProductA], [ProductB], [ProductC]) ) AS pivot_table; SELECT FROM crosstab(‘SQL tworzący tabelę w postaci tekstu’) AS nazwa_tabeli(definicja kolumn wynikowych tabeli);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);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ń.
SELECT 'Hello' + ' ' + 'World' AS concatenated_string;SELECT CONCAT('Hello', ' ', 'World') AS concatenated_string;SELECT CONCAT_WS(', ', 'John', 'Doe', 'New York') AS concatenated_string;SELECT STUFF('Hello World', 6, 0, ', ') AS concatenated_string;SELECT CAST(kolumna AS nowy_typ) AS nowa_kolumnaFROM tabela;SELECT CONVERT(nowy_typ, kolumna) AS nowa_kolumnaFROM tabela;convert(name, 'AL32UTF8', 'WE8MSWIN1252')SELECT CONVERT(name, 'UTF8', 'AL32UTF8') FROM nazwa_tabeliSELECT TO_NUMBER(kolumna) AS nowa_kolumnaFROM tabela;SELECT kolumna::integer AS nowa_kolumnaFROM tabela;SELECT FROM tabelaWHERE NOT kolumna = 'wartosc';SELECT FROM tabelaWHERE NOT (warunek1 AND warunek2);SELECT column_nameFROM table_nameWHERE column_name LIKE '%fraza%';SELECT column_nameFROM table_nameWHERE SOUNDEX(column_name) = SOUNDEX('wyrażenie');SELECT column_nameFROM table_nameWHERE DIFFERENCE(column_name, 'wyrażenie') >= 3;SELECT TRIM(' Hello World ');SELECT TRIM('.,?!' FROM '...Hello, World?!...');SELECT TRIM(LEADING ' ' FROM ' Hello World ');SELECT TRIM(TRAILING ' ' FROM ' Hello World ');SELECT column1, column2, ...FROM table1WHERE EXISTS (SELECT column1 FROM table2 WHERE condition);SELECT column1, column2, ...FROM table1WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);DELETE FROM tabela WHERE warunek;TRUNCATE TABLE tabela;CREATE TABLE tabela2 ASSELECT DISTINCT FROM tabela;DELETE FROM tabela aWHERE EXISTS ( SELECT 1 FROM tabela b WHERE a.kolumna = b.kolumna AND a.id < b.id);WITH duplicates AS ( SELECT kolumna, COUNT() AS count FROM tabela GROUP BY kolumna HAVING COUNT(*) > 1)DELETE FROM tabelaWHERE (kolumna) IN ( SELECT kolumna FROM duplicates);CASE WHEN:SELECT column_name, CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE result_default END AS resultFROM table_name;SELECT product_name, CASE WHEN units_sold > 1000 THEN 'High' WHEN units_sold > 500 THEN 'Medium' ELSE 'Low' END AS sales_categoryFROM products;IF:SELECT column_name, IF(condition, result_true, result_false) AS resultFROM table_name;SELECT product_name, IF(units_sold > 1000, 'High', 'Low') AS sales_categoryFROM products;IIF (dostępna w niektórych systemach baz danych):SELECT column_name, IIF(condition, result_true, result_false) AS resultFROM table_name;SELECT product_name, IIF(units_sold > 1000, 'High', 'Low') AS sales_categoryFROM products;CREATE TABLE customers ( customer_id INT PRIMARY KEY, customer_name VARCHAR(50));CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers (customer_id));CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), email VARCHAR(50) UNIQUE);CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(50), quantity INT, price DECIMAL(10, 2), CHECK (quantity >= 0 AND price > 0));No comments yet.
Cheatography n. The art of mapping complex subjects into clear, instantly navigable reference guides.