Professional Documents
Culture Documents
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żą:
TYPY DANYCH
Numeric Data Types – numeryczne
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
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
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
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.
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.
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 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.
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.