|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
Najpierw przygotujemy na dysku katalog na pliki danych. Otwórz Eksplorator plików i w głównym katalogu dysku C: utwórz katalog C:\sql:

Otwórz ten katalog. W katalogu sql utwórz katalog d1, w którym będziemy przechowywać pliki na potrzeby tej lekcji:

Teraz otwórz notatnik Windows i wpisz w nim tekst:
@echo off c: cd \sql \xampp\mysql\bin\mysql -u twoje_konto -ptwoje_hasło twoja_baza
Zamień w tekście czerwone napisy na swoje dane. Jest to prosty skrypt dla systemu Windows:
@echo off |
– | To polecenie wyłącza wyświetlanie wykonywanych poleceń skryptu w oknie konsoli. Znak @ na początku powoduje, iż samo polecenie echo off również nie zostanie wyświetlone, tylko wykonane. |
c: |
– | Wybiera dysk C: jako dysk bieżący |
cd \sql |
– | Ustawia katalog c:\sql jako katalog bieżący |
\xampp\... |
– | Uruchamia terminal MySQL. |
Plik notatnika zapisz w katalogu pulpit pod nazwą sql.cmd. Plik sql.cmd będzie teraz automatycznie uruchamiał terminal MySQL z katalogu c:\sql.
Uruchom panel sterowania XAMPP i włącz serwer MySQL:

Przejdź na pulpit i kliknij dwukrotnie lewym przyciskiem myszki w ikonę sql.cmd:

Jeśli wszystko wykonałeś poprawnie, to powinien uruchomić się terminal MySQL z twoim kontem i z twoją bazą danych:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.4.32-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [twoja_baza]>
Sprawdzimy, czy pracujemy we właściwym katalogu na swoim dysku. Wpisz polecenie:
SYSTEM dir
lub
\! dir
Polecenie SYSTEM (lub \!) pozwala wykonać rozkaz systemowy dir (ang. directory = katalog), który wyświetli bieżący katalog roboczy. Powinien to być utworzony przez nas katalog c:\sql:
SYSTEM dir
Volume in drive C has no label.
Volume Serial Number is 182A-FCC9
Directory of c:\sql
09.01.2024 10:06 <DIR> .
09.01.2024 10:06 <DIR> ..
09.01.2024 08:57 <DIR> d1
0 File(s) 0 bytes
3 Dir(s) 1 603 732 922 368 bytes freeBaza danych składa się z tabel. Sprawdźmy, jakie tabele zawiera baza, do której jesteśmy załogowani. Wpisz polecenie SQL:
SHOW TABLES;
Polecenie zwraca informację o nazwach tabel w twojej bazie:
SHOW TABLES; +---------------+ | Tables_in_geo | +---------------+ | osoba | +---------------+
W mojej bazie danych, której nazwa to geo, znajduje się jedna tabela osoba, utworzona na poprzedniej lekcji. Ponieważ nie jest nam już potrzebna tabela osoby, usuwamy ją z bazy danych poleceniem SQL:
DROP TABLE osoba;
i sprawdź:
SHOW TABLES; Empty set (0.001 sec)
Empty set = zbiór pusty, czyli tutaj oznacza brak tabel w bazie danych.
Teraz utworzymy trzy nowe tabele o następującej strukturze:
| kraje | ||||||
| id | kod | nazwa | waluta | populacja | stolica | kontynent |
INT |
CHAR(3) |
VARCHAR(45) |
CHAR(3) |
BIGINT |
VARCHAR(30) |
CHAR(2) |
| jezyki | |
| kraj | jezyk |
CHAR(3) |
VARCHAR(10) |
| kontynenty | |
| kod | kontynent |
CHAR(2) |
VARCHAR(18) |
Kolor żółty tła oznacza klucz główny, czyli wartość, która dla każdego rekordu tabeli jest inna.
W tabeli kraje klucz główny będzie kolejnym numerem rekordu.
W tabeli jezyki klucz główny będzie obejmował dwa pola: kraj oraz jezyk. Dlaczego tak? Otóż klucz główny musi być unikalny dla każdego rekordu tabeli, a ten warunek spełniają kraj i jezyk wzięte razem – ten sam kraj może mieć kilka różnych języków i ten sam język może być używany w kilku różnych krajach, ale para kraj-język może pojawić się tylko jeden raz.
W tabeli kontynenty kluczem głównym jest pole kod, zawierające 2-literowy kod kontynentu.
Tabele są ze sobą powiązane relacjami:
Tabela języki w kolumnie kraj przechowuje kody krajów z kolumny kod w tabeli kraje.
Tabela kraje w kolumnie kontynent przechowuje kody kontynentów z kolumny kod w tabeli kontynenty.
Wpisz polecenia SQL (dłuższe polecenia można edytować w edytorze przed wysłaniem ich na terminal SQL. Rozkaz uruchamiający edytor to polecenie EDIT, wprowadzone polecenia należy zapisać przy pomocy Ctrl-S i zamknąć edytor. Inną opcją jest użycie własnego notatnika Windows, w którym wpisujemy polecenie, po czym kopiujemy je do schowka i wklejamy do terminala MySQL.):
CREATE TABLE kraje ( id INT AUTO_INCREMENT PRIMARY KEY, kod CHAR(3) NOT NULL, nazwa VARCHAR(45) NOT NULL, waluta CHAR(3) DEFAULT NULL, populacja BIGINT DEFAULT 0, stolica VARCHAR(30) DEFAULT NULL, kontynent CHAR(2) DEFAULT NULL ); CREATE TABLE jezyki ( kraj CHAR(3) NOT NULL, jezyk VARCHAR(10) NOT NULL, PRIMARY KEY(kraj,jezyk) ); CREATE TABLE kontynenty ( kod CHAR(2) PRIMARY KEY, kontynent VARCHAR(13) NOT NULL );
Atrybut NOT NULL wymusza wprowadzenie informacji do danego pola rekordu tabeli. Pole z atrybutem NOT NULL nie może być puste.
Atrybut DEFAULT NULL umieszcza w polu standardowo tekst pusty.
Atrybut DEFAULT wartość liczbowa umieszcza w polu standardowo podaną wartość.
PRIMARY KEY(lista pól tabeli) tworzy klucz główny z podanej listy pól. Oznacza to, iż w tabeli nie może być dwóch rekordów o takiej samej zawartości pól objętych kluczem głównym.
Sprawdź tabele w swojej bazie danych:
SHOW TABLES; +---------------+ | Tables_in_geo | +---------------+ | jezyki | | kontynenty | | kraje | +---------------+ 3 rows in set (0.001 sec)
W następnym kroku wpiszemy dane do tabel. Wpisz EDIT, po czym w edytorze wprowadź polecenie SQL:
INSERT INTO kontynenty (kod,kontynent) VALUES
('AF','Africa'),
('EU','Europe'),
('AS','Asia'),
('SA','South America'),
('NA','North America'),
('AN','Antarctica'),
('OC','Oceania');
Zapisz treść edytora (Ctrl+S), zamknij okienko edytora i wpisz znak ; , aby wykonać polecenie. Następnie wpisz
SELECT * FROM kontynenty;
Powinieneś otrzymać wynik:
SELECT * FROM kontynenty; +-----+---------------+ | kod | kontynent | +-----+---------------+ | AF | Africa | | AN | Antarctica | | AS | Asia | | EU | Europe | | NA | North America | | OC | Oceania | | SA | South America | +-----+---------------+ 7 rows in set (0.000 sec)
Dane dla pozostałych dwóch tabel kraje i języki są zbyt duże, aby wprowadzać je ręcznie. Dlatego odczytamy je z plików.
Pobierz poniższy plik i zapisz go w katalogu C:\sql\d1 :
Wprowadź wpisz polecenie SQL:
LOAD DATA LOCAL INFILE 'd1/jezyki.txt' INTO TABLE jezyki FIELDS TERMINATED BY ',';
Polecenie ładuje dane lokalnie (czyli z komputera, na którym pracujesz w terminalu MySQL) dane z pliku jezyki.txt, który znajduje się w katalogu d1 (zwróć uwagę, iż znak rozdzielający katalog od pliku to /, a nie \, jak w Windows) do tabeli jezyki, gdzie pola danych w pliku rozdzielono znakiem przecinka.
Jeśli wszystko wykonałeś poprawnie, to powinieneś otrzymać komunikat:
Query OK, 696 rows affected (0.100 sec) Records: 696 Deleted: 0 Skipped: 0 Warnings: 0
Wyświetl zawartość tabeli jezyki:
SELECT * FROM jezyki; +------+-------+ | kraj | jezyk | +------+-------+ | AD | ca | | AE | ar-AE | | AE | en | | ... | ... | | ... | ... | | ... | ... | | ZW | nd | | ZW | nr | | ZW | sn | +------+-------+ 696 rows in set (0.001 sec)
W tabeli jest 696 rekordów.
Podobnie wczytamy dane do tabeli kraje. Pobierz poniższy plik do katalogu C:\sql\d1 :
Wpisz polecenie SQL:
LOAD DATA LOCAL INFILE 'd1/kraje.txt' INTO TABLE kraje FIELDS TERMINATED BY ',';
Jeśli nie będzie błędów, otrzymasz komunikat:
Query OK, 250 rows affected (0.124 sec) Records: 250 Deleted: 0 Skipped: 0 Warnings: 0
Tabela kraje zawiera teraz 250 rekordów. Wyświetl jej zawartość:
SELECT * FROM kraje; +-----+-----+----------------------------------------------+--------+------------+--------------------------------+-----------+ | id | kod | nazwa | waluta | populacja | stolica | kontynent | +-----+-----+----------------------------------------------+--------+------------+--------------------------------+-----------+ | 1 | AD | Andorra | EUR | 84000 | Andorra la Vella | EU | | 2 | AE | United Arab Emirates | AED | 4975593 | Abu Dhabi | AS | | 3 | AF | Afghanistan | AFN | 29121286 | Kabul | AS | ...
Mamy przygotowaną bazę danych. Wykorzystamy ją do uzyskania różnych informacji o krajach.
SHOW TABLES;
INSERT INTO tabela (kolumna_1,kolumna_2,...,kolumna_n)
VALUES
(wartości kolumn w pierwszym rekordzie),
(wartości kolumn w drugim rekordzie),
...
(wartości kolumn w ostatnim rekordzie);
LOAD DATA LOCAL INFILE 'plik' INTO TABLE tabela FIELDS TERMINATED BY 'znak';
Wyszukiwanie informacji w pojedynczej tabeli przeprowadzamy za pomocą zapytania:
SELECT kolumna_1,kolumna_2,...,kolumna_n FROM tabela WHERE warunek;
Efektem takiego zapytania jest tabela wyników zawierająca kolumny z wybranej tabeli. W kolumnach są umieszczane te rekordy, w których jest spełniony warunek. Na przykład wyszukajmy wszystkie kraje, w których walutą jest USD (dolar amerykański - United States Dollar). Wpisujemy:
SELECT nazwa,waluta FROM kraje WHERE waluta = 'USD'; +--------------------------------+--------+ | nazwa | waluta | +--------------------------------+--------+ | American Samoa | USD | | Bonaire | USD | | Ecuador | USD | | Micronesia | USD | | Guam | USD | | British Indian Ocean Territory | USD | | Marshall Islands | USD | | Northern Mariana Islands | USD | | Puerto Rico | USD | | Palau | USD | | El Salvador | USD | | Turks and Caicos Islands | USD | | East Timor | USD | | U.S. Minor Outlying Islands | USD | | United States | USD | | British Virgin Islands | USD | | U.S. Virgin Islands | USD | +--------------------------------+--------+ 17 rows in set (0.001 sec)
W podobny sposób znajdź kraje korzystające z EUR, PLN, GBP (funt brytyjski - Great Britain Pound).
Wynik zapytania można sortować wg wybranej kolumny rosnąco ASC (ang. ascendingly - rosnąco) lub malejąco DESC (ang. descendingly - malejąco). Jeszcze raz wyświetlmy kraje używające USD, lecz posortujmy je w porządku rosnącym wg pola nazwa:
SELECT nazwa,waluta FROM kraje WHERE waluta = 'USD' ORDER BY nazwa ASC; +--------------------------------+--------+ | nazwa | waluta | +--------------------------------+--------+ | American Samoa | USD | | Bonaire | USD | | British Indian Ocean Territory | USD | | British Virgin Islands | USD | | East Timor | USD | | Ecuador | USD | | El Salvador | USD | | Guam | USD | | Marshall Islands | USD | | Micronesia | USD | | Northern Mariana Islands | USD | | Palau | USD | | Puerto Rico | USD | | Turks and Caicos Islands | USD | | U.S. Minor Outlying Islands | USD | | U.S. Virgin Islands | USD | | United States | USD | +--------------------------------+--------+ 17 rows in set (0.001 sec)
Jeśli nie podoba nam się nazwa kolumny i w wyniku zapytania chcielibyśmy mieć inną nazwę, to robimy to tak:
SELECT nazwa AS Kraj, waluta AS Waluta FROM kraje WHERE waluta = 'USD' ORDER BY nazwa ASC; +--------------------------------+--------+ | Kraj | Waluta | +--------------------------------+--------+ | American Samoa | USD | | Bonaire | USD | | British Indian Ocean Territory | USD | | British Virgin Islands | USD | | East Timor | USD | | Ecuador | USD | | El Salvador | USD | | Guam | USD | | Marshall Islands | USD | | Micronesia | USD | | Northern Mariana Islands | USD | | Palau | USD | | Puerto Rico | USD | | Turks and Caicos Islands | USD | | U.S. Minor Outlying Islands | USD | | U.S. Virgin Islands | USD | | United States | USD | +--------------------------------+--------+ 17 rows in set (0.001 sec)
Wyszukajmy teraz wszystkie kraje leżące w Europie. Symbol Europy to EU:
SELECT nazwa AS 'Kraj w Europie' FROM kraje WHERE kontynent = 'EU' ORDER BY nazwa ASC; +------------------------+ | Kraj w Europie | +------------------------+ | Aland | | Albania | | Andorra | | ... |
W podobny sposób wyszukaj kraje w Azji (AS), Afryce (AF) i Ameryce Północnej (NA).
Wyszukajmy kraje, w których liczba ludności jest większa od 100000000. W wyniku chcemy uzyskać informację o nazwie kraju, populacji i nazwie kontynentu. Kraje będą uporządkowane malejąco wg liczby ludności:
SELECT
nazwa AS Kraj,
populacja AS Ludność,
kontynent AS Kontynent
FROM kraje
WHERE populacja > 100000000
ORDER BY populacja DESC;
+---------------+------------+-----------+
| Kraj | Ludność | Kontynent |
+---------------+------------+-----------+
| China | 1330044000 | AS |
| India | 1173108018 | AS |
| United States | 310232863 | NA |
| Indonesia | 242968342 | AS |
| Brazil | 201103330 | SA |
| Pakistan | 184404791 | AS |
| Bangladesh | 156118464 | AS |
| Nigeria | 154000000 | AF |
| Russia | 140702000 | EU |
| Japan | 127288000 | AS |
| Mexico | 112468855 | NA |
+---------------+------------+-----------+
Niestety, w wyniku otrzymaliśmy jedynie kody kontynentów, a nie nazwy kontynentów. Nazwy są w innej tabeli. Aby otrzymać te nazwy w wyniku zapytania, musimy w instrukcji SELECT użyć dwóch tabel połączonych relacją. Relacja ta jest taka, że pole w kolumnie kontynent tabeli kraje ma tę samą wartość co pole w kolumnie kod tabeli kontynenty:
kraje.kontynent = kontynenty.kod
Na początek wyświetlmy wszystkie kraje z informacją o kontynencie, na którym się znajdują. Kraje uporządkowane alfabetycznie wg ich nazwy:
SELECT
nazwa AS Kraj,
kontynenty.kontynent AS Kontynent
FROM kraje, kontynenty
WHERE kraje.kontynent = kontynenty.kod
ORDER BY nazwa;
+----------------------------------------------+---------------+
| Kraj | Kontynent |
+----------------------------------------------+---------------+
| Afghanistan | Asia |
| Aland | Europe |
| Albania | Europe |
| ... | ... |Ponieważ korzystamy w zapytaniu z dwóch tabel, to może się zdarzyć, że w tych tabelach istnieją kolumny o takich samych nazwach. W takim przypadku należy zawsze odwoływać się do kolumny poprzez nazwę tabeli, kropkę i nazwę kolumny w tej tabeli. Inaczej MySQL zgłosi błąd polegający na niejednoznaczności nazw kolumn. Oczywiście, najlepiej jest tak zaprojektować bazę danych, aby kolumny nie miały tych samych nazw. Wracając do naszego pierwotnego problemu, należy w zapytaniu wykorzystać operator logiczny AND, aby uzyskać dodatkowo informację o nazwach kontynentów:
SELECT
nazwa AS Kraj,
populacja AS Ludność,
kontynenty.kontynent AS Kontynent
FROM kraje,kontynenty
WHERE
populacja > 100000000
AND kraje.kontynent = kontynenty.kod
ORDER BY populacja DESC;
+---------------+------------+---------------+
| Kraj | Ludność | Kontynent |
+---------------+------------+---------------+
| China | 1330044000 | Asia |
| India | 1173108018 | Asia |
| United States | 310232863 | North America |
| Indonesia | 242968342 | Asia |
| Brazil | 201103330 | South America |
| Pakistan | 184404791 | Asia |
| Bangladesh | 156118464 | Asia |
| Nigeria | 154000000 | Africa |
| Russia | 140702000 | Europe |
| Japan | 127288000 | Asia |
| Mexico | 112468855 | North America |
+---------------+------------+---------------+
11 rows in set (0.001 sec)
SELECT kolumna_1, kolumna_2, ..., kolumna_n
FROM tabela_1, tabela_2, ..., tabela_n
WHERE warunek
ORDER BY kolumna_i {ASC/DESC};
tabela.kolumna
kolumna AS nazwa...
= <> != > < >= <= AND OR NOT LIKE wzorzec NOT LIKE wzorzec
wzorzec jest tekstem, w którym % oznacza dowolny ciąg znaków, a _ zastępuje jeden dowolny znak. Na przykład, jeśli kolumna imie zawiera imiona, to warunek:
imie LIKE 'A%'
będzie prawdziwy dla imion na literę A. Z kolei warunek:
imie NOT LIKE 'A%'
będzie prawdziwy dla wszystkich imion, które nie rozpoczynają się literą A.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.