• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapytania do bazy SQL

VPS Starter Arubacloud
0 głosów
396 wizyt
pytanie zadane 10 maja 2022 w SQL, bazy danych przez alpha.netrunner Gaduła (4,760 p.)

Cześć

Mam takie zadanie:

Za pomocą narzędzia XAMPP Control Panel uruchom usługę Apache i MySQL. Przejdź następnie do strony http://localhost i wybierz narzędzie phpMyAdmin. Wykonaj następujące czynności:

1. Stwórz bazę danych o nazwie Sklep.

2. Zaimportuj do bazy plik sklep.sql (plik sklep.sql w załączniku zadania).

3. Zapoznaj się ze strukturą bazy danych. Składają się na nią trzy tabele: klient, produkt oraz zamowienie. Każda z nich ma klucz główny zaczynający się od "id". Tabela zamowienie posiada klucz obcy dla pola idKlienta do tabeli klient do pola idKlienta oraz klucz obcy dla pola idProduktu do tabeli produkt do pola idProduktu.

4. Korzystając z zakładki SQL, przygotuj zapytania do bazy i wykonaj je. Kwerendy zapisz w pliku kwerendy.txt.

Lista kwerend do zdefiniowania:
1. zwrócenie imion i nazwisk wszystkich klientów
2. zwrócenie nazw produktów oraz ich cen w kolejności od najtańszego do najdroższego
3. zwrócenie imion i nazwisk klientów oraz nazw i cen produktów jakie kupił każdy z nich
4. zwrócenie imion i nazwisk klientów oraz sumy cen wszystkich zakupów dla każdego z klientów

I tak 1 i 2 mam zrobione wszystko działa jak należy ale w 3 nie wiem co robię źle, ponieważ przypisuje mi wszystkie produkty do każdej osoby. Bardzo proszę o pomoc oraz wyjaśnienie co robię źle.

Baza danych:

-- phpMyAdmin SQL Dump
-- version 4.9.0.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Czas generowania: 09 Maj 2022, 14:41
-- Wersja serwera: 10.4.6-MariaDB
-- Wersja PHP: 7.1.32

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Baza danych: `sklep`
--

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `klient`
--

CREATE TABLE `klient` (
  `idKlienta` int(11) NOT NULL,
  `imie` varchar(10) NOT NULL,
  `nazwisko` varchar(10) NOT NULL,
  `telefon` int(9) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `klient`
--

INSERT INTO `klient` (`idKlienta`, `imie`, `nazwisko`, `telefon`) VALUES
(1, 'Adam', 'Nowak', 123132123),
(2, 'Anna', 'Kowalska', 558558665),
(3, 'Stefan', 'Drabinka', 666555444),
(4, 'Krzysztof', 'Grabki', 741258963),
(5, 'Katarzyna', 'Malinowska', 987456321);

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `produkt`
--

CREATE TABLE `produkt` (
  `idProduktu` int(11) NOT NULL,
  `nazwa` varchar(20) NOT NULL,
  `cena` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `produkt`
--

INSERT INTO `produkt` (`idProduktu`, `nazwa`, `cena`) VALUES
(1, 'Procesor', 1230.5),
(2, 'Karta graficzna', 950),
(3, 'Karta muzyczna', 249.49),
(4, 'RAM', 320),
(5, 'Dysk SSD', 599.99);

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `zamowienie`
--

CREATE TABLE `zamowienie` (
  `idZamowienia` int(11) NOT NULL,
  `idKlienta` int(11) NOT NULL,
  `idProduktu` int(11) NOT NULL,
  `data` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `zamowienie`
--

INSERT INTO `zamowienie` (`idZamowienia`, `idKlienta`, `idProduktu`, `data`) VALUES
(1, 1, 3, '2022-03-01 14:32:12'),
(2, 2, 1, '2022-03-03 16:27:13'),
(3, 1, 1, '2022-03-04 11:35:17'),
(4, 3, 5, '2022-03-06 17:28:17'),
(5, 4, 2, '2022-03-08 15:27:34'),
(6, 4, 4, '2022-03-08 15:27:34'),
(7, 5, 1, '2022-03-13 12:21:41'),
(8, 2, 2, '2022-03-16 14:16:40');

--
-- Indeksy dla zrzutów tabel
--

--
-- Indeksy dla tabeli `klient`
--
ALTER TABLE `klient`
  ADD PRIMARY KEY (`idKlienta`);

--
-- Indeksy dla tabeli `produkt`
--
ALTER TABLE `produkt`
  ADD PRIMARY KEY (`idProduktu`);

--
-- Indeksy dla tabeli `zamowienie`
--
ALTER TABLE `zamowienie`
  ADD PRIMARY KEY (`idZamowienia`),
  ADD KEY `klient` (`idKlienta`),
  ADD KEY `produkt` (`idProduktu`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT dla tabeli `klient`
--
ALTER TABLE `klient`
  MODIFY `idKlienta` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT dla tabeli `produkt`
--
ALTER TABLE `produkt`
  MODIFY `idProduktu` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT dla tabeli `zamowienie`
--
ALTER TABLE `zamowienie`
  MODIFY `idZamowienia` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;

--
-- Ograniczenia dla zrzutów tabel
--

--
-- Ograniczenia dla tabeli `zamowienie`
--
ALTER TABLE `zamowienie`
  ADD CONSTRAINT `klient` FOREIGN KEY (`idKlienta`) REFERENCES `klient` (`idKlienta`),
  ADD CONSTRAINT `produkt` FOREIGN KEY (`idProduktu`) REFERENCES `produkt` (`idProduktu`);
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Zapytania:

-- 1.
SELECT 
`klient`.`imie`, 
`klient`.`nazwisko` 
FROM 
`klient`;

-- 2.
SELECT 
`produkt`.`nazwa`, 
`produkt`.`cena` 
FROM 
`produkt` 
ORDER BY 
`produkt`.`cena` 
ASC;

-- 3.NIE DZIAŁA (pokazuje wszystko)
SELECT
`klient`.`imie`,
`klient`.`nazwisko`,
`produkt`.`nazwa`,
`produkt`.`cena`
FROM
`klient`,
`produkt`,
`zamowienie`
WHERE
`klient`.`idKlienta`=`zamowienie`.`idKlienta`

-- 4. Jeszcze nie zrobiłem

 

1 odpowiedź

+2 głosów
odpowiedź 10 maja 2022 przez mikey737 Nowicjusz (180 p.)

Cześć, w kwerendzie 3. zapomniałeś o dopisaniu relacji pomiędzy tabelą produkt i tabelą zamówienie, dlatego wyświetla się za dużo wyników. Wystarczy że dopiszesz warunek 

produkt.idProduktu = zamowienie.idProduktu

i wszystko będzie śmigać. W kwerendzie 4. natomiast użyłbym grupowania po imieniu oraz nazwisku, dodając kolumnę sumującą ceny produktów. 

SELECT imie, nazwisko, SUM(cena) AS SUMA
FROM klient, produkt, zamowienie
WHERE klient.idKlienta = zamowienie.idKlienta AND produkt.idProduktu = zamowienie.idProduktu
GROUP BY imie, nazwisko

Napisałem na szybko po swojemu i działa, przerób sobie tak żeby pasowało do twojej wcześniejszej konwencji. Generalnie też jestem laikiem i właśnie zaczynam zabawę z SQLem, także dobrze jakby ktoś ktoś doświadczony jeszcze się wypowiedziałwink

komentarz 10 maja 2022 przez alpha.netrunner Gaduła (4,760 p.)

O bardzo dziękuję laugh

Podobne pytania

0 głosów
0 odpowiedzi 152 wizyt
pytanie zadane 23 lutego 2019 w SQL, bazy danych przez zerakot Obywatel (1,870 p.)
0 głosów
1 odpowiedź 318 wizyt
pytanie zadane 6 czerwca 2019 w PHP przez Jayix Użytkownik (680 p.)
+2 głosów
1 odpowiedź 394 wizyt
pytanie zadane 19 lutego 2022 w SQL, bazy danych przez eugi Użytkownik (570 p.)

92,782 zapytań

141,712 odpowiedzi

320,595 komentarzy

62,114 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...