Laboratorium 1

Jak połączyć się z bazą danych?

  • host: granat.im.pwr.wroc.pl
  • user: (Podane na laboratorium)
  • hasło: (Podane na laboratorium)

Dwie bazy są dla nas interesujące:

  • northwind - na tym ćwiczymy zapytania
  • tmp - baza, która jest czyszczona po każdym wylogowaniu. Tutaj można robić, co tylko dusza zapragnie.

Gdzie nauczyć się zapytań?

Mnóstwo materiałów w internecie. Między innymi http://www.w3schools.com/sql/ lub dokumentacja http://dev.mysql.com/doc/refman/5.7/en/

Northwind

#jakie bazy są dostępne
SHOW DATABASES;

#wybieramy bazę northwind
USE northwind;

#jakie tabele znajdują się w bazie northwind
SHOW TABLES;

#jakie kolumny zawiera tabela Customers
SHOW COLUMNS FROM Customers;

Cel na te zajęcia: znaleźć 5 krajów o największej łącznej wartości zamówień

Zacznijmy od podstaw.

Zapytanie: wszystkie kolumny z tabeli Customers

SELECT * FROM `Customers`;

Możemy też wybrać niektóre kolumny

SELECT CustomerName,City FROM Customers;

Z jakich miast pochodzą nasi klienci?

SELECT City FROM Customers;
# a co jeśli mamy wiele kopii tego samego?
SELECT DISTINCT City FROM Customers;

Wybieraliśmy kolumny, teraz czas na wybór podzbioru wierszy. Ustawiamy warunki logiczne.

# co jeśli interesują nas tylko klienci z Polski?
SELECT * FROM Customers
WHERE Country='Poland';

Możemy też ustawiać warunki numeryczne (<, >) oraz dopasowanie wzorca

SELECT * FROM Customers
WHERE City LIKE 'war%';

SELECT * FROM Customers
WHERE City LIKE '[a-c]%';

A co jeśli chcielibyśmy mieć nasze wyniki uszeregowane?

SELECT * FROM Customers
ORDER BY Country DESC, City;

Zamiast wszystkich wyników może nas interesować jedynie kilka pierwszych

SELECT * FROM Customers
LIMIT 3;

Jako rozgrzewkę wyciagniemy z bazy informację o liczbie zamówień dokonanych przez poszczególnych klientów. W tym celu musimy połączyć informacje z tabel Orders i Customers. Służy do tego polecenie JOIN.

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID

Wyniki powyższego zapytania chcemt pogrupowć po nazwie klienta i zsumować.

SELECT Customers.CustomerName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Customers
  INNER JOIN Orders
  ON Customers.CustomerID=Orders.CustomerID
GROUP BY Country
ORDER BY NumberOfOrders DESC

Żeby dostać informację o krajach z największą WARTOŚCIĄ zamówień musimy połączyć tabele Order Details i Orders.

SELECT Orders.ShipCountry AS Country, UnitPrice, Quantity
FROM Orders
  INNER JOIN `Order Details`;

AS tworzy alias, nową nazwę, na wybraną kolumnę. Jeśli nie podamy na jakich kolumnach chcemy łączyć tabele to SQL autoamtycznie połączy je po kolumnach o tych samych nazwach w obu tabelach. To może nie być dokładnie to na czym nam zależy!

5 krajow o najwiekszych zamowieniach

SELECT Orders.ShipCountry AS Country, SUM(UnitPrice*Quantity) AS TotalPrice
FROM Orders
  INNER JOIN `Order Details`
GROUP BY Country
ORDER BY TotalPrice DESC
LIMIT 5;

Instalacja i uruchomienie software pod linuxem (Ubuntu/Debian)

Sciągamy i uruchamiamy program DataGrip (wybieramy licencję dla studentów lub nauczycieli)

W konsoli przechodzimy do katalogu bin

cd DataGrip-1.0.3/bin

Uruchamiamy skrypt

./datagrip.sh

Support na stronie https://intellij-support.jetbrains.com/hc/en-us

Instalujemy mysql. Na ubuntu robimy to następująco

sudo apt-get install mysql-client mysql-server

W czasie instalacji ustalamy hasło na root’a

Jest dużo tutoriali w internecie na ten temat. Np. http://www.yolinux.com/TUTORIALS/LinuxTutorialMySQL.html