|
introduce lista acestora,separate prin virgula
|
səhifə | 8/16 | tarix | 03.01.2019 | ölçüsü | 1,42 Mb. | | #89992 |
| introduce lista acestora,separate prin virgula:
SELECT Common_name,Category,Length_In FROM Biolife.db
Pentru schimbarea comenzii,proprietatea Active trebuie dezactivata si apoi
reactivata din nou.
-56-
Atunci cand creati o baza de date,alegeti cu atentie numele coloanelor,
astfel incat sa nu se preteze la ambiguitati.De exemplu,in tabelul Biolife
exista o coloana cu titlul Species Name.Daca doriti sa solicitati cu
SELECT aceasta coloana,formula SELECT Species Name FROM Biolife.db va
returna un mesaj de eroare,deoarece spatiul gol va fi interpretat ca si
sfarsit al denumirii si se va cauta coloana Species (care nu exista).
Pentru a formula astfel de coloane se va prefera Species_Name sau orice
alta formula de evitare a ambiguitatilor.
Daca urmariti cu atentie tabelul,in coloana Category puteti observa
ca exista mai multi pesti din aceeasi categorie(Exemple; shark,snapper,
Wrasse).Pentru selectarea exclusiva a unui singur element din fiecare
tip se poate utiliza cuvantul cheie DISTINCT.
EXEMPLU: introduceti urmatoarea comanda:
SELECT DISTINCT Category FROM Biolife.db
Observati ca se vor afisa doar 21 de categorii,fata 28 initiale (toate
repetitiile au fost excluse).
Cu datele de pana acum,putem selecta dintr-o baza de date,una sau
mai multe coloane.Dar,intr-o baza de date reala,aceste coloane pot fi
extrem de lungi (mii de inregistrari).Pentru a realiza o selectie mai
eficienta,se poate adauga o conditie de cautare,care va extrage din
coloana selectata doar acele inregistrari care respecta conditia.
Sintaxa generala este:
SELECT coloana FROM tabelul WHERE coloana OPERATORUL valoarea
deci conditia este formata prin compararea detelor dintr-o coloana oare-
care (poate fi alta coloana decat cea selectata) cu o valoare de control.
De exemplu,pentru a extrage denumirea comuna a tuturor speciilor de
rechin din tabelul Biolife se va utiliza o formula de genul:
SELECT Common_Name FROM Biolife.db WHERE Category = 'Shark'
sau pentru a selecta doar denumirile comune care incep cu litera A,B sau
C se poate utriliza o formula de genul:
SELECT Common_Name FROM Biolife.db WHERE Common_Name < 'D'
SELECT se poate utiliza si cu una dintre functiile SQL,pentru a produce
o valoare noua.De exemplu,pentru a determina valoarea medie a lungimii,
pentru toate speciile din tabel,se poate utiliza functia AVG() astfel:
SELECT AVG(Length_In) FROM Biolife.db (vezi si Functiile SQL)
pentru a returna toate coloanele,dar pentru o singura inregistrare din
tabel,se va formula o comanda care include in conditie o anumita data
cunoscuta:
SELECT * FROM Biolife.db WHERE Common_Name = 'Firefish'
Cand se cunoaste o anumita data din tabel,se poate utiliza operatorul IN
Astfel,comanda de mai sus este identica cu:
SELECT * FROM Biolife.db WHERE Common_Name IN('Firefish')
sau pentru a utiliza operatorul LIKE se va edita o comanda de genul:
SELECT * FROM Biolife.db WHERE Category LIKE '%Snapper'
Pentru a selecta un grup de inregistrari,la care una dintre coloane are
o valoare cuprinsa intre anumite limite,se poate utiliza operatorul
BETWEEN ... AND.
De exemplu,pentru a selecta din tabelul Biolife.db,speciile de peste cu
lungimea cuprinsa intre 35 si 50 se va edita o comanda de genul:
SELECT * FROM Biolife.db WHERE Length_In BETWEEN 35 AND 50
Incercati exercitii similare,pana cand stapaniti bine comanda SELECT.
-57-
Daca nu mai doriti sa tot activati si dezactivati proprietatea Active
din Query1,adaugati doua butoane,un camp TEdit si urmatoarele proceduri
OnClick pentru butoane(Button1=OK si Button2=Executa):
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Active:=False;
Query1.SQL.Text:=Edit1.Text;
Query1.Active:=True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Query1.Active:=False;
Query1.SQL.Text:=Edit1.Text;
Query1.ExecSQL;
end;
Primul buton(denumit OK) va fi utilizat pentru operatiile care nu modifica
baza de date (de tip SELECT) iar cel de al doilea pentru cele care modi-
fica baza de date (INSERT INTO,DELETE,UPDATE etc).
Puteti utiliza Edit1 si butonul OK pentru a explora si restul tabelelor
din DATA: Animals.dbf,Clients.dbf,Holdings.dbf,Master.dbf,Industry,dbf,
Events,Customer,Items,Orders,Vendors etc.
Pentru a adauga o noua inregistrare,se poate utiliza comanda INSERT,
care are urmatoarea sintaxa generala (cu Edit1 + butonul Executa)
INSERT INTO tabel VALUES(valoarea1,valoarea2....valoarea"n") sau:
INSERT INTO tabel(coloana1,coloana2....) VALUES(valoarea1,valoarea2...)
Exemplu,pentru Biolife.db:
INSERT INTO Biolife.db(Category) VALUES('Crap')
Pentru a observa modificarea inchideti si apoi reporniti programul.
Pentru a sterge o inregistrare din tabel se poate utiliza comanda
DELETE,care are urmatoarea sintaxa generala:
DELETE FROM tabel WHERE coloana=valoare
De exemplu,pentru a sterge valoarea Crap introdusa anterior se va putea
utiliza linia de comanda:
DELETE FROM Biolife.db WHERE Category = 'Crap'
Este bine sa faceti o copie de siguranta a fisierelor,inainte de a incepe
operatiile de steregere.In caz contrar,riscati sa pierdeti irecuperabil
o parte din date.Acest principiu este util pentru orice operatie de
actualizare a unei baze de date.Executati initial o copie de siguranta,
apoi efectuati toate operatiile dorite.Daca rezultatul este multumitor
puteti sterge copia de siguranta.Daca au intervenit erori de conceptie,
sau de executie,reinstalati copia de siguranta si repetati procesul.
Pentru a schimba o anumita data,dintr-o singura coloana,puteti utiliza
comanda UPDATE,care are urmatoarea sintaxa generala:
UPDATE tabel SET coloana=valoare noua WHERE coloana=valoare veche
Exemplu: pentru a schimba in tabelul Biolife denumirea de 'Shark' cu cea
de 'Rechin' se poate utiliza urmatoarea comanda:
UPDATE Biolife.db SET Category='Rechin' WHERE Category='Shark'
Prj52 este conceput destul de rudimentar si are doar rol exemplificativ.
Puteti realiza un program cu cate un buton specializat pentru fiecare
operatie,sau cu mai multe campuri de afisare in care datele sa poata fi
prezentate diferit,etc.
-58-
In afara de selectie,datele din tabel pot fi si ordonate dupa un
anumit criteriu.
Ordonarea de face alfabetic prin adaugarea sufixului:ORDER BY coloana.
De exemplu,in tabelul Biolife.db se pot ordona alfabetic speciile de peste
in functie de denumirea lor comuna,cu comanda:
SELECT * FROM Biolife.db ORDER BY Common_Name
Pentru a exploata si alta baza de date,introduceti comanda:
SELECT * FROM Events
Pentru a selecta evenimentele sportive in ordinea datei de incepere:
se poate utiliza comanda:
SELECT * FROM Events ORDER BY Event_Date
Sau pentru a ordona evenimentele alfabetic se poate utiliza comanda:
SELECT * FROM Events ORDER BY Event_Name
iar pentru a ordona evenimentele in functie de ora inceperii:
SELECT * FROM Events ORDER BY Event_Time
Pentru a grupa doua sau mai multe conditii utilizate impreuna cu WHERE
se pot utiliza operatorii AND si OR
De exemplu,pentru a putea selecta din tabelul Events toate evenimentele
din data de 6/20/96 care se desfasoara dupa ora 3:00:00 PM se poate
utiliza o comanda de genul:
SELECT *FROM Events WHERE Event_Date='6/20/96' AND Event_Time>'3:00:00 PM'
Limbajul SQL permite si selectarea de date din doua sau mai multe tabele
simultan,sau reunirea dintre doua comenzi cu UNION:
SELECT coloana FROM tabel1
UNION
SELECT coloana FROM tabel2
EXEMPLU: extrage codul postal(ZIP) din tabelele Clients.dbf si Customer
SELECT zip FROM Clients.dbf UNION SELECT zip FROM CUSTOMER
Apasati butonul Executa,apoi butonul OK.
Comanda UNION este asemanatoare cu SELECT DISTINCT,adica sumeaza din cele
doua comenzi doar rezultatele distincte.Daca doriti sa selectati toate
datele,inclusiv cele care se repeta,se va utiliza comanda UNION ALL (care
are sintaxa identica cu UNION).
Pentru a intersecta datele din doua tabele diferite,in functie de
o conditie prestabilita,se poate utiliza comanda JOIN (sau variantele
sale INNER JOIN,LEFT JOIN,RIGHT JOIN):
Pentru JOIN sintaxa generala este:
SELECT tabel1.coloana1,tabel2.coloana2 FROM tabel1,tabel2
WHERE tabel1.coloana3=tabel2.coloana4
Se pot selecta coloane diferite din cele doua tabele,care respecta con-
ditia specificata prin WHERE...
EXEMPLU: pentru a vedea numele companiilor care sunt localizate in
acelasi stat cu consumatorii se pot utiliza tabelele Vendors si Customer
si urmatoarea linie de comanda:
SELECT Vendors.City,Customer.Company FROM Vendors,Customer
WHERE Customer.State = Vendors.State
Observati ca am utilizat pentru stabilirea conditiei alta coloana decat
cele selectate pentru afisare.Apasati butonul Executa si apoi butonul OK.
Pentru fiecare locatie din tabelul Vendors se va afisa numele companiei
din Customer care este localizata in acelasi stat.Mai exact,se va extrage
fiecare coloana ceruta ori de cate ori conditia WHERE este satisfacuta.
-59-
O comanda asemanatoare este INNER JOIN,care returneaza toate datele din
ambele tabele,daca satisfac conditia specificata.Sintaxa generala este:
SELECT Tabel1.coloana1,Tabel2.coloana2 FROM Tabel1 INNER JOIN Tabel2
ON Tabel1.coloana3=Tabel2.coloana4
De exemplu,pentru cele doua tabele de mai sus se poate utiliza:
SELECT Vendors.VendorName FROM Vendors INNER JOIN Customer
ON Vendors.State = Customer.State
Comanda LEFT JOIN este aproape identica,dar returneaza coloana din
primul tabel in intregime,chiar daca nu verifica conditia specificata
(copiaza complet datele din stanga ecuatiei si selectiv cele din dreapta
ecuatiei):
EXEMPLU:
SELECT Vendors.VendorName,Customer.Zip FROM Vendors LEFT JOIN Customer
ON Vendors.State = Customer.State
Observati ca in coloana din stanga apar si date care nu au corespondent
in coloana din dreapata.Pentru datele care respecta conditia,numele
vanzatorului este repetat pentru fiecare cod postal din statul respectiv.
Comanda RIGHT JOIN este asemanatoare,dar returneaza complet datele
din coloana solicitata din cel de al doilea tabel si returneaza selectiv
datele din coloana aleasa din primul tabel,doar daca aceste date verifica
conditia specificata prin ON:
EXEMPLU:
SELECT Vendors.VendorName,Customer.Zip FROM Vendors RIGHT JOIN Customer
ON Vendors.State = Customer.State
Observati ca in acest caz,coloana din dreapta (Zip) are mult mai multe
date decat cea din stanga (VendorName).
Este foarte important ca aceste comenzi sa fie formulate cat mai clar,
pentru a realiza o selectie cat mai discriminativa.Atunci cand se inter-
secteaza datele din doua tabele,teoretic se pot obtine un numar extrem
de mare de combinatii posibile.Arta programatorului este de a formula
expresia cea mai simpla care returneaza cat mai exact datele dorite.
Daca formula de selectie nu este buna,sau daca nu formulati nici o con-
ditie de selectie,se vor returna tabele extrem de lungi,practic imposibil
de evaluat.Este bine sa exersati acest gen de comenzi cu tabele cat mai
mici,pana cand formulati cat mai exact expresiile de comanda.
Pentru a schimba structura unui tabel,se poate utiliza comanda
ALTER TABLE care va adauga sau va sterge o colana in intregime.Comanda
are doua variante:
ALTER TABLE tabel ADD coloana tipul de data
si ALTER TABLE tabel DROP COLUMN coloana
De exemplu pentru a adauga o coloana de concluzii,de tip char,la tabelul
Orders se poate utiliza comanda:
ALTER TABLE Orders ADD Concluzii char
Tastati Executa,apoi inchideti programul,reporniti si utilizati comanda
SELECT * FROM ORDERS pentru a vedea modificarea efectuata.
Pentru a sterge coloana adaugata se va putea utiliza comanda:
ALTER TABLE Orders DROP COLUMN Concluzii
Tastati Executa,apoi inchideti programul.
Comenzile de modificare a tabelelor cu ALTER TABLE se vor utiliza cat
mai rar,si cu maxim de discernamant,deoarece reformateaza intrega baza
de date si introduc un numar mare de spatii goale.
-60-
Nu este recomandabil nici sa eliminati coloane de date dintr-o baza de
date.O baza de date se construieste greu si se distruge sau sterge foarte
usoar.Date aparent intutile la prima vedere pot fi extrem de utile intr-un
viitor apropiat.In general,atunci cand proiectati o baza de date,alegeti
coloanele si tipul datelor,astfel incat sa nu fie necesar sa fie modifi-
cate ulterior.Se pot restructura bazele de date,atunci cand vor fi apli-
cate intr-un alt proiect (mai restrans sau mai amplu).
Pentru a pastra formatul unui tabel si a sterge doar datele din coloane
se poate utiliza comanda TRUNCATE TABLE tabelul.
Pentru a sterge un tabel si respectiv o baza de date,se pot utiliza
comenzile DROP TABLE Tabel si DROP DATABASE nume.
FUNCTII SQL
Limbajul SQL include si o serie de functii,care pot fi incluse in
comenzi,pentru a obtine rezultate diferite de cele arhivate in tabele.
Sintaxa generala pentru apelarea unei functii este:
SELECT functia(coloana) FROM tabel
Functiile care actioneaza asupra unei colectii de date,pentru a returna
o singura valoare se numesc functii agregate,iar cele actioneaza asupra
unei singure valori pentru a returna o valoare unica se numesc scalare.
Functiile agregate sunt:
AVG(coloana) -returneaza valaorea medie a coloanei
COUNT(coloana) -returneaza numarul de linii din coloana
COUNT(*) -returneaza numarul de coloane selectate
FIRST(coloana) -returneaza prima inregistrare din coloana
LAST(coloana) -returneaza ultima inregistrare din coloana
MAX(coloana) -returneaza valaorea cea mai amre din coloana
MIN(coloana) -returneaza valaorea cea mai mica din coloana
SUM(coloana) -returneaza suma valorilor din coloana
Functiile scalare sunt:
UCASE(c) -converteste caracterele la majuscule
LCASE(c) -converteste caracterele la minuscule
MID(c,start[end])-extrage caractere dintr-un text (intre start si end)
LEN(c) -returneaza lungimea textului
INSTR(c,char) -returneaza pozitia caracterului in text
LEFT(c,nrofchar) -returneaza partea din stanga a textului (nrofchar)
RIGHT(c,nrofchar)-returneaza partea din dreapta a textului
ROUND(c,decimals)-rotunjeste valoarea numerica
MOD(x,y) -executa operatia modul (restul impartirii)
NOW() -returneaza data curenta
FORMAT(c,format) -schimba formatul datelor
DATE DIFF(d,date1,date2)-calculeaza diferenta datelor calendaristice
EXEMPLE: pentru a efectua o medie aritmetica:
SELECT AVG(YRL_HIGH),AVG(YRL_LOW) FROM Master.dbf
pentru a aduna toate inregistrarile dintr-o coloana:
SELECT SUM(Shares) FROM Holdings.dbf
pentru a selecta valaorea maxima si valaorea minima din coloana
SELECT MAX(Shares),MIN(Shares) FROM Holdings.dbf
pentru a afla numarul de inregistrari dintr-un tabel:
SELECT COUNT(Category) FROM Biolife.db
pentru a calcula o suma partiala,in functie de o conditie:
SELECT SUM(CUR_PRICE) FROM Master.dbf WHERE YRL_HIGH > 50
-61-
Functiile agregate se pot utiliza si pentru a realiza calcule partiale
ale unor date din coloana respectiva,care respecta o anumita conditie
introdusa prin GROUP BY.De exemplu,in tabelul Biolife.db exista trei
specii de cod,doua specii de rechin etc.Pentru a determina care este
lungimea medie,pentru fiecare specie,se poate utiliza formula:
SELECT Category,AVG(Length_In) FROM Biolife.db GROUP BY Category
In continuare,pentru a selecta dintre speciile de peste,doar cele care
au dimensiunea medie mai mare de 40 de cm,se poate adauga o noua conditie
Pentru functiile agregate,in loc de WHERE se va utiliza HAVING.
EXEMPLU:
SELECT Category,AVG(Length_In) FROM Biolife.db GROUP BY Category
HAVING AVG(Length_In) > 40
Pentru a copia date dintr-un tabel in altul se utilizeaza comanda
SELECT INTO cu sintaxa generala:
SELECT nume INTO tabel nou(IN-baza de date] FROM sursa
EXEMPLU: SELECT * INTO Angajati FROM Persoane va copia tot tabelul.
O comanda SQL poate fi utilizata si sub forma de membru al unei ecuatii,
unde ecuatia respectiva specifica o anumita conditie:
EXEMPLU:
SELECT Co_Name,Yrl_Low FROM Master.dbf
WHERE Yrl_Low < (SELECT AVG(Yrl_Low) FROM Master.dbf)
va selecta din tabel,doar companiile pentru care valoarea minima anuala
este mai mica decat media valorilor minime anuale (al pretului/actiune)
Pentru a crea baze de date,puteti utiliza CREATE DATABASE si CREATE
TABLE,dar este recomandabil sa utilizati un program specializat(FoxPro).
Principala problema o constitue modul de selectie a datelor din bazele
de date foarte mari (cu mii si zeci de mii de inregistrari).Un numar prea
mic de conditii,va returna un numar prea mare de rezultate,iar un numar
prea mare de conditii poate sa excluda exact rezultatele cautate,sau
cele foarte asemenatoare care prezinta un interes secundar.Este exact
genul de dilema al "internautilor Google".
Atunci cand proiectati si programati o aplicatie Delphi,care exploa-
teaza o baza de date,este bine sa utilizati butoane sau comenzi care
executa automat comenzile SQL precizate de d-voastra.Nu este recomandabil
sa lasati formularea acestor comenzi pe seama utilizatorului (este absolut
impredictibil la ce rezultate vor putea ajunge).
In general,Delphi este proiectat pentru a realiza interfete vizuale cu
utilizatorul,astfel incat acesta sa nu trebuiasca decat sa apese un singur
buton.
Atunci cand bazele proiectate vor fi in permanenta crestere,verificati
comenzile si dinamic.Adauagti progresiv un anumit numar de inregistrari si
apoi verificati si reverificati comenzile utilizate.
In cazul in care nu puteti formula o comanda ideala,este preferabil sa
afisati si un numar limitat de date inutile,decat sa pierdeti o parte
dintre datele semnificative.
Pentru bazele de date cu care se lucreaza frecvent,este bine sa salvati
copii de siguranta,realizate in etape succesive (baza de date de la debut,
baza de date cu datele esentiale si ultima actualizare a bazei de date).
In acest mod,pastrati in siguranta atat formatul de baza cat si datele
esentiale sau recente.In general,bazele de date mici sunt mai eficiente
decat cele foarte lungi(se prefera organizarea modulara cu baze multiple).
-62- Internet - TDataSetTableProducer
TDataSetTableProducer este un obiect care combina facilitatile oferite
de TPageProducer cu cele oferite de TQueryTable producer.Mai exact,acest
component permite preluarea datelor de tip tabelar,dintr-o baza de date
si reeditarea acestora sub forma de text in limbaj HTML.Ca rezultat,datele
vor putea fi utilizate pentru a realiza file HTML locale sau pentru a
formula raspunsul unei aplicatii WebServer(sub forma de mesaj HTML).
Dostları ilə paylaş: |
|
|