Die Welt der Datenbanken wurde lange Zeit von relationalen DBMS erfasst, die die SQL-Sprache verwenden. So sehr, dass die aufstrebenden Arten NoSQL heißen. Es ist ihnen gelungen, einen bestimmten Platz auf diesem Markt zurückzugewinnen, aber relationale DBMS werden nicht sterben und weiterhin aktiv für ihre Zwecke eingesetzt.
In diesem Artikel möchte ich das Konzept einer funktionalen Datenbank beschreiben. Zum besseren Verständnis werde ich dies tun, indem ich es mit dem klassischen relationalen Modell vergleiche. Als Beispiele werden Aufgaben aus verschiedenen im Internet gefundenen SQL-Tests verwendet.
Einführung
Relationale Datenbanken arbeiten mit Tabellen und Feldern. In der Funktionsdatenbank werden stattdessen Klassen und Funktionen verwendet. Ein Feld in einer Tabelle mit N Tasten wird als Funktion von N Parametern dargestellt. Anstelle von Beziehungen zwischen Tabellen werden Funktionen verwendet, die Objekte der Klasse zurückgeben, die verknüpft wird. Anstelle der JOIN-Funktion wird die Komposition verwendet.
Bevor ich direkt zu den Aufgaben übergehe, werde ich die Aufgabe der Domänenlogik beschreiben. Für DDL werde ich die PostgreSQL-Syntax verwenden. Für funktionale, eigene Syntax.
Tabellen und Felder
Einfaches Sku-Objekt mit Feldname und Preis:
RelationalCREATE TABLE Sku
(
id bigint NOT NULL,
name character varying(100),
price numeric(10,5),
CONSTRAINT id_pkey PRIMARY KEY (id)
)
, Sku, .
, , , .
/ / . , . , :
CREATE TABLE prices
(
skuId bigint NOT NULL,
storeId bigint NOT NULL,
supplierId bigint NOT NULL,
dateTime timestamp without time zone,
price numeric(10,5),
CONSTRAINT prices_pkey PRIMARY KEY (skuId, storeId, supplierId)
)
, .
CREATE INDEX prices_date
ON prices
(skuId, storeId, supplierId, dateTime)
,
.
( ).
1.1
, .
select a.*
from employee a, employee b
where b.id = a.chief_id
and a.salary > b.salary
1.2
,
select a.*
from employee a
where a.salary = ( select max(salary) from employee b
where b.department_id = a.department_id )
. CREATE VIEW, . , .
1.3
ID , 3 .
select department_id
from employee
group by department_id
having count(*) <= 3
1.4
, , - .
select a.*
from employee a
left join employee b on (b.id = a.chief_id and b.department_id = a.department_id)
where b.id is null
1.5
ID .
with sum_salary as
( select department_id, sum(salary) salary
from employee
group by department_id )
select department_id
from sum_salary a
where a.salary = ( select max(salary) from sum_salary )
. , MS SQL.
2.1
1997 30 №1?
( ):
select LastName
from Employees as e
where (
select sum(od.Quantity)
from [Order Details] as od
where od.ProductID = 1 and od.OrderID in (
select o.OrderID
from Orders as o
where year(o.OrderDate) = 1997 and e.EmployeeID = o.EmployeeID)
) > 30
2.2
(, ) (), 1997- .
:
SELECT ContactName, ProductName FROM (
SELECT c.ContactName, p.ProductName
, ROW_NUMBER() OVER (
PARTITION BY c.ContactName
ORDER BY SUM(od.Quantity * od.UnitPrice * (1 - od.Discount)) DESC
) AS RatingByAmt
FROM Customers c
JOIN Orders o ON o.CustomerID = c.CustomerID
JOIN [Order Details] od ON od.OrderID = o.OrderID
JOIN Products p ON p.ProductID = od.ProductID
WHERE YEAR(o.OrderDate) = 1997
GROUP BY c.ContactName, p.ProductName
) t
WHERE RatingByAmt < 3
PARTITION : , SUM ( 1), ( Customer Year, ), , ORDER ( bought, , ).
2.3
.
:
select s.CompanyName, p.ProductName, sum(od.Quantity) + p.ReorderLevel — p.UnitsInStock as ToOrder
from Orders o
join [Order Details] od on o.OrderID = od.OrderID
join Products p on od.ProductID = p.ProductID
join Suppliers s on p.SupplierID = s.SupplierID
where o.ShippedDate is null
group by s.CompanyName, p.ProductName, p.UnitsInStock, p.ReorderLevel
having p.UnitsInStock < sum(od.Quantity) + p.ReorderLevel
. . . :
. A, B, C , A B, B C, A C, A C.
:
SQL. , , . . . . :
UPD:
dss_kalika:
SELECT
pl.PersonAID
,pf.PersonAID
,pff.PersonAID
FROM Persons AS p
--
JOIN PersonRelationShip AS pl ON pl.PersonAID = p.PersonID
AND pl.Relation = 'Like'
--
JOIN PersonRelationShip AS pf ON pf.PersonAID = p.PersonID
AND pf.Relation = 'Friend'
--
JOIN PersonRelationShip AS pff ON pff.PersonAID = pf.PersonBID
AND pff.PersonBID = pl.PersonBID
AND pff.Relation = 'Friend'
--
LEFT JOIN PersonRelationShip AS pnf ON pnf.PersonAID = p.PersonID
AND pnf.PersonBID = pff.PersonBID
AND pnf.Relation = 'Friend'
WHERE pnf.PersonAID IS NULL
;WITH PersonRelationShipCollapsed AS (
SELECT pl.PersonAID
,pl.PersonBID
,pl.Relation
FROM #PersonRelationShip AS pl
UNION
SELECT pl.PersonBID AS PersonAID
,pl.PersonAID AS PersonBID
,pl.Relation
FROM #PersonRelationShip AS pl
)
SELECT
pl.PersonAID
,pf.PersonBID
,pff.PersonBID
FROM #Persons AS p
--
JOIN PersonRelationShipCollapsed AS pl ON pl.PersonAID = p.PersonID
AND pl.Relation = 'Like'
--
JOIN PersonRelationShipCollapsed AS pf ON pf.PersonAID = p.PersonID
AND pf.Relation = 'Friend'
--
JOIN PersonRelationShipCollapsed AS pff ON pff.PersonAID = pf.PersonBID
AND pff.PersonBID = pl.PersonBID
AND pff.Relation = 'Friend'
--
LEFT JOIN PersonRelationShipCollapsed AS pnf ON pnf.PersonAID = p.PersonID
AND pnf.PersonBID = pff.PersonBID
AND pnf.Relation = 'Friend'
WHERE pnf.[PersonAID] IS NULL
, — . SQL, , . , - , . — . C++, Python .
, :
- . , . (, ), , , .
- . (, sold, bought ..), . . , , sold , . , CREATE VIEW. , .
- . ( ). , ( , — , ). , «» . , . , :
- . CLASS ClassP: Class1, Class2 . , .
, , Java, . ,
. , ( PostgreSQL) « ». , , . , , , .