Zaawansowane bazy danych i hurtownie danych studia zaoczne II stopnia, sem. I



Podobne dokumenty
Bazy danych. Plan wykładu. Zależności funkcyjne. Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL.

Technologie baz danych

Ogólny plan przedmiotu. Strony WWW. Literatura BAZY DANYCH. Materiały do wykładu:

CREATE USER

SQL 4 Structured Query Lenguage

Systemy GIS Tworzenie zapytań w bazach danych

Administrowanie serwerami baz danych ZADANIA ADMINISTRATORA BAZ DANYCH

BAZY DANYCH. Wykład 1: Wprowadzenie do baz danych. Marcin Czajkowski. Przygotowanie wykładu: Małgorzata Krętowska

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Przestrzenne bazy danych Podstawy języka SQL

Technologie baz danych

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

Projektowanie systemów baz danych

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Po instalacji serwera MYSQL dostępne jest konto o nazwie root. Domyślnie nie ma ono przypisanego hasła, aczkolwiek podczas procesu konfiguracji jest

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

P o d s t a w y j ę z y k a S Q L

Wprowadzenie do języka SQL

Relacyjne bazy danych. Podstawy SQL

Widok Connections po utworzeniu połączenia. Obszar roboczy

SQL (ang. Structured Query Language)

Paweł Rajba

Relacyjne bazy danych. Podstawy SQL

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

mysql> UPDATE user SET Password=PASSWORD('pass') WHERE user='root'; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

Wykład 5. SQL praca z tabelami 2

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Bazy danych 7. SQL podstawy

Język SQL. Rozdział 2. Proste zapytania

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Bazy Danych. Ćwiczenie 16: System przywilejów oraz zarządzanie użytkownikami

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Wykład 2. SQL 1 Structured Query Lenguage

SQL DDL DML TECHNOLOGIE BAZ DANYCH. Wykład 5: Język DDL i DML. Małgorzata Krętowska

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Autor: Joanna Karwowska

Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1

Autor: Joanna Karwowska

Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych

Język SQL, zajęcia nr 1

Bazy danych 10. SQL Widoki

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Bazy danych. Polecenia SQL

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

Bazy danych 2. Wykład 4 Structured Query Language (SQL)

Instalacja MySQL.

Wykład 7 Implementacja języka SQL w systemach baz danych Oracle sortowanie, funkcje agregujące i podzapytania.

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

SQL - Structured Query Language. strukturalny język zapytań

Bazy danych 5. Samozłaczenie SQL podstawy

Internetowe bazy danych

BAZY DANYCH wprowadzenie do języka SQL. Opracował: dr inż. Piotr Suchomski

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Wprowadzenie do baz danych

Uprawnienia, role, synonimy

Zarządzanie systemami informatycznymi. Zarządzanie internetową bazą danych MySQL

Grupowanie i funkcje agregujące

Bazy danych 2. Wykład 5 Structured Query Language (SQL) c.d. DDL

Bazy Danych i Usługi Sieciowe

Oracle11g: Wprowadzenie do SQL

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Podstawowe zapytania SELECT (na jednej tabeli)

Zbiór pytań nr 5. 2 Które stwierdzenie opisuje najlepiej zbiór uprawnień dostępny po wykonaniu

Bazy danych. Plan wykładu. Podstawy modeli relacyjnych. Diagramy ER. Wykład 3: Relacyjny model danych. SQL

Bazy danych i usługi sieciowe

Zaawansowane bazy danych i hurtownie danych semestr I

Typy tabel serwera MySQL

Połączenie z bazą danych : mysql h u root -p Enter password: *******

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Plan wykładu. Problemy w bazie danych. Problemy w bazie danych BAZY DANYCH

Kurs. Podstawy MySQL

Plan ćwiczenia. Rozdział 16 Uwierzytelnianie i autoryzacja w bazie danych. Użytkownicy i schematy (1) Użytkownicy i schematy (2) baza danych: ZESP99

SQL Structured Query Language

Składowane procedury i funkcje

Bazy danych 4. SQL- podstawy

Bazy danych. Dr inż. Paweł Kasprowski

Język SQL podstawy zapytań

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

BAZY DANYCH JĘZYK ZAPYTAŃ BAZ DANYCH SQL. Microsoft Access. Adrian Horzyk. Akademia Górniczo-Hutnicza

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

System. Instalacja bazy danych MySQL. Autor : Piotr Zielonka tel Piotrków Tryb., sierpień 2018r.

PROJEKTOWANIE BAZ DANYCH

Ref. 7 - Język SQL - polecenia DDL i DML

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Bazy danych Ćwiczenia projektowe

Bazy danych 4. SQL podstawy. P. F. Góra

Transkrypt:

Wydział Informatyki Politechnika Białostocka Plan wykładu Zaawansowane bazy danych i hurtownie danych studia zaoczne II stopnia, sem. I 1. MySQL 2. Powtórzenie SQL WYKŁAD 2: MySQL: podstawowe obiekty Powtórzenie SQL. Agnieszka Oniśko, Małgorzata Krętowska PHP a MySQL, 1/41 PHP a MySQL, 2/41 Użytkownicy bazy danych SQL (Structured Query Language) Administratorzy baz danych Baza danych Definiowanie danych (DDL:Data Definition Language) Definiowanie zapytań (DQL: Data Query Language) Modyfikowanie danych (DML: Data Manipulation Language) Sterowanie danymi (DCL: Data Control Language) Programiści Użytkownicy końcowi PHP a MySQL, 3/41 PHP a MySQL, 4/41

MySQL: Tworzenie bazy danych CREATE DATABASE SCHEMA [IF NOT EXISTS] nazwa_bazy [[DEFAULT] CHARACTER SET [=] kodowanie] [DEFAULT] COLLATE [=] collation_name ; mysql> SHOW CHARACTER SET LIKE 'latin%'; +---------+-----------------------------+-------------------+--------+ Charset Description Default collation Maxlen +---------+-----------------------------+-------------------+--------+ latin1 cp1252 West European latin1_swedish_ci 1 latin2 ISO 8859-2 Central European latin2_general_ci 1 latin5 ISO 8859-9 Turkish latin5_turkish_ci 1 latin7 ISO 8859-13 Baltic latin7_general_ci 1 +---------+-----------------------------+-------------------+--------+ PHP a MySQL, 5/41 MySQL: Baza danych SHOW DATABASES; +--------------------+ Database +--------------------+ information_schema mysql test +--------------------+ Wynik po instalacji MySQL USE nazwa_bazy; - ustawia daną bazę jako domyślną dla późniejszych instrukcji USE db1; SELECT COUNT(*) FROM mytable; USE db2; SELECT COUNT(*) FROM mytable; # wybiera z db1.mytable # wybiera z db2.mytable PHP a MySQL, 6/41 MySQL: Modyfikacja/usuwanie bazy danych MySQL: Polecenia SHOW/DESCRIBE DESCRIBE nazwa_tabeli [nazwa_kolumny wartość ]; ALTER DATABASE nazwa_bazy [[DEFAULT] CHARACTER SET [=] kodowanie] [DEFAULT] COLLATE [=] collation_name ; DROP DATABASE [IF EXISTS] nazwa_bazy; DESCRIBE user %priv ; SHOW DATABASES; SHOW TABLES [FROM nazwa_bazy] [LIKE wartość ]; SHOW GRANTS FOR użytkownik; SHOW TABLES FROM mysql LIKE my% ; SHOW COLUMNS FROM user LIKE priv% ; SHOW INDEX FROM user; PHP a MySQL, 7/41 PHP a MySQL, 8/41

MySQL: Tworzenie użytkowników bazy MySQL: Zmiana hasła użytkownika bazy CREATE USER użytkownik [IDENTIFIED BY [PASSWORD] hasło'] [, użytkownik [IDENTIFIED BY [PASSWORD] hasło']]... SET PASSWORD [FOR użytkownik] = { PASSWORD( hasło') OLD_PASSWORD( hasło') zaszyfrowane_hasło' } SET PASSWORD FOR nowy = PASSWORD( nowe_haslo'); CREATE USER nowy_użytkownik IDENTIFIED BY tutaj_haslo ; SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass'); Jest to równoznaczne z: UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='bob' AND Host='%.loc.gov'; FLUSH PRIVILEGES; PHP a MySQL, 9/41 PHP a MySQL, 10/41 MySQL: Instalacja MySQL: information_schema Utworzenie bazy systemowej mysql mysql Utworzenie bazy systemowej mysql mysql MySQL Utworzenie bazy testowej test Utworzenie użytkownika systemowego root test MySQL Utworzenie bazy testowej test Utworzenie użytkownika systemowego root test PHP a MySQL, 11/41 PHP a MySQL, 12/41

Bazy mysql i test Wybrane obiekty bazy mysql Baza systemowa mysql Zawiera 23 tabele systemowe Tabele systemowe przechowują informacje na temat: użytkowników bazy uprawnień przydzielonych użytkownikom bazy Tabele kontrolujące dostęp do bazy user db host* columns_priv* tables_priv* Baza testowa test Nie zawiera żadnych tabel PHP a MySQL, 13/41 PHP a MySQL, 14/41 MySQL: Rodzaje uprawnień Rodzaje kolumn ALTER ALTER ROUTINE CREATE CREATE ROUTINE CREATE TEMPORARY TABLES CREATE USER CREATE VIEW DELETE DROP EXECUTE FILE GRANT OPTION INDEX INSERT LOCK TABLES PROCESS RELOAD SELECT SHOW DATABASES SHOW VIEW SHUTDOWN UPDATE select_priv insert_priv update_priv delete_priv create_priv alter_priv drop_priv index_priv table_priv column_priv ssl_type ssl_cipher shutdown_priv process_priv file_priv grant_priv show_db_priv reload_priv create_tmp_tables_priv lock_tables_priv execute_priv max_questions max_updates max_connections max_user_connections PHP a MySQL, 15/41 PHP a MySQL, 16/41

Tabela user: Kolumny Tabela user: Kolumny host user password Kolumny określają, kto ma dostęp do serwera bazy i z jakiego hosta (Klucz główny (host, user)) ssl_type ssl_cipher... Kolumny określają rodzaj połączenia select_priv insert_priv update_priv delete_priv... Uprawnienia max_questions max_updates max_connections max_user_connections Kolumny określają uprawnienia dotyczące połącznia z bazą PHP a MySQL, 17/41 PHP a MySQL, 18/41 Tabela db: Kolumny host db user select_priv insert_priv update_priv delete_priv... Kolumny określają, kto ma dostęp do konkretnej bazy i z jakiego hosta Klucz główny (host, db, user) Uprawnienia Tabela db: Przykład mysql> select user, password from user; +------+-------------------------------------------+ user password +------+-------------------------------------------+ root *70EADDEE29B2EDFA77EA589C9ED2D866FD9E79D5 +------+-------------------------------------------+ PHP a MySQL, 19/41 PHP a MySQL, 20/41

Tabela host: Kolumny Tabela tables_priv: Kolumny host db select_priv insert_priv update_priv delete_priv... Kolumny określają, z jakiego hosta do jakiej bazy mamy dostęp Klucz główny (host, db) Uprawnienia host db user table_name column_name grantor table_priv column_priv Kolumny określają, kto ma dostęp do tabeli Klucz główny (host, db, user, table_name) SELECT host, db, user, table_name, table_priv, column_priv FROM tables_priv; PHP a MySQL, 21/41 PHP a MySQL, 22/41 Tabela columns_priv: Kolumny MySQL: Nadawanie uprawnień host db user table_name column_name column_priv Kolumny określają kto ma dostęp do kolumn tabeli Klucz główny (host, db, user, table_name, column_name) GRANT typ_uprawnienia [(lista_kolumn)] [, typ_uprawnienia [(lista_kolumn)]]... ON [typ_obiektu] poziom_uprawnienia TO użytkownik [IDENTIFIED BY [PASSWORD] hasło'] [, użytkownik [IDENTIFIED BY [PASSWORD] 'hasło']]... [REQUIRE {NONE ssl_option [[AND] ssl_option]...}] [WITH z_opcją [z_opcją]...] ; SELECT host, db, user, table_name, column_name, column_priv FROM columns_priv; PHP a MySQL, 23/41 PHP a MySQL, 24/41

MySQL: Nadawanie uprawnień MySQL: Nadawanie uprawnień, przykład typ_obiektu: TABLE FUNCTION PROCEDURE poziom_uprawnienia: * *.* db_nazwa.* db_nazwa.nazwa_tabeli nazwa_tabeli db_nazwa.nazwa_procedury z_opcją: GRANT OPTION MAX_QUERIES_PER_HOUR liczba MAX_UPDATES_PER_HOUR liczba MAX_CONNECTIONS_PER_HOUR liczba MAX_USER_CONNECTIONS liczba ssl_option: SSL X509 CIPHER 'cipher' ISSUER 'issuer' SUBJECT 'subject GRANT SELECT, UPDATE, INSERT ON test.tabela TO kowalski @ localhost ; GRANT SELECT, UPDATE (k1, k2) ON test.tabela TO kowalski @ localhost ; GRANT SELECT, UPDATE (k1, k2) ON test.tabela TO kowalski @ localhost REQUIRE ssl WITH MAX_UPDATES_PER_HOUR 20; PHP a MySQL, 25/41 PHP a MySQL, 26/41 MySQL: Sprawdzanie uprawnień SELECT host, user, select_priv, update_priv FROM user WHERE user = kowalski ; MySQL: Sprawdzanie uprawnień SHOW GRANTS FOR kowalski @ localhost ; SELECT host, db, user, table_name, table_priv, column_priv FROM tables_priv WHERE user = kowalski ; SELECT host, db, user, table_name, column_name, column_priv FROM columns_priv WHERE user = kowalski ; SELECT host, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv FROM user WHERE user = kowalski ; PHP a MySQL, 27/41 PHP a MySQL, 28/41

MySQL: Odbieranie uprawnień MySQL: Aktualizacja uprawnień REVOKE typ_uprawinienia [(lista_kolumn)] [, typ_uprawnienia [(lista_kolumn)]]... ON [typ_obiektu] {nazwa_tabeli * *.* nazwa_bazy.*} FROM użytkownik [, użytkownik]... FLUSH PRIVILEGES REVOKE ALL PRIVILEGES, GRANT OPTION FROM użytkownik [, użytkownik]... REVOKE UPDATE ON test.tabela FROM kowalski @ localhost ; PHP a MySQL, 29/41 PHP a MySQL, 30/41 Baza ćwiczeniowa Zapytania proste SELECT [ALL DISTINCT] wyrażenie [[AS] alias],... FROM nazwa_tabeli,... [WHERE warunek] [ORDER BY wyrażenie ASC DESC],...]; PHP a MySQL, 31/41 31 PHP a MySQL, 32/41

Zapytania proste SELECT [ALL DISTINCT] wyrażenie [[AS] alias],... FROM nazwa_tabeli,... ALL- pokazuje wszystkie wiersze (domyślny) DISTINCT - eliminuje powtarzające się wiersze wyrażenie - nazwa kolumny lub wyrażenie zawierające nazwy kolumn, zamiast wyrażenia może wystąpić znak '* oznaczający wszystkie kolumny alias - nazwa nadana wyrażeniu na liście SELECT, może mieć postać identyfikatora prostego (napis złożony z liter, cyfr i znaków podkreślenia) lub złożonego (dowolny napis ograniczony podwójnymi cudzysłowami, np. zawierający spacje), PHP a MySQL, 33/41 Zapytania proste [WHERE warunek] Operatory logiczne: =; <; >; >=; <= Operatory SQL: BETWEEN... AND... - między dwiema wartościami (włącznie z nimi) IN (lista) - zgodnie z jednym elementów listy LIKE - zgodnie z zadanym wzorcem (interpretacja znaków typu "wildcard": % zastępuje ciąg znaków, _ zastępuje jeden znak) IS NULL - jest wartością NULL Operator negacji: NOT (NOT nazwa_kolumny =...; NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL) Kryteria złożone: AND (i) OR (lub) PHP a MySQL, 34/41 Przykład Wypisać pracowników pracujących na stanowisku sprzedawcy lub informatyka. select nazwisko, stanowisko from pracownik where stanowisko in ( SPRZEDAWCA, INFORMATYK ); NAZWISKO STANOWISKO ------------- ----------------- Nazwisko1 SPRZEDAWCA Nazwisko2 SPRZEDAWCA Nazwisko11 INFORMATYK Nazwisko12 INFORMATYK Nazwisko14 SPRZEDAWCA Złączenia tabel SELECT [ALL DISTINCT] wyrażenie [[AS] alias],... FROM tabela_1, tabela_2,..., tabela_n WHERE warunki_łączący_tabele minimalna liczba łączących warunków = liczba tabel -1 PHP a MySQL, 35/41 PHP a MySQL, 36/41

Przykład Wypisać nazwiska i nazwy departamentów pracowników. SELECT nazwisko, nazwa, p.nr_departamentu as nr_z_pr, d.nr_departamentu as nr_z_dep FROM pracownik p, departament d; NAZWISKO NAZWA NR_Z_PR NR_Z_DEP ------------- --------------- ---------- ---------- Nazwisko1 Departament 1 1 1 Nazwisko2 Departament 1 1 1 Nazwisko3 Departament 1 2 1 Nazwisko4 Departament 1 2 1 Nazwisko5 Departament 1 3 1 Nazwisko6 Departament 1 3 1 Nazwisko7 Departament 1 3 1 SELECT nazwisko, nazwa, p.nr_departamentu as nr_z_pr, d.nr_departamentu as nr_z_dep FROM pracownik p, departament d WHERE p.nr_departamentu=d.nr_departamentu; NAZWISKO NAZWA NR_Z_PR NR_Z_DEP ------------- --------------- ---------- ---------- Nazwisko1 Departament 1 1 1 Nazwisko9 Departament 1 1 1 Nazwisko8 Departament 1 1 1 Nazwisko14 Departament 1 1 1 Nazwisko2 Departament 1 1 1 Nazwisko13 Departament 2 2 2 Nazwisko4 Departament 2 2 2 Nazwisko3 Departament 2 2 2 Nazwisko11 Departament 2 2 2 PHP a MySQL, 37/41 Przykład Wypisać poziomy płac poszczególnych pracowników wraz z ich zarobkami SELECT nazwisko, pensja, nr_przedzialu FROM pracownik, poziom_zarobkow WHERE pensja between dolna_granica and gorna_granica; Wynik działania zapytania: NAZWISKO PENSJA NR_PRZEDZIALU ------------- ---------- ------------- Nazwisko2 900 1 Nazwisko1 1000 1 Nazwisko14 1000 1 Nazwisko8 1200 1 Nazwisko9 1400 2 Nazwisko3 1500 3 Nazwisko4 2000 3 Nazwisko13 2000 3 Nazwisko5 3000 4 Nazwisko7 3500 5 Nazwisko11 3500 5 Tabela poziom_zarobkow: NR_PRZEDZIALU DOLNA_GRANICA GORNA_GRANICA ------------- ------------- ------------- 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 PHP a MySQL, 38/41 Funkcje grupowe Funkcje grupowe są przeznaczone do działania na grupach wierszy. Wynikiem działania funkcji grupowej jest pojedyncza wartość dla całej grupy, a nie jedna wartość dla każdego wiersza. Przykłady funkcji: AVG ([DISTINCT] wyrażenie) COUNT ([DISTINCT] wyrażenie) COUNT(*) MAX ([DISTINCT] wyrażenie) MIN ([DISTINCT] wyrażenie) STDDEV ([DISTINCT] wyrażenie) SUM ([DISTINCT] wyrażenie) VARIANCE ([DISTINCT] wyrażenie) Przykład Wyznacz średni zarobek w firmie select avg(pensja) from pracownik; Ilu pracowników jest zatrudnionych w departamencie numer 20? Select count(*) from pracownik where nr_departamentu=20; Wszystkie funkcje grupowe, z wyjątkiem count(*) ignorują NULL. PHP a MySQL, 39/41 PHP a MySQL, 40/41

Zapytania grupujące Zasady wykonania zapytania grupującego SELECT lista pól FROM tabele WHERE warunki przed grupowaniem GROUP BY pola grupujące HAVING warunki po grupowaniu Rozważ wszystkie kombinacje wierszy tabel występujących w klauzuli FROM Do każdego wiersza zastosuj warunek WHERE Podziel wiersze na grupy Do każdej grupy zastosuj warunek w klauzuli HAVING Dla każdego wiersza reprezenującego grupę oblicz wartości wyrażeń po SELECT PHP a MySQL, 41/41 PHP a MySQL, 42/41 Zapytania grupujące - ograniczenia Na liście wyboru polecenia SELECT używającego grupowania wolno umieszczać tylko te kolumny, które są przedmiotem działania klauzuli GROUP BY chyba, że występują one wewnątrz funkcji grupującej. Każda kolumna lub wyrażenie występujące na liście SELECT, nie objęte funkcją grupową musi być przedmiotem grupowania klauzulą GROUP BY. PHP a MySQL, 43/41