\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{sigeud} \pdfinfo{ /Title (sql.pdf) /Creator (Cheatography) /Author (sigeud) /Subject (SQL Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{1F6E8C} \definecolor{LightBackground}{HTML}{F1F5F7} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{SQL Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{sigeud} via \textcolor{DarkBackground}{\uline{cheatography.com/188214/cs/39451/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}sigeud \\ \uline{cheatography.com/sigeud} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Published 4th July, 2023.\\ Updated 9th July, 2023.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{2} \begin{tabularx}{8.4cm}{p{1.04 cm} x{6.96 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{SQL DML (Data Manipulation Language)}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{SELECT} & `SELECT * FROM tabela;` \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \seqsplit{INSERT} & `INSERT INTO tabela (kolumna1, kolumna2) VALUES ('wartość1', 'wartość2');` \tn % Row Count 5 (+ 3) % Row 2 \SetRowColor{LightBackground} \seqsplit{UPDATE} & `UPDATE tabela SET kolumna1 = 'nowa\_wartość' WHERE warunek;` \tn % Row Count 7 (+ 2) % Row 3 \SetRowColor{white} \seqsplit{DELETE} & `DELETE FROM tabela WHERE warunek;` \tn % Row Count 9 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{DML umożliwia manipulację danymi w bazie danych, obejmuje operacje takie jak wstawianie, modyfikowanie, usuwanie i pobieranie danych z bazy.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.36 cm} x{6.64 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{SQL DQL (Data Query Language)}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{SELECT} & `SELECT kolumna1, kolumna2 FROM tabela WHERE warunek;` \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \seqsplit{DISTINCT} & `SELECT DISTINCT kolumna FROM tabela;` \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} ORDER BY & `SELECT kolumna1, kolumna2 FROM tabela ORDER BY kolumna1 ASC;` \tn % Row Count 6 (+ 2) % Row 3 \SetRowColor{white} GROUP BY & `SELECT kolumna, COUNT(*) FROM tabela GROUP BY kolumna;` \tn % Row Count 8 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{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.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{3.44 cm} x{4.56 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{SQL DDL (Data Definition Language)}} \tn % Row 0 \SetRowColor{LightBackground} CREATE (TABLE, DATABASE, ...) & `CREATE TABLE tabela ( \{\{nl\}\} kolumna1 typ\_danych, \{\{nl\}\} kolumna2 typ\_danych, \{\{nl\}\} ... \{\{nl\}\});` \tn % Row Count 5 (+ 5) % Row 1 \SetRowColor{white} CREATE VIEW & `CREATE VIEW widok AS \{\{nl\}\} SELECT kolumna1, kolumna2 \{\{nl\}\} FROM tabela \{\{nl\}\} WHERE warunek;` \tn % Row Count 10 (+ 5) % Row 2 \SetRowColor{LightBackground} ALTER TABLE (ADD, DROP, ALTER) & `ALTER TABLE tabela \{\{nl\}\} ADD kolumna typ\_danych;` \tn % Row Count 13 (+ 3) % Row 3 \SetRowColor{white} DROP (TABLE, DATABASE, ...) & `DROP TABLE tabela;` \tn % Row Count 15 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{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.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{0.836 cm} x{3.42 cm} x{3.344 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{SQL DCL (Data Control Language)}} \tn % Row 0 \SetRowColor{LightBackground} GRANT & używana do udzielania uprawnień użytkownikom w bazie danych & `GRANT SELECT, INSERT ON tabela TO użytkownik;` \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} \seqsplit{REVOKE} & używana do cofania uprawnień użytkownikom w bazie danych & `REVOKE DELETE ON tabela FROM użytkownik;` \tn % Row Count 8 (+ 4) % Row 2 \SetRowColor{LightBackground} GRANT ROLE & używana do nadawania roli użytkownikowi w bazie danych & `GRANT rola TO użytkownik;` \tn % Row Count 12 (+ 4) % Row 3 \SetRowColor{white} \seqsplit{COMMIT} & używana do zatwierdzania transakcji, czyli trwałego zapisania zmian wprowadzonych w bazie danych & `COMMIT;` \tn % Row Count 18 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}---} \SetRowColor{LightBackground} \mymulticolumn{3}{x{8.4cm}}{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.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.444 cm} x{3.344 cm} x{2.812 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{SQL TCL (Transactional Control Language)}} \tn % Row 0 \SetRowColor{LightBackground} COMMIT & używana do zatwierdzania bieżącej transakcji, co oznacza trwałe zapisanie wprowadzonych zmian w bazie danych & `COMMIT;` \tn % Row Count 7 (+ 7) % Row 1 \SetRowColor{white} \seqsplit{ROLLBACK} & jest używana do wycofywania bieżącej transakcji, czyli cofania wprowadzonych zmian do stanu poprzedniego & `ROLLBACK;` \tn % Row Count 14 (+ 7) % Row 2 \SetRowColor{LightBackground} \seqsplit{SAVEPOINT} & używana do tworzenia punktu zapisu w trakcie trwania transakcji & `SAVEPOINT \seqsplit{punkt\_zapisu;`} \tn % Row Count 18 (+ 4) % Row 3 \SetRowColor{white} \seqsplit{RELEASE} \seqsplit{SAVEPOINT} & używana do usunięcia punktu zapisu utworzonego za pomocą instrukcji SAVEPOINT & `RELEASE SAVEPOINT \seqsplit{punkt\_zapisu;`} \tn % Row Count 23 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}---} \SetRowColor{LightBackground} \mymulticolumn{3}{x{8.4cm}}{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.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Widoki (Views)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 7 (+ 7) 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. \newline % Row Count 12 (+ 5) `CREATE VIEW SalesReport AS` \newline % Row Count 13 (+ 1) `SELECT ProductID, SUM(Quantity * Price) AS TotalSales` \newline % Row Count 15 (+ 2) `FROM Sales` \newline % Row Count 16 (+ 1) `WHERE OrderDate BETWEEN '2022-01-01' AND '2022-12-31'` \newline % Row Count 18 (+ 2) `GROUP BY ProductID;` \newline % Row Count 19 (+ 1) `SELECT * FROM SalesReport;`% Row Count 20 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.368 cm} x{3.116 cm} x{3.116 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Łączenie zbiorów (tabel)}} \tn % Row 0 \SetRowColor{LightBackground} 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, \{\{nl\}\} column2 \{\{nl\}\} FROM table1 \{\{nl\}\} UNION \{\{nl\}\} SELECT column1, column2 \{\{nl\}\} FROM table2;` \tn % Row Count 10 (+ 10) % Row 1 \SetRowColor{white} UNION ALL & wykonuje łączenie wyników zapytań bez usuwania duplikatów & `SELECT column1, \{\{nl\}\} column2 \{\{nl\}\} FROM table1 \{\{nl\}\} WHERE condition \{\{nl\}\} UNION ALL \{\{nl\}\} SELECT column1, \{\{nl\}\} column2 \{\{nl\}\} FROM table2 \{\{nl\}\} WHERE condition;` \tn % Row Count 21 (+ 11) % Row 2 \SetRowColor{LightBackground} \seqsplit{INTERSECT} & zwraca tylko te wiersze, które występują jednocześnie w wynikach obu zapytań SELECT & `SELECT column1, \{\{nl\}\} column2 \{\{nl\}\} FROM table1 \{\{nl\}\} INTERSECT \{\{nl\}\} SELECT column1, \{\{nl\}\} column2 \{\{nl\}\} FROM table2;` \tn % Row Count 29 (+ 8) % Row 3 \SetRowColor{white} 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, \{\{nl\}\} column2 \{\{nl\}\} FROM table1 \{\{nl\}\} EXCEPT \{\{nl\}\} SELECT column1, \{\{nl\}\} column2 \{\{nl\}\} FROM table2;` \tn % Row Count 38 (+ 9) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Łączenie tabel}} \tn % Row 0 \SetRowColor{LightBackground} JOIN (INNER JOIN) & `SELECT Orders.OrderID, \{\{nl\}\} \seqsplit{Customers.CustomerName} \{\{nl\}\} FROM Orders \{\{nl\}\} INNER JOIN Customers \{\{nl\}\} ON Orders.CustomerID = \seqsplit{Customers.CustomerID;`} \tn % Row Count 8 (+ 8) % Row 1 \SetRowColor{white} LEFT JOIN & `SELECT \seqsplit{Customers.CustomerName}, \{\{nl\}\} Orders.OrderID \{\{nl\}\} FROM Customers \{\{nl\}\} LEFT JOIN Orders \{\{nl\}\} ON \seqsplit{Customers.CustomerID} = Orders.CustomerID;` \tn % Row Count 16 (+ 8) % Row 2 \SetRowColor{LightBackground} RIGHT JOIN & `SELECT \seqsplit{Customers.CustomerName}, \{\{nl\}\} Orders.OrderID \{\{nl\}\} FROM Customers \{\{nl\}\} RIGHT JOIN Orders \{\{nl\}\} ON \seqsplit{Customers.CustomerID} = Orders.CustomerID;` \tn % Row Count 24 (+ 8) % Row 3 \SetRowColor{white} FULL JOIN & `SELECT \seqsplit{Customers.CustomerName}, \{\{nl\}\} Orders.OrderID \{\{nl\}\} FROM Customers \{\{nl\}\} FULL JOIN Orders \{\{nl\}\} ON \seqsplit{Customers.CustomerID} = Orders.CustomerID;` \tn % Row Count 32 (+ 8) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Łączenie tabel (cont)}} \tn % Row 4 \SetRowColor{LightBackground} Zagnieżdżone zapytania (subqueries) & `SELECT * \{\{nl\}\} FROM Table1 \{\{nl\}\} WHERE Column1 IN (\{\{nl\}\} SELECT Column1 \{\{nl\}\} FROM Table2 \{\{nl\}\} WHERE Column2 = 'wartość'\{\{nl\}\} );` \tn % Row Count 8 (+ 8) % Row 5 \SetRowColor{white} Warunki złączenia (JOIN conditions) w klauzuli WHERE & `SELECT * \{\{nl\}\} FROM Table1, \{\{nl\}\} Table2 \{\{nl\}\} WHERE Table1.Column1 = Table2.Column1;` \tn % Row Count 13 (+ 5) % Row 6 \SetRowColor{LightBackground} Funkcje skalarne & `SELECT Table1.Column1, \{\{nl\}\} Table1.Column2, (\{\{nl\}\} SELECT Column3 \{\{nl\}\} FROM Table2 \{\{nl\}\} WHERE Table2.Column1 = Table1.Column1) AS Column3 \{\{nl\}\} FROM Table1;` \tn % Row Count 22 (+ 9) % Row 7 \SetRowColor{white} CROSS JOIN & `SELECT * \{\{nl\}\} FROM Table1 \{\{nl\}\} CROSS JOIN Table2;` \tn % Row Count 25 (+ 3) % Row 8 \SetRowColor{LightBackground} NATURAL JOIN (automatycznie łączy dwie tabele na podstawie wspólnych nazw kolumn) & `SELECT * \{\{nl\}\} FROM Table1 \{\{nl\}\} NATURAL JOIN Table2;` \tn % Row Count 30 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje okna (window functions)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 8 (+ 8) 1. Składnia: \newline % Row Count 9 (+ 1) 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. \newline % Row Count 14 (+ 5) Przykład: \newline % Row Count 15 (+ 1) `SELECT order\_id, customer\_id, order\_total, SUM(order\_total)` \newline % Row Count 17 (+ 2) `OVER (PARTITION BY customer\_id) AS sum\_order\_total` \newline % Row Count 19 (+ 2) `FROM orders;` \newline % Row Count 20 (+ 1) Rezultat: \newline % Row Count 21 (+ 1) order\_id | customer\_id | order\_total | sum\_order\_total \newline % Row Count 23 (+ 2) -{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-- \newline % Row Count 25 (+ 2) 1 | 101 | 50.00 | 150.00 \newline % Row Count 26 (+ 1) 2 | 101 | 75.00 | 150.00 \newline % Row Count 27 (+ 1) 3 | 102 | 100.00 | 250.00 \newline % Row Count 28 (+ 1) 4 | 103 | 200.00 | 200.00 \newline % Row Count 29 (+ 1) 5 | 103 | 50.00 | 200.00 \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje okna (window functions) (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{2. PARTITION BY: \newline % Row Count 1 (+ 1) 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. \newline % Row Count 6 (+ 5) Przykład: \newline % Row Count 7 (+ 1) `SELECT column1, column2, AVG(column3) ` \newline % Row Count 8 (+ 1) `OVER (PARTITION BY column1, column2) AS avg\_column3` \newline % Row Count 10 (+ 2) `FROM table;` \newline % Row Count 11 (+ 1) 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. \newline % Row Count 15 (+ 4) 3. ORDER BY: \newline % Row Count 16 (+ 1) 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. \newline % Row Count 20 (+ 4) Przykład: \newline % Row Count 21 (+ 1) `SELECT column1, column2, RANK() ` \newline % Row Count 22 (+ 1) `OVER (PARTITION BY column1 ` \newline % Row Count 23 (+ 1) `ORDER BY column2 DESC) AS rank\_column2` \newline % Row Count 24 (+ 1) `FROM table;` \newline % Row Count 25 (+ 1) 4. Funkcje okna vs group by \newline % Row Count 26 (+ 1) 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.% Row Count 33 (+ 7) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.356 cm} x{2.66 cm} x{2.584 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Bardziej zaawansowane funkcje agregujące}} \tn % Row 0 \SetRowColor{LightBackground} RANK() / \seqsplit{DENSE\_RANK()} / \seqsplit{ROW\_NUMBER()} & Przypisuje wartość rankingu, gęstego rankingu lub numeru wiersza do każdego wiersza w wynikach zapytania & `SELECT kolumna, \{\{nl\}\} RANK() OVER \{\{nl\}\} (ORDER BY kolumna DESC) AS Rank \{\{nl\}\} FROM tabela;` \tn % Row Count 8 (+ 8) % Row 1 \SetRowColor{white} NTILE() & Dzieli zestaw danych na równą liczbę grup i przypisuje numer grupy do każdego wiersza & `SELECT kolumna, \{\{nl\}\} NTILE(4) OVER \{\{nl\}\} (ORDER BY kolumna) AS GroupNumber \{\{nl\}\} FROM tabela;` \tn % Row Count 16 (+ 8) % Row 2 \SetRowColor{LightBackground} CUME\_DIST() & Oblicza kumulacyjną wartość dystrybucji dla danego wiersza w zestawie danych & `SELECT kolumna, \{\{nl\}\} CUME\_DIST() OVER \{\{nl\}\} (ORDER BY kolumna) AS \seqsplit{CumulativeDistribution} \{\{nl\}\} FROM tabela;` \tn % Row Count 25 (+ 9) % Row 3 \SetRowColor{white} \seqsplit{FIRST\_VALUE()} / \seqsplit{LAST\_VALUE()} & Zwraca pierwszą lub ostatnią wartość z określonej kolumny w ramach grupy & `SELECT kolumna, \{\{nl\}\} \seqsplit{FIRST\_VALUE(kolumna)} \{\{nl\}\} OVER (PARTITION BY \seqsplit{inna\_kolumna} \{\{nl\}\} ORDER BY \seqsplit{kolejna\_kolumna)} AS FirstValue \{\{nl\}\} FROM tabela;` \tn % Row Count 37 (+ 12) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.356 cm} x{2.66 cm} x{2.584 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Bardziej zaawansowane funkcje agregujące (cont)}} \tn % Row 4 \SetRowColor{LightBackground} LAG() / LEAD() & Zwraca wartość z poprzedniego lub następnego wiersza w zestawie danych & `SELECT kolumna, \{\{nl\}\} LAG(kolumna) \{\{nl\}\} OVER (ORDER BY \seqsplit{kolejna\_kolumna)} AS \seqsplit{PreviousValue} \{\{nl\}\} FROM tabela;` \tn % Row Count 9 (+ 9) % Row 5 \SetRowColor{white} NTH\_VALUE() & Zwraca wartość z określonego wiersza w określonym oknie, gdzie numer wiersza jest podany & \seqsplit{`NTH\_VALUE(column}, n) \{\{nl\}\} OVER (PARTITION BY ...)` \tn % Row Count 16 (+ 7) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{row\_number() / rank() / dense\_rank()}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{8.4cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/sigeud_1688475599_row_number-rank-dense_rank.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{\seqsplit{https://learnsql.com/blog/sql-window-functions-cheat-sheet/}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{ntile(n)}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{8.4cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/sigeud_1688475851_ntile.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{percent\_rank() / cume\_dist()}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{8.4cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/sigeud_1688475704_cume_dist-percent_rank.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{first\_value(expr) / last\_value(expr)}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{8.4cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/sigeud_1688475882_first_value-last_value.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{nth\_value(expr, n)}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{8.4cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/sigeud_1688475922_nth_value.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{lead() / lag()}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{8.4cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/sigeud_1688475794_lead-lag.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{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 \newline 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} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje WITHIN GROUP}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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ń. \newline % Row Count 8 (+ 8) - STRING\_AGG, która łączy wartości w jednym łańcuchu znaków, zdefiniowanym separatorem. \newline % Row Count 10 (+ 2) Przykład: \newline % Row Count 11 (+ 1) `SELECT customer\_id, STRING\_AGG(order\_id, ', ' ORDER BY order\_id) WITHIN GROUP` `(ORDER BY order\_id) AS order\_list` \newline % Row Count 14 (+ 3) `FROM orders` \newline % Row Count 15 (+ 1) `GROUP BY customer\_id;` \newline % Row Count 16 (+ 1) Wynik: \newline % Row Count 17 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 18 (+ 1) | customer\_id | order\_list | \newline % Row Count 19 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 20 (+ 1) | 1001 | 1, 2 | \newline % Row Count 21 (+ 1) | 1002 | 3, 4, 5 | \newline % Row Count 22 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 23 (+ 1) - PERCENTILE\_CONT(): \newline % Row Count 24 (+ 1) `SELECT job\_title, PERCENTILE\_CONT(0.5) WITHIN GROUP (ORDER BY salary) ` \newline % Row Count 26 (+ 2) `AS median\_salary` \newline % Row Count 27 (+ 1) `FROM employees` \newline % Row Count 28 (+ 1) `GROUP BY job\_title;` \newline % Row Count 29 (+ 1) wynik: \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje WITHIN GROUP (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 1 (+ 1) | job\_title | median\_salary | \newline % Row Count 2 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 3 (+ 1) | Manager | 5500.00 | \newline % Row Count 4 (+ 1) | Developer | 4000.00 | \newline % Row Count 5 (+ 1) | Analyst | 3500.00 | \newline % Row Count 6 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 7 (+ 1) -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. \newline % Row Count 12 (+ 5) `SELECT PERCENTILE\_DISC(0.75) ` \newline % Row Count 13 (+ 1) `WITHIN GROUP (ORDER BY score) ` \newline % Row Count 14 (+ 1) `AS percentile\_value` \newline % Row Count 15 (+ 1) `FROM scores;` \newline % Row Count 16 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 17 (+ 1) | percentile\_value | \newline % Row Count 18 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 19 (+ 1) | 85 | \newline % Row Count 20 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 21 (+ 1) `select` \newline % Row Count 22 (+ 1) `percentile\_disc(array{[}0.1, 0.5, 0.9{]})` \newline % Row Count 23 (+ 1) `within group (order by liczba\_pasazerow) as` \newline % Row Count 24 (+ 1) `kwantyle from wnioski` \newline % Row Count 25 (+ 1) - PERCENTILE\_DISC() vs PERCENTILE\_CONT() \newline % Row Count 26 (+ 1) 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. \newline % Row Count 34 (+ 8) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje WITHIN GROUP (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 9 (+ 9) - 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 \newline % Row Count 13 (+ 4) `SELECT category, MODE() WITHIN GROUP (ORDER BY category) ` \newline % Row Count 15 (+ 2) `AS mode\_category` \newline % Row Count 16 (+ 1) `FROM products` \newline % Row Count 17 (+ 1) `GROUP BY category;` \newline % Row Count 18 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 19 (+ 1) | category | mode\_category | \newline % Row Count 20 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+ \newline % Row Count 21 (+ 1) | Electronics | Electronics | \newline % Row Count 22 (+ 1) | Clothing | Clothing | \newline % Row Count 23 (+ 1) | Books | Books | \newline % Row Count 24 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}--+% Row Count 25 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.508 cm} x{2.508 cm} x{2.584 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Statystyczne funkcje agregujące}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{CORR(dependent}, independent) & Oblicza \seqsplit{współczynnik} korelacji między dwiema zmiennymi & `SELECT CORR(sales, advertising) AS correlation \{\{nl\}\} FROM \seqsplit{sales\_data;`} \tn % Row Count 6 (+ 6) % Row 1 \SetRowColor{white} COVAR\_POP() / \seqsplit{COVAR\_SAMP()} & Oblicza kowariancję między dwiema zmiennymi & `SELECT \seqsplit{COVAR\_POP(income}, expenditure) AS covariance \{\{nl\}\} FROM \seqsplit{financial\_data;`} \tn % Row Count 13 (+ 7) % Row 2 \SetRowColor{LightBackground} \seqsplit{STDDEV\_POP()} / \seqsplit{STDDEV\_SAMP()} / STDDEV() & Oblicza odchylenie standardowe danych & `SELECT \seqsplit{STDDEV\_POP(temperature)} AS \seqsplit{population\_stddev}, \{\{nl\}\} \seqsplit{STDDEV\_SAMP(temperature)} AS \seqsplit{sample\_stddev}, \{\{nl\}\} \seqsplit{STDDEV(temperature)} AS stddev \{\{nl\}\} FROM \seqsplit{weather\_data;`} \tn % Row Count 26 (+ 13) % Row 3 \SetRowColor{white} VAR\_POP() / VAR\_SAMP() / VARIANCE() & Oblicza wariancję danych & `SELECT \seqsplit{VAR\_POP(sales)} AS \seqsplit{population\_variance},\{\{nl\}\} \seqsplit{VAR\_SAMP(sales)} AS \seqsplit{sample\_variance},\{\{nl\}\} \seqsplit{VARIANCE(sales)} AS variance \{\{nl\}\} FROM \seqsplit{sales\_data;`} \tn % Row Count 38 (+ 12) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.508 cm} x{2.508 cm} x{2.584 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Statystyczne funkcje agregujące (cont)}} \tn % Row 4 \SetRowColor{LightBackground} \seqsplit{REGR\_INTERCEPT()} & Oblicza wartość punktu przecięcia linii regresji liniowej & `SELECT \seqsplit{REGR\_INTERCEPT(sales}, advertising) AS intercept \{\{nl\}\} FROM \seqsplit{sales\_data;`} \tn % Row Count 7 (+ 7) % Row 5 \SetRowColor{white} REGR\_SLOPE() & Oblicza \seqsplit{współczynnik} nachylenia linii regresji liniowej. & `SELECT \seqsplit{REGR\_SLOPE(sales}, advertising) AS slope \{\{nl\}\} FROM \seqsplit{sales\_data;`} \tn % Row Count 13 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Operatory}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{- 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). \newline % Row Count 5 (+ 5) Przykład: \newline % Row Count 6 (+ 1) `SELECT column1` \newline % Row Count 7 (+ 1) `FROM table1` \newline % Row Count 8 (+ 1) `WHERE column2 IN (SELECT column3 FROM table2);` \newline % Row Count 9 (+ 1) - Operator NOT IN, który wykonuje negację operatora IN. Operator NOT IN zwraca prawdę (true), jeśli wartość nie znajduje się w wynikach podzapytania. \newline % Row Count 13 (+ 4) Przykład: \newline % Row Count 14 (+ 1) `SELECT column1` \newline % Row Count 15 (+ 1) `FROM table1` \newline % Row Count 16 (+ 1) `WHERE column2 NOT IN (1, 2, 3);` \newline % Row Count 17 (+ 1) - Operator = / \textless{}\textgreater{} (NOT EQUAL): Operator = służy do porównywania równości między dwiema wartościami. Operator \textless{}\textgreater{} (lub !=) sprawdza, czy wartości są różne od siebie. \newline % Row Count 21 (+ 4) Przykład: \newline % Row Count 22 (+ 1) `SELECT column1` \newline % Row Count 23 (+ 1) `FROM table1` \newline % Row Count 24 (+ 1) `WHERE column2 = 'value';` \newline % Row Count 25 (+ 1) `SELECT column1` \newline % Row Count 26 (+ 1) `FROM table1` \newline % Row Count 27 (+ 1) `WHERE column2 \textless{}\textgreater{} 'value';` \newline % Row Count 28 (+ 1) - 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. \newline % Row Count 34 (+ 6) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Operatory (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Przykład: \newline % Row Count 1 (+ 1) `SELECT column1` \newline % Row Count 2 (+ 1) `FROM table1` \newline % Row Count 3 (+ 1) `WHERE EXISTS (SELECT column2 FROM table2 WHERE column2 = table1.column3);` \newline % Row Count 5 (+ 2) - Operator ANY / ALL: Operator ANY porównuje wartość z wynikami podzapytania przy użyciu określonego operatora porównania (np. \textgreater{}, \textless{}, =). 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. \newline % Row Count 13 (+ 8) Przykład: \newline % Row Count 14 (+ 1) `SELECT column1` \newline % Row Count 15 (+ 1) `FROM table1` \newline % Row Count 16 (+ 1) `WHERE column2 \textgreater{} ANY (SELECT column3 FROM table2);` \newline % Row Count 18 (+ 2) `SELECT column1` \newline % Row Count 19 (+ 1) `FROM table1` \newline % Row Count 20 (+ 1) `WHERE column2 = ALL (SELECT column3 FROM table2);` \newline % Row Count 22 (+ 2) - 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. \newline % Row Count 27 (+ 5) Przykład: \newline % Row Count 28 (+ 1) `SELECT column1` \newline % Row Count 29 (+ 1) `FROM table1` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Operatory (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`WHERE column2 BETWEEN 10 AND 20;` \newline % Row Count 1 (+ 1) - 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. \newline % Row Count 5 (+ 4) Przykład: \newline % Row Count 6 (+ 1) `SELECT column1` \newline % Row Count 7 (+ 1) `FROM table1` \newline % Row Count 8 (+ 1) `WHERE column2 LIKE 'A\%';` \newline % Row Count 9 (+ 1) - 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. \newline % Row Count 15 (+ 6) Przykład: \newline % Row Count 16 (+ 1) `SELECT column1` \newline % Row Count 17 (+ 1) `FROM table1` \newline % Row Count 18 (+ 1) `WHERE column2 ILIKE 'a\%';` \newline % Row Count 19 (+ 1) - 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. \newline % Row Count 23 (+ 4) Przykład: \newline % Row Count 24 (+ 1) `SELECT column1` \newline % Row Count 25 (+ 1) `FROM table1` \newline % Row Count 26 (+ 1) `WHERE column2 IS NULL;`% Row Count 27 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Transakcje SQL}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 6 (+ 6) 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: \newline % Row Count 11 (+ 5) 1. BEGIN/START TRANSACTION: Rozpoczyna nową transakcję. \newline % Row Count 13 (+ 2) `BEGIN TRANSACTION;` \newline % Row Count 14 (+ 1) 2. COMMIT: Zatwierdza transakcję i wprowadza wszystkie jej zmiany do bazy danych. \newline % Row Count 16 (+ 2) `COMMIT;` \newline % Row Count 17 (+ 1) 3. ROLLBACK: Anuluje transakcję i cofa wszystkie jej zmiany, przywracając bazę danych do stanu przed rozpoczęciem transakcji. \newline % Row Count 20 (+ 3) `ROLLBACK;` \newline % Row Count 21 (+ 1) 4. SAVEPOINT: Utworzenie punktu kontrolnego w trakcie transakcji, który można użyć do późniejszego przywrócenia transakcji do określonego stanu. \newline % Row Count 25 (+ 4) `SAVEPOINT savepoint\_name;` \newline % Row Count 26 (+ 1) 5. RELEASE SAVEPOINT: Usuwa określony punkt kontrolny utworzony w trakcie transakcji. \newline % Row Count 28 (+ 2) `RELEASE SAVEPOINT savepoint\_name;` \newline % Row Count 29 (+ 1) 6. ROLLBACK TO SAVEPOINT: Cofa transakcję do określonego punktu kontrolnego, usuwając wszystkie zmiany po tym punkcie. \newline % Row Count 32 (+ 3) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Transakcje SQL (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`ROLLBACK TO SAVEPOINT savepoint\_name;` \newline % Row Count 1 (+ 1) 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. \newline % Row Count 7 (+ 6) 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. \newline % Row Count 14 (+ 7) Najprostszą transkacją w SQL Server jest pojedyncza instrukcja modyfikacji danych. \newline % Row Count 16 (+ 2) `UPDATE Person.Address` \newline % Row Count 17 (+ 1) `SET AddressLine1 = 'Prosta 51'` \newline % Row Count 18 (+ 1) `WHERE AddressID = 1` \newline % Row Count 19 (+ 1) Transakcje z wieloma operacjami (Explicit Transactions) \newline % Row Count 21 (+ 2) `BEGIN TRANSACTION` \newline % Row Count 22 (+ 1) `UPDATE Person.Address` \newline % Row Count 23 (+ 1) `SET AddressLine1 = 'Prosta 51'` \newline % Row Count 24 (+ 1) `WHERE AddressID = 1` \newline % Row Count 25 (+ 1) `UPDATE Person.Address` \newline % Row Count 26 (+ 1) `SET AddressLine1= 'Przyokopowa 31'` \newline % Row Count 27 (+ 1) WHERE AddressID = 2` \newline % Row Count 28 (+ 1) COMMIT TRANSACTION`% Row Count 29 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{\seqsplit{https://www.plukasiewicz.net/Artykuly/SQL\_Transactions}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Procedury, funkcje i triggery}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 4 (+ 4) 1. Procedury: \newline % Row Count 5 (+ 1) - Procedury to zbiorcze instrukcje SQL, które są zdefiniowane i przechowywane w bazie danych. \newline % Row Count 7 (+ 2) - Procedury mogą przyjmować parametry wejściowe, wykonywać operacje na danych, a następnie zwracać wyniki lub modyfikować dane w bazie. \newline % Row Count 10 (+ 3) - Procedury mogą być wywoływane przez inne zapytania SQL lub programy aplikacyjne. \newline % Row Count 12 (+ 2) - Przykład: \newline % Row Count 13 (+ 1) `CREATE PROCEDURE GetCustomerOrders` \newline % Row Count 14 (+ 1) ` @customerId INT` \newline % Row Count 15 (+ 1) `AS` \newline % Row Count 16 (+ 1) `BEGIN` \newline % Row Count 17 (+ 1) ` SELECT * FROM Orders WHERE CustomerId = @customerId;` \newline % Row Count 19 (+ 2) `END;` \newline % Row Count 20 (+ 1) 2. Funkcje: \newline % Row Count 21 (+ 1) - Funkcje są podobne do procedur, ale różnią się sposobem użycia i zwracanymi wartościami. \newline % Row Count 24 (+ 3) - Funkcje zwracają wartość, która może być wykorzystana w zapytaniach SQL, wyrażeniach lub instrukcjach. \newline % Row Count 27 (+ 3) - Mogą być wykorzystywane jako część zapytań SELECT, warunków WHERE, wyrażeń CASE itp. \newline % Row Count 29 (+ 2) - Funkcje mogą być skalarnymi funkcjami (zwracające pojedynczą wartość) lub funkcjami tabelarycznymi (zwracające tabelę wynikową). \newline % Row Count 32 (+ 3) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Procedury, funkcje i triggery (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{ - Przykład: \newline % Row Count 1 (+ 1) `CREATE FUNCTION GetOrderTotal` \newline % Row Count 2 (+ 1) ` (@orderId INT)` \newline % Row Count 3 (+ 1) `RETURNS DECIMAL(10, 2)` \newline % Row Count 4 (+ 1) `AS` \newline % Row Count 5 (+ 1) `BEGIN` \newline % Row Count 6 (+ 1) ` DECLARE @total DECIMAL(10, 2);` \newline % Row Count 7 (+ 1) ` SELECT @total = SUM(Quantity * Price) FROM OrderItems WHERE OrderId = @orderId;` \newline % Row Count 9 (+ 2) ` RETURN @total;` \newline % Row Count 10 (+ 1) `END;` \newline % Row Count 11 (+ 1) 3. Triggery: \newline % Row Count 12 (+ 1) - Triggery są automatycznymi reakcjami na zdarzenia lub operacje w bazie danych, takie jak wstawianie, aktualizacja lub usuwanie danych. \newline % Row Count 15 (+ 3) - Trigger to blok kodu SQL, który jest wywoływany w odpowiedzi na określone zdarzenie. \newline % Row Count 17 (+ 2) - Triggery mogą być definiowane dla tabel i uruchamiane przed lub po wykonaniu określonych operacji. \newline % Row Count 20 (+ 3) - Mogą być wykorzystywane do wprowadzania logiki biznesowej, sprawdzania warunków, synchronizacji danych itp. \newline % Row Count 23 (+ 3) - Przykład: \newline % Row Count 24 (+ 1) `CREATE TRIGGER UpdateOrderTotal` \newline % Row Count 25 (+ 1) `ON OrderItems` \newline % Row Count 26 (+ 1) `AFTER INSERT, UPDATE, DELETE` \newline % Row Count 27 (+ 1) `AS` \newline % Row Count 28 (+ 1) `BEGIN` \newline % Row Count 29 (+ 1) ` UPDATE Orders` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Procedury, funkcje i triggery (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{` SET TotalAmount = (SELECT SUM(Quantity * Price) FROM OrderItems WHERE OrderId =` `inserted.OrderId)` \newline % Row Count 3 (+ 3) ` FROM Orders INNER JOIN inserted ON Orders.OrderId = inserted.OrderId;` \newline % Row Count 5 (+ 2) `END;` \newline % Row Count 6 (+ 1) 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. \newline % Row Count 12 (+ 6) * "@" przed nazwą oznacza, że jest to nazwa parametru wejściowego funkcji.% Row Count 14 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{sprawdzanie typów danych}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{- Aby sprawdzić typy danych w tabeli, można skorzystać z polecenia DESCRIBE lub DESC. Oto przykład: \newline % Row Count 3 (+ 3) `DESCRIBE tabela;` \newline % Row Count 4 (+ 1) Lub \newline % Row Count 5 (+ 1) `DESC tabela;` \newline % Row Count 6 (+ 1) To polecenie wyświetli informacje o strukturze tabeli, w tym nazwy kolumn, typy danych, rozmiary kolumn itp. \newline % Row Count 9 (+ 3) - 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: \newline % Row Count 13 (+ 4) `SHOW COLUMNS FROM tabela;` \newline % Row Count 14 (+ 1) 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. \newline % Row Count 18 (+ 4) - Aby sprawdzić typ danych na konkretnej kolumnie w tabeli, można użyć polecenia DESCRIBE z podaniem nazwy kolumny. Oto przykład: \newline % Row Count 21 (+ 3) `DESCRIBE tabela nazwa\_kolumny;` \newline % Row Count 22 (+ 1) Na przykład, jeśli chcemy sprawdzić typ danych kolumny "imie" w tabeli "uzytkownicy", użyjemy polecenia: \newline % Row Count 25 (+ 3) `DESCRIBE uzytkownicy imie;` \newline % Row Count 26 (+ 1) Polecenie to zwróci informacje dotyczące typu danych dla określonej kolumny, takie jak typ danych, rozmiar, atrybuty null itp.% Row Count 29 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{SELECT {\emph{ a SELECT '}}'}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Różnica między SELECT {\emph{ FROM tabela a SELECT '}}' FROM tabela polega na tym, jak zostaną zwrócone dane. \newline % Row Count 3 (+ 3) - 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: \newline % Row Count 7 (+ 4) `CREATE TABLE osoba (` \newline % Row Count 8 (+ 1) ` id INT,` \newline % Row Count 9 (+ 1) ` imie VARCHAR(50),` \newline % Row Count 10 (+ 1) ` nazwisko VARCHAR(50)` \newline % Row Count 11 (+ 1) `);` \newline % Row Count 12 (+ 1) `INSERT INTO osoba (id, imie, nazwisko)` \newline % Row Count 13 (+ 1) `VALUES (1, 'John', 'Doe'),` \newline % Row Count 14 (+ 1) ` (2, 'Jane', 'Smith');` \newline % Row Count 15 (+ 1) `SELECT * FROM osoba;` \newline % Row Count 16 (+ 1) Wynik: \newline % Row Count 17 (+ 1) | id | imie | nazwisko | \newline % Row Count 18 (+ 1) |-{}-{}-{}-|-{}-{}-{}-{}-{}-|-{}-{}-{}-{}-{}-{}-{}-{}-{}-| \newline % Row Count 19 (+ 1) | 1 | John | Doe | \newline % Row Count 20 (+ 1) | 2 | Jane | Smith | \newline % Row Count 21 (+ 1) - 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: \newline % Row Count 27 (+ 6) `CREATE TABLE osoba (` \newline % Row Count 28 (+ 1) ` id INT,` \newline % Row Count 29 (+ 1) ` imie VARCHAR(50),` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{SELECT {\emph{ a SELECT '}}' (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{` nazwisko VARCHAR(50)` \newline % Row Count 1 (+ 1) `);` \newline % Row Count 2 (+ 1) `INSERT INTO osoba (id, imie, nazwisko)` \newline % Row Count 3 (+ 1) `VALUES (1, 'John', 'Doe'),` \newline % Row Count 4 (+ 1) ` (2, 'Jane', 'Smith');` \newline % Row Count 5 (+ 1) `SELECT '*' FROM osoba;` \newline % Row Count 6 (+ 1) Wynik: \newline % Row Count 7 (+ 1) | '*' | \newline % Row Count 8 (+ 1) |-{}-{}-{}--| \newline % Row Count 9 (+ 1) | '*' | \newline % Row Count 10 (+ 1) | '*' | \newline % Row Count 11 (+ 1) Jak widać, w drugim przypadku zwracane są tylko powtórzone gwiazdki, nie uwzględniając rzeczywistych danych z tabeli. \newline % Row Count 14 (+ 3) 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.% Row Count 19 (+ 5) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{operator LIKE}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 3 (+ 3) 1. `\%` (znak procentu): \newline % Row Count 4 (+ 1) 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: \newline % Row Count 8 (+ 4) - `'\%abc'` - pasuje do ciągów, które kończą się na 'abc' \newline % Row Count 10 (+ 2) - `'abc\%'` - pasuje do ciągów, które zaczynają się od 'abc' \newline % Row Count 12 (+ 2) - `'\%abc\%'` - pasuje do ciągów, które zawierają 'abc' gdziekolwiek \newline % Row Count 14 (+ 2) 2. `\_` (podkreślnik): \newline % Row Count 15 (+ 1) Symbol `\_` odpowiada dokładnie jednemu znakowi. Może być używany na początku, na końcu lub w środku wzorca. Przykłady: \newline % Row Count 18 (+ 3) - `'a\_'` - pasuje do dwuznakowych ciągów, które zaczynają się od 'a' \newline % Row Count 20 (+ 2) - `'\_bc'` - pasuje do dwuznakowych ciągów, które kończą się na 'bc' \newline % Row Count 22 (+ 2) - `'\_b\_'` - pasuje do trzyznakowych ciągów, które mają 'b' na drugiej pozycji \newline % Row Count 24 (+ 2) 3. `{[}{]}` (klasy znaków): \newline % Row Count 25 (+ 1) Klasy znaków pozwalają na określenie zbioru dopuszczalnych znaków w danej pozycji. Przykłady: \newline % Row Count 28 (+ 3) - `'a{[}bc{]}d'` - pasuje do ciągów, które mają 'a', a następnie 'b' lub 'c', a potem 'd' \newline % Row Count 30 (+ 2) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{operator LIKE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{ - `'{[}0-9{]}abc'` - pasuje do ciągów, które mają cyfrę od 0 do 9, a następnie 'abc' \newline % Row Count 2 (+ 2) 4. `{[}\textasciicircum{}{]}` (negacja klasy znaków): \newline % Row Count 3 (+ 1) Negacja klasy znaków oznacza dopasowanie znaku, który nie jest w podanym zbiorze. Przykład: \newline % Row Count 5 (+ 2) - `'a{[}\textasciicircum{}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' \newline % Row Count 8 (+ 3) 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. \newline % Row Count 14 (+ 6) 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 {[}{]}. \newline % Row Count 20 (+ 6) 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. \newline % Row Count 24 (+ 4) Przykład z użyciem wyrażeń regularnych w PostgreSQL: \newline % Row Count 26 (+ 2) `SELECT column\_name` \newline % Row Count 27 (+ 1) `FROM table\_name` \newline % Row Count 28 (+ 1) `WHERE column\_name \textasciitilde{} '\textasciicircum{}{[}a-z{]}\$';` \newline % Row Count 29 (+ 1) Przykład z użyciem wyrażeń regularnych w MySQL: \newline % Row Count 31 (+ 2) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{operator LIKE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`SELECT column\_name` \newline % Row Count 1 (+ 1) `FROM table\_name` \newline % Row Count 2 (+ 1) `WHERE column\_name REGEXP '\textasciicircum{}{[}a-z{]}\$';` \newline % Row Count 3 (+ 1) W powyższych przykładach wyrażenie regularne \textasciicircum{}{[}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. \newline % Row Count 8 (+ 5) Wzorce takie jak \% i \_ wciąż mają takie same znaczenie w przypadku operatora ILIKE. Jednak operatory klasy znaków {[} {]} i {[}\textasciicircum{} {]} 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.% Row Count 14 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{is null = '', not null, \textless{}\textgreater{} ''}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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). \newline % Row Count 6 (+ 6) 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`. \newline % Row Count 13 (+ 7) Przykład: \newline % Row Count 14 (+ 1) `SELECT column\_name` \newline % Row Count 15 (+ 1) `FROM table\_name` \newline % Row Count 16 (+ 1) `WHERE column\_name = '';` \newline % Row Count 17 (+ 1) 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. \newline % Row Count 22 (+ 5) Podobnie, porównanie `\textless{}\textgreater{}` z pustym ciągiem znaków nie jest równoważne z operatorem `IS NOT NULL`. Porównanie `\textless{}\textgreater{}` 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. \newline % Row Count 28 (+ 6) Jeśli chcesz sprawdzić, czy wartość w kolumnie jest pusta lub NULL, powinieneś nadal używać operatorów `IS NULL` lub `IS NOT NULL`. \newline % Row Count 31 (+ 3) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{is null = '', not null, \textless{}\textgreater{} '' (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Wniosek: Porównanie pustego ciągu znaków `''` nie jest równoważne z operatorem `IS NULL`, a porównanie `\textless{}\textgreater{} ''` 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.% Row Count 6 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje agregujące z groupby a w funkcji okna}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Użycie funkcji agregujących z klauzulą `GROUP BY` i w funkcjach okna ma kilka istotnych różnic: \newline % Row Count 3 (+ 3) 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. \newline % Row Count 9 (+ 6) Przykład: \newline % Row Count 10 (+ 1) `SELECT department, SUM(salary) AS total\_salary` \newline % Row Count 12 (+ 2) `FROM employees` \newline % Row Count 13 (+ 1) `GROUP BY department;` \newline % Row Count 14 (+ 1) 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. \newline % Row Count 20 (+ 6) Przykład: \newline % Row Count 21 (+ 1) `SELECT employee\_id, last\_name, salary, SUM(salary) ` \newline % Row Count 23 (+ 2) `OVER (PARTITION BY department) AS total\_salary` \newline % Row Count 25 (+ 2) `FROM employees;` \newline % Row Count 26 (+ 1) 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. \newline % Row Count 30 (+ 4) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje agregujące z groupby a w funkcji okna (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 4 (+ 4) 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ę. \newline % Row Count 11 (+ 7) 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`. \newline % Row Count 18 (+ 7) Przykład: \newline % Row Count 19 (+ 1) `SELECT department, AVG(salary) AS avg\_salary` \newline % Row Count 20 (+ 1) `FROM employees` \newline % Row Count 21 (+ 1) `GROUP BY department;` \newline % Row Count 22 (+ 1) `SELECT employee\_id, last\_name, salary, AVG(salary) ` \newline % Row Count 24 (+ 2) `OVER (PARTITION BY department) AS avg\_salary` \newline % Row Count 25 (+ 1) `FROM employees;` \newline % Row Count 26 (+ 1) 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. \newline % Row Count 31 (+ 5) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Funkcje agregujące z groupby a w funkcji okna (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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.% Row Count 9 (+ 9) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Tabela DUAL}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 6 (+ 6) 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. \newline % Row Count 10 (+ 4) Przykład użycia tabeli "DUAL": \newline % Row Count 11 (+ 1) `SELECT 'Hello, World!' AS message FROM DUAL;` \newline % Row Count 12 (+ 1) 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ą. \newline % Row Count 18 (+ 6) 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. \newline % Row Count 23 (+ 5) 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ń.% Row Count 32 (+ 9) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Pseudo kolumny}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 6 (+ 6) 1. `ROWNUM` (Oracle) lub `ROW\_NUMBER()` (inny dialekt SQL): \newline % Row Count 8 (+ 2) 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. \newline % Row Count 12 (+ 4) Przykład: \newline % Row Count 13 (+ 1) `SELECT ROWNUM, first\_name, last\_name` \newline % Row Count 14 (+ 1) `FROM employees` \newline % Row Count 15 (+ 1) `WHERE ROWNUM \textless{}= 10;` \newline % Row Count 16 (+ 1) 2. `ROWID` (Oracle) lub `CTID` (PostgreSQL): \newline % Row Count 17 (+ 1) 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. \newline % Row Count 21 (+ 4) Przykład: \newline % Row Count 22 (+ 1) `UPDATE employees` \newline % Row Count 23 (+ 1) `SET salary = 5000` \newline % Row Count 24 (+ 1) `WHERE ROWID = 'AAABBBCCC';` \newline % Row Count 25 (+ 1) 3. `SYSDATE` (Oracle) lub `CURRENT\_TIMESTAMP` (inny dialekt SQL): \newline % Row Count 27 (+ 2) Ta pseudo-kolumna zawiera aktualną datę i czas na serwerze bazy danych. \newline % Row Count 29 (+ 2) Przykład: \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Pseudo kolumny (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{ `SELECT order\_id, order\_date, SYSDATE AS current\_date` \newline % Row Count 2 (+ 2) `FROM orders;` \newline % Row Count 3 (+ 1) 4. `LEVEL` (Oracle) lub `GENERATION` (inny dialekt SQL): \newline % Row Count 5 (+ 2) Ta pseudo-kolumna jest używana w zapytaniach rekurencyjnych lub do określenia poziomu hierarchii w zapytaniach związanych z drzewem. \newline % Row Count 8 (+ 3) Przykład: \newline % Row Count 9 (+ 1) `SELECT employee\_id, last\_name, LEVEL` \newline % Row Count 10 (+ 1) `FROM employees` \newline % Row Count 11 (+ 1) `START WITH employee\_id = 1` \newline % Row Count 12 (+ 1) `CONNECT BY PRIOR employee\_id = manager\_id;` \newline % Row Count 13 (+ 1) 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. \newline % Row Count 19 (+ 6) Przykład: \newline % Row Count 20 (+ 1) `SELECT object\_name, object\_type` \newline % Row Count 21 (+ 1) `FROM all\_objects` \newline % Row Count 22 (+ 1) `WHERE object\_id = 12345;` \newline % Row Count 23 (+ 1) 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. \newline % Row Count 29 (+ 6) Przykład: \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Pseudo kolumny (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`SELECT object\_id, object\_value` \newline % Row Count 1 (+ 1) `FROM xml\_table;` \newline % Row Count 2 (+ 1) 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. \newline % Row Count 8 (+ 6) Przykład: \newline % Row Count 9 (+ 1) `SELECT rowid, ora\_rowscn` \newline % Row Count 10 (+ 1) `FROM my\_table;` \newline % Row Count 11 (+ 1) 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. \newline % Row Count 16 (+ 5) Przykład: \newline % Row Count 17 (+ 1) `SELECT xmldata` \newline % Row Count 18 (+ 1) `FROM xml\_table;` \newline % Row Count 19 (+ 1) 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. \newline % Row Count 26 (+ 7) Przykład: \newline % Row Count 27 (+ 1) `SELECT my\_sequence.NEXTVAL` \newline % Row Count 28 (+ 1) `FROM dual;` \newline % Row Count 29 (+ 1) 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. \newline % Row Count 36 (+ 7) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Pseudo kolumny (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Przykład: \newline % Row Count 1 (+ 1) `SELECT employee\_id, last\_name, CONNECT\_BY\_ISCYCLE` \newline % Row Count 3 (+ 2) `FROM employees` \newline % Row Count 4 (+ 1) `START WITH employee\_id = 1` \newline % Row Count 5 (+ 1) `CONNECT BY PRIOR employee\_id = manager\_id;` \newline % Row Count 6 (+ 1) 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ć.% Row Count 13 (+ 7) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Self Join}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 6 (+ 6) 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. \newline % Row Count 11 (+ 5) Przykład zapytania self join, które zwraca informacje o pracownikach i ich przełożonych, może wyglądać tak: \newline % Row Count 14 (+ 3) `SELECT e.first\_name AS employee\_first\_name, e.last\_name AS employee\_last\_name,` \newline % Row Count 16 (+ 2) ` m.first\_name AS manager\_first\_name, m.last\_name AS manager\_last\_name` \newline % Row Count 18 (+ 2) `FROM employees e` \newline % Row Count 19 (+ 1) `JOIN employees m ON e.manager\_id = m.employee\_id;` \newline % Row Count 21 (+ 2) 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. \newline % Row Count 27 (+ 6) 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.% Row Count 33 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Typ danych złożonych}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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). \newline % Row Count 5 (+ 5) 1. Rekordy (record): \newline % Row Count 6 (+ 1) - Rekord to struktura danych, która może zawierać wiele pól o różnych typach danych. \newline % Row Count 8 (+ 2) - Definicja rekordu wymaga zdefiniowania nazw pól i odpowiadających im typów danych. \newline % Row Count 10 (+ 2) - Przykład składni w PostgreSQL: \newline % Row Count 11 (+ 1) `CREATE TYPE person\_type AS (` \newline % Row Count 12 (+ 1) ` first\_name VARCHAR(50),` \newline % Row Count 13 (+ 1) ` last\_name VARCHAR(50),` \newline % Row Count 14 (+ 1) ` age INT` \newline % Row Count 15 (+ 1) `);` \newline % Row Count 16 (+ 1) - Przykład użycia rekordu: \newline % Row Count 17 (+ 1) `DECLARE` \newline % Row Count 18 (+ 1) ` person person\_type;` \newline % Row Count 19 (+ 1) `BEGIN` \newline % Row Count 20 (+ 1) ` person.first\_name := 'John';` \newline % Row Count 21 (+ 1) ` person.last\_name := 'Doe';` \newline % Row Count 22 (+ 1) ` person.age := 30;` \newline % Row Count 23 (+ 1) ` ...` \newline % Row Count 24 (+ 1) `END;` \newline % Row Count 25 (+ 1) 2. Tablice (array): \newline % Row Count 26 (+ 1) - Tablica to struktura danych, która pozwala na przechowywanie wielu wartości tego samego typu w jednym polu. \newline % Row Count 29 (+ 3) - Definicja tablicy wymaga określenia typu danych elementów tablicy. \newline % Row Count 31 (+ 2) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Typ danych złożonych (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{ - Przykład składni w PostgreSQL: \newline % Row Count 1 (+ 1) `CREATE TYPE colors AS VARCHAR(20) ARRAY;` \newline % Row Count 2 (+ 1) - Przykład użycia tablicy: \newline % Row Count 3 (+ 1) `DECLARE` \newline % Row Count 4 (+ 1) ` color\_list colors := ARRAY{[}'red', 'green', 'blue'{]};` \newline % Row Count 6 (+ 2) ` ...` \newline % Row Count 7 (+ 1) `END;` \newline % Row Count 8 (+ 1) 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.% Row Count 16 (+ 8) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{DECODE - mapowanie wartości}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 7 (+ 7) Poniżej przedstawiam kilka zastosowań funkcji `DECODE`: \newline % Row Count 9 (+ 2) 1. Mapowanie wartości: \newline % Row Count 10 (+ 1) `SELECT` \newline % Row Count 11 (+ 1) ` column\_name,` \newline % Row Count 12 (+ 1) ` DECODE(column\_name, value1, result1, value2, result2, default\_result) AS mapped\_value` \newline % Row Count 14 (+ 2) `FROM table\_name;` \newline % Row Count 15 (+ 1) Przykład: \newline % Row Count 16 (+ 1) `SELECT` \newline % Row Count 17 (+ 1) ` product\_name,` \newline % Row Count 18 (+ 1) ` DECODE(category\_id, 1, 'Electronics', 2, 'Clothing', 'Other') AS category\_name` \newline % Row Count 20 (+ 2) `FROM products;` \newline % Row Count 21 (+ 1) 2. Przypisanie wartości na podstawie warunków: \newline % Row Count 22 (+ 1) `SELECT` \newline % Row Count 23 (+ 1) ` column\_name,` \newline % Row Count 24 (+ 1) ` DECODE(condition, value1, result1, value2, result2, default\_result) AS result` \newline % Row Count 26 (+ 2) `FROM table\_name;` \newline % Row Count 27 (+ 1) Przykład: \newline % Row Count 28 (+ 1) `SELECT` \newline % Row Count 29 (+ 1) ` order\_date,` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{DECODE - mapowanie wartości (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{ ` \seqsplit{DECODE(SIGN(total\_amount} - 100), 1, 'Above', -1, 'Below', 'Equal') AS status` \newline % Row Count 2 (+ 2) `FROM orders;` \newline % Row Count 3 (+ 1) 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.% Row Count 9 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Czym są sekwencje?}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 5 (+ 5) Główne cechy sekwencji to: \newline % Row Count 6 (+ 1) 1. Unikalność: Sekwencje zapewniają unikalność generowanych wartości. Każda wygenerowana wartość jest różna od poprzednich i następnych. \newline % Row Count 9 (+ 3) 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. \newline % Row Count 15 (+ 6) 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. \newline % Row Count 19 (+ 4) Przykład tworzenia i użycia sekwencji w języku SQL (na przykładzie Oracle): \newline % Row Count 21 (+ 2) `-{}- Tworzenie sekwencji` \newline % Row Count 22 (+ 1) `CREATE SEQUENCE seq\_employee\_id` \newline % Row Count 23 (+ 1) ` START WITH 1` \newline % Row Count 24 (+ 1) ` INCREMENT BY 1` \newline % Row Count 25 (+ 1) ` NOCACHE;` \newline % Row Count 26 (+ 1) `-{}- Wykorzystanie sekwencji do generowania wartości` \newline % Row Count 28 (+ 2) `INSERT INTO employees (employee\_id, employee\_name)` \newline % Row Count 30 (+ 2) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Czym są sekwencje? (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`VALUES \seqsplit{(seq\_employee\_id.NEXTVAL}, 'John Doe');` \newline % Row Count 1 (+ 1) 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`. \newline % Row Count 7 (+ 6) 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.% Row Count 14 (+ 7) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{SKŁADNIA}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{W języku SQL, składnia zapytań zazwyczaj przyjmuje postać: \newline % Row Count 2 (+ 2) SELECT - określa, które kolumny mają zostać zwrócone lub jakie wyrażenia mają zostać obliczone. \newline % Row Count 5 (+ 3) FROM - wskazuje, z jakich tabel lub widoków mają zostać pobrane dane. \newline % Row Count 7 (+ 2) WHERE - określa warunki filtrujące wiersze, które mają zostać zwrócone na podstawie określonych kryteriów. \newline % Row Count 10 (+ 3) GROUP BY - grupuje wyniki według określonych kolumn. \newline % Row Count 12 (+ 2) HAVING - filtruje grupy na podstawie warunków. \newline % Row Count 13 (+ 1) ORDER BY - sortuje wyniki według określonych kolumn w określonej kolejności. \newline % Row Count 15 (+ 2) LIMIT/OFFSET (opcjonalne) - ogranicza liczbę zwracanych wierszy lub przesuwa wyniki o określoną liczbę wierszy. \newline % Row Count 18 (+ 3) Oczywiście, nie wszystkie klauzule muszą być obecne w każdym zapytaniu. Składnia i kolejność klauzul zależą od konkretnego rodzaju zapytania i wymagań. \newline % Row Count 22 (+ 4) Przykładowa składnia zapytania SELECT może wyglądać tak: \newline % Row Count 24 (+ 2) `SELECT kolumny` \newline % Row Count 25 (+ 1) `FROM tabela` \newline % Row Count 26 (+ 1) `WHERE warunki` \newline % Row Count 27 (+ 1) `GROUP BY kolumny` \newline % Row Count 28 (+ 1) `HAVING warunki` \newline % Row Count 29 (+ 1) `ORDER BY kolumny` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{SKŁADNIA (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`LIMIT liczba\_wierszy` \newline % Row Count 1 (+ 1) `OFFSET przesuniecie;` \newline % Row Count 2 (+ 1) Ważne jest przestrzeganie poprawnej składni SQL, aby zapewnić poprawne wykonanie zapytań i otrzymanie oczekiwanych wyników.% Row Count 5 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.736 cm} x{3.496 cm} x{1.368 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Numeryczne typy danych}} \tn % Row 0 \SetRowColor{LightBackground} INTEGER & Reprezentuje liczby całkowite o ograniczonym zakresie & 43 \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} BIGINT & Reprezentuje duże liczby całkowite. & \seqsplit{9876543210} \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} DECIMAL(p, s) lub NUMERIC(p, s) & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o precyzji p (liczba całkowita) i skali s (liczba miejsc po przecinku). & 12.345 \tn % Row Count 13 (+ 7) % Row 3 \SetRowColor{white} FLOAT(p) & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o podwójnej precyzji. & \seqsplit{3.14159} \tn % Row Count 17 (+ 4) % Row 4 \SetRowColor{LightBackground} REAL & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o jednostronnej precyzji. & \seqsplit{2.71828} \tn % Row Count 21 (+ 4) % Row 5 \SetRowColor{white} SMALLINT & Reprezentuje małe liczby całkowite o ograniczonym zakresie. & 123 \tn % Row Count 25 (+ 4) % Row 6 \SetRowColor{LightBackground} NUMERIC(p, s) & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o precyzji p i skali s. & \seqsplit{9876.54321} \tn % Row Count 29 (+ 4) % Row 7 \SetRowColor{white} DOUBLE PRECISION & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o podwójnej precyzji. & \seqsplit{1.23456789012345} \tn % Row Count 33 (+ 4) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.736 cm} x{3.496 cm} x{1.368 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Numeryczne typy danych (cont)}} \tn % Row 8 \SetRowColor{LightBackground} DEC & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o precyzji i skali dostosowanej do konkretnego systemu bazodanowego. & \seqsplit{456.789} \tn % Row Count 6 (+ 6) % Row 9 \SetRowColor{white} NUM & Reprezentuje liczby \seqsplit{zmiennoprzecinkowe} o precyzji i skali dostosowanej do konkretnego systemu bazodanowego. & 0.1234 \tn % Row Count 12 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{0.912 cm} x{3.344 cm} x{3.344 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Tekstowe typy danych}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{CHAR(n)} & Reprezentuje stałą długość łańcucha znakowego o rozmiarze n. & 'Hello' \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} \seqsplit{VARCHAR(n)} & Reprezentuje zmienną długość łańcucha znakowego o maksymalnym rozmiarze n. & 'OpenAI' \tn % Row Count 9 (+ 5) % Row 2 \SetRowColor{LightBackground} TEXT & Reprezentuje łańcuch znakowy o zmiennej długości, bez określonego maksymalnego & 'Lorem ipsum dolor sit amet...' \tn % Row Count 14 (+ 5) % Row 3 \SetRowColor{white} \seqsplit{NCHAR(n)} & Reprezentuje stałą długość łańcucha znakowego w formacie Unicode o rozmiarze n. & 'Привет' \tn % Row Count 20 (+ 6) % Row 4 \SetRowColor{LightBackground} \seqsplit{NVARCHAR(n)} & Reprezentuje zmienną długość łańcucha znakowego w formacie Unicode o maksymalnym rozmiarze n. & \seqsplit{'こんにちは'} \tn % Row Count 26 (+ 6) % Row 5 \SetRowColor{white} 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. \tn % Row Count 31 (+ 5) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{0.912 cm} x{3.344 cm} x{3.344 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Tekstowe typy danych (cont)}} \tn % Row 6 \SetRowColor{LightBackground} BLOB & Reprezentuje duże binarne dane, takie jak obrazy, dźwięk, wideo itp. & Dane binarne reprezentujące plik graficzny JPEG. \tn % Row Count 5 (+ 5) % Row 7 \SetRowColor{white} ENUM & Reprezentuje zestaw wartości tekstowych, z których można wybrać jedną. & 'Male', 'Female', 'Other' \tn % Row Count 10 (+ 5) % Row 8 \SetRowColor{LightBackground} SET & Reprezentuje zbiór wartości tekstowych, z których można wybrać więcej niż jedną. & 'Red', 'Green', 'Blue' \tn % Row Count 16 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.748 cm} x{2.964 cm} x{2.888 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Data i czas}} \tn % Row 0 \SetRowColor{LightBackground} DATE & Reprezentuje datę (bez czasu) w formacie 'RRRR-MM-DD' & '2023-07-04' \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} TIME & Reprezentuje czas (bez daty) w formacie 'HH:MI:SS' & '12:34:56' \tn % Row Count 8 (+ 4) % Row 2 \SetRowColor{LightBackground} DATETIME lub \seqsplit{TIMESTAMP:} & Reprezentuje datę i czas w formacie 'RRRR-MM-DD HH:MI:SS' & '2023-07-04 12:34:56' \tn % Row Count 12 (+ 4) % Row 3 \SetRowColor{white} YEAR & Reprezentuje rok w formacie 'RRRR' & '2023' \tn % Row Count 15 (+ 3) % Row 4 \SetRowColor{LightBackground} INTERVAL & Reprezentuje pewien przedział czasu, np. ilość dni, godzin, minut itp. & INTERVAL '1 day' (reprezentuje 1 dzień) \tn % Row Count 20 (+ 5) % Row 5 \SetRowColor{white} 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) \tn % Row Count 26 (+ 6) % Row 6 \SetRowColor{LightBackground} \seqsplit{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) \tn % Row Count 33 (+ 7) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{p{0.76 cm} x{3.42 cm} x{3.42 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Pozostałe typy danych}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{BOOLEAN} & Reprezentuje wartość logiczną true lub false & TRUE \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \seqsplit{BINARY} & Reprezentuje dane binarne o stałej długości & 01101001 \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} \seqsplit{VARBINARY} & Reprezentuje dane binarne o zmiennej długości & 11001100 \tn % Row Count 9 (+ 3) % Row 3 \SetRowColor{white} BIT & Reprezentuje pojedynczy bit o wartości 0 lub 1 & 1 \tn % Row Count 12 (+ 3) % Row 4 \SetRowColor{LightBackground} UUID & Reprezentuje unikalny identyfikator, często używany do identyfikacji rekordów w tabelach & \seqsplit{'550e8400-e29b-41d4-a716-446655440000'} \tn % Row Count 18 (+ 6) % Row 5 \SetRowColor{white} XML & Reprezentuje dane w formacie XML & '\textless{}person\textgreater{}\textless{}name\textgreater{}John\textless{}/name\textgreater{}\textless{}age\textgreater{}30\textless{}/age\textgreater{}\textless{}/person\textgreater{}' \tn % Row Count 21 (+ 3) % Row 6 \SetRowColor{LightBackground} JSON & Reprezentuje dane w formacie JSON (JavaScript Object Notation) & '\{"name": "John", "age": 30\}' \tn % Row Count 25 (+ 4) % Row 7 \SetRowColor{white} \seqsplit{GEOMETRY} & Reprezentuje dane geometrii przestrzennej, takie jak punkty, linie, poligony itp. & POINT(1 2) \tn % Row Count 30 (+ 5) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{p{0.76 cm} x{3.42 cm} x{3.42 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Pozostałe typy danych (cont)}} \tn % Row 8 \SetRowColor{LightBackground} ARRAY & Reprezentuje tablicę wartości jednego typu danych & {[}1, 2, 3, 4{]} \tn % Row Count 3 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.9 cm} x{2.888 cm} x{2.812 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Count}} \tn % Row 0 \SetRowColor{LightBackground} COUNT(*) & Zlicza wszystkie wiersze w wyniku zapytania, niezależnie od wartości w \seqsplit{poszczególnych} kolumnach & `SELECT COUNT(*) \{\{nl\}\} FROM Customers;` \tn % Row Count 7 (+ 7) % Row 1 \SetRowColor{white} COUNT(1) & Zlicza wszystkie wiersze w wyniku zapytania, używając stałej wartości & `SELECT COUNT(1) \{\{nl\}\} FROM Customers;` \tn % Row Count 12 (+ 5) % Row 2 \SetRowColor{LightBackground} \seqsplit{COUNT(column\_name)} & Zlicza liczbę niepustych wartości w określonej kolumnie & `SELECT \seqsplit{COUNT(Quantity)} \{\{nl\}\} FROM Orders;` \tn % Row Count 16 (+ 4) % Row 3 \SetRowColor{white} \seqsplit{COUNT(DISTINCT} \seqsplit{column\_name)} & Zlicza liczbę unikalnych niepustych wartości w określonej kolumnie & `SELECT COUNT(\{\{nl\}\} DISTINCT CustomerID) \{\{nl\}\} FROM Orders;` \tn % Row Count 21 (+ 5) % Row 4 \SetRowColor{LightBackground} \seqsplit{COUNT(expression)} & Zlicza liczbę niepustych wartości zwracanych przez określone wyrażenie & `SELECT COUNT(CASE \{\{nl\}\} WHEN Quantity \textgreater{} 10 \{\{nl\}\} THEN 1 END) \{\{nl\}\} FROM Orders;` \tn % Row Count 27 (+ 6) % Row 5 \SetRowColor{white} \seqsplit{COUNT(DISTINCT} \seqsplit{expression)} & Zlicza liczbę unikalnych niepustych wartości zwracanych przez określone wyrażenie. & `SELECT \seqsplit{COUNT(DISTINCT} CONCAT(\{\{nl\}\} FirstName, LastName\{\{nl\}\} )) \{\{nl\}\} FROM Customers;` \tn % Row Count 34 (+ 7) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{1.9 cm} x{2.888 cm} x{2.812 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Count (cont)}} \tn % Row 6 \SetRowColor{LightBackground} IS NOT NULL & Zliczanie niepustych wartości w kolumnie & `SELECT COUNT(*) \{\{nl\}\} FROM Customers \{\{nl\}\} WHERE City IS NOT NULL;` \tn % Row Count 5 (+ 5) % Row 7 \SetRowColor{white} IS NULL & Zliczanie wartości NULL w kolumnie & `SELECT COUNT(*) \{\{nl\}\} FROM Customers \{\{nl\}\} WHERE City IS NULL;` \tn % Row Count 10 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.584 cm} x{2.508 cm} x{2.508 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{String functions}} \tn % Row 0 \SetRowColor{LightBackground} CONCAT() & Łączy dwa lub więcej łańcuchów znakowych & `SELECT \seqsplit{CONCAT(FirstName}, ' ', LastName) \{\{nl\}\} AS FullName \{\{nl\}\} FROM Customers;` \tn % Row Count 7 (+ 7) % Row 1 \SetRowColor{white} LENGTH() / LEN() & Zwraca długość łańcucha znakowego & `SELECT \seqsplit{LENGTH(FirstName)} \{\{nl\}\} AS NameLength \{\{nl\}\} FROM Customers;` \tn % Row Count 13 (+ 6) % Row 2 \SetRowColor{LightBackground} UPPER() & Konwertuje łańcuch znakowy na wielkie litery & `SELECT \seqsplit{UPPER(FirstName)} \{\{nl\}\} AS UpperName \{\{nl\}\} FROM Customers;` \tn % Row Count 19 (+ 6) % Row 3 \SetRowColor{white} LOWER() & Konwertuje łańcuch znakowy na małe litery & `SELECT \seqsplit{LOWER(LastName)} \{\{nl\}\} AS LowerName \{\{nl\}\} FROM Customers;` \tn % Row Count 25 (+ 6) % Row 4 \SetRowColor{LightBackground} SUBSTRING() & Wyodrębnia podłańcuch znakowy z danego łańcucha na podstawie określonego indeksu i długości & `SELECT \seqsplit{SUBSTRING(Description}, 1, 10) \{\{nl\}\} AS \seqsplit{SubstringDesc} \{\{nl\}\} FROM Products;` \tn % Row Count 33 (+ 8) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.584 cm} x{2.508 cm} x{2.508 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{String functions (cont)}} \tn % Row 5 \SetRowColor{LightBackground} REPLACE() & Zamienia wszystkie wystąpienia określonego \seqsplit{podłańcucha} na inny podłańcuch w łańcuchu & `SELECT \seqsplit{REPLACE(Description}, 'old', 'new') \{\{nl\}\} AS UpdatedDesc \{\{nl\}\} FROM Products;` \tn % Row Count 8 (+ 8) % Row 6 \SetRowColor{white} TRIM() / LTRIM() / RTRIM() & Usuwa początkowe i końcowe białe znaki z łańcucha & `SELECT \seqsplit{TRIM(FirstName)} \{\{nl\}\} AS TrimmedName \{\{nl\}\} FROM Customers;` \tn % Row Count 14 (+ 6) % Row 7 \SetRowColor{LightBackground} LEFT() & Zwraca określoną liczbę znaków z lewej strony łańcucha & `SELECT \seqsplit{LEFT(FirstName}, 3) \{\{nl\}\} AS LeftChars \{\{nl\}\} FROM Customers;` \tn % Row Count 20 (+ 6) % Row 8 \SetRowColor{white} RIGHT() & Zwraca określoną liczbę znaków z prawej strony łańcucha & `SELECT \seqsplit{RIGHT(LastName}, 2) \{\{nl\}\} AS RightChars \{\{nl\}\} FROM Customers;` \tn % Row Count 26 (+ 6) % Row 9 \SetRowColor{LightBackground} \seqsplit{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 \seqsplit{SPLIT\_PART('John},Doe,42', ',', 2); -{}- 'Doe'` \tn % Row Count 35 (+ 9) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.584 cm} x{2.508 cm} x{2.508 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{String functions (cont)}} \tn % Row 10 \SetRowColor{LightBackground} \seqsplit{SUBSTRING(string} FROM start {[}FOR length{]}) & Zwraca podciąg znaków z określonego ciągu na podstawie podanego \seqsplit{początkowego} indeksu i, opcjonalnie, długości. & `SELECT \seqsplit{SUBSTRING('Hello}, World', 1, 5); -{}- 'Hello'` \tn % Row Count 9 (+ 9) % Row 11 \SetRowColor{white} \seqsplit{INITCAP(string)} & Zamienia pierwszą literę każdego wyrazu w ciągu na wielką literę, a pozostałe litery na małe litery. & `SELECT \seqsplit{INITCAP('hello} world'); -{}-'Hello World'` \tn % Row Count 18 (+ 9) % Row 12 \SetRowColor{LightBackground} \seqsplit{REVERSE(string)} & Odwraca kolejność znaków w podanym ciągu. & `SELECT \seqsplit{REVERSE('Hello');} -{}- 'olleH'` \tn % Row Count 22 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{0.836 cm} x{3.42 cm} x{3.344 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Number funcktions}} \tn % Row 0 \SetRowColor{LightBackground} ABS() & Zwraca wartość bezwzględną liczby & `SELECT ABS(-10) \{\{nl\}\} AS AbsoluteValue;` \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \seqsplit{ROUND()} & Zaokrągla liczbę do określonej liczby miejsc po przecinku & `SELECT ROUND(3.14159, 2) \{\{nl\}\} AS RoundedNumber;` \tn % Row Count 7 (+ 4) % Row 2 \SetRowColor{LightBackground} \seqsplit{CEILING()} & Zwraca najmniejszą liczbę całkowitą większą lub równą danej liczbie & `SELECT CEILING(4.25) \{\{nl\}\} AS CeilingNumber;` \tn % Row Count 12 (+ 5) % Row 3 \SetRowColor{white} \seqsplit{FLOOR()} & Zwraca największą liczbę całkowitą mniejszą lub równą danej liczbie & `SELECT FLOOR(4.75) \{\{nl\}\} AS FloorNumber;` \tn % Row Count 17 (+ 5) % Row 4 \SetRowColor{LightBackground} \seqsplit{SQRT()} & Zwraca pierwiastek kwadratowy z liczby & `SELECT SQRT(25) \{\{nl\}\} AS SquareRoot;` \tn % Row Count 20 (+ 3) % Row 5 \SetRowColor{white} \seqsplit{POWER()} & Podnosi daną liczbę do określonej potęgi & `SELECT POWER(2, 3) \{\{nl\}\} AS PowerResult;` \tn % Row Count 23 (+ 3) % Row 6 \SetRowColor{LightBackground} MOD() & Zwraca resztę z dzielenia jednej liczby przez drugą & `SELECT MOD(10, 3) \{\{nl\}\} AS ModuloResult;` \tn % Row Count 26 (+ 3) % Row 7 \SetRowColor{white} \seqsplit{RAND()} & Zwraca losową liczbę z zakresu od 0 do 1 & `SELECT RAND() \{\{nl\}\} AS RandomNumber;` \tn % Row Count 29 (+ 3) % Row 8 \SetRowColor{LightBackground} \seqsplit{SIGN()} & Zwraca znak liczby (-1 dla liczby ujemnej, 0 dla zera, 1 dla liczby dodatniej) & `SELECT SIGN(-15) \{\{nl\}\} AS SignNumber;` \tn % Row Count 34 (+ 5) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{0.836 cm} x{3.42 cm} x{3.344 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Number funcktions (cont)}} \tn % Row 9 \SetRowColor{LightBackground} \seqsplit{RANDOM()} & Zwraca losową liczbę z określonego zakresu & `SELECT RANDOM() \{\{nl\}\} AS RandomNumber;` \tn % Row Count 3 (+ 3) % Row 10 \SetRowColor{white} PI() & Zwraca wartość liczby π (pi) & `SELECT PI() AS PiValue;` \tn % Row Count 5 (+ 2) % Row 11 \SetRowColor{LightBackground} LOG() & Oblicza logarytm o podstawie 10 z danej liczby & `SELECT LOG(100) \{\{nl\}\} AS Logarithm;` \tn % Row Count 8 (+ 3) % Row 12 \SetRowColor{white} LN() & Oblicza logarytm naturalny (o podstawie e) z danej liczby & `SELECT LN(2.71828) \{\{nl\}\} AS \seqsplit{NaturalLogarithm;`} \tn % Row Count 12 (+ 4) % Row 13 \SetRowColor{LightBackground} EXP() & Oblicza wartość wykładniczą liczby (e) podniesionej do danej potęgi & `SELECT EXP(1) \{\{nl\}\} AS \seqsplit{ExponentialValue;`} \tn % Row Count 16 (+ 4) % Row 14 \SetRowColor{white} \seqsplit{GREATEST()} & Zwraca największą wartość spośród podanych argumentów & `SELECT GREATEST(5, 8, 2) \{\{nl\}\} AS MaxValue;` \tn % Row Count 20 (+ 4) % Row 15 \SetRowColor{LightBackground} \seqsplit{LEAST()} & Zwraca najmniejszą wartość spośród podanych argumentów & `SELECT LEAST(5, 8, 2) \{\{nl\}\} AS MinValue;` \tn % Row Count 24 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.444 cm} x{3.116 cm} x{3.04 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Date functions}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{CURRENT\_DATE()} & Zwraca aktualną datę & `SELECT CURRENT\_DATE() \{\{nl\}\} AS CurrentDate;` \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \seqsplit{CURRENT\_TIME()} & Zwraca aktualny czas & `SELECT CURRENT\_TIME() \{\{nl\}\} AS CurrentTime;` \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} \seqsplit{CURRENT\_TIMESTAMP()} & Zwraca aktualną datę i czas & `SELECT \seqsplit{CURRENT\_TIMESTAMP()} \{\{nl\}\} AS \seqsplit{CurrentDateTime;`} \tn % Row Count 10 (+ 4) % Row 3 \SetRowColor{white} DATE() & Zwraca tylko datę z wartości daty i czasu & `SELECT \seqsplit{DATE('2023-07-04} 10:30:00') \{\{nl\}\} AS DateOnly;` \tn % Row Count 14 (+ 4) % Row 4 \SetRowColor{LightBackground} \seqsplit{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') \{\{nl\}\} AS ExtractedYear;` \tn % Row Count 20 (+ 6) % Row 5 \SetRowColor{white} \seqsplit{DATEADD()} & Dodaje określoną wartość do daty & `SELECT DATEADD(DAY, 7, '2023-07-04') \{\{nl\}\} AS AddedDate;` \tn % Row Count 24 (+ 4) % Row 6 \SetRowColor{LightBackground} \seqsplit{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') \{\{nl\}\} AS \seqsplit{DateDifference;`} \tn % Row Count 30 (+ 6) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{1.444 cm} x{3.116 cm} x{3.04 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Date functions (cont)}} \tn % Row 7 \SetRowColor{LightBackground} \seqsplit{DATE\_FORMAT()} & Formatuje datę według określonego formatu & `SELECT \seqsplit{DATE\_FORMAT('2023-07-04'}, '\%Y-\%m-\%d') \{\{nl\}\} AS FormattedDate;` \tn % Row Count 5 (+ 5) % Row 8 \SetRowColor{white} \seqsplit{DATE\_PART()} & Zwraca wartość określonej części daty i czasu, takiej jak rok, miesiąc, dzień, godzina itp. & `SELECT \seqsplit{DATE\_PART('year'}, '2023-07-04') \{\{nl\}\} AS Year;` \tn % Row Count 12 (+ 7) % Row 9 \SetRowColor{LightBackground} \seqsplit{DATE\_TRUNC()} & Skraca datę do określonej jednostki, np. do miesiąca, roku itp. & `SELECT \seqsplit{DATE\_TRUNC('month'}, '2023-07-04') \{\{nl\}\} AS TruncatedDate;` \tn % Row Count 17 (+ 5) % Row 10 \SetRowColor{white} NOW() & Zwraca aktualną datę i czas & `SELECT NOW() \{\{nl\}\} AS \seqsplit{CurrentDateTime;`} \tn % Row Count 20 (+ 3) % Row 11 \SetRowColor{LightBackground} \seqsplit{SYSDATE} & Zwraca aktualną datę i czas & `SELECT SYSDATE \{\{nl\}\} AS \seqsplit{CurrentDateTime;`} \tn % Row Count 23 (+ 3) % Row 12 \SetRowColor{white} HOW \seqsplit{TIMEZONE} & Zwraca bieżącą strefę czasową ustawioną w bazie danych & `SHOW TIMEZONE;` \tn % Row Count 27 (+ 4) % Row 13 \SetRowColor{LightBackground} TIME & Typ danych TIME reprezentuje wartość czasu bez daty & `SELECT TIME '10:30:45' \{\{nl\}\} AS TimeValue;` \tn % Row Count 31 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.16 cm} x{5.84 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{date\_part( 'unit', date ) - unit}} \tn % Row 0 \SetRowColor{LightBackground} day & Day of the month (1 to 31) \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} decade & Year divided by 10 \tn % Row Count 2 (+ 1) % Row 2 \SetRowColor{LightBackground} dow & Day of the week (0=Sunday, 1=Monday, 2=Tuesday, ... 6=Saturday) \tn % Row Count 5 (+ 3) % Row 3 \SetRowColor{white} doy & Day of the year (1=first day of year, 365/366=last day of the year, depending if it is a leap year) \tn % Row Count 9 (+ 4) % Row 4 \SetRowColor{LightBackground} epoch & Number of seconds since '1970-01-01 00:00:00 UTC', if date value. Number of seconds in an interval, if interval value \tn % Row Count 14 (+ 5) % Row 5 \SetRowColor{white} hour & Hour (0 to 23) \tn % Row Count 15 (+ 1) % Row 6 \SetRowColor{LightBackground} isodow & Day of the week (1=Monday, 2=Tuesday, 3=Wednesday, ... 7=Sunday) \tn % Row Count 18 (+ 3) % Row 7 \SetRowColor{white} isoyear & ISO 8601 year value (where the year begins on the Monday of the week that contains January 4th) \tn % Row Count 22 (+ 4) % Row 8 \SetRowColor{LightBackground} minute & Minute (0 to 59) \tn % Row Count 23 (+ 1) % Row 9 \SetRowColor{white} month & Number for the month (1 to 12), if date value. Number of months (0 to 11), if interval value \tn % Row Count 27 (+ 4) % Row 10 \SetRowColor{LightBackground} quarter & Quarter (1 to 4) \tn % Row Count 28 (+ 1) % Row 11 \SetRowColor{white} second & Seconds (and fractional seconds) \tn % Row Count 30 (+ 2) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.16 cm} x{5.84 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{date\_part( 'unit', date ) - unit (cont)}} \tn % Row 12 \SetRowColor{LightBackground} timezone & ime zone offset from UTC, expressed in seconds \tn % Row Count 2 (+ 2) % Row 13 \SetRowColor{white} \seqsplit{timezone\_hour} & Hour portion of the time zone offset from UTC \tn % Row Count 4 (+ 2) % Row 14 \SetRowColor{LightBackground} \seqsplit{timezone\_minute} & Minute portion of the time zone offset from UTC \tn % Row Count 6 (+ 2) % Row 15 \SetRowColor{white} 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) \tn % Row Count 11 (+ 5) % Row 16 \SetRowColor{LightBackground} year & Year as 4-digits \tn % Row Count 12 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{\seqsplit{https://www.techonthenet.com/postgresql/functions/date\_part.php}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{0.912 cm} x{3.344 cm} x{3.344 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{null functions}} \tn % Row 0 \SetRowColor{LightBackground} IS NULL & Sprawdza, czy określona wartość jest NULL-em & `SELECT * \{\{nl\}\} FROM tabela \{\{nl\}\} WHERE kolumna IS NULL;` \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} IS NOT NULL & Sprawdza, czy określona wartość nie jest NULL-em & `SELECT * \{\{nl\}\} FROM tabela \{\{nl\}\} WHERE kolumna IS NOT NULL;` \tn % Row Count 8 (+ 4) % Row 2 \SetRowColor{LightBackground} \seqsplit{COALESCE()} & Zwraca pierwszą nie-NULL-ową wartość z listy wartości & `SELECT \seqsplit{COALESCE(kolumna1}, \{\{nl\}\} kolumna2, \{\{nl\}\} kolumna3) \{\{nl\}\} AS NonNullValue \{\{nl\}\} FROM tabela;` \tn % Row Count 15 (+ 7) % Row 3 \SetRowColor{white} \seqsplit{NULLIF()} & Zwraca NULL, jeśli dwa wyrażenia są równe, w przeciwnym razie zwraca pierwsze wyrażenie & `SELECT NULLIF(kolumna1, 0) \{\{nl\}\} AS Result \{\{nl\}\} FROM tabela;` \tn % Row Count 21 (+ 6) % Row 4 \SetRowColor{LightBackground} NVL() & Zwraca drugie wyrażenie, jeśli pierwsze jest NULL-em & `SELECT NVL(kolumna1, \{\{nl\}\} 'Brak wartości') \{\{nl\}\} AS Result \{\{nl\}\} FROM tabela;` \tn % Row Count 26 (+ 5) % Row 5 \SetRowColor{white} \seqsplit{IFNULL()} & Zwraca drugie wyrażenie, jeśli pierwsze jest NULL-em & `SELECT IFNULL(kolumna1, \{\{nl\}\} 'Brak wartości') \{\{nl\}\} AS Result \{\{nl\}\} FROM tabela;` \tn % Row Count 32 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.052 cm} x{2.736 cm} x{2.812 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Funkcje agregujące}} \tn % Row 0 \SetRowColor{LightBackground} COUNT() & Zlicza liczbę wierszy lub wartości w danej kolumnie. & `SELECT COUNT(*) \{\{nl\}\} AS TotalRows \{\{nl\}\} FROM tabela;` \tn % Row Count 5 (+ 5) % Row 1 \SetRowColor{white} SUM() & Oblicza sumę wartości w danej kolumnie numerycznej. & `SELECT SUM(kolumna) \{\{nl\}\} AS TotalSum \{\{nl\}\} FROM tabela;` \tn % Row Count 10 (+ 5) % Row 2 \SetRowColor{LightBackground} AVG() & Oblicza średnią wartość w danej kolumnie numerycznej. & `SELECT AVG(kolumna) \{\{nl\}\} AS AverageValue \{\{nl\}\} FROM tabela;` \tn % Row Count 15 (+ 5) % Row 3 \SetRowColor{white} MIN() & Zwraca najmniejszą wartość w danej kolumnie. & `SELECT MIN(kolumna) \{\{nl\}\} AS MinValue \{\{nl\}\} FROM tabela;` \tn % Row Count 20 (+ 5) % Row 4 \SetRowColor{LightBackground} MAX() & Zwraca największą wartość w danej kolumnie. & `SELECT MAX(kolumna) \{\{nl\}\} AS MaxValue \{\{nl\}\} FROM tabela;` \tn % Row Count 25 (+ 5) % Row 5 \SetRowColor{white} \seqsplit{GROUP\_CONCAT} (MySQL, MariaDB) & Konkatenacja wartości napisowych z grupy w jedną wartość napisową, rozdzieloną separatorem. & `SELECT \seqsplit{GROUP\_CONCAT(nazwa\_kolumny} \{\{nl\}\} SEPARATOR ', ') \{\{nl\}\} AS \seqsplit{ConcatenatedValues} \{\{nl\}\} FROM tabela \{\{nl\}\} GROUP BY kolumna;` \tn % Row Count 35 (+ 10) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.052 cm} x{2.736 cm} x{2.812 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Funkcje agregujące (cont)}} \tn % Row 6 \SetRowColor{LightBackground} LISTAGG (Oracle) & Konkatenacja wartości napisowych z grupy w jedną wartość napisową, rozdzieloną separatorem. & `SELECT \seqsplit{LISTAGG(nazwa\_kolumny}, \{\{nl\}\} ', ') \{\{nl\}\} WITHIN GROUP \{\{nl\}\} (ORDER BY kolumna) \{\{nl\}\} AS \seqsplit{ConcatenatedValues} \{\{nl\}\} FROM tabela;` \tn % Row Count 10 (+ 10) % Row 7 \SetRowColor{white} GROUP BY & Grupuje wyniki zapytania według wartości określonych kolumn. & `SELECT kolumna, \{\{nl\}\} COUNT(*) \{\{nl\}\} FROM tabela GROUP BY kolumna;` \tn % Row Count 15 (+ 5) % Row 8 \SetRowColor{LightBackground} GROUP BY ROLLUP & pozwala na generowanie zestawu wyników \seqsplit{hierarchicznych} w oparciu o różne poziomy podsumowania, generuje wyniki dla wszystkich kombinacji wartości w kolumnach podsumowania, tworząc hierarchię podsumowań & `SELECT kolumna1, \{\{nl\}\} kolumna2, \{\{nl\}\} SUM(wartosc) AS Suma \{\{nl\}\} FROM tabela \{\{nl\}\} GROUP BY \seqsplit{ROLLUP(kolumna1}, kolumna2);` \tn % Row Count 30 (+ 15) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{2.052 cm} x{2.736 cm} x{2.812 cm} } \SetRowColor{DarkBackground} \mymulticolumn{3}{x{8.4cm}}{\bf\textcolor{white}{Funkcje agregujące (cont)}} \tn % Row 9 \SetRowColor{LightBackground} GROUP BY CUBE & generuje wszystkie możliwe kombinacje wartości w kolumnach podsumowania, tworząc tzw. kostkę (cube) & `SELECT kolumna1, \{\{nl\}\} kolumna2, \{\{nl\}\} SUM(wartosc) AS Suma \{\{nl\}\} FROM tabela \{\{nl\}\} GROUP BY CUBE(kolumna1, kolumna2);` \tn % Row Count 9 (+ 9) % Row 10 \SetRowColor{white} HAVING & służy do filtrowania wyników zapytania po grupowaniu, na podstawie warunków logicznych & `SELECT kolumna, \{\{nl\}\} SUM(wartosc) AS Suma \{\{nl\}\} FROM tabela \{\{nl\}\} GROUP BY kolumna \{\{nl\}\} HAVING SUM(wartosc) \textgreater{} 100` \tn % Row Count 18 (+ 9) \hhline{>{\arrayrulecolor{DarkBackground}}---} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{GROUP BY ROLLUP vs GROUP BY CUBE}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 4 (+ 4) Tabela "Sales": \newline % Row Count 5 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 6 (+ 1) | Product | Region | Quantity | \newline % Row Count 7 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 8 (+ 1) | A | North | 10 | \newline % Row Count 9 (+ 1) | A | South | 5 | \newline % Row Count 10 (+ 1) | B | North | 8 | \newline % Row Count 11 (+ 1) | B | South | 12 | \newline % Row Count 12 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 13 (+ 1) Group by ROLLUP: \newline % Row Count 14 (+ 1) `SELECT Product, Region, SUM(Quantity) AS TotalQuantity FROM Sales GROUP BY` `ROLLUP(Product, Region);` \newline % Row Count 17 (+ 3) Wyniki zapytania: \newline % Row Count 18 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 19 (+ 1) | Product | Region | TotalQuantity | \newline % Row Count 20 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 21 (+ 1) | A | North | 10 | \newline % Row Count 22 (+ 1) | A | South | 5 | \newline % Row Count 23 (+ 1) | A | NULL | 15 | \newline % Row Count 24 (+ 1) | B | North | 8 | \newline % Row Count 25 (+ 1) | B | South | 12 | \newline % Row Count 26 (+ 1) | B | NULL | 20 | \newline % Row Count 27 (+ 1) | NULL | NULL | 35 | \newline % Row Count 28 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 29 (+ 1) 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. \newline % Row Count 34 (+ 5) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{GROUP BY ROLLUP vs GROUP BY CUBE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Group by CUBE: \newline % Row Count 1 (+ 1) `SELECT Product, Region, SUM(Quantity) AS TotalQuantity FROM Sales GROUP BY` `CUBE(Product, Region);` \newline % Row Count 4 (+ 3) Wyniki zapytania: \newline % Row Count 5 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 6 (+ 1) | Product | Region | TotalQuantity | \newline % Row Count 7 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 8 (+ 1) | A | North | 10 | \newline % Row Count 9 (+ 1) | A | South | 5 | \newline % Row Count 10 (+ 1) | A | NULL | 15 | \newline % Row Count 11 (+ 1) | B | North | 8 | \newline % Row Count 12 (+ 1) | B | South | 12 | \newline % Row Count 13 (+ 1) | B | NULL | 20 | \newline % Row Count 14 (+ 1) | NULL | North | 18 | \newline % Row Count 15 (+ 1) | NULL | South | 17 | \newline % Row Count 16 (+ 1) | NULL | NULL | 35 | \newline % Row Count 17 (+ 1) +-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-+ \newline % Row Count 18 (+ 1) 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. \newline % Row Count 23 (+ 5) Podsumowując: \newline % Row Count 24 (+ 1) GROUP BY ROLLUP generuje zestaw wyników z hierarchią podsumowań, w którym uwzględnia podsumowania dla poszczególnych kolumn i ich kombinacji. \newline % Row Count 27 (+ 3) 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. \newline % Row Count 31 (+ 4) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{GROUP BY ROLLUP vs GROUP BY CUBE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Warto zauważyć, że w obu przypadkach wyniki zawierają dodatkowe wiersze i kolumny, które reprezentują ogólne podsumowania% Row Count 3 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Podzapytania (subquery)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 6 (+ 6) Oto kilka ważnych informacji na temat podzapytań: \newline % Row Count 8 (+ 2) 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. \newline % Row Count 14 (+ 6) 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. \newline % Row Count 19 (+ 5) Przykład: \newline % Row Count 20 (+ 1) `SELECT column1` \newline % Row Count 21 (+ 1) `FROM table1` \newline % Row Count 22 (+ 1) `WHERE column2 IN (SELECT column3 FROM table2);` \newline % Row Count 23 (+ 1) 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ń. \newline % Row Count 28 (+ 5) Przykład: \newline % Row Count 29 (+ 1) `SELECT column1` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Podzapytania (subquery) (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`FROM table1` \newline % Row Count 1 (+ 1) `WHERE column2 IN (SELECT column3 FROM table2 WHERE column4 \textgreater{} 100);` \newline % Row Count 3 (+ 2) 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. \newline % Row Count 9 (+ 6) 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.% Row Count 16 (+ 7) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Podzapytania CTE}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 7 (+ 7) Składnia CTE wygląda następująco: \newline % Row Count 8 (+ 1) `WITH nazwa\_cte (kolumna1, kolumna2, ...)` \newline % Row Count 9 (+ 1) `AS (` \newline % Row Count 10 (+ 1) ` SELECT kolumna1, kolumna2, ...` \newline % Row Count 11 (+ 1) ` FROM tabela` \newline % Row Count 12 (+ 1) ` WHERE warunek` \newline % Row Count 13 (+ 1) `)` \newline % Row Count 14 (+ 1) Przykład: \newline % Row Count 15 (+ 1) `WITH sales\_cte (product\_id, total\_sales)` \newline % Row Count 16 (+ 1) `AS (` \newline % Row Count 17 (+ 1) ` SELECT product\_id, SUM(quantity * price) AS total\_sales` \newline % Row Count 19 (+ 2) ` FROM sales` \newline % Row Count 20 (+ 1) ` GROUP BY product\_id` \newline % Row Count 21 (+ 1) `)` \newline % Row Count 22 (+ 1) `SELECT product\_id, total\_sales` \newline % Row Count 23 (+ 1) `FROM sales\_cte` \newline % Row Count 24 (+ 1) `WHERE total\_sales \textgreater{} 1000;` \newline % Row Count 25 (+ 1) 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. \newline % Row Count 30 (+ 5) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Podzapytania CTE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`WITH cte1 AS (` \newline % Row Count 1 (+ 1) ` SELECT column1, column2` \newline % Row Count 2 (+ 1) ` FROM table1` \newline % Row Count 3 (+ 1) ` WHERE condition1` \newline % Row Count 4 (+ 1) `),` \newline % Row Count 5 (+ 1) `cte2 AS (` \newline % Row Count 6 (+ 1) ` SELECT column3, column4` \newline % Row Count 7 (+ 1) ` FROM table2` \newline % Row Count 8 (+ 1) ` WHERE condition2` \newline % Row Count 9 (+ 1) `)` \newline % Row Count 10 (+ 1) `SELECT cte1.column1, cte1.column2, cte2.column3, cte2.column4` \newline % Row Count 12 (+ 2) `FROM cte1` \newline % Row Count 13 (+ 1) `JOIN cte2 ON cte1.column1 = cte2.column3;` \newline % Row Count 14 (+ 1) 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". \newline % Row Count 22 (+ 8) Podzapytania CTE mogą znacznie ułatwić czytelność i zarządzanie bardziej skomplikowanymi zapytaniami, pozwalając na ich modularyzację i ponowne wykorzystanie. \newline % Row Count 26 (+ 4) 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. \newline % Row Count 32 (+ 6) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Podzapytania CTE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Składnia ogólna WITH RECURSIVE wygląda następująco: \newline % Row Count 2 (+ 2) `WITH RECURSIVE nazwa (kolumny) AS (` \newline % Row Count 3 (+ 1) ` \seqsplit{Zapytanie\_nie\_rekurencyjne`} \newline % Row Count 4 (+ 1) ` UNION {[}ALL{]}` \newline % Row Count 5 (+ 1) ` Zapytanie\_rekurencyjne` \newline % Row Count 6 (+ 1) `)` \newline % Row Count 7 (+ 1) `Zapytanie\_główne` \newline % Row Count 8 (+ 1) Przykład: \newline % Row Count 9 (+ 1) 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). \newline % Row Count 15 (+ 6) `WITH RECURSIVE employee\_hierarchy (employee\_id, full\_name, manager\_id) AS (` \newline % Row Count 17 (+ 2) ` SELECT employee\_id, full\_name, manager\_id` \newline % Row Count 18 (+ 1) ` FROM employees` \newline % Row Count 19 (+ 1) ` WHERE employee\_id = 1 -{}- Przykładowy identyfikator kierownika` \newline % Row Count 21 (+ 2) ` UNION ALL` \newline % Row Count 22 (+ 1) ` SELECT e.employee\_id, e.full\_name, e.manager\_id` \newline % Row Count 24 (+ 2) ` FROM employees e` \newline % Row Count 25 (+ 1) ` JOIN employee\_hierarchy eh ON e.manager\_id = eh.employee\_id` \newline % Row Count 27 (+ 2) `)` \newline % Row Count 28 (+ 1) `SELECT *` \newline % Row Count 29 (+ 1) `FROM employee\_hierarchy;` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Podzapytania CTE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 9 (+ 9) W rezultacie zapytanie zwróci wszystkich pracowników, którzy są podlegli danemu kierownikowi, bez względu na poziom hierarchii.% Row Count 12 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Losowa próbka rekordów}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 4 (+ 4) - Przykład dla systemu PostgreSQL: \newline % Row Count 5 (+ 1) `SELECT *` \newline % Row Count 6 (+ 1) `FROM table\_name` \newline % Row Count 7 (+ 1) `ORDER BY RANDOM()` \newline % Row Count 8 (+ 1) `LIMIT 10;` \newline % Row Count 9 (+ 1) 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. \newline % Row Count 14 (+ 5) Przykład dla systemu MySQL: \newline % Row Count 15 (+ 1) `SELECT *` \newline % Row Count 16 (+ 1) `FROM table\_name` \newline % Row Count 17 (+ 1) `ORDER BY RAND()` \newline % Row Count 18 (+ 1) `LIMIT 10;` \newline % Row Count 19 (+ 1) 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. \newline % Row Count 22 (+ 3) Przykład dla systemu Microsoft SQL Server: \newline % Row Count 23 (+ 1) `SELECT TOP 10 *` \newline % Row Count 24 (+ 1) `FROM table\_name` \newline % Row Count 25 (+ 1) `ORDER BY NEWID();` \newline % Row Count 26 (+ 1) 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. \newline % Row Count 31 (+ 5) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Losowa próbka rekordów (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{- WHERE RANDOM() \textless{} 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. \newline % Row Count 5 (+ 5) Przykład: \newline % Row Count 6 (+ 1) `SELECT *` \newline % Row Count 7 (+ 1) `FROM table\_name` \newline % Row Count 8 (+ 1) `WHERE RANDOM() \textless{} 0.01;` \newline % Row Count 9 (+ 1) - 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. \newline % Row Count 13 (+ 4) Przykład: \newline % Row Count 14 (+ 1) `SELECT *` \newline % Row Count 15 (+ 1) `FROM table\_name TABLESAMPLE SYSTEM(1);` \newline % Row Count 16 (+ 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.% Row Count 20 (+ 4) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{PIVOT}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 6 (+ 6) 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: \newline % Row Count 10 (+ 4) `SELECT * ` \newline % Row Count 11 (+ 1) `FROM (` \newline % Row Count 12 (+ 1) ` SELECT category, product, quantity ` \newline % Row Count 13 (+ 1) ` FROM sales ` \newline % Row Count 14 (+ 1) `) AS src ` \newline % Row Count 15 (+ 1) ` PIVOT (` \newline % Row Count 16 (+ 1) ` SUM(quantity) ` \newline % Row Count 17 (+ 1) ` FOR product IN ({[}ProductA{]}, {[}ProductB{]}, {[}ProductC{]}) ` \newline % Row Count 19 (+ 2) `) AS pivot\_table; ` \newline % Row Count 20 (+ 1) 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. \newline % Row Count 30 (+ 10) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{PIVOT (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 4 (+ 4) category | ProductA | ProductB | ProductC \newline % Row Count 5 (+ 1) -{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}- \newline % Row Count 6 (+ 1) CategoryA | 10 | 5 | 3 \newline % Row Count 7 (+ 1) CategoryB | 8 | 2 | 6 \newline % Row Count 8 (+ 1) 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. \newline % Row Count 15 (+ 7) a) `SELECT * ` \newline % Row Count 16 (+ 1) `FROM crosstab('SQL tworzący tabelę w postaci tekstu')` \newline % Row Count 18 (+ 2) `AS nazwa\_tabeli(definicja kolumn wynikowych tabeli);` \newline % Row Count 20 (+ 2) b) `SELECT *` \newline % Row Count 21 (+ 1) `FROM crosstab('select jezyk::text, stan\_wniosku::text, count(*)::numeric` \newline % Row Count 23 (+ 2) `FROM wnioski group by 1, 2')` \newline % Row Count 24 (+ 1) `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);`% Row Count 32 (+ 8) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Indeksowanie}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{8.4cm}}{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: \newline \newline Rodzaje indeksów: \newline Indeksy jednokolumnowe: tworzone na pojedynczej kolumnie tabeli. \newline Indeksy wielokolumnowe: tworzone na kilku kolumnach tabeli. \newline Unikalne indeksy: zapewniają, że wartości w indeksowanych kolumnach są unikalne. \newline Indeksy skupione (clustered): określają fizyczną organizację danych w tabeli na podstawie wartości indeksowanych kolumn. \newline Indeksy niestrukture (non-clustered): mają oddzielną strukturę od tabeli i zawierają odnośniki do fizycznych miejsc, gdzie dane są przechowywane. \newline \newline Korzyści wynikające z indeksowania: \newline Szybsze wyszukiwanie danych: indeksy umożliwiają bezpośrednie odnalezienie pasujących rekordów, co przyspiesza zapytania wyszukiwania. \newline Szybsze sortowanie danych: indeksy ułatwiają sortowanie danych według indeksowanych kolumn. \newline Zmniejszone obciążenie zapytań: efektywne indeksowanie może zmniejszyć obciążenie na serwerze baz danych poprzez skrócenie czasu wykonywania zapytań. \newline Tworzenie i zarządzanie indeksami: \newline Indeksy można tworzyć podczas tworzenia tabeli lub po jej utworzeniu. \newline 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. \newline Indeksy należy utrzymywać i aktualizować wraz z danymi w tabelach, aby zapewnić ich skuteczność. \newline \newline Przykład tworzenia indeksu na jednej kolumnie: \newline `CREATE INDEX idx\_customer\_name ON Customers (customer\_name);` \newline \newline Przykład tworzenia indeksu na wielu kolumnach: \newline `CREATE INDEX idx\_customer\_location ON Customers (city, state);` \newline \newline 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. \newline \newline 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: \newline \newline Mamy tabelę "Customers" z indeksem na kolumnie "customer\_name". Wykonajmy zapytanie wyszukujące klienta o nazwie "John Smith": \newline `SELECT * FROM Customers WHERE customer\_name = 'John Smith';` \newline \newline 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. \newline \newline 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. \newline \newline 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ń.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{łączenie (konkatenacja) stringów}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{W SQL istnieje kilka sposobów łączenia (konkatenacji) stringów. Oto kilka przykładów: \newline % Row Count 2 (+ 2) - Operator konkatenacji (+): \newline % Row Count 3 (+ 1) Możesz użyć operatora "+" do połączenia dwóch stringów w jedną wartość. Przykład: \newline % Row Count 5 (+ 2) `SELECT 'Hello' + ' ' + 'World' AS concatenated\_string;` \newline % Row Count 7 (+ 2) Wynik: "Hello World" \newline % Row Count 8 (+ 1) - Funkcja CONCAT(): \newline % Row Count 9 (+ 1) Funkcja CONCAT() pozwala na łączenie wielu stringów w jeden. Przykład: \newline % Row Count 11 (+ 2) `SELECT CONCAT('Hello', ' ', 'World') AS concatenated\_string;` \newline % Row Count 13 (+ 2) Wynik: "Hello World" \newline % Row Count 14 (+ 1) - Operator ||: \newline % Row Count 15 (+ 1) W niektórych bazach danych, takich jak Oracle, PostgreSQL czy SQLite, można użyć operatora "||" do konkatenacji stringów. Przykład: \newline % Row Count 18 (+ 3) SELECT 'Hello' || ' ' || 'World' AS concatenated\_string; \newline % Row Count 20 (+ 2) Wynik: "Hello World" \newline % Row Count 21 (+ 1) - Funkcja CONCAT\_WS(): \newline % Row Count 22 (+ 1) Funkcja CONCAT\_WS() służy do konkatenacji stringów z użyciem określonego separatora. Przykład: \newline % Row Count 25 (+ 3) `SELECT CONCAT\_WS(', ', 'John', 'Doe', 'New York') AS concatenated\_string;` \newline % Row Count 27 (+ 2) Wynik: "John, Doe, New York" \newline % Row Count 28 (+ 1) - Funkcja STUFF() (dla SQL Server): \newline % Row Count 29 (+ 1) Funkcja STUFF() w SQL Server umożliwia zamianę fragmentu stringa innym stringiem. Może być używana do łączenia stringów. Przykład: \newline % Row Count 32 (+ 3) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{łączenie (konkatenacja) stringów (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{`SELECT STUFF('Hello World', 6, 0, ', ') AS concatenated\_string;` \newline % Row Count 2 (+ 2) Wynik: "Hello, World"% Row Count 3 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Konwersja danych}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 4 (+ 4) - CAST() lub CONVERT() umożliwiają konwersję jednego typu danych na inny. Przykład: \newline % Row Count 6 (+ 2) `SELECT CAST(kolumna AS nowy\_typ) AS nowa\_kolumna` \newline % Row Count 8 (+ 2) `FROM tabela;` \newline % Row Count 9 (+ 1) lub \newline % Row Count 10 (+ 1) `SELECT CONVERT(nowy\_typ, kolumna) AS nowa\_kolumna` \newline % Row Count 12 (+ 2) `FROM tabela;` \newline % Row Count 13 (+ 1) Należy zastąpić "kolumna" nazwą kolumny, którą chcesz przekonwertować, a "nowy\_typ" docelowym typem danych. \newline % Row Count 16 (+ 3) *Convert z unicode \newline % Row Count 17 (+ 1) `convert(name, 'AL32UTF8', 'WE8MSWIN1252')` \newline % Row Count 18 (+ 1) `SELECT CONVERT(name, 'UTF8', 'AL32UTF8') FROM nazwa\_tabeli` \newline % Row Count 20 (+ 2) - funkcje konwersji typów danych: \newline % Row Count 21 (+ 1) 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: \newline % Row Count 27 (+ 6) `SELECT TO\_NUMBER(kolumna) AS nowa\_kolumna` \newline % Row Count 28 (+ 1) `FROM tabela;` \newline % Row Count 29 (+ 1) W powyższym przykładzie używamy funkcji TO\_NUMBER(), aby przekonwertować wartość kolumny na typ liczbowy. \newline % Row Count 32 (+ 3) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Konwersja danych (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{-Składnia wyrażenie::typ\_danych lub \seqsplit{wyrażenie::typ\_danych(n)} służy do jawnego rzutowania (explicit cast) wartości wyrażenia na określony typ danych. Przykład: \newline % Row Count 4 (+ 4) `SELECT kolumna::integer AS nowa\_kolumna` \newline % Row Count 5 (+ 1) `FROM tabela;` \newline % Row Count 6 (+ 1) W powyższym przykładzie używamy ::integer, aby przekonwertować wartość kolumny na typ całkowitoliczbowy (integer). \newline % Row Count 9 (+ 3) 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.% Row Count 16 (+ 7) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{trim}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 5 (+ 5) Składnia ogólna funkcji TRIM jest następująca: \newline % Row Count 7 (+ 2) TRIM({[} {[} LEADING | TRAILING | BOTH {]} {[} characters\_to\_remove {]} FROM {]} string\_expression) \newline % Row Count 9 (+ 2) Argumenty funkcji TRIM: \newline % Row Count 10 (+ 1) - LEADING: Usuwa określone znaki z początku ciągu. \newline % Row Count 12 (+ 2) - TRAILING: Usuwa określone znaki z końca ciągu. \newline % Row Count 14 (+ 2) - BOTH (domyślne): Usuwa określone znaki zarówno z początku, jak i końca ciągu. \newline % Row Count 16 (+ 2) - 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. \newline % Row Count 20 (+ 4) - string\_expression: Wyrażenie tekstowe, z którego mają być usunięte znaki. \newline % Row Count 22 (+ 2) Przykłady: \newline % Row Count 23 (+ 1) Usunięcie spacji z początku i końca ciągu: \newline % Row Count 24 (+ 1) `SELECT TRIM(' Hello World ');` \newline % Row Count 25 (+ 1) Wynik: 'Hello World' \newline % Row Count 26 (+ 1) Usunięcie określonych znaków z początku i końca ciągu: \newline % Row Count 28 (+ 2) `SELECT TRIM('.,?!' FROM '...Hello, World?!...');` \newline % Row Count 30 (+ 2) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{trim (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Wynik: 'Hello, World' \newline % Row Count 1 (+ 1) Usunięcie spacji tylko z początku ciągu: \newline % Row Count 2 (+ 1) `SELECT TRIM(LEADING ' ' FROM ' Hello World ');` \newline % Row Count 4 (+ 2) Wynik: 'Hello World ' \newline % Row Count 5 (+ 1) Usunięcie spacji tylko z końca ciągu: \newline % Row Count 6 (+ 1) `SELECT TRIM(TRAILING ' ' FROM ' Hello World ');` \newline % Row Count 8 (+ 2) Wynik: ' Hello World' \newline % Row Count 9 (+ 1) 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. \newline % Row Count 13 (+ 4) 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.% Row Count 18 (+ 5) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Różnica między EXISTS a IN}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 4 (+ 4) 1. EXISTS: \newline % Row Count 5 (+ 1) - Klauzula EXISTS sprawdza, czy podzapytanie zwraca jakiekolwiek wyniki. \newline % Row Count 7 (+ 2) - Jeśli podzapytanie zwraca przynajmniej jeden wiersz, to warunek EXISTS jest spełniony. \newline % Row Count 9 (+ 2) - Klauzula EXISTS jest zwykle używana w warunku WHERE, aby sprawdzić, czy istnieją powiązane wiersze w innych tabelach. \newline % Row Count 12 (+ 3) - 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. \newline % Row Count 16 (+ 4) Przykład użycia klauzuli EXISTS: \newline % Row Count 17 (+ 1) `SELECT column1, column2, ...` \newline % Row Count 18 (+ 1) `FROM table1` \newline % Row Count 19 (+ 1) `WHERE EXISTS (SELECT column1 FROM table2 WHERE condition);` \newline % Row Count 21 (+ 2) 2. IN: \newline % Row Count 22 (+ 1) - Klauzula IN porównuje wartość wyrażenia z zestawem wartości dostarczonych w podzapytaniu lub liście wartości. \newline % Row Count 25 (+ 3) - Jeśli wartość jest równa jednej z wartości z podzapytania lub listy, warunek IN jest spełniony. \newline % Row Count 28 (+ 3) - Klauzula IN jest zwykle używana w warunku WHERE, aby sprawdzić, czy wartość znajduje się w określonym zestawie. \newline % Row Count 31 (+ 3) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Różnica między EXISTS a IN (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{ - Może być łatwiejsza do zrozumienia i zapisu niż EXISTS, ale może być mniej wydajna dla dużych zbiorów danych. \newline % Row Count 3 (+ 3) Przykład użycia klauzuli IN: \newline % Row Count 4 (+ 1) `SELECT column1, column2, ...` \newline % Row Count 5 (+ 1) `FROM table1` \newline % Row Count 6 (+ 1) `WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);` \newline % Row Count 8 (+ 2) 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.% Row Count 14 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Różnice między DELETE a TRUNCATE}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Różnica między operacjami DELETE i TRUNCATE dotyczy sposobu usuwania danych w bazie danych. Oto główne różnice między nimi: \newline % Row Count 3 (+ 3) DELETE: \newline % Row Count 4 (+ 1) - DELETE jest operacją DML (Data Manipulation Language), która służy do usuwania jednego lub więcej wierszy z tabeli. \newline % Row Count 7 (+ 3) - Operacja DELETE jest rejestrowana w dzienniku transakcji (ang. transaction log), co oznacza, że można cofnąć operację DELETE w ramach transakcji. \newline % Row Count 11 (+ 4) - DELETE można stosować z dodatkowymi warunkami (WHERE), aby precyzyjnie określić, które wiersze mają być usunięte. \newline % Row Count 14 (+ 3) - DELETE wywołuje wyzwalacze (triggery) zdefiniowane na tabeli, które mogą wykonywać określone działania przed lub po usunięciu danych. \newline % Row Count 17 (+ 3) Przykład użycia DELETE: \newline % Row Count 18 (+ 1) `DELETE FROM tabela WHERE warunek;` \newline % Row Count 19 (+ 1) TRUNCATE: \newline % Row Count 20 (+ 1) - TRUNCATE jest operacją DDL (Data Definition Language), która służy do usuwania wszystkich wierszy z tabeli. \newline % Row Count 23 (+ 3) - Operacja TRUNCATE nie jest rejestrowana w dzienniku transakcji, co oznacza, że nie można cofnąć operacji TRUNCATE w ramach transakcji. \newline % Row Count 26 (+ 3) - TRUNCATE nie używa warunków (WHERE), ponieważ usuwa wszystkie wiersze z tabeli. \newline % Row Count 28 (+ 2) - TRUNCATE nie wywołuje wyzwalaczy (triggers) zdefiniowanych na tabeli. \newline % Row Count 30 (+ 2) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Różnice między DELETE a TRUNCATE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Przykład użycia TRUNCATE: \newline % Row Count 1 (+ 1) `TRUNCATE TABLE tabela;` \newline % Row Count 2 (+ 1) 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.% Row Count 11 (+ 9) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Usuwanie duplikatów z tabeli}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 5 (+ 5) Przykład 1: Użycie operacji SELECT DISTINCT i INSERT INTO \newline % Row Count 7 (+ 2) `CREATE TABLE tabela2 AS` \newline % Row Count 8 (+ 1) `SELECT DISTINCT *` \newline % Row Count 9 (+ 1) `FROM tabela;` \newline % Row Count 10 (+ 1) W tym przykładzie tworzymy nową tabelę tabela2, która zawiera tylko unikalne wiersze z tabeli oryginalnej. \newline % Row Count 13 (+ 3) Przykład 2: Użycie operacji DELETE z klauzulą EXISTS \newline % Row Count 15 (+ 2) `DELETE FROM tabela a` \newline % Row Count 16 (+ 1) `WHERE EXISTS (` \newline % Row Count 17 (+ 1) ` SELECT 1` \newline % Row Count 18 (+ 1) ` FROM tabela b` \newline % Row Count 19 (+ 1) ` WHERE a.kolumna = b.kolumna` \newline % Row Count 20 (+ 1) ` AND a.id \textless{} b.id` \newline % Row Count 21 (+ 1) `);` \newline % Row Count 22 (+ 1) W tym przykładzie usuwamy wiersze, dla których istnieje inny wiersz o tej samej wartości kolumny, ale z niższym identyfikatorem (id). \newline % Row Count 25 (+ 3) Przykład 3: Użycie operacji DELETE z wykorzystaniem CTE \newline % Row Count 27 (+ 2) `WITH duplicates AS (` \newline % Row Count 28 (+ 1) ` SELECT kolumna, COUNT(*) AS count` \newline % Row Count 29 (+ 1) ` FROM tabela` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Usuwanie duplikatów z tabeli (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{` GROUP BY kolumna` \newline % Row Count 1 (+ 1) ` HAVING COUNT(*) \textgreater{} 1` \newline % Row Count 2 (+ 1) `)` \newline % Row Count 3 (+ 1) `DELETE FROM tabela` \newline % Row Count 4 (+ 1) `WHERE (kolumna) IN (` \newline % Row Count 5 (+ 1) ` SELECT kolumna` \newline % Row Count 6 (+ 1) ` FROM duplicates` \newline % Row Count 7 (+ 1) `);` \newline % Row Count 8 (+ 1) 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. \newline % Row Count 14 (+ 6) 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.% Row Count 20 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Fuzzy Matching}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 4 (+ 4) - 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: \newline % Row Count 9 (+ 5) `SELECT column\_name` \newline % Row Count 10 (+ 1) `FROM table\_name` \newline % Row Count 11 (+ 1) `WHERE column\_name LIKE '\%fraza\%';` \newline % Row Count 12 (+ 1) W powyższym przykładzie, '\%fraza\%' dopasuje wartości w kolumnie column\_name, które zawierają "fraza" gdziekolwiek wewnątrz ciągu. \newline % Row Count 15 (+ 3) - 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: \newline % Row Count 21 (+ 6) `SELECT column\_name` \newline % Row Count 22 (+ 1) `FROM table\_name` \newline % Row Count 23 (+ 1) `WHERE SOUNDEX(column\_name) = SOUNDEX('wyrażenie');` \newline % Row Count 25 (+ 2) 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". \newline % Row Count 29 (+ 4) 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. \newline % Row Count 35 (+ 6) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Fuzzy Matching (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{- Przykład z użyciem DIFFERENCE w SQL Server: \newline % Row Count 1 (+ 1) `SELECT column\_name` \newline % Row Count 2 (+ 1) `FROM table\_name` \newline % Row Count 3 (+ 1) `WHERE DIFFERENCE(column\_name, 'wyrażenie') \textgreater{}= 3;` \newline % Row Count 5 (+ 2) W powyższym przykładzie, DIFFERENCE(column\_name, 'wyrażenie') \textgreater{}= 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. \newline % Row Count 10 (+ 5) 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.% Row Count 16 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Operator NOT}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 4 (+ 4) 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. \newline % Row Count 10 (+ 6) Przykład: \newline % Row Count 11 (+ 1) `SELECT *` \newline % Row Count 12 (+ 1) `FROM tabela` \newline % Row Count 13 (+ 1) `WHERE NOT kolumna = 'wartosc';` \newline % Row Count 14 (+ 1) 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. \newline % Row Count 20 (+ 6) Operator NOT może być również używany do negacji warunków logicznych, takich jak AND i OR. Na przykład: \newline % Row Count 23 (+ 3) `SELECT *` \newline % Row Count 24 (+ 1) `FROM tabela` \newline % Row Count 25 (+ 1) `WHERE NOT (warunek1 AND warunek2);` \newline % Row Count 26 (+ 1) 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. \newline % Row Count 32 (+ 6) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{Operator NOT (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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. \newline % Row Count 4 (+ 4) 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.% Row Count 9 (+ 5) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{IF ELSE}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{1. Konstrukcja `CASE WHEN`: \newline % Row Count 1 (+ 1) `SELECT` \newline % Row Count 2 (+ 1) ` column\_name,` \newline % Row Count 3 (+ 1) ` CASE` \newline % Row Count 4 (+ 1) ` WHEN condition1 THEN result1` \newline % Row Count 5 (+ 1) ` WHEN condition2 THEN result2` \newline % Row Count 6 (+ 1) ` ELSE result\_default` \newline % Row Count 7 (+ 1) ` END AS result` \newline % Row Count 8 (+ 1) `FROM table\_name;` \newline % Row Count 9 (+ 1) Przykład: \newline % Row Count 10 (+ 1) `SELECT` \newline % Row Count 11 (+ 1) ` product\_name,` \newline % Row Count 12 (+ 1) ` CASE` \newline % Row Count 13 (+ 1) ` WHEN units\_sold \textgreater{} 1000 THEN 'High'` \newline % Row Count 14 (+ 1) ` WHEN units\_sold \textgreater{} 500 THEN 'Medium'` \newline % Row Count 15 (+ 1) ` ELSE 'Low'` \newline % Row Count 16 (+ 1) ` END AS sales\_category` \newline % Row Count 17 (+ 1) `FROM products;` \newline % Row Count 18 (+ 1) 2. Funkcja `IF`: \newline % Row Count 19 (+ 1) `SELECT` \newline % Row Count 20 (+ 1) ` column\_name,` \newline % Row Count 21 (+ 1) ` IF(condition, result\_true, result\_false) AS result` \newline % Row Count 23 (+ 2) `FROM table\_name;` \newline % Row Count 24 (+ 1) Przykład: \newline % Row Count 25 (+ 1) `SELECT` \newline % Row Count 26 (+ 1) ` product\_name,` \newline % Row Count 27 (+ 1) ` IF(units\_sold \textgreater{} 1000, 'High', 'Low') AS sales\_category` \newline % Row Count 29 (+ 2) `FROM products;` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{IF ELSE (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{3. Konstrukcja `IIF` (dostępna w niektórych systemach baz danych): \newline % Row Count 2 (+ 2) `SELECT` \newline % Row Count 3 (+ 1) ` column\_name,` \newline % Row Count 4 (+ 1) ` IIF(condition, result\_true, result\_false) AS result` \newline % Row Count 6 (+ 2) `FROM table\_name;` \newline % Row Count 7 (+ 1) Przykład: \newline % Row Count 8 (+ 1) `SELECT` \newline % Row Count 9 (+ 1) ` product\_name,` \newline % Row Count 10 (+ 1) ` IIF(units\_sold \textgreater{} 1000, 'High', 'Low') AS sales\_category` \newline % Row Count 12 (+ 2) `FROM products;` \newline % Row Count 13 (+ 1) 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ć.% Row Count 22 (+ 9) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{co to jest Constraint?}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{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: \newline % Row Count 7 (+ 7) 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. \newline % Row Count 12 (+ 5) Przykład: \newline % Row Count 13 (+ 1) `CREATE TABLE customers (` \newline % Row Count 14 (+ 1) ` customer\_id INT PRIMARY KEY,` \newline % Row Count 15 (+ 1) ` customer\_name VARCHAR(50)` \newline % Row Count 16 (+ 1) `);` \newline % Row Count 17 (+ 1) 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. \newline % Row Count 22 (+ 5) Przykład: \newline % Row Count 23 (+ 1) `CREATE TABLE orders (` \newline % Row Count 24 (+ 1) ` order\_id INT PRIMARY KEY,` \newline % Row Count 25 (+ 1) ` customer\_id INT,` \newline % Row Count 26 (+ 1) ` order\_date DATE,` \newline % Row Count 27 (+ 1) ` FOREIGN KEY (customer\_id) REFERENCES customers (customer\_id)` \newline % Row Count 29 (+ 2) `);` \newline % Row Count 30 (+ 1) } \tn \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{co to jest Constraint? (cont)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{3. Unique Key (Klucz unikalny): Ograniczenie unique key zapewnia unikalność wartości w kolumnie lub grupie kolumn, ale pozwala na obecność wartości null. \newline % Row Count 4 (+ 4) Przykład: \newline % Row Count 5 (+ 1) `CREATE TABLE employees (` \newline % Row Count 6 (+ 1) ` employee\_id INT PRIMARY KEY,` \newline % Row Count 7 (+ 1) ` employee\_name VARCHAR(50),` \newline % Row Count 8 (+ 1) ` email VARCHAR(50) UNIQUE` \newline % Row Count 9 (+ 1) `);` \newline % Row Count 10 (+ 1) 4. Check Constraint (Ograniczenie sprawdzające): Ograniczenie check definiuje warunek, który musi zostać spełniony przez wartości w kolumnie. \newline % Row Count 13 (+ 3) Przykład: \newline % Row Count 14 (+ 1) `CREATE TABLE products (` \newline % Row Count 15 (+ 1) ` product\_id INT PRIMARY KEY,` \newline % Row Count 16 (+ 1) ` product\_name VARCHAR(50),` \newline % Row Count 17 (+ 1) ` quantity INT,` \newline % Row Count 18 (+ 1) ` price DECIMAL(10, 2),` \newline % Row Count 19 (+ 1) ` CHECK (quantity \textgreater{}= 0 AND price \textgreater{} 0)` \newline % Row Count 20 (+ 1) `);` \newline % Row Count 21 (+ 1) 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.% Row Count 26 (+ 5) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}