Andra relationella språk Kapitel 5 Andra relationella språk sid Tupelrelationskalkyl 1 Domänrelationskalkyl 6 Query-by-Example (QBE) 8
Andra relationella språk, tupelrelationskalkyl 5-1 Tupelrelationskalkyl Tupelrelationskalkyl är ett icke-proceduralt frågespråk (dvs. en fråga beskriver vilken information som önskas).tupelrelationskalkyl (begränsad till säkra uttryck) är lika uttrycksfullt som relationsalgebra. Dvs. för varje relationsalgebraiskt uttryck där endast grundoperatorer ingår finns ett ekvivalent uttryck i tupelrelationskalkyl, och tvärtom. Varje fråga är av formen: { t P (t) } Dvs. mängden av alla tupler t så att predikatet P är sant för t. t är en tupel-variabel, t[a] betecknar värdet för tupel t på attribut A. t r betecknar att tupel t finns i relation r. P är en formel liksom en formel i predikatkalkylen. En predikatkalkylformel uppbyggs av Mängd av attribut och konstanter Mängd av jämförelseoperatorer: <, <, =,, >, > Mängd av konektiver: och, eller, icke Implikation : P 1 P 2 Kvantorer: t r (P(t)) det existerar en tupel t i relation r sådan att predikatet P(t) är sant t r (P(t)) P är sant för alla tupler t i relation r P 1 P 2 ( (P 1 ) (P 2 )) P 1 P 2 (P 1 ) P 2 t r (P(t)) t r ( P(t))
Andra relationella språk, tupelrelationskalkyl 5-2 Exempelfrågor Bestäm loan_number, branch_name, och amount för lån större än 1200. { t t loan t[amount] > 1200} σ amount >1200 (loan) dvs. alla attribut ingår i svaret Bestäm lånnumret för varje lån större än 1200 (dvs. samma som ovan men bara lånnumret önskas i svaret). Π loan_number (σ amount >1200 (loan)) { t s loan ( t[loan_number] = s[loan_number] s[amount] > 1200 ) } Svaret är en ett-attributig tabell på schemat (loan_number), vilket bara framgår implicit i frågan Bestäm lånnummer och lånebelopp för varje lån större än 1200. { t s loan ( t[loan_number] = s[loan_number] t[amount] = s[amount] s[amount] > 1200 ) } Svaret är en två-attributig tabell på schemat (loan_number, amount), eftersom t har värden specificerade för loan_number och amount. Π loan_number, amount (σ amount >1200 (loan)) customer (customer_name, customer_street, customer_city) branch(branch_name, branch_city, assets) account(account_number, branch_name, balance) loan(loan_number, branch_name, amount) depositor (customer_name, account_number) borrower (customer_name, loan_number)
Andra relationella språk, tupelrelationskalkyl 5-3 Bestäm namnen på alla kunder som har ett lån, ett konto, eller båda i banken. { t s depositor ( t[customer_name] = s[customer_name]) u borrower ( t[customer_name] = u[customer_name]) } Π customer_name (borrower) Π customer_name (depositor) Bestäm namnen på alla kunder som har ett lån och ett konto i banken. { t s depositor ( t[customer_name] = s[customer_name]) u borrower ( t[customer_name] = u[customer_name]) } Bestäm namnen på alla kunder som har ett lån i Perryridge-grenen. { t s borrower ( t[customer_name] = s[customer_name] u loan ( u[loan_number] = s[loan_number] u[branch_name] = Perryridge )) } Π customer_name (σ borrower.loan_number = loan.loan_number (borrower loan)) branch_name = Perryride customer (customer_name, customer_street, customer_city) branch(branch_name, branch_city, assets) account(account_number, branch_name, balance) loan(loan_number, branch_name, amount) depositor (customer_name, account_number) borrower (customer_name, loan_number)
Andra relationella språk, tupelrelationskalkyl 5-4 Bestäm namnen på alla kunder som har ett konto i banken men som inte har ett lån. alla kontoinnehavare { t s depositor ( t[customer_name] = s[customer_name] u borrower ( t[customer_name] = u[customer_name] )) } alla låntagare Π customer_name (depositor) Π customer_name (borrower) Bestäm namnen på alla kunder som har ett lån från Perryridge-grenen samt deras boningsort. { t s loan (s[branch_name] = Perryridge u borrower (s[loan_number] = u[loan_number] t[customer_name] = u[customer_name] ) v customer (u[customer_name] = v[customer_name] t[customer_city] = v[customer_city] )) } Π customer_name, customer_city (σ borrower.loan_number = loan.loan_number (loan borrower customer)) borrower.customer_name = customer.customer_name loan.branch_name = Perryride customer (customer_name, customer_street, customer_city) branch(branch_name, branch_city, assets) account(account_number, branch_name, balance) loan(loan_number, branch_name, amount) depositor (customer_name, account_number) borrower (customer_name, loan_number)
Andra relationella språk, tupelrelationskalkyl 5-5 Bestäm namnen på alla kunder som har ett konto i alla grenar belägna i Brooklyn. { t s customer (t[customer_name] = s[customer_name]) ( u branch (u[branch_city] = Brooklyn v depositor (t[customer_name] = v[customer_name] ) w account ( w[account_number] = v[account_number] w[branch_name] = u[branch_name] )))) } Mängden av alla kunder sådana att, för alla tupler u i branch-relationen, med värdet Brooklyn, kunden har ett konto i grenen vars namn är i branch_name attributet i u. Π customer_name, branch_name (depositor account) Π branch_name (σ branch_city = Brooklyn (branch)) Säkerhet av uttryck Det är möjligt att skriva tupelkalkyluttryck som genererar oändliga relationer. Ex.: { t t r } Resulterar i en oändlig relation om domänen för något attribut är oändlig För att skydda mot problemet, inskränker vi mängden av tillåtna uttryck till säkra uttryck: Ett uttryck { t P (t) } i tupelrelationskalkyl är säkert om alla värden i resultatet tillhör dom(p), där domänen dom(p) för P är mängden av alla värden som refereras av P (ingår i P eller i någon relation vars namn ingår i P). Dvs. varje komponent av t måste förekommer i en av de relationer, tupler, eller konstanter som förekommer i P. T.ex.: { t t[a] = 5 true } är ej säkert uttrycket genererar en oändlig mängd av attributvärden som inte förekommer i någon relation eller tupel eller konstant i P.
Andra relationella språk, domänrelationskalkyl 5-6 Domänrelationskalkyl Domänrelationskalkyl är ett icke-proceduralt frågespråk ekvivalent i styrka med tupelrelationskalkyl. Varje fråga är ett uttryck av formen: { < x 1, x 2,..., x n > P(x 1, x 2,..., x n ) } där x 1, x 2,..., x n representerar en domän variabler och P representerar en formel liksom en formel i predikatkalkylenl Exempelfrågor Π loan_number (σ amount >1200 (loan))? Bestäm loan_number, branch_name, och amount för lån större än 1200. σ amount >1200 (loan) { < l, b, a > < l, b, a > loan a > 1200} { t t loan t[amount] > 1200} Bestäm namnen på alla kunder som har ett lån större än 1200. {<c > l, b, a (< c, l > borrower < l, b, a > loan a > 1200)} Bestäm namnet och lånebeloppet för alla kunder som har ett lån från Perryridge-grenen. alt.: {<c, a > l (< c, l > borrower b (< l, b, a > loan b= Perryridge ))} { < c, a > l (< c, l > borrower < l, Perryridge, a > loan )} customer (customer_name, customer_street, customer_city) branch(branch_name, branch_city, assets) account(account_number, branch_name, balance) loan(loan_number, branch_name, amount) depositor (customer_name, account_number) borrower (customer_name, loan_number)
Andra relationella språk, domänrelationskalkyl 5-7 Bestäm namnen på alla kunder som har ett lån, ett konto, eller båda i Perryridge grenen. { < c > l (< c, l > borrower b, a (< l, b, a > loan b= Perryridge )) a (< c, a > depositor b, n (< a, b, n > account b= Perryridge )) } Bestäm namnen på alla kunder som har ett konto i alla grenar belägna i Brooklyn. { < c > s, n (< c, s, n > customer ) x, y, z (< x, y, z > branch y= Brooklyn ) a,b (< x, y, z > account < c, a > depositor ) } Säkerhet av uttryck Uttrycket { < l, b, a > (< l, b, a > loan ) } är ej säkert Ett uttryck är säkert om alla av följande gäller: { < x 1, x 2,..., x n > P(x 1, x 2,..., x n ) } Alla värden som förekommer i tupler av uttrycket är värden från dom(p) (dvs. värdena förekommer antingen i P eller en tupel av en relation nämnd i P). För varje det existerar delformel av formen x (P 1 (x)), är delformen sann omm det existerar ett värde på x i dom(p 1 ) så att P 1 (x) är sann. För varje för alla delformel av formen x (P 1 (x)), är delformen sann omm P 1 (x) är sann för alla värden x i dom(p 1 ). Dvs. de två sista kraven garanterar att för alla och det existerar kan testas utan att behöva testa oändligt många möjligheter. customer (customer_name, customer_street, customer_city) branch(branch_name, branch_city, assets) account(account_number, branch_name, balance) loan(loan_number, branch_name, amount) depositor (customer_name, account_number) borrower (customer_name, loan_number)
Andra relationella språk, QBE 5-8 QBE - Query by Example Ett grafiskt språk som är baserat på domänrelationskalkyl. Syntaxen är två-dimensionell - systemet skapar mallar av de relationer som begärs av användare och frågorna uttrycks som exempel. QBE skelettabeller för bankexemplet: customer customer-name customer-street customer-city branch branch-name branch-city assets borrower customer-name loan-number loan loan-number branch-name amount depositor customer-name account-number account account-number branch-name balance
Andra relationella språk, QBE 5-9 Frågor på en relation Bestäm alla lånenummer vid Perryridge-grenen: loan loan-number branch-name amount Perryridge _x är en variabel (kan utelämnas i frågan ovan) P. betyder print (display) Duplikat avlägsnas per default, för att behålla duplikat används P.ALL Visa fulla detaljer för alla lån: loan loan-number branch-name amount P._y P._z alt.: förkortad notation loan loan-number branch-name amount P. Bestäm lånenummer för alla lån med ett lånebelopp större än 700: loan loan-number branch-name amount P. > 700
Andra relationella språk,qbe 5-10 Bestäm namnen på alla grenar som inte är belägna i Brooklyn: branch branch-name branch-city assets P. Brooklyn Bestäm lånenummer för alla lån givna gemensamt åt Smith och Jones: borrower customer-name loan-number Smith Jones _x Bestäm alla kunder som bor i samma stad som Jones customer customer-name customer-street customer-city Jones _y _y
Andra relationella språk,qbe 5-11 Frågor på flera relationer Bestäm namnen på alla kunder som har ett lån från Perryridge-grenen: loan loan-number branch-name amount _x Perryridge borrower customer-name loan-number P._y _x Bestäm namnen på alla kunder som har både ett konto och ett lån i banken: depositor customer-name account-number borrower customer-name loan-number _x Bestäm namnen på alla kunder som har ett konto i banken, men inte har ett lån från banken: Negation depositor customer-name account-number borrower customer-name loan-number _x Bestäm namnen på alla kunder som har åtminståne två konton: depositor customer-name account-number _x _y _y
Andra relationella språk, QBE 5-12 Villkorsboxen Tillåter uttryck av begränsningar på domänvariabler som är antingen obekväma eller omöjliga att yttrycka inom skelettabeller. Komplicerade villkor kan användas i villkorsboxar Bestäm lånenummer för alla lån givna åt Smith, åt Jones eller åt båda gemensamt: borrower customer-name loan-number _n conditions _n = Smith or _n = Jones QBE understöder följande intressanta syntax för att uttrycka alternativa värden: branch branch-name branch-city assets P. _x conditions _x = (Brooklyn or Queens) Bestäm alla kontonummer med en balans större än 1300 och mindre än 1500: account account-number branch-name balance P. _x conditions _x > 1300 _x < 1500
Andra relationella språk, QBE 5-13 Bestäm alla kontonummer med en balans större än 1300 och mindre än 1500 men inte exakt 1400: account account-number branch-name balance P. _x conditions _x = (> 1300 and < 1500 and 1400 Bestäm alla grenar som har tillgångar större än åtminstone en gren belägen i Brooklyn: branch branch-name branch-city assets Brooklyn _y _z conditions _y > _z
5-14 Sammanfattning En realtidsdatamodell är baserad på en samling tabeller. Användaren kan ställa frågor mot dessa tabeller, insätta nya tupler, stryka tupler och modifiera tupler. Det finns flera språk för att utföra dessa operationer. Tupel relationskalkylen och domän relationskalkylen är icke-procedurala språk som representerar den grundläggande styrka som krävs i ett frågespråk. Relationsalgebra är ett proceduralt språk som är ekvivalent i styrka med båda formerna av rel.kalkyl när de begränsas till säkra uttryck. Relationsalgebra och relationskalkylerna är klara, formella språk som inte lämpar sig för den tillfällige användaren av databassystem. Kommersiella DBS har därför använt språk med mera "syntaktiskt socker". De vanligaste sådana språk är SQL, QBE och Quel, och kanske Datalog.