0
Księgarnia
Jakub Stefko edited this page 2017-11-15 21:31:10 +00:00
--DROP DATABASE Ksiegarnia;
--GO
--CREATE DATABASE Ksiegarnia;
--GO
--USE Ksiegarnia;
--GO
-------- USUŃ TABELE
IF OBJECT_ID('Ksiazki', 'U') IS NOT NULL
DROP TABLE Ksiazki;
IF OBJECT_ID('Autorzy', 'U') IS NOT NULL
DROP TABLE Autorzy;
--------- CREATE - UTWÓRZ TABELE I POWIĄZANIA
CREATE TABLE Autorzy
(
id_autor INT PRIMARY KEY,
nazwisko VARCHAR(30),
kraj VARCHAR(10)
);
CREATE TABLE Ksiazki
(
id_ksiazki INT PRIMARY KEY IDENTITY(1,1),
autor INT REFERENCES Autorzy(id_autor),
tytul VARCHAR(50),
cena FLOAT,
rok_wydania INT,
dzial VARCHAR(30)
);
---------- INSERT - WSTAW DANE
INSERT INTO Autorzy VALUES(1, 'Abiteboul', 'USA');
INSERT INTO Autorzy VALUES(2, 'Szekspir', 'Anglia');
INSERT INTO Autorzy VALUES(3, 'Sapkowski', 'Polska');
INSERT INTO Autorzy VALUES(4, 'Yen', 'USA');
INSERT INTO Autorzy VALUES(5, 'Cervantes', 'Hiszpania');
INSERT INTO Ksiazki VALUES(1, 'Quering XML', 60, 1997, 'informatyka');
INSERT INTO Ksiazki VALUES(1, 'Data on the web', 75, 2000, 'informatyka');
INSERT INTO Ksiazki VALUES(2, 'Poskromienie złośnicy', 32, 1999, 'dramat');
---
INSERT INTO Ksiazki VALUES(1, 'Poskromienie złośnicy', 32, 1999, 'dramat');
INSERT INTO Ksiazki VALUES(1, 'Poskromienie złośnicy', 32, 1999, 'sf');
---
INSERT INTO Ksiazki VALUES(3, 'Ostatnie życzenie', 25, 1993 ,'sf');
INSERT INTO Ksiazki VALUES(3, 'Wieża jaskółki', 30, 1997, 'sf');
INSERT INTO Ksiazki VALUES(3, 'Narrenturm', 20, 2002, 'sf');
INSERT INTO Ksiazki VALUES(4, 'Fuzzy Logic', 55, 1999, 'informatyka');
------------ SELECT
SELECT * FROM Autorzy;
SELECT * FROM Ksiazki;
--1 Podaj autorów spoza Polski; uporządkuj alfabetycznie według nazwisk [nazwisko, kraj].
SELECT nazwisko, kraj FROM Autorzy
WHERE kraj !='Polska'
ORDER BY nazwisko;
--2 Podaj książki zawierające ciąg XML w tytule [tytul].
SELECT tytul FROM Ksiazki WHERE tytul LIKE '%XML%';
--3 Znajdź książki droższe od Fuzzy Logic A)złączenie
SELECT B.tytul FROM Ksiazki A
JOIN Ksiazki B
ON A.tytul='Fuzzy Logic'
AND B.cena>A.cena;
--3 Znajdź książki droższe od Fuzzy Logic B)podzapytanie
SELECT tytul FROM Ksiazki
WHERE cena > (SELECT cena from ksiazki
WHERE tytul='Fuzzy Logic');
--4 Podaj autorów książek z informatyki A)złączenie
SELECT DISTINCT nazwisko FROM Autorzy A
INNER JOIN Ksiazki B
ON A.id_autor = B.autor
WHERE dzial='informatyka';
--4 Podaj autorów książek z informatyki B)podzapytanie
SELECT DISTINCT nazwisko FROM Autorzy A
WHERE id_autor IN (SELECT autor FROM Ksiazki WHERE dzial='informatyka');
--5 Znajdź autorów piszących książki z tego samego działu co Yen [nazwisko]
SELECT DISTINCT A.nazwisko FROM Autorzy A
JOIN Ksiazki B ON A.id_autor=B.autor
WHERE B.dzial IN (SELECT C.dzial FROM Ksiazki C
JOIN Autorzy D ON D.id_autor=C.autor
WHERE D.nazwisko='Yen')
AND A.nazwisko != 'Yen';
--6 Podaj liczbę książek w każdym z działów [dzial, ile]
SELECT dzial, COUNT(*) 'ile'
FROM Ksiazki
GROUP BY dzial;
--7 Podaj średnią cenę książek Sapkowskiego [srednia]
SELECT AVG(cena) FROM Ksiazki
WHERE autor=(SELECT id_autor FROM Autorzy WHERE nazwisko='Sapkowski');
--8 Podaj tytuł najtańszej książki z informatyki [tytul]
SELECT tytul FROM Ksiazki
WHERE dzial='informatyka' AND
cena = (SELECT MIN(cena) FROM Ksiazki WHERE dzial='informatyka');
--9 Podaj tytuł najtańszej książki dla każdego z działów [dzial, tytul] (podzapytanie skorelowane).
SELECT DISTINCT dzial, tytul FROM Ksiazki A
WHERE cena = (SELECT MIN(cena) FROM Ksiazki B
WHERE A.dzial=B.dzial);
--10 Podaj autorów, którzy napisali przynajmniej dwie książki po roku 1996 [nazwisko, ile].
SELECT A.nazwisko, COUNT(*) 'ile' FROM Autorzy A
INNER JOIN Ksiazki B
ON A.id_autor=B.autor
WHERE rok_wydania > 1996
GROUP BY nazwisko
HAVING COUNT(nazwisko) >= 2;
--11Znajdź dział, do którego pisze więcej niż jeden autor [dzial, licz_autorow].
SELECT dzial, COUNT(DISTINCT autor) 'licz_autorow' FROM Ksiazki
GROUP BY dzial
HAVING COUNT(DISTINCT autor)>1;
--12 Znajdź dział o największej liczbie książek [dzial]
SELECT DISTINCT dzial FROM Ksiazki A
WHERE (SELECT COUNT(*) FROM Ksiazki B WHERE B.dzial = A.dzial) >=
ALL(SELECT COUNT(*) FROM Ksiazki C GROUP BY dzial);
--13 Sprawdź czy istnieje autor piszący książki do każdego z działów [nazwisko] (podzielenie relacji).
SELECT DISTINCT nazwisko FROM Autorzy A
WHERE NOT EXISTS (SELECT * FROM Ksiazki B WHERE NOT EXISTS(
SELECT * FROM Ksiazki C WHERE
C.dzial=B.dzial
AND C.autor=A.id_autor));
--14 Podaj autora, którego książek nie ma w bazie [nazwisko] a) JOIN
SELECT A.nazwisko FROM Autorzy A
LEFT OUTER JOIN Ksiazki B ON A.id_autor=B.autor
WHERE id_ksiazki IS NULL;
--14 Podaj autora, którego książek nie ma w bazie [nazwisko] b) subquery
SELECT nazwisko FROM Autorzy
WHERE id_autor NOT IN (SELECT autor FROM Ksiazki);
--14 Podaj autora, którego książek nie ma w bazie [nazwisko] c) EXISTS
SELECT nazwisko FROM Autorzy A
WHERE NOT EXISTS (SELECT * FROM Ksiazki WHERE A.id_autor = autor);
--15 Podaj tytuły książek droższych niż wynosi średnia cena książki w ich dziale [tytul].
SELECT tytul FROM Ksiazki A
WHERE cena > (SELECT AVG(cena) FROM Ksiazki B WHERE B.dzial=A.dzial);