منذ فترة طويلة تم القبض على عالم قواعد البيانات من قبل DBMSs العلائقية التي تستخدم لغة SQL. لدرجة أن الأنواع الناشئة تسمى NoSQL. لقد تمكنوا من استعادة مكان معين في هذا السوق ، لكن قواعد بيانات إدارة قواعد البيانات العلائقية لن تموت ، ولا يزال استخدامها نشطًا لأغراضهم.
في هذه المقالة أريد أن أصف مفهوم قاعدة البيانات الوظيفية. لفهم أفضل ، سأفعل ذلك من خلال مقارنة مع نموذج العلائقية الكلاسيكية. على سبيل المثال ، سيتم استخدام المهام من اختبارات SQL المختلفة الموجودة على الإنترنت.
مقدمة
قواعد البيانات العلائقية تعمل على الجداول والحقول. في قاعدة البيانات الوظيفية ، سيتم استخدام الفئات والوظائف بدلاً من ذلك. سيتم تقديم حقل في جدول به مفاتيح N كدالة لمعلمات N. بدلاً من العلاقات بين الجداول ، سيتم استخدام الدوال التي تُرجع كائنات الفئة التي يتم ربطها. بدلا من تكوين وظيفة JOIN سيتم استخدامها.
قبل المتابعة مباشرة إلى المهام ، سأصف مهمة منطق المجال. بالنسبة إلى DDL ، سأستخدم بناء جملة PostgreSQL. للحصول على وظيفي ، بناء الجملة الخاصة به.
الجداول والحقول
كائن Sku بسيط مع اسم الحقول والسعر:
قصصيCREATE 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) « ». , , . , , , .