Vastus (19.03.2023 13:44): Nende vahendite kaudu saab käivitada SQL lauseid, mis on
- illegaalne SQL,
- ei ole kooskõlas MS Accessi SQL dialektiga, st lauseid otse andmebaasisüsteemis käivitades need ei toimi.
Põhjus saab olla selles, et see programm kui vahendaja kirjutab lauseid enne käivitamist ümber andmebaasisüsteemile sobivaks. See muutub probleemiks, kui sellise vahenda puudumisel ei oska kasutaja andmebaasisüsteemis toimivat koodi kirjutada.
Esitan järgnevalt näiteid.
Illegaalse SQLi näide
SELECT [oppimine] , tulemus
FROM [Oppimine] INNER JOIN [Eksam] ON Oppimine.[oppimine] =Eksam.[oppimine];
Veerg oppimine on nii tabelites Oppimine kui Eksam. Veerule viidates ei täpsustata tabelit, milles see veerg sisaldub.
Korrektne oleks:
SELECT Oppimine.[oppimine] , tulemus
FROM [Oppimine] INNER JOIN [Eksam] ON Oppimine.[oppimine] =Eksam.[oppimine];
Näited lausetest, mida MS Accessi SQL dialekt ei toeta, kuid mida saan DBeaveris MS Accessi andmebaasi põhjal käivitada
SELECT Count(DISTINCT aine) AS arv
FROM [Oppimine];
--leian erinevate ainete arvu, mida on vähemalt korra õpitud
WITH erinevad AS (SELECT DISTINCT [aine] FROM [Oppimine])
SELECT Count(*) AS arv
FROM erinevad;
/*ühine tabeli avaldis (Common Table Expression) - deklareerin alampäringu ja siis kasutan*/
SELECT *
FROM [Oppimine]
ORDER BY [oppim_algus] DESC
LIMIT 2;
SELECT *
FROM [Tudeng] INNER JOIN [Oppimine] ON Tudeng.[tudkood] = Oppimine.[tudeng]
INNER JOIN [Aine] ON Oppimine.[aine] = Aine.[aine_kood]
--ühendamisoperatsioonid pole sulgudes
SELECT *
FROM [Tudeng] JOIN [Oppimine] ON Tudeng.[tudkood] = Oppimine.[tudeng]
JOIN [Aine] ON Oppimine.[aine] = Aine.[aine_kood]
--sõna JOIN fraasi INNER JOIN asemel
SELECT *
FROM [Oppimine] INNER JOIN [Eksam] USING (oppimine);
--kompaktsem süntaks ühendamiseks üle samanimeliste veergude
SELECT *
FROM [Oppimine]
WHERE Extract(YEAR FROM [oppim_algus])=1999;
--Extract funktsioon kuupäevast aastaarvu eraldamiseks
SELECT *
FROM [Oppimine]
WHERE [oppim_algus]='1999-09-01'
--Kuupäevastring on ülakomade vahel
Näited SQL lausetes, mida saab MS Accessis otse käivitada
SELECT Count(aine) AS arv
FROM (SELECT DISTINCT [aine]
FROM [Oppimine]) AS ap;
SELECT *
FROM ([Tudeng] INNER JOIN [Oppimine] ON Tudeng.[tudkood] = Oppimine.[tudeng])
INNER JOIN [Aine] ON Oppimine.[aine] = Aine.[aine_kood]
--sulud ühendamisoperatsioonide ümber
SELECT *
FROM [Oppimine]
WHERE Year([oppim_algus])=1999;
--MS Accessis on funktsioon Year
SELECT *
FROM [Oppimine]
WHERE [oppim_algus]=#1999-09-01#;