You are on page 1of 11

Praktyczny kurs SQL.

Wydanie III - Danuta Mendrala, Marcin Szeliga

SQL - czyli strukturalny język zapytań (ang. Structured Query Language), umożliwia
odczytywanie i modyfikowanie przechowywanych w bazie danych informacji. Jest on też
podstawowym językiem programowania baz danych, czyli pozwala na tworzenie i
modyfikowanie obiektów bazodanowych, takich jak tabele czy procedury.

http://sql.dawida.pl/alfabet.php

Serwery bazodanowe
Na rynku dostępnych jest co najmniej kilkadziesiąt różnych serwerów baz danych. Do
najpopularniejszych należą:

1. SQL Server firmy Microsoft;


2. MySQL — powstał w ramach projektu Open Source, następnie został wykupiony przez szwedzką
firmę MySQL AB, a w lutym 2008 roku przejęty przez Sun Microsystems;
3. Oracle Database firmy Oracle;
4. PostgreSQL — początkowo dzieło naukowców z uniwersytetu w Berkeley, teraz rozwijany w
ramach otwartego projektu przez społeczność PostgreSQL Global Development Group;
5. Wchodzący w skład pakietu Microsoft Office Access;
6. Bazujący na udostępnionym w 2000 roku kodzie serwera InterBase Firebird;
7. DB2 firmy IBM;
8. InterBase firmy Borland.
Jedynym wspólnym punktem wszystkich tych serwerów jest język SQL

TYPY DANYCH
Numeric Data Types – numeryczne

* – zielone wpisy onaczają przyjmowane wartości dla UNSIGNED


Wszystkie powyższe typy danych domyślnie przyjmują NULL, a jeśli pole jest zdefiniowane jako NOT NULL, wówczas
przyjmują zero.

DECIMAL[(precyzja[,skala])]
● precyzja - całkowita ilość znaczących cyfr użyta do wyrażenia liczby
● skala - całkowita ilość cyfr na prawo od kropki dziesiętnej

Date and Time Types – typu daty i czasu

* – domyślnie YEAR reprezentowany jest przez 4 cyfry

String types
Wszystkie powyższe typy napisowe domyślnie przyjmują NULL, a jeśli pole jest zdefiniowane jako NOT NULL, wówczas
domyślna wartość to: ”.
Różnica między CHAR a VARCHAR jest taka, że CHAR jest łańcuchem znakowym o stałej, a VARCHAR o zmiennej długości.

http://www.mysqltutorial.org/mysql-data-types.aspx
https://www.promotic.eu/pl/pmdoc/Subsystems/Db/MsSQL/DataTypes.htm

MySQL CREATE TABLE


CREATE TABLE [IF NOT EXISTS] table_name(
column_list
) engine=table_type

column_name data_type[size] [NOT NULL|NULL] [DEFAULT value]


[AUTO_INCREMENT]
● The column_name specifies the name of the column. Each column has a specific data type and the size
e.g.,VARCHAR(255)
● The NOT NULL or NULL indicates that the column accepts NULL value or not.
● The DEFAULT value is used to specify the default value of the column.
● The AUTO_INCREMENT indicates that the value of the column is increased automatically whenever a new row is
inserted into the table. Each table has one and only one AUTO_INCREMENT column.

PRIMARY KEY (col1,col2,...)

Np.
CREATE TABLE IF NOT EXISTS tasks (
task_id INT(11) NOT NULL AUTO_INCREMENT,
subject VARCHAR(45) DEFAULT NULL,
start_date DATE DEFAULT NULL,
end_date DATE DEFAULT NULL,
description VARCHAR(200) DEFAULT NULL,
PRIMARY KEY (task_id)
) ENGINE=InnoDB

MYSQL DATA MANIPULATION

GROUP BY

1.

SELECT
status
FROM
orders
GROUP BY status;
2.

SELECT
status, COUNT(*)
FROM
orders
GROUP BY status;

JOINY - Różnica w ich działaniu polega na tym, że przy inner join zapytanie wyświetla
tylko te wartości, które dają się sparować z obu tabel. Przy right join do wszystkich
rekordów z prawej tabeli są przyporządkowywane rekordy z lewej tabeli. Jeśli do
któregoś rekordu z prawej nie da się nic sparować, to wtedy w kolumnach pochodzących
z tabeli lewej są wartości NULL.

INNER JOIN
http://www.w3schools.com/sql/sql_join_inner.asp
http://www.mysqltutorial.org/mysql-inner-join.aspx

The INNER JOIN keyword selects all rows from both tables as long as there is
a match between the columns in both tables.
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

Np.
SELECT
productCode, productName, textDescription
FROM
products T1
INNER JOIN
productlines T2
ON T1.productline = T2.productline;
SELECT
T1.orderNumber,
status,
SUM(quantityOrdered * priceEach) total
FROM
orders AS T1
INNER JOIN
orderdetails AS T2
ON T1.orderNumber = T2.orderNumber
GROUP BY orderNumber;

LEFT JOIN
http://www.w3schools.com/sql/sql_join_left.asp

The LEFT JOIN keyword returns all rows from the left table (table1), with the
matching rows in the right table (table2). The result is NULL in the right side
when there is no match.

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

Np.
SELECT
c.customerNumber, customerName, orderNumber, status
FROM
customers c
LEFT JOIN
orders o
ON c.customerNumber = o.customerNumber;
SELECT
c.customerNumber, c.customerName, orderNumber, o.status
FROM
customers c
LEFT JOIN
orders o
ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;

RIGHT JOIN
The RIGHT JOIN keyword returns all rows from the right table (table2), with
the matching rows in the left table (table1). The result is NULL in the left side
when there is no match.

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
http://sqlhints.com/2016/10/15/difference-between-left-outer-join-and-right-outer-join-in-sql-
server/

GROUP BY
The GROUP BY statement is used in conjunction with the aggregate functions
to group the result-set by one or more columns.

Słowo kluczowe GROUP BY służy do podzielenia danych zwracanych przez


instrukcję SELECT na dowolną liczbę grup.

The GROUP BY clause, which is an optional part of the SELECT statement, groups a set of
rows into a set of summary rows by values of columns or expressions. The GROUP BY
clause returns one row for each group. In other words, it reduces the number of rows in the
result set.
We often use the GROUP BY clause with aggregate functions such as SUM, AVG, MAX,
MIN, and COUNT. The aggregate function that appears in the SELECT clause provides the
information about each group.

Funkcje grupujące mogą być wywoływane dla określonych grup, a nie tylko dla całych
tabel. Podział wierszy na logiczne grupy umożliwia właśnie klauzula GROUP BY , przy
czym najczęściej wiersz jest klasyfikowany do danej grupy na podstawie wartości
kolumny innej niż ta, dla której wywoływana jest funkcja grupująca.
!!!! Jeżeli zapytanie zawiera klauzulę GROUP BY , w klauzuli SELECT dopuszczalne są
wyłącznie funkcje grupujące oraz nazwy kolumn lub wyrażenia użyte do pogrupowania
danych, czyli występujące w klauzuli GROUP BY.

Logiczna kolejność wykonywania zapytania zawierającego wszystkie poznane do


tej pory klauzule jest następująca:
1. Jako pierwsza wykonywana jest klauzula FROM . Jeżeli zapytanie odwołuje się do
wielu tabel, są one kolejno ze sobą złączane.
2. Otrzymany w ten sposób zbiór pośredni jest filtrowany na podstawie warunku
logicznego umieszczonego w klauzuli WHERE . Tylko te wiersze, dla których jest on
prawdziwy, trafiają do kolejnego zbioru pośredniego.
3. Następnie wykonywana jest klauzula GROUP BY , czyli grupowane są tylko
przefiltrowane wiersze.
4. Po zgrupowaniu wykonywana jest klauzula SELECT .
5. W dalszej kolejności serwer sortuje wiersze, czyli wykonywana jest klauzula ORDER
BY
6. Na końcu, podczas wykonywania klauzuli TOP , liczba wierszy wyniku zapytania
zostaje ograniczona.

SELECT column_name, aggregate_function(column_name)


FROM table_name
WHERE column_name operator value
GROUP BY column_name;

Np.
SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS
NumberOfOrders FROM Orders
LEFT JOIN Shippers
ON Orders.ShipperID=Shippers.ShipperID
GROUP BY ShipperName;


SELECT
status
FROM
orders
GROUP BY status;
……………

SELECT
status, COUNT(*)
FROM
orders
GROUP BY status;
…………
SELECT
status, SUM(quantityOrdered * priceEach) AS amount
FROM
orders
INNER JOIN
orderdetails USING (orderNumber)
GROUP BY status;
…….
SELECT
YEAR(orderDate) AS year,
SUM(quantityOrdered * priceEach) AS total
FROM
orders
INNER JOIN
orderdetails USING (orderNumber)
WHERE
status = 'Shipped'
GROUP BY YEAR(orderDate);

……….
We can find which order has total sales greater than $1000. We use the MySQL
HAVING clause with the aggregate as follows:

SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING total > 1000;

AGREGUJĄCE FUNKCJE
http://uazz.pl/index.php/sql/258-sql-funkcje-agregujace
KLUCZE
Klucz Podstawowy

Klucz Podstawowy (PRIMARY KEY) nazywany też kluczem głównym, dzięki temu
ograniczeniu będziemy mogli w łatwy sposób odwoływac się do rekordów, słuzy on więc do
indentyfikacji poszczególnych wierszy. W jednej tabeli można utworzyć najwyżej jeden klucz
podstawowy. Dla pola z kluczem głównym można dodatkowo określić parametr
AUTO_INCREMENT (opisany w innej części kursu).
Na ten klucz automatycznie nakładana jest właściwość UNIQUE INDEX dzięki czemu do
kolumny nie można wprowadzić powtarzającej się wartości.
Wspomne tutaj, że klucz główny nie jest tym samym co unikalny indeks, przybiera on
dodatkowe właściwości m.in można na niego nałożyc wspomniane AUTO_INCREMENT a
także odwolywac sie przez klucz obcy.

Klucz główny możemy nalożyć tym zapytaniem:


Kod: ALTER TABLE nazwa_tabeli ADD PRIMARY KEY (nazwa_kolumny);

Klucz obcy
Odwołuje się on do klucza głównego znajdujacego się w innej tabeli. Dzięki temu np.
modyfikując wartość w jednej tabeli zmiany zostaną zaktualizowane także w drugiej.

Uwaga: Klucz obcy w MySQL działa tylko dla tabel z silnikiem InnoDB.
http://www.forumweb.pl/porady-i-tutoriale-www/mysql-kurs-mysql-cz-iii-klucze-
indeksy-zlaczenia-etc,27586

Tabele w MySQL mog ˛a byc przechowywane na kilka sposobów. Sposób ten (zargonowo:
silnik, ˙ engine) jest definiowany przy zakładaniu tabeli. Najwazniejsze dwa sposoby to
1. MyISAM — domyslny (natywny) system MySQL. Dostep do tabel jest szybki, ale sposób
ten nie realizuje niektórych rzeczy zdefiniowanych w standardzie SQL, w szczególnosci nie
obsługuje mechanizmu kluczy obcych ani transakcji, co jest przedmiotem niniejszego
wykładu.
2. InnoDB — dostep do tabel moze byc wyraznie wolniejszy, ale ten sposób ´ pozwala na
stosowanie kluczy obcych i transakcji.

Klucze obce Klucze obce — powi ˛azanie indeksowanej kolumny jakiejs tabeli z
indeksowana kolumna innej tabeli, co pozwala na automatyczne dokonywanie zmian w
powiazanych tabelach lub uniemozliwia dokonanie zmian naruszajacych ograniczenia. ˙
Uwaga: To jest bardzo wygodne, ale bardzo niebezpieczne! A poza tym spowalnia działanie
bazy.

Mechanizm kluczy obcych jest sposobem na realizacj ˛e w SQL wi ˛ezów integralnosci


referencyjnej ´ .

W MySQL działa tylko dla tabel InnoDB.

GŁÓWNY
Określenie relacyjna baza danych swoją nazwę zawdzięcza matematyce, a dokładniej
rzecz ujmując – teorii zbiorów. W ogólnej koncepcji tabele bazodanowe powiązane są ze
sobą za pomocą relacji, co znacznie zwiększa elastyczność konstrukcji oraz pozwala na
minimalizację rozmiarów zbioru informacji w stosunku do tradycyjnego (liniowego)
przechowywania danych.
Każda z tabel musi posiadać swój własny, unikatowy w ramach własnej struktury,
identyfikator – zwany kluczem głównym. PRIMARY KEY jednoznacznie identyfikuje
każdą krotkę (rekord), dzięki czemu, oprócz spełnienia warunków normalizacji bazy
danych (Normal Form), może występować jako łącznik w obrębie innych tabel.

You might also like