Kurekebisha safu mlalo fulani pekee. WAPI - ni data gani inayoonyeshwa

Wakati wa kurejesha data, inaweza kuwa muhimu kuipata kwa fomu fulani iliyoagizwa. Kupanga kunaweza kufanywa na sehemu zozote zilizo na aina yoyote ya data. Hii inaweza kuwa aina ya kupanda au kushuka kwa sehemu za nambari. Kwa sehemu za herufi (maandishi), hii inaweza kupangwa kwa mpangilio wa alfabeti, ingawa kimsingi pia imepangwa kwa mpangilio wa kupanda au kushuka. Inaweza pia kufanywa kwa mwelekeo wowote - kutoka A hadi Z, na kinyume chake kutoka Z hadi A.

Kiini cha mchakato wa kupanga ni kupunguza mlolongo kwa utaratibu fulani. Unaweza kupata maelezo zaidi kuhusu kupanga katika makala ya “Kupanga Algorithms.” Kwa mfano, kupanga mlolongo wa nambari kiholela kwa mpangilio wa kupanda:

2, 4, 1, 5, 9

inapaswa kusababisha mlolongo ulioamriwa:

1, 2, 4, 5, 6

Vivyo hivyo, wakati wa kupanga katika mpangilio wa kupanda wa maadili ya kamba:

Ivanov Ivan, Petrov Petr, Ivanov Andrey

matokeo yanapaswa kuwa:

Ivanov Andrey, Ivanov Ivan, Petrov Petrov

Hapa mstari "Andrey Ivanov" umehamia mwanzo, kwani kulinganisha kwa kamba hufanywa tabia kwa tabia. Mistari yote miwili huanza na wahusika sawa "Ivanov". Kwa kuwa ishara "A" katika neno "Andrey" inakuja mapema katika alfabeti kuliko ishara "I" katika neno "Ivan," mstari huu utawekwa mapema.

Kupanga katika Hoja ya SQL

Ili kutekeleza kupanga, unahitaji kuongeza ORDER BY amri kwenye kamba ya hoja. Baada ya amri hii, uwanja ambao upangaji unafanywa unaonyeshwa.

Kwa mifano, tunatumia bidhaa za meza ya bidhaa:

nambari
(Nambari ya bidhaa)
kichwa
(Jina)
bei
(bei)
1 Mandarin50
2 Tikiti maji120
3 Nanasi80
4 Ndizi40

Data hapa tayari imepangwa na safu wima ya "nambari". Sasa, wacha tuunde swali ambalo litaonyesha jedwali lililo na bidhaa zilizopangwa kwa mpangilio wa alfabeti:

CHAGUA * KUTOKA kwa bidhaa ORDER BY title

CHAGUA * KUTOKA kwa bidhaa - inabainisha kuchagua sehemu zote kutoka kwa jedwali la bidhaa;

AGIZA KWA - amri ya kuchagua;

kichwa - safu ambayo upangaji utafanywa.

Matokeo ya kutekeleza ombi kama hilo ni kama ifuatavyo:

nambari kichwa bei
3 Nanasi80
2 Tikiti maji120
4 Ndizi40
1 Mandarin50

Unaweza pia kupanga kwa uga wowote wa jedwali.

Upangaji mwelekeo

Kwa chaguo-msingi, amri ya ORDER BY hupanga kwa mpangilio wa kupanda. Ili kudhibiti mwenyewe mwelekeo wa kupanga, tumia neno msingi ASC (kupanda) au DESC (kushuka) baada ya jina la safu wima. Kwa hivyo, ili kuonyesha jedwali letu kwa utaratibu wa kushuka wa bei, unahitaji kuuliza swali kama hili:

CHAGUA * KUTOKA kwa bidhaa ORDER BY bei DESC

Panga kwa bei ya kupanda itakuwa:

CHAGUA * KUTOKA kwa bidhaa AGIZO KWA bei ASC

Inapanga kulingana na sehemu nyingi

SQL inaruhusu kupanga kwa sehemu nyingi mara moja. Ili kufanya hivyo, baada ya ORDER BY amri, mashamba yanayohitajika yanaonyeshwa kutengwa na koma. Mpangilio wa matokeo ya hoja utasanidiwa kwa mpangilio sawa ambao sehemu za kupanga zimebainishwa.

safu1 safu ya2 safu ya3
3 1 c
1 3 c
2 2 b
2 1 b
1 2 a
1 3 a
3 4 a

Wacha tupange meza kulingana na sheria zifuatazo:

CHAGUA * KUTOKA KATIKA AGIZO LA safu wima1 ASC, safu wima2 DESC, safu wima3 ASC

Wale. safu ya kwanza inapanda, ya pili inashuka, ya tatu inapanda tena. Swala itaagiza safu kwa safu ya kwanza, kisha, bila kuvunja sheria ya kwanza, kwa safu ya pili. Kisha, pia, bila kukiuka sheria zilizopo, kulingana na ya tatu. Matokeo yake yatakuwa seti ya data kama hii:

safu1 safu ya2 safu ya3
1 3 a
1 3 c
1 2 a
2 2 b
2 1 b
3 1 a
3 1 c

Agizo la ORDER BY amri katika hoja

Kupanga safu mara nyingi hufanywa pamoja na hali ya kuchagua data. Amri ya ORDER BY imewekwa baada ya hali ya uteuzi WHERE. Kwa mfano, tunachagua bidhaa zilizo na bei chini ya rubles 100, zilizopangwa kwa jina kwa mpangilio wa alfabeti:

CHAGUA * KUTOKA kwa bidhaa WAPI bei 100 AGIZA KWA bei ASC

Sura hii inatanguliza amri zinazodhibiti maadili yaliyowasilishwa kwenye jedwali. Unapomaliza sura hii, utaweza kuweka safu katika jedwali, kuzifuta, na kubadilisha maadili mahususi yanayowakilishwa katika kila safu. Matumizi ya maswali katika uundaji yataonyeshwa kikundi kamili safu mlalo za kuingiza, na jinsi kiima kinaweza kutumika kudhibiti kubadilisha thamani na kufuta safu mlalo. Nyenzo katika sura hii inajumuisha maarifa kamili yanayoonyesha jinsi ya kuunda na kudhibiti habari katika hifadhidata. Njia zenye nguvu zaidi za kubuni vihusishi vitajadiliwa katika sura inayofuata.

AMRI ZA MABADILIKO YA LUGHA ya DML

Thamani zinaweza kuingizwa na kuondolewa kutoka kwa sehemu kwa kutumia amri tatu za DML (Lugha ya Udhibiti wa Data): INSERT, UPDATE, DELETE. Usichanganyikiwe, zote zilitajwa hapo awali katika SQL kama amri za urekebishaji.

KUINGIA MAADILI

Safu mlalo zote katika SQL zimeingizwa kwa kutumia amri ya urekebishaji ya INSERT. Katika umbo lake rahisi, INSERT hutumia sintaksia ifuatayo: INSERT IN MAADILI (, . . .); Kwa hivyo, kwa mfano, kuingiza safu katika jedwali la Wauzaji, unaweza kutumia hali ifuatayo: WEKA MAADILI ya Wauzaji (1001, "Peel", "London", .12); Amri za DML hazitoi matokeo yoyote, lakini programu yako inapaswa kukupa uthibitisho fulani kwamba data ilitumiwa.

Jedwali (kwa upande wetu, Wafanyabiashara) lazima lifafanuliwe hapo awali katika amri ya CREATE TABLE (angalia Sura ya 17), na kila thamani iliyohesabiwa katika kifungu cha thamani lazima ifanane na aina ya data ya safu ambayo imeingizwa. Katika ANSI, maadili haya hayawezi kuunda misemo, ambayo inamaanisha kuwa 3 inapatikana, lakini usemi 2 + 1 haupo. Maadili, bila shaka, yameingizwa kwenye meza kwa utaratibu wa jina, hivyo thamani ya kwanza yenye jina moja kwa moja huisha kwenye safu ya 1, ya pili katika safu ya 2, na kadhalika.

KUWEKA VIASHIRIA TUPU

Ikiwa unahitaji kuingiza thamani isiyofaa, unaiingiza kama thamani ya kawaida. Hebu tuchukulie kuwa hapakuwa na jinsia ya jiji kwa Bw. Peel bado. Unaweza kuingiza mfuatano wenye value=NULL katika sehemu hii kama hii: WEKA MAADILI YA Wauzaji (1001, "Peel", NULL, .12); Kwa sababu NULL ni ishara maalum na sio tu thamani ya mhusika, haijajumuishwa katika nukuu moja.

KUTAJA SAFU ILI KUWEKA

Unaweza pia kutaja safu wima ambapo unataka kuingiza thamani ya jina. Hii hukuruhusu kuingiza majina kwa mpangilio wowote. Wacha tuseme unachukua maadili ya jedwali la Wateja kutoka kwa ripoti ya printa ambayo inawaweka kwa mpangilio huu: jiji, cname, na cnum, na ili kurahisisha mambo, unataka kuingiza maadili kwa mpangilio sawa: INGIA Wateja (mji, cname, cnum ) THAMANI ("London", "Honman", 2001); Tafadhali kumbuka kuwa safu wima za ukadiriaji na snum hazipo. Hii inamaanisha kuwa mistari hii huwekwa kiotomatiki kwa thamani yao chaguomsingi. Thamani chaguo-msingi inaweza kuwa NULL au thamani nyingine iliyofafanuliwa kuwa chaguo-msingi. Ikiwa kizuizi kinakataza matumizi ya NULL in safu hii, na safu wima hii haijawekwa kama chaguo-msingi, safu wima hii lazima itolewe kwa thamani ya amri yoyote ya INGIZA inayotumika kwenye jedwali (angalia Sura ya 18 kwa maelezo kuhusu NULL na vizuizi "chaguo-msingi").

KUWEKA MATOKEO YA SWALI

Unaweza pia kutumia amri ya INSERT kupata au kuchagua maadili kutoka kwa jedwali moja na kuziweka kwenye nyingine ili kutumia na hoja. Ili kufanya hivyo, unabadilisha tu kifungu cha VALUES (kutoka kwa mfano uliopita) na swali linalolingana: WEKA INTO Londonstaff CHAGUA * FROM Salespeople WHERE city = "London"; Hapa, thamani zote zinazotolewa na hoja zimechaguliwa - yaani, safu zote kutoka kwa jedwali la Wauzaji na thamani ya jiji = "London" - na kuwekwa kwenye jedwali linaloitwa Londonstaff. Ili hili lifanye kazi, jedwali la wafanyakazi wa London lazima likidhi masharti yafuatayo:

* Lazima iwe tayari imeundwa kwa amri ya CREATE TABLE.

* Ni lazima iwe na safu wima nne zinazolingana na jedwali

Wauzaji kwa suala la aina ya data; yaani, ya kwanza, ya pili, na kadhalika, safu wima za kila jedwali lazima ziwe na aina sawa ya data (na hazipaswi kuwa na majina sawa).

Kanuni ya jumla ukweli kwamba safu wima za jedwali zilizoingizwa lazima zilingane na safu wima zinazotolewa na hoja ndogo, katika kesi hii, kwa jedwali zima la Wauzaji. Londonstaff sasa ni jedwali huru ambalo limepokea maadili kutoka kwa jedwali la Wauzaji. Ikiwa maadili katika jedwali la Wauzaji yangebadilishwa ghafla, hii haingekuwa na athari kwenye jedwali la Londonstaff (ingawa unaweza kuunda athari kama hiyo kwa kutumia MTAZAMO uliofafanuliwa katika Sura ya 20). Kwa sababu swala au amri ya INGIZA inaweza kubainisha safuwima kwa jina, unaweza, ukipenda, kuhamisha safu wima zilizochaguliwa pekee na pia kupanga upya safu wima ulizochagua.

Hebu tuseme, kwa mfano, kwamba unaamua kuunda jedwali jipya linaloitwa Daytotals ambalo litafuatilia kwa urahisi jumla ya dola za kiasi cha ununuzi kilichopangwa kwa kila siku. Unaweza kuingiza data hii bila kutegemea jedwali la Maagizo, lakini lazima kwanza ujaze jedwali la Daytotals na maelezo yaliyotolewa hapo awali kwenye jedwali la Maagizo.

Kutambua kwamba meza ya Maagizo inashughulikia mwisho mwaka wa fedha badala ya siku chache tu kama ilivyo katika mfano wetu, unaweza kuona manufaa ya kutumia kifungu kifuatacho INGIZA katika kuhesabu na kuweka thamani INGIZA KWENYE Daytotals (tarehe, jumla) CHAGUA odate, SUM (amt) KUTOKA KUNDI LA Maagizo KWA Odate; Kumbuka kwamba, kama ilivyopendekezwa awali, majina ya safu wima ya jedwali la Maagizo na jedwali la Daytotals si lazima yafanane. Pia, ikiwa tarehe ya ununuzi na jumla ya idadi ndio safu wima pekee kwenye jedwali, na ziko ndani kwa utaratibu huu, majina yao yanaweza kutengwa kutoka kwa matokeo kwa sababu ya unyenyekevu wao dhahiri.

KUFUTA SAFU KWENYE MAJEDWALI

Unaweza kufuta safu kutoka kwa meza na amri ya kurekebisha - DELETE. Inaweza tu kufuta safu mlalo zilizoingizwa, si thamani za sehemu mahususi, kwa hivyo kigezo cha sehemu ni cha hiari au hakipatikani. Ili kufuta maudhui yote ya jedwali la Wafanyabiashara, unaweza kuingiza hali ifuatayo: FUTA KUTOKA KWA Wauzaji; Sasa kwa kuwa jedwali ni tupu, linaweza kudondoshwa kabisa kwa amri ya DROP TABLE (hii imefafanuliwa katika Sura ya 17). Kwa kawaida, unahitaji tu kufuta baadhi ya safu maalum kutoka kwa meza. Kuamua ni safu mlalo zipi zitafutwa, unatumia kiima, kama vile ulivyofanya kwa hoja. Kwa mfano, ili kumwondoa muuzaji Axelrod kwenye jedwali, unaweza kuingiza FUTA KUTOKA KWA Wauzaji WHERE snum = 1003; Tulitumia uga wa snum badala ya uga wa sname kwa sababu hii ndiyo mbinu bora unapotumia funguo msingi unapotaka safu mlalo moja pekee iathiriwe. Kwa wewe - hii ni sawa na hatua ya ufunguo wa msingi. Bila shaka, unaweza pia kutumia DELETE na kihusishi kinachochagua kundi la safu mlalo, kama inavyoonyeshwa katika mfano huu: FUTA KUTOKA KWA Salespeople WHERE city = "London";

KUBADILISHA MAADILI YA UWANJA

Sasa kwa kuwa unaweza kuingiza na kufuta safu mlalo za jedwali, unapaswa kujifunza jinsi ya kubadilisha baadhi au maadili yote katika safu mlalo iliyopo. Hii inafanywa kwa amri ya UPDATE. Amri hii ina kifungu cha UPDATE ambacho kinabainisha jedwali la kutumia na kifungu cha SET ambacho kinabainisha mabadiliko ya kufanywa kwa safu mahususi. Kwa mfano, ili kubadilisha ukadiriaji wa wateja wote hadi 200, unaweza kuingiza UPDATE SET rating ratings = 200;

KUREKEBISHA SAFU MAALUM TU

Bila shaka, hutataka kila wakati kubainisha safu mlalo zote za jedwali ili kubadilisha thamani moja, kwa hivyo UPDATE, kama vile DELETE, inaweza kuchukua vidakuzi. Hivi ndivyo jinsi, kwa mfano, unaweza kufanya mabadiliko sawa kwa wateja wote wa muuzaji wa Peel (kuwa na snum=1001): UPDATE Wateja SET rating = 200 WHERE snum = 1001;

SASISHA AMRI KWA SAFU NYINGI

Walakini, hupaswi kujiwekea kikomo kwa kurekebisha safu wima moja na UPDATE amri. Kifungu cha SET kinaweza kubainisha idadi yoyote ya safu wima, ikitenganishwa na koma. Kazi zote zilizo hapo juu zinaweza kufanywa kwa safu yoyote ya jedwali, lakini kwa moja tu kwa wakati mmoja. Wacha tuseme muuzaji wa Motika amestaafu na tunataka kukabidhi nambari yake kwa muuzaji mpya: USASISHA Salespeople SET sname = "Gibson",city = "Boston",comm = .10 WHERE snum = 1004; Timu hii itahamisha kwa muuzaji mpya wa Gibson wateja wote wa sasa wa muuzaji wa zamani wa Motika na maagizo jinsi yalivyowekwa pamoja kwa Motika kwa kutumia snum. Huwezi, hata hivyo, kurekebisha majedwali mengi kwa wakati mmoja kwa amri moja, kwa sehemu kwa sababu huwezi kuweka majedwali yenye safu wima zilizorekebishwa na kifungu cha SET. Kwa maneno mengine, huwezi kusema "SET Salespeople.sname = Gibson" kwa amri ya UPDATE, unaweza tu kusema "SET sname = Gibson".

KUTUMIA MANENO KWA KUBADILISHA

Unaweza kutumia misemo ya scalar katika kifungu cha SET cha amri ya UPDATE, hata hivyo, kwa kuijumuisha katika usemi wa kijinsia ambao utabadilishwa. Hii ni tofauti na kifungu cha VALUES cha amri ya INSERT, ambayo maneno hayawezi kutumika; Sifa hii ya misemo ya scalar ni kipengele muhimu sana. Wacha tuseme unaamua kuongeza tume za wauzaji wako wote mara mbili. Unaweza kutumia usemi ufuatao: SASISHA Wauzaji SET comm = comm * 2; Wakati wowote unaporejelea thamani ya safu wima maalum katika kifungu cha SET, thamani inayotokana inaweza kutokea mstari wa sasa, kwanza mabadiliko kadhaa yatafanywa kwake kwa kutumia amri ya UPDATE. Kwa kawaida, unaweza kuchanganya vipengele hivi na kusema - tume mara mbili kwa wauzaji wote katika London, na sentensi hii: UPDATE Salespeople SET comm = comm * 2 WHERE city = "London";

KUREKEBISHA MAADILI TUPU

Kifungu cha SET sio kihusishi. Anaweza kuingiza maadili tupu NULL kama alivyoingiza maadili bila kutumia syntax maalum (kama vile IS NULL). Kwa hivyo ikiwa ungetaka kuweka ukadiriaji wote wa wateja huko London kuwa NULL, unaweza kuingiza taarifa ifuatayo: SASISHA wateja WEKA ukadiriaji = NULL WHERE city = "London"; ambayo itaweka upya ukadiriaji wote wa wateja huko London.

MUHTASARI

Sasa umebobea ustadi wa kudhibiti yaliyomo kwenye hifadhidata yako kwa kutumia amri tatu rahisi: INSERT - iliyotumiwa kuingiza safu katika hifadhidata; FUTA - kuzifuta; MAREJELEO - kubadilisha thamani katika safu mlalo zilizoingizwa tayari. Ulijifunza kutumia kihusishi kilicho na amri za UPDATE na DELETE ili kubaini ni safu zipi ambazo amri itaathiri. Bila shaka, vihusishi kama hivyo havina maana KUINGIZA, kwa sababu safu mlalo inayohusika haipo kwenye jedwali hadi amri ya INGIZA ikamilike. Hata hivyo, unaweza kutumia maswali ya INSERT kuweka safu mlalo zote kwenye jedwali mara moja. Kwa kuongeza, unaweza kufanya hivyo na safu kwa mpangilio wowote. Umejifunza kuwa thamani chaguomsingi zinaweza kuwekwa kwenye safu wima isipokuwa utaweka thamani kwa uwazi. Umeona matumizi pia thamani ya kawaida chaguo-msingi, ambayo ni NULL. Pia, uligundua kuwa UPDATE inaweza kutumia usemi wa thamani ilhali INSERT haiwezi. Sura inayofuata itapanua maarifa yako kwa kukuonyesha jinsi ya kutumia maswali madogo na amri hizi. Maswali haya madogo yanafanana na yale ambayo tayari unayafahamu, lakini kuna athari na vikwazo maalum wakati hoja ndogo zinatumiwa katika amri za DML, ambazo tutazijadili katika Sura ya 16.

KUFANYA KAZI NA SQL

1. Andika amri ambayo ingeweka maadili yafuatayo, kwa mpangilio wao ulio hapa chini, kwa jedwali la Wauzaji: jiji - San Jose, jina - Bianco, comm - NULL, cnum - 1100. 2. Andika amri ambayo ingefuta maagizo yote ya mteja wa Clemens kwenye jedwali la Maagizo.

3. Andika amri ambayo ingeongeza ukadiriaji wa wateja wote nchini Roma kwa 100.

4. Muuzaji wa Serres aliondoka kwenye kampuni. Wape wateja wake tena muuza Motika.

Kazi kuu wakati wa kuunda hifadhidata za uhusiano ni malezi ya uhusiano bora.

Ili kurasimisha mchakato wa kujenga hifadhidata bora ya uhusiano, nadharia ya kuhalalisha hutumiwa, kwa kuzingatia ukweli kwamba seti fulani ya uhusiano ina mali bora wakati wa kujumuisha, kurekebisha na kufuta data kuliko seti zingine zote za uhusiano ambazo data hiyo hiyo inaweza. kuwakilishwa (tazama Sura ya 4).

Urekebishaji unafanywa kwa kufuatana kwa kutumia fomu tano za kawaida, ikiwa ni pamoja na fomu ya Boyce-Kodz.

Hapa ndipo ujenzi wa hifadhidata ya "karatasi" unaisha. Utekelezaji wa kompyuta wa hifadhidata imedhamiriwa na lugha za maelezo (DL) na udanganyifu (DML) za data. Wanaweza kutegemea algebra ya uhusiano(lugha za kiutaratibu) na hesabu za uhusiano za tuples na vikoa (lugha tangazo). Lugha ya SQL inategemea calculus tuple, na lugha ya QBE inategemea calculus ya kikoa.

Wacha tuangalie uwezo wa lugha za SQL na QBE. Matumizi yao ya vitendo yamefafanuliwa katika Sura. 15.

Lugha ya SQL

Kuna anuwai nyingi na lahaja za SQL. Hapa tunaelezea masharti makuu ya toleo la msingi: zaidi maelezo ya kina lugha inatolewa katika.

Kielelezo Lugha ya SQL Wacha tutumie mfano wa hifadhidata ya "Ugavi" iliyowasilishwa kwenye jedwali. 5.3–5.5. Kwa ajili yake, mchoro wa uunganisho wa Ufikiaji unaonyeshwa kwenye Mtini. 5.2.

Jedwali 5.3

"Wauzaji"

Jedwali 5.4

"Wateja"

St. Petersburg

Jedwali 5.5

"Maagizo"

Majina ya uwanja wa jedwali

Jedwali la "Wauzaji":

pnom - nambari ya kipekee ya muuzaji, ufunguo wa msingi;

jina - jina la muuzaji;

mji - jiji ambalo muuzaji yuko;

com - tume ya muuzaji.

Jedwali "Wateja":

kujua - nambari ya kipekee ya mteja, ufunguo wa msingi;

pnom - nambari ya muuzaji, ufunguo wa kigeni.

Jedwali "Maagizo":

prnom - nambari ya utaratibu wa kipekee, ufunguo wa msingi;

sumpr - kiasi (yen) ya agizo;

datpr - tarehe ya kupokea agizo;

znom - nambari ya mteja anayefanya agizo, ufunguo wa kigeni;

pm - nambari ya muuzaji anayeuza agizo, ufunguo wa kigeni.

Mchele. 5.2. Mchoro wa uunganisho

Kuna lugha tuli na zenye nguvu Upangaji wa SQL. KATIKA lugha tuli maana za vitu vyote zimeandikwa kwa uwazi. KATIKA lugha yenye nguvu SQL badala ya maadili ya kitu, vigezo hutumiwa, data ambayo huingizwa kwa maingiliano na mtumiaji, au hukopwa wakati wa utekelezaji wa programu kutoka kwa meza nyingine (databases).

Lugha ya programu tuli SQL

Katika lugha ya SQL, inawezekana kutofautisha makundi matatu makuu ya shughuli: uumbaji (CREATE), sasisha (INGIZA, UPDATE, DELETE), swala (CHAGUA). Wana kufuata viwango, ambamo nukuu ifuatayo inatumika: | - kila kitu kinachotangulia ishara kinaweza kubadilishwa na kile kinachofuata; () - kitengo kimoja cha kutumia ishara; - kujieleza kwa hiari; ... - kurudia nambari ya kiholela mara moja; - kurudiwa kwa idadi ya nyakati kiholela, lakini tukio lolote linatenganishwa na koma.

(5.1)

Aina za data zinaweza kuwa "INTEGER, CHARACTER, DECIMAL, NUMERIC, SMALLINT, FLOAT, REAL, PRECISION, LONG, VARCHAR, DATE, TIME. Aina nne za mwisho hazijajumuishwa katika kiwango cha SQL, lakini zinaweza kuungwa mkono nayo.

Aina ya safu wima (na aina ya jedwali) inaweza kuwa: KIPEKEE, UFUNGUO WA MSINGI, ANGALIA<предикат>,HALALI=<список полей>, REJEA<имя таблицы> [(<имя столбца>.,...)|.

(5.3)

(5.4)

Kuna aina tatu za SQL: ingiliani, iliyoorodheshwa na inline.

Interactive SQL hutumiwa kuendesha moja kwa moja kwenye hifadhidata ili kutoa pato kwa matumizi ya mteja.

SQL iliyopachikwa inajumuisha amri za SQL zilizowekwa ndani ya programu ambazo kwa kawaida huandikwa katika lugha nyingine (kama vile COBOL au Pascal). Hii inafanya programu hizo kuwa na nguvu zaidi na ufanisi.

Tutazingatia kimsingi (bila kukosekana kwa marejeleo) lugha ya mwingiliano.

♦ LUGHA YA SQL INGILIANO

Inawezekana kusisitiza:

  • DDL (Lugha ya Maelezo ya Data) ni lugha ya maelezo ya schema na katika ANSI ina amri zinazounda vitu (meza, faharisi, maoni) katika hifadhidata;
  • DML (Lugha ya Udanganyifu wa Data) ni seti ya amri zinazoamua ni maadili gani yanawasilishwa kwenye jedwali wakati wowote;
  • DCD (Lugha ya Kudhibiti Data) inajumuisha zana zinazofafanua ikiwa mtumiaji anaruhusiwa kufanya vitendo fulani.

Kwa msingi wake, lugha ya SQL ni lugha maalum ya kuuliza, na kwa hivyo idadi kubwa zaidi ya michanganyiko ipo kwa CHAGUA taratibu. Walakini, ni rahisi zaidi kupanga maagizo kulingana na mzunguko wa kiteknolojia wa kufanya kazi na hifadhidata:

  • 1) kuunda hifadhidata - miundo ya meza, kuunda maoni, kujaza hifadhidata na data, kuhakikisha uadilifu, mfumo wa ufikiaji (ruhusa), kamusi ya data, hali ya watumiaji wengi;
  • 2) kutumia hifadhidata - uliza ndani aina mbalimbali(pamoja na sasisho).

Kuunda hifadhidata

Muundo wa meza. Majedwali (tupu) huundwa kwa amri ya CREATE TABLE (maneno (5.1)).

(5.5)

Amri ya CREATE TABLE kimsingi hubainisha jina la jedwali, seti ya majina ya safu wima iliyobainishwa kwa mpangilio maalum, aina za data, na saizi za safu wima.

Majedwali yanamilikiwa na mtumiaji aliyeyaunda, na majina ya jedwali zote zinazomilikiwa na kwa mtumiaji huyu, lazima iwe tofauti kutoka kwa kila mmoja, pamoja na majina ya safu wima zote ndani ya jedwali fulani. Mpangilio wa safu katika jedwali imedhamiriwa na mpangilio ambao zimeorodheshwa.

SQL hukuruhusu kuunda majedwali ya muda, "maisha" ambayo ni kipindi cha hifadhidata (muda kutoka ufunguzi hadi kufunga hifadhidata).

Jedwali linaweza kuwa la kimataifa, ambayo ni, kupatikana kwa programu nzima ya programu iliyoiunda:

TUNZA Wauzaji wa MEZA YA MUDA YA GLOBAL

(nambari kamili,

jina char (10),

sura ya jiji (10),

comm decimal);

Inaweza kuwa ya kawaida, kupatikana tu kwa moduli ya programu ambayo iliundwa:

TUNZA Wachuuzi wa MEZA YA MUDA YA MTAA

(nambari kamili,

jina char (10),

sura ya jiji (10),

comm decimal);

Kubadilisha jedwali baada ya kuundwa hufanywa kwa amri ya ALTER TABLE. Kwa kawaida, huongeza safu kwenye meza. Wakati mwingine inaweza kuondoa au kubadilisha ukubwa wa safuwima, na katika baadhi ya programu, kuongeza au kuondoa vikwazo. Ili kuongeza safu kwenye jedwali, tumia umbizo:

MEZA BADILISHA<имя таблицы>ONGEZA<имя поля>

<тип данных> <размер>;

Safu itaongezwa mwisho na yenye thamani NULL kwa safu mlalo zote kwenye jedwali.

Uondoaji unafanywa kwa amri

DONDOSHA TABLE<имя таблицы>;

Lazima uwe muundaji wa jedwali ili uweze kuifuta.

Fahirisi huundwa na kufutwa kwa njia ile ile.

Jedwali la msingi (5.5) linawasilishwa kwa fomu rahisi zaidi na litaendelezwa zaidi: meza nyingine zitaundwa baadaye. Sasa hebu tuangalie tu kuunda mtazamo.

Muundo na maudhui ya aina. Jedwali ulilounda hivi punde linaitwa jedwali la msingi. Unaweza kuunda mtazamo (Tazama) - meza ambazo maudhui yake yanachukuliwa au yanayotokana na meza nyingine. Mtazamo umeundwa kwa amri ya CREATE VIEW:

UNDA MAONI Moscow1

KUTOKA kwa Wauzaji

WAPI mji = "Moscow";

Moscow 1 - utendaji (mtazamo). Inatumika kwa madhumuni ya usalama wa habari na huhesabiwa kila wakati ombi linapofanywa na kwa hivyo data inasasishwa kiotomatiki. Inaweza kutumika kama jedwali lingine lolote la msingi, lakini kuna mahususi kwa taratibu za ufikiaji na kusasisha.

Idadi kubwa ya aina za kutazama ni za kusoma tu. Hii inamaanisha kuwa zinaweza kuulizwa, lakini haziwezi kuathiriwa na amri za urekebishaji.

Kuna baadhi ya aina ya maswali ambayo hayaruhusiwi katika ufafanuzi wa mwonekano: mwonekano mmoja lazima uzingatie hoja moja; MUUNGANO na MUUNGANO WOTE, kazi za jumla, DISTINCT katika ufafanuzi, mashamba yaliyohesabiwa hayaruhusiwi wakati wa kufanya kazi na maoni; ORDER BY haitumiki kamwe katika kufafanua maoni.

Kuondoa maoni hufanywa na (mmiliki wake) amri

ONDOA TAZAMA<имя вида>.

Kujaza hifadhidata na data. Thamani zinaweza kuingizwa na kuondolewa kutoka kwa sehemu kwa kutumia amri za DML (Lugha ya Udhibiti wa Data) INGIA, FUTA - misemo (5.2) na (5.3). Kwa hiyo, kwa mfano, kuingiza safu kwenye meza ya Wauzaji, unaweza kutumia hali ifuatayo;

Ingiza ndani ya Wauzaji

MAADILI (", "Strokov", "Moscow", .12);

Unaweza pia kuingiza thamani tupu (NULL).

Inawezekana kutaja safu wima kwa mpangilio wowote, kwa mfano,

WEKA KWA Wateja (mji, jina, nambari)

MAADILI ("Moscow", "Ivanov", 2001);

Safu zilizoingizwa kwa makosa hufutwa kwa kutumia amri ya DELETE. Inaweza tu kufuta safu mlalo zilizoingizwa, si thamani za sehemu mahususi, kwa hivyo kigezo cha sehemu ni cha hiari au hakipatikani. Ili kufuta yaliyomo yote ya jedwali la "Wauzaji", lazima uweke:

FUTA KUTOKA KWA Wauzaji;

Jedwali sasa ni tupu na linaweza kufutwa kabisa kwa amri ya DROP TABLE. Kwa kawaida unataka tu kuondoa baadhi ya safu mahususi kutoka kwa jedwali, ambayo hufanywa kwa kutumia kiambishi. Kwa mfano, ili kuondoa data ya muuzaji Kozlov kutoka kwa meza ya Wafanyabiashara, unaweza kuingia

FUTA KUTOKA KWA Wauzaji

WAPI pnom = 1003;

Amri za INGIZA na KUFUTA pamoja na amri ya UPDATE hutumiwa katika utaratibu wa kusasisha wakati wa kuendesha hifadhidata.

Zoezi (usalama) uadilifu. Hii ni tofauti ya amri ya CREATE TABLE ambayo inakuwezesha kuweka vikwazo kwenye meza.

Kizuizi cha safu wima kinawekwa mwishoni mwa jina la safu wima, baada ya aina ya data na kabla ya koma. Vizuizi vya jedwali vimewekwa mwishoni mwa jina la jedwali, baada ya jina la safu wima ya mwisho lakini kabla ya mabano ya mwisho:

TENGENEZA JEDWALI<имя таблицы>

Kizuizi cha jedwali > (<имя столбца>

[, <имя столбца> ]...);

Hebu tuorodhe baadhi ya vikwazo.

  • 1. Kuondoa viashiria tupu (NULL) kwa kuanzisha amri ya NOT NULL.
  • 2. Upekee wa data na funguo msingi.

Kubana safu wima ya UNIQUE kwenye sehemu wakati wa kuunda jedwali kutakataa jaribio lolote la kuingia katika sehemu hiyo kwa mojawapo ya safu mlalo thamani ambayo tayari iko katika safu mlalo nyingine. Kizuizi hiki kinaweza kutumika kwa sehemu ambazo zimetangazwa kuwa SI BATILI.

  • 3. SQL inaauni vitufe vya msingi moja kwa moja na kikwazo cha UFUNGUO WA MSINGI. Vifunguo vya msingi haiwezi kuwa na maadili NULL. Hii ina maana kwamba, kama sehemu zilizo katika kikwazo cha KIPEKEE, sehemu yoyote inayotumiwa katika kikwazo cha PRIMARY KEY lazima iwe tayari itangazwe SIYO BATILI.
  • 4. Vikwazo kwa maadili ya shamba. Kizuizi cha CHECK kinatumika kwa hili: kuzuia hitilafu uingizaji usio sahihi maadili ya "comm", tutaweka kizuizi cha safu - CHECK ("comm" ni chini ya I).

Ya juu yanaweza kuwasilishwa kwa fomu

TENGENEZA Wachuuzi wa TABLE

sura ya jiji (10),

comm decimal CHECK (comm< 1));

Vipindi na seti za maadili ya vizuizi vinaweza kubainishwa.

Wacha kwanza tuunda jedwali la "Maagizo":

TENGENEZA Maagizo ya TABLE

(nambari kamili SI NULL UNIQUE,

supr decimal,

datepr date SIYO BATILI,

nambari kamili ya thamani SIYO BATILI,

nambari kamili ya pnom SI NULL);

5. Weka maadili chaguo-msingi kuwa nambari.

Thamani DEFAULT imebainishwa katika amri ya CREATE TABLE kwa njia sawa na kizuizi cha safu.

Ikiwa ofisi iko Orel na wauzaji wengi pia wanaishi Orel, basi kwa chaguo-msingi:

TENGENEZA Wachuuzi wa TABLE

(nom integer NOT NULL UNIQUE,

jina char(10) SI UTUPU WA KIPEKEE,

city ​​char(10) DEFAULT = "Eagle",

comm decimal CHECK (comm< 1);

6. Vikwazo muhimu vya kigeni (uadilifu wa marejeleo). SQL hudumisha uadilifu wa marejeleo katika amri ya CREATE TABLE (au ALTER TABLE). kizuizi cha NJE KEY yenye syntax

UFUNGUO WA NJE<список полей>MAREJEO

Jedwali lenye ufunguo mzazi > [<список полей>.

Hebu tuunde jedwali "Wateja" na sehemu ya "pnom" ikifafanuliwa kama ufunguo wa kigeni unaorejelea jedwali "Wauzaji":

TENGENEZA Wateja wa TABLE

(nambari kamili ya maarifa SIYO NULL PRIMARY KEY char ya msimu wa baridi(10), char ya jiji(10),

nambari kamili ya pnom,

UFUNGUO WA KIGENI (Pnom) MAREJEO Wauzaji (Pnom);

Kizuizi kinaweza kuletwa tofauti:

CONSTRAINT muhimu FOREIGN KEY (mon)

MAREJEO Wauzaji(Pnom);

Utangulizi huu wa kizuizi ni rahisi kwa sababu hukuruhusu kufuta moja kwa moja au kuandika usemi mwingine bila kubadilisha mpango wa kuunda meza. Kuondoa kizuizi

DROP CONSTRAINT field_nom;

hasa rahisi ikiwa meza imejaa.

Kumbuka kwamba ufunguo wa mzazi lazima uwe wa kipekee na usiwe na thamani zozote batili. Hii haitoshi kwa ufunguo wa mzazi wakati wa kutangaza ufunguo wa kigeni. SQL lazima iwe na uhakika kuhusu thamani mbili au maadili tupu(NULL) hazikuingizwa kwenye ufunguo wa mzazi, i.e.

TENGENEZA Wachuuzi wa TABLE

(nambari kamili SIYO NULL PRIMARY KEY,

jina char(10) SI UFUPI,

sura ya jiji (10),

comm decimal);

TENGENEZA Wateja wa TABLE

char ya msimu wa baridi(10) SI UFUPI,

sura ya jiji (10),

WAUZAJI WA MAREJEO YA KIGENI (πηομ),

UNIQUE (znom, pnom);

TENGENEZA Maagizo ya TABLE

(nambari kamili SIYO UFUNGUO NULL MSINGI,

supr decimal,

datepr date SIYO BATILI,

nambari kamili ya thamani SIYO BATILI

nambari kamili ya pnom SIYO BATILI

UFUNGUO WA KIGENI (znom, pnom) MAREJEO

Wateja (Znom, Pnom);

Kwa hivyo, meza zote tatu zinaundwa na uhusiano kati yao umeanzishwa.

Ikiwa unahitaji kubadilisha au kufuta thamani ya sasa ya marejeleo ya ufunguo wa mzazi, una chaguo tatu:

  • 1) zuia au piga marufuku mabadiliko (kwa njia ya ANSI), ikionyesha kuwa mabadiliko katika ufunguo wa mzazi yamezuiliwa (IMEZUILIWA);
  • 2) unaweza kufanya mabadiliko katika ufunguo wa mzazi na hivyo mabadiliko ya moja kwa moja katika ufunguo wa kigeni, yaani mabadiliko ya cascade (CASCADES);
  • 3) fanya mabadiliko katika ufunguo wa mzazi na uweke kiotomati ufunguo wa kigeni kwa NULL (ikizingatiwa kuwa NULLS inaruhusiwa kwenye ufunguo wa kigeni) - mabadiliko tupu ya ufunguo wa kigeni (NULL).

Kwa mfano, sasisha na kuharibu

TENGENEZA Wateja wa TABLE

(nambari kamili SIYO UFUNGUO NULL MSINGI,

char ya msimu wa baridi(10) SI UFUPI, char ya jiji(10),

USASISHAJI WA MICHEZO,

KUFUTA Wauzaji WAMEZUIWA);

Ikiwa sasa unajaribu kuondoa Strokov kutoka kwenye meza ya "Wauzaji", amri haitakuwa halali mpaka thamani ya "pnom" shamba "Wateja" na Ivanov na Krabov hubadilishwa kwa muuzaji mwingine aliyepewa.

Wakati huo huo, unaweza kubadilisha thamani ya uwanja wa "Pnom" kwa Strokov hadi 1009, na kwa data ya Ivanov na Krabs, maadili ya uwanja wa "Pnom" pia yatabadilishwa moja kwa moja.

Mabadiliko NULL (tupu) pia yanawezekana. Kwa mfano,

TENGENEZA Maagizo ya TABLE

nambari kamili ya prnom SI UFUNGUO NULL MSINGI,

supr decimal,

datepr date SIYO BATILI,

Nambari kamili ya 3HOM SI MAREJEO FUPI Wateja,

mon integer MAREJEO Wauzaji,

USASISHAJI WA CASCADES Wateja,

FUTA WATEJA WA CASCADES,

HABARI ZA Wauzaji wa CASCADES,

KUFUTA NULLS za Wauzaji);

Kwa kawaida, katika amri ya KUFUTA yenye athari NULL katika jedwali la "Wachuuzi", kikwazo cha NOT NULL lazima kiondolewe kwenye sehemu ya "pnom".

Kwa kutumia lugha ya SQL, hifadhidata, utaratibu uliohifadhiwa, jenereta, kihesabu, kichochezi kinaweza kufafanuliwa.

Hifadhidata imeundwa kama hii:

TUNZA HABARI "d:...a1 .gdb"

NENOSIRI "masterkey"

Seti ya herufi chaguomsingi WIN 1251

Utaratibu uliohifadhiwa:

UNDA UTARATIBU Rashod_Tovara(IN_Tovar varchar (20))

MREJESHO(OUT_Tovar varchar(20))

KWA Bidhaa CHAGUA

WAPI Bidhaa=: IN_Tovar

Jenereta imeainishwa na taratibu mbili:

TENGENEZA UTARATIBU Pata_N_Rash;

WEKA JENERETA RASHOD_N_Rash KWA 1;

tengeneza UTARATIBU Pata_N_Rash

RUDISHI(Nambari kamili ya NR)

NR=Gen_ID(RASHOD_N_Rash, 1);

Cascade kianzisha sasisho:

TUNZA TRIGGER BU_Kipengee IKIWA ILIVYO

IKIWA (OLD.TovarONEW.Tovar) BASI

WEKA Bidhaa=MPYA.Tovar

WAPI Product=OLD.Tovar;

Mfumo ruhusa. Mfumo wa kuruhusu (mapendeleo) au kukataa ufikiaji wa data inawezekana. Hebu tukumbushe kwamba wasimamizi wa hifadhidata wenyewe huunda watumiaji na kuwapa mapendeleo. Hata hivyo, watumiaji wanaounda majedwali pia wana haki ya kudhibiti majedwali hayo.

Upendeleo ndio huamua ikiwa mtumiaji maalum endesha amri hii.

Hebu fikiria kanuni za msingi za ujenzi wao kulingana na lugha ya SQL. Vipaumbele vifuatavyo vinatofautishwa (kwa mpangilio wa kushuka): jukumu, mtumiaji, kikundi, ufikiaji wa jumla(umma).

Kuna kuruhusu na kukataza vitendo.

Ruhusa inatolewa na mwendeshaji wa fomu

RUZUKU<вид операции>

WASHA<объект>

KWAMBA<субъект>

Mstari wa mwisho unazungumza juu ya uhamishaji wa haki ya matumizi.

Kwa usimamizi wa ujasiri, mchanganyiko wa msimamizi wa hifadhidata na mmiliki wa kitu (kwa mfano, meza) inahitajika.

Uundaji wa mtumiaji Ilya (ambaye amepewa uwezo wa kuunda hifadhidata), iliyofanywa na msimamizi wa hifadhidata, imedhamiriwa na amri.

UNDA MTUMIAJI Ilya

NA MApendeleo create.db;

kumnyima mtumiaji huyu marupurupu hufanywa kwa amri

DONDOSHA MTUMIAJI Ilya;

uundaji wa jukumu (na nenosiri) unafanywa na amri

TUNZA WAJIBU create_db KWA NENOSIRI = "12";

na kunyimwa jukumu na timu

DROP ROLE create_db;

Kuna aina kadhaa za marupurupu yanayolingana na aina kadhaa za shughuli. Mapendeleo yanatolewa na kubatilishwa kwa kutumia amri mbili za SQL: GRANT na BATILISHA.

Kila mtumiaji katika mazingira ya SQL ana jina maalum la kitambulisho (kitambulisho - ID) au nambari.

Kitambulisho cha ruhusa ni jina la mtumiaji. SQL inaweza kutumia neno muhimu USER, ambalo linamaanisha kitambulisho cha ufikiaji kinachohusishwa na amri ya sasa. Amri inatafsiriwa na kuruhusiwa (au kukataliwa).

Haki za kitu zinahusishwa na watumiaji na majedwali. Jambo moja la kukumbuka ni kwamba mtumiaji aliyeunda meza (ya aina yoyote) ndiye mmiliki wa meza hiyo: ana haki zote kwenye meza hiyo na anaweza kuhamisha marupurupu hayo kwa watumiaji wengine.

Mapendeleo yanatumika kwa amri za CHAGUA, INGIZA, SASISHA, FUTA, MAREJEO (kufafanua ufunguo wa kigeni unaotumia safu wima moja au zaidi za jedwali hili kama ufunguo mzazi).

Amri zisizo za kawaida ni pamoja na INDEX, ambayo inatoa haki ya kuunda faharasa kwenye jedwali, na ALTER, ambayo hutekeleza amri ya ALTER TABLE kwenye jedwali. Injini ya SQL inapeana haki hizi kwa watumiaji wanaotumia amri ya GRANT.

Kwa mfano, mtumiaji Ilya ana jedwali "Wateja" na anataka kumruhusu mtumiaji Peter kuendesha hoja dhidi yake:

MPE Petro CHAGUO KWA Wateja;

Peter anaweza kutekeleza maswali dhidi ya jedwali la Wateja, lakini hawezi kutoa haki ya CHAGUA kwa mtumiaji mwingine: jedwali bado ni la Ilya.

Mapendeleo ya kikundi pia yanawezekana:

TOA CHAGUA, WEKA KWA Maagizo KWA Ilya, Peter;

Unaweza pia kubainisha sehemu tofauti za amri za UPDATE na REFERNCES:

USASISHAJI (comm) KWA Wauzaji KWA Ilya;

Haki ya MAREJELEO inaweza kubainishwa kama orodha ya safu wima moja au zaidi ambazo upendeleo huu umewekewa vikwazo. Kwa mfano, Ilya anaweza kumpa Stepan haki ya kutumia sehemu za jedwali la Wateja kama jedwali kuu la ufunguo kwa kutumia amri ifuatayo:

MAREJEO YA RUZUKU (baridi, joto)

KWA Wateja KWA Stepan;

SQL inaauni hoja mbili kwa amri ya GRANT ambazo zina maana maalum: FAIDA ZOTE (mapendeleo yote) au ZOTE kwa amri na UMMA (jumla) kwa watumiaji.

UTOE WOTE KWA WATEJA KWA UMMA;

Uwezo wa mtumiaji kuhamisha mapendeleo aliyopewa unatekelezwa na kifungu cha CHAGUO LA RUZUKU.

Wakati mwingine muundaji wa meza anataka watumiaji wengine waweze kupata marupurupu kwenye meza yake. Hii kwa kawaida hufanywa katika mifumo ambapo mtu mmoja au zaidi huunda majedwali kadhaa (au yote) ya msingi katika hifadhidata na kisha kuwakabidhi wajibu kwa wale ambao watafanya kazi nao. SQL hukuruhusu kufanya hivi kwa kutumia kifungu cha CHAGUO LA RUZUKU.

Acha Ilya ahamishe haki kwa Peter kwa fursa ya CHAGUA kwenye jedwali la "Wateja":

TOA UCHAGUZI KWA Wateja KWA Petr

KWA CHAGUO LA RUZUKU;

Inawezekana kuruhusu utaratibu wa kuangalia jumuishi kufanya kazi

KWENYE UTARATIBU integ_check

Haki kwenye amri ya INSERT, kwa mfano, inaweza kubatilishwa:

FUTA KUINGIZA KWA AGIZO KUTOKA KWA Peter;

Orodha zinaweza pia kutumika hapa:

FUTA INGIZA, FUTA KWA Wateja KUTOKA KWA Peter, Stepan;

Inawezekana kuweka (au kubatilisha) mapendeleo kwa kutumia aina zilizojadiliwa hapo awali. Kwa mfano,

UNDA MAONI Moscow 1

CHAGUA majira ya baridi, jina KUTOKA kwa Wauzaji;

Moscow1 hutoa fursa ya SELECT katika mtazamo (mtazamo), na sio kwenye jedwali la "Wauzaji" yenyewe:

RUZUKU CHAGUA KWENYE Moscow1 KWA Victor;

Mapendeleo yanaweza pia kupunguzwa na mistari ifuatayo:

UNDA MAONI Moscow2

KUTOKA KWA Wateja

WAPI mji = "Sochi"

NA CHAGUO HIKI;

RUZUKU UPDATE ON Moscow2 KWA Peter;

Kifungu cha CHAGUO LA KUANGALIA humzuia Petr kubadilisha thamani ya sehemu ya "mji" na thamani yoyote isipokuwa Sochi.

Kuna chaguzi kadhaa za kufanya kazi na maoni.

Mfumo wa ukubwa wowote huwa na aina fulani ya mtumiaji mkuu - mara nyingi Msimamizi wa Hifadhidata au DBA. Ana haki za mfumo zifuatazo: CONNECT (unganisha), RESOURCE (rasilimali) na DBA (Msimamizi wa Hifadhidata).

CONNECT inajumuisha haki ya kujiandikisha na haki ya kuunda maoni na visawe, RESOURCE ina haki ya kuunda meza za msingi, DBA ni fursa ambayo inampa mtumiaji mamlaka ya juu katika hifadhidata.

Mifumo mingine ina mtumiaji maalum, wakati mwingine huitwa SYSADM au SYS ( Msimamizi wa Mfumo Hifadhidata), ambayo ina mamlaka ya juu zaidi.

Amri ya GRANT, katika fomu iliyorekebishwa, inaweza kutumika na marupurupu ya kitu pamoja na mapendeleo ya mfumo:

MPE Rasilimali Miron;

Kwa kawaida, mtumiaji Myron lazima aundwe.

Mtumiaji anaweza pia kuwa na nenosiri (kwa mfano, Ivan). Kisha amri inaonekana kama

RUZUKU MUUNGANO KWA Fedor ILIYOTAMBULISHWA NA Ivan;

ambayo itaunda mtumiaji anayeitwa Fedor, kumpa haki ya kujiandikisha na kumpa nenosiri la Ivan.

Ikiwa unataka kumzuia mtumiaji kuingia, unapaswa kutumia fursa ya CONNECT kwenye REVOKE, ambayo "huondoa" mtumiaji huyo.

Marufuku (ya kuunda majedwali katika hifadhidata mpya ya kikundi cha karani) ina fomu

Wakati mwingine ni muhimu kwamba katika swala la sql, ikiwa hali inakabiliwa, shamba moja (au kujieleza) huchaguliwa, na vinginevyo uwanja mwingine (au kujieleza) huchaguliwa, i.e. kuchagua uga au usemi kulingana na hali. Au, unahitaji kusasisha maadili kwenye hifadhidata kulingana na hali. Ili kutatua tatizo hili, unahitaji kutumia taarifa ya CASE. Opereta huyu ana chaguzi 2 za syntax, ambayo kila moja ni rahisi katika kesi zake. Nitatoa mifano wazi ya njia zote mbili.

Mfano 1. Inaonyesha matokeo tofauti kulingana na thamani katika sehemu.

CHAGUA ProductNumber, Category = CASE Productline WAKATI "R" ALAFU "Barabara" WAKATI "M" HALAFU "Mlima" WAKATI "T" HALAFU "Touring" WAKATI "S" KISHA "Vitu vingine vya mauzo" VINGINEVYO "Haviuzwi" MWISHO, Jina KUTOKA KWA Uzalishaji. Agizo la Bidhaa KWA Nambari ya Bidhaa

KATIKA katika mfano huu kila kitu ni rahisi: ikiwa ProductLine = "R", basi uteuzi wa matokeo utakuwa na maandishi "Barabara", ikiwa ProductLine = "M" - basi tutapata "Mlima" katika matokeo, nk.

Mfano 2. Hali ngumu zaidi ya kupata maandishi tofauti kulingana na thamani kwenye sehemu.

CHAGUA Nambari ya Bidhaa, Jina, "Msururu wa Bei" = KESI WAKATI ListPrice = 0 KISHA "Kipengee cha Mfg - si cha kuuzwa tena" LINI ListPrice< 50 THEN "Under $50" WHEN ListPrice >= 50 na ListPrice< 250 THEN "Under $250" WHEN ListPrice >= 250 na ListPrice< 1000 THEN "Under $1000" ELSE "Over $1000" END FROM Production.Product ORDER BY ProductNumber

Mfano 3. Kutumia muundo kama "IF BASI VINGINEVYO" katika hoja

CHAGUA Jina la Kwanza, Jina la Mwisho, Nambari ya Simu, KESI WAKATI Maagizo Maalum ya Simu YAPO BATILI KISHA "Wakati Wowote" VINGINEVYO Simu Maagizo Maalum YANAISHIA JAMAA Wakati Mawasiliano KUTOKA kwa Mtu.vAdditionalContactInfo.

Mfano 4. Kutumia hali wakati wa kupanga hoja husababisha ORDER BY

CHAGUA Kitambulisho cha Mfanyakazi, MfanyakaziFIO, Bendera ya Mshahara KUTOKA KWA AGIZO LA Mfanyikazi KWA KESI WAKATI SalariedFlag = 1 KISHA KITAMBULISHO CHA MFANYAKAZI WAKATI SalariedFlag = 0 KISHA MfanyakaziFIO MWISHO

Kanuni ya kupanga na hali ni kwamba kwanza maadili yote yatapatikana kulingana na hali (yaani, uwanja wa ziada utapokelewa), baada ya hapo matokeo yote ya swala yatapangwa kulingana na matokeo ya hali hiyo. Ndiyo maana matokeo ya hali lazima yawe ya aina moja ya data.

Mfano 5. Sasisha uga na data mpya kulingana na hali.

SASISHA Mfanyakazi WEKA LikizoHours = KESI WAKATI LikizoSaa< 10 THEN VacationHours + 40 ELSE VacationHours + 20 END OUTPUT Deleted.EmployeeID, Deleted.VacationHours AS BeforeValue, Inserted.VacationHours AS AfterValue WHERE SalariedFlag = 0

Katika mfano huu, 40 huongezwa kwenye uga wa VacationHours ikiwa VacationHours ni chini ya 10, vinginevyo 20 huongezwa. Baada ya masasisho kukamilika, hoja pia itaonyesha jedwali lenye safu wima za Kitambulisho cha Mfanyakazi na thamani ya sehemu ya Saa za Likizo "Kabla" na "Baada ya" sasisho.

  • Tafsiri
  • Mafunzo
Je, unahitaji "CHAGUA * WAPI a=b KUTOKA c" au "CHAGUA WAPI a=b KUTOKA c HADI *"?

Ikiwa wewe ni kama mimi, utakubali: SQL ni mojawapo ya mambo ambayo yanaonekana kuwa rahisi mwanzoni (husomwa kama Kiingereza!), lakini kwa njia fulani itabidi Google kila swali rahisi kupata syntax sahihi.


Na kisha kujiunga, mkusanyiko, subqueries huanza, na inageuka kuwa takataka kabisa. Kitu kama hiki:


CHAGUA wanachama.jina la kwanza || ""|| wanachama.jina la mwisho AS "Jina Kamili" KUTOKA kwa ukopaji INNER JOIN wanachama ON members.memberid=borrowings.memberid INNER JIUNGE vitabu ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (CHAGUA kitabu KUTOKA vitabu WHERE stock>(CHAGUA wastani(hisa) ) KUTOKA kwenye vitabu)) KUNDI LA wanachama.jina la kwanza, wanachama.jina la mwisho;

Bue! Hii itamwogopa mgeni yeyote, au hata msanidi wa kiwango cha kati ikiwa anaona SQL kwa mara ya kwanza. Lakini sio yote mabaya.


Ni rahisi kukumbuka ni nini angavu, na kwa mwongozo huu ninatumai kupunguza kizuizi cha kuingia kwenye SQL kwa wanaoanza na kuwapa wale ambao tayari wamepitia njia mpya ya kuangalia SQL.


Ingawa sintaksia ya SQL ni sawa kati ya hifadhidata tofauti, kifungu hiki kinatumia PostgreSQL kwa maswali. Baadhi ya mifano itafanya kazi katika MySQL na hifadhidata zingine.

1. Maneno matatu ya uchawi

SQL ina mengi maneno muhimu, lakini SELECT , FROM na WHERE zipo katika karibu kila hoja. Baadaye kidogo utaelewa kuwa maneno haya matatu yanawakilisha vipengele vya msingi zaidi vya kuunda maswali ya hifadhidata, na maswali mengine magumu zaidi ni nyongeza tu juu yao.

2. Msingi wetu

Wacha tuangalie hifadhidata tutakayotumia kama mfano katika nakala hii:







Tuna maktaba ya kitabu na watu. Pia kuna meza maalum ya kurekodi vitabu vilivyotolewa.

  • Jedwali la "vitabu" huhifadhi maelezo kuhusu kichwa, mwandishi, tarehe ya uchapishaji na upatikanaji wa kitabu. Ni rahisi.
  • Katika jedwali la "wanachama" - majina ya kwanza na ya mwisho ya watu wote waliojiandikisha kwa maktaba.
  • Jedwali la "kukopa" huhifadhi habari kuhusu vitabu vilivyochukuliwa kutoka kwa maktaba. Safu wima ya kitabu inarejelea kitambulisho cha kitabu kilichochukuliwa kwenye jedwali la "vitabu", na safu wima ya wanachama inarejelea mtu anayelingana kutoka kwa jedwali la "wanachama". Pia tunayo tarehe ya toleo na tarehe ambayo kitabu lazima kirudishwe.

3. Ombi rahisi

Wacha tuanze na ombi rahisi: tunahitaji majina Na vitambulisho(id) ya vitabu vyote vilivyoandikwa na mwandishi "Dan Brown"


Ombi litakuwa kama hii:


CHAGUA kitabu kama "id", kichwa KUTOKA vitabu WHERE mwandishi="Dan Brown";

Na matokeo yake ni kama hii:


kitambulisho kichwa
2 Alama Iliyopotea
4 Inferno

Rahisi kabisa. Hebu tuangalie ombi ili kuelewa nini kinaendelea.

3.1 KUTOKA - ambapo tunapata data kutoka

Hili linaweza kuonekana dhahiri sasa, lakini FROM itakuwa muhimu sana baadaye tutakapofika kwenye viungo na maswali madogo.


KUTOKA pointi hadi kwenye jedwali hadi kuuliza. Hii inaweza kuwa jedwali lililopo (kama ilivyo kwenye mfano hapo juu), au jedwali iliyoundwa kwa kuruka kupitia viungio au subqueries.

3.2 WAPI - ni data gani inayoonyeshwa

WAPI hufanya kama kichujio mistari, ambayo tunataka kutoa. Kwa upande wetu, tunataka tu kuona safu ambapo thamani katika safu ya mwandishi ni "Dan Brown".

3.3 CHAGUA - jinsi ya kuonyesha data

Sasa kwa kuwa tuna safu zote tunazohitaji kutoka kwa meza tunayohitaji, tunahitaji kuamua jinsi hasa ya kuonyesha data hii. Kwa upande wetu, tunahitaji tu vichwa vya vitabu na vitambulisho, kwa hivyo ndivyo tunavyofanya. tuchague kwa kutumia CHAGUA. Wakati huo huo, unaweza kubadilisha safu kwa kutumia AS.


Swali zima linaweza kuonyeshwa kwa kutumia mchoro rahisi:


4. Viunganishi (viunga)

Sasa tunataka kuona mada (siyo lazima ziwe za kipekee) za vitabu vyote vya Dan Brown ambavyo vimeangaliwa kutoka kwenye maktaba, na wakati vitabu hivyo vinahitaji kurejeshwa:


CHAGUA vitabu.jina AS "Kichwa", borrowings.return AS "Tarehe ya Kurudi" KUTOKA kwenye ukopaji JIUNGE NA vitabu KUHUSU borrowings.bookid=books.bookid WHERE books.author="Dan Brown";

Matokeo:


Kichwa Tarehe ya Kurudi
Alama Iliyopotea 2016-03-23 00:00:00
Inferno 2016-04-13 00:00:00
Alama Iliyopotea 2016-04-19 00:00:00

Kwa sehemu kubwa ombi ni sawa na la awali isipokuwa KUTOKA sehemu. Ina maana kwamba tunauliza data kutoka kwa jedwali lingine. Hatufikii jedwali la "vitabu" au jedwali la "kukopa". Badala yake tunageukia meza mpya, ambayo iliundwa kwa kuunganisha meza hizi mbili.


kukopa JIUNGE na vitabu KUHUSU borrowings.bookid=books.bookid - hii ni, zingatia, meza mpya, ambayo iliundwa kwa kuchanganya rekodi zote kutoka kwa jedwali la "vitabu" na "azima" ambamo maadili ya kitabu yanalingana. Matokeo ya muunganisho kama huo yatakuwa:



Na kisha tunauliza jedwali hili kwa njia sawa na katika mfano hapo juu. Hii ina maana kwamba wakati wa kujiunga na meza, unahitaji tu kuwa na wasiwasi kuhusu jinsi ya kufanya kujiunga. Na kisha ombi inakuwa wazi kama katika kesi ya " ombi rahisi»kutoka sehemu ya 3.


Wacha tujaribu unganisho changamano zaidi na jedwali mbili.


Sasa tunataka kupata majina ya kwanza na ya mwisho ya watu ambao walichukua vitabu kutoka maktaba na mwandishi "Dan Brown".


Wakati huu wacha tuende kutoka chini kwenda juu:


Hatua ya 1- tunapata wapi data? Ili kupata matokeo tunayohitaji, tunahitaji kujiunga na meza za "mwanachama" na "vitabu" na meza ya "kukopa". Sehemu ya JOIN itaonekana kama hii:


kukopa JIUNGE NA vitabu KUHUSU borrowings.bookid=books.bookid JIUNGE na wanachama KWA wanachama.memberid=borrowings.memberid

Matokeo ya uunganisho yanaweza kuonekana kwenye kiungo.


Hatua ya 2- tunaonyesha data gani? Tunavutiwa tu na data ambapo mwandishi wa kitabu ni "Dan Brown"


WHERE books.author="Dan Brown"

Hatua ya 3- tunaonyeshaje data? Sasa kwa kuwa data imepokelewa, unahitaji tu kuonyesha majina ya kwanza na ya mwisho ya wale waliochukua vitabu:


CHAGUA wanachama.jina la kwanza AS "Jina la Kwanza", wanachama.jina la mwisho AS "Jina la Mwisho"

Super! Kilichobaki ni kuchanganya vipengele vitatu na kufanya ombi tunalohitaji:


CHAGUA wanachama.jina la kwanza AS "Jina la Kwanza", wanachama.jina la mwisho AS "Jina la Ukoo" KUTOKA kwa ukopaji JIUNGE na vitabu ILIYO borrowings.bookid=books.bookid JIUNGE na wanachama ON members.memberid=borrowings.memberid WHERE books.author="Dan Brown";

Nini kitatupa:


Jina la kwanza Jina la familia
Mike Willis
Ellen Horton
Ellen Horton

Kubwa! Lakini majina yanarudiwa (sio ya kipekee). Tutarekebisha hili hivi karibuni.

5. Kujumlisha

Kwa kusema, Ujumlisho unahitajika ili kubadilisha safu mlalo nyingi kuwa moja. Wakati huo huo, wakati wa kujumlisha, mantiki tofauti hutumiwa kwa safu tofauti.


Wacha tuendelee na mfano wetu ambapo majina rudufu yanaonekana. Ni wazi kwamba Ellen Horton alichukua zaidi ya kitabu kimoja, lakini hii sio zaidi Njia bora onyesha habari hii. Unaweza kufanya ombi lingine:


CHAGUA wanachama.jina la kwanza AS "Jina la Kwanza", wanachama.jina la mwisho AS "Jina la Mwisho", hesabu(*) AS "Idadi ya vitabu vilivyoazima" KUTOKA KWA waliokopa JIUNGE na vitabu KUHUSU borrowings.bookid=books.bookid JIUNGE na wanachama ON members.memberid=borrowings .memberid WAPI books.author="Dan Brown" GROUP BY members.jina la kwanza, members.jina la mwisho;

Ambayo itatupa matokeo unayotaka:


Jina la kwanza Jina la familia Idadi ya vitabu vilivyokopwa
Mike Willis 1
Ellen Horton 2

Takriban mijumuisho yote huja na kifungu cha KUNDI KWA . Jambo hili hubadilisha jedwali ambalo linaweza kurejeshwa na hoja kuwa vikundi vya jedwali. Kila kikundi kinalingana na thamani ya kipekee (au kikundi cha maadili) ya safu ambayo tulibainisha katika GROUP BY . Katika mfano wetu, tunabadilisha matokeo kutoka kwa zoezi la awali kuwa kikundi cha safu. Pia tunafanya ujumlisho na count , ambayo hubadilisha safu mlalo nyingi kuwa thamani kamili (kwa upande wetu, idadi ya safu mlalo). Maana hii basi hupewa kila kikundi.


Kila safu katika matokeo inawakilisha matokeo ya mkusanyiko wa kila kikundi.



Mtu anaweza kufikia hitimisho la kimantiki kwamba nyanja zote kwenye matokeo zinapaswa kubainishwa katika GROUP BY , au ujumlisho unapaswa kufanywa juu yao. Kwa sababu nyanja zingine zote zinaweza kutofautiana kutoka kwa kila mmoja mistari tofauti, na ikiwa utawachagua CHAGUA ", basi haijulikani wazi ni ipi kati ya maadili yanayowezekana inapaswa kuchukuliwa.


Katika mfano hapo juu, kazi ya kuhesabu ilichakata safu zote (kwani tulikuwa tukihesabu idadi ya safu). Vitendaji vingine kama vile jumla au max huchakata safu mlalo zilizobainishwa pekee. Kwa mfano, ikiwa tunataka kujua idadi ya vitabu vilivyoandikwa na kila mwandishi, basi tunahitaji swali lifuatalo:


CHAGUA mwandishi, jumla (hisa) KUTOKA vitabu GROUP BY mwandishi;

Matokeo:


mwandishi jumla
Robin Sharma 4
Dan Brown 6
John Green 3
Amish Tripathi 2

Hapa kazi ya jumla inachakata safu wima ya hisa pekee na kukokotoa jumla ya thamani zote katika kila kikundi.

6. Maswali


Maswali madogo ni hoja za kawaida za SQL zilizopachikwa ndani ya hoja kubwa zaidi. Wamegawanywa katika aina tatu kulingana na aina ya matokeo yaliyorejeshwa.

6.1 Jedwali la pande mbili

Kuna maswali ambayo yanarudisha safu wima nyingi. Mfano mzuri ni swali kutoka kwa zoezi la awali la kujumlisha. Kwa kuwa hoja ndogo, itarudisha jedwali lingine ambalo hoja mpya zinaweza kuulizwa. Kuendelea kutoka kwa zoezi la awali, ikiwa tunataka kujua idadi ya vitabu vilivyoandikwa na mwandishi "Robin Sharma", basi njia moja inayowezekana ni kutumia subqueries:


CHAGUA * KUTOKA (CHAGUA mwandishi, jumla(hisa) KUTOKA kwa vitabu GROUP BY mwandishi) AS matokeo WHERE author="Robin Sharma";

Matokeo:



Inaweza kuandikwa kama: ["Robin Sharma", "Dan Brown"]


2. Sasa tunatumia matokeo haya katika swali jipya:


CHAGUA kichwa, kitabu KUTOKA vitabu WHERE mwandishi IN (CHAGUA mwandishi KUTOKA (CHAGUA mwandishi, jumla(hisa) KUTOKA vitabu GROUP BY mwandishi) AS matokeo WHERE jumla > 3);

Matokeo:


kichwa kitabu
Alama Iliyopotea 2
Nani Atalia Ukifa? 3
Inferno 4

Hii ni sawa na:


CHAGUA kichwa, kitabu KUTOKA vitabu WHERE mwandishi IN ("Robin Sharma", "Dan Brown");

6.3 Maadili ya mtu binafsi

Kuna maswali ambayo husababisha safu mlalo moja na safu wima moja. Wanaweza kuchukuliwa kama maadili ya mara kwa mara na yanaweza kutumika popote maadili yanatumiwa, kama vile waendeshaji kulinganisha. Pia zinaweza kutumika kama majedwali ya pande mbili au safu za kipengele kimoja.


Hebu, kwa mfano, tupate habari kuhusu vitabu vyote ambavyo idadi yao katika maktaba inazidi wastani wa sasa.


Kiwango cha wastani kinaweza kupatikana kwa njia hii:


chagua wastani (hisa) kutoka kwa vitabu;

Nini kinatupa:


7. Andika shughuli

Shughuli nyingi za uandishi wa hifadhidata ni rahisi sana ikilinganishwa na shughuli ngumu zaidi za kusoma.

7.1 Sasisho

Sintaksia SASISHA ombi kimantiki sawa na ombi la kusoma. Tofauti pekee ni kwamba badala ya kuchagua nguzo na SELECT, tunaweka ujuzi na SET.


Ikiwa vitabu vyote vya Dan Brown vimepotea, basi unahitaji kuweka upya thamani ya wingi. Swali kwa hili litakuwa:


UPDATE vitabu SET stock=0 WHERE author="Dan Brown";

WAPI hufanya kitu sawa na hapo awali: huchagua safu mlalo. Badala ya SELECT tuliyotumia wakati wa kusoma, sasa tunatumia SET. Hata hivyo, sasa unahitaji kutaja sio tu jina la safu, lakini pia thamani mpya ya safu hii katika safu zilizochaguliwa.


7.2 Futa

Hoja ya KUFUTA ni swala CHAGUA au KUSASISHA bila majina ya safu wima. Kwa umakini. Kama ilivyo kwa SELECT na UPDATE , kizuizi cha WHERE kinabaki sawa: huchagua safu za kufutwa. Operesheni ya kufuta inaharibu safu nzima, kwa hivyo haina maana kutaja safu wima za kibinafsi. Kwa hivyo, ikiwa tutaamua kutoweka upya nambari ya vitabu vya Dan Brown, lakini kufuta rekodi zote kabisa, basi tunaweza kufanya ombi lifuatalo:


FUTA KUTOKA kwenye vitabu AMBAPO mwandishi="Dan Brown";

7.3 Ingiza

Labda kitu pekee ambacho ni tofauti na aina zingine za maswali ni INSERT. Muundo ni:


WEKA NDANI YA x (a,b,c) THAMANI (x, y, z);

Ambapo a , b , c ni majina ya safuwima, na x , y na z ndizo thamani zinazopaswa kuingizwa kwenye safu wima hizo, kwa mpangilio sawa. Hiyo ndiyo kimsingi.


Hebu tuangalie mfano maalum. Hili hapa ni swali INGIZA ambalo hujaza jedwali zima la "vitabu":


INGIZA KATIKA vitabu (kitabu, kichwa,mwandishi,kilichochapishwa,hisa) THAMANI (1,"Scion of Ikshvaku","Amish Tripathi","06-22-2015",2), (2,"Alama Iliyopotea"," Dan Brown","07-22-2010",3), (3,"Nani Atalia Unapokufa?","Robin Sharma",06-15-2006",4), (4,"Inferno" ,"Dan Brown","05-05-2014",3), (5,"Kosa katika Nyota zetu","John Green","01-03-2015",3);

8. Angalia

Tumefika mwisho, napendekeza mtihani mdogo. Angalia ombi hilo mwanzoni kabisa mwa makala hiyo. Je, unaweza kuitambua? Jaribu kuigawanya katika sehemu SELECT , FROM , WHERE , GROUP BY, na uangalie vipengele vya kibinafsi vya subqueries.


Hapa iko katika fomu inayosomeka zaidi:


CHAGUA wanachama.jina la kwanza || ""|| wanachama.jina la mwisho AS "Jina Kamili" KUTOKA kwa ukopaji INNER JOIN wanachama ON members.memberid=borrowings.memberid INNER JIUNGE vitabu ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (CHAGUA kitabu KUTOKA vitabu WHERE stock> (CHAGUA wastani(hisa) ) KUTOKA kwenye vitabu)) KUNDI LA wanachama.jina la kwanza, wanachama.jina la mwisho;

Hoja hii inarejesha orodha ya watu ambao wameangalia kitabu kutoka kwa maktaba ambao jumla yao ni zaidi ya wastani.


Matokeo:


Jina kamili
Lida Tyler

Natumai umeweza kuigundua bila shida yoyote. Lakini ikiwa sivyo, ningekaribisha maoni na maoni yako ili niweze kuboresha chapisho hili.

Lebo: Ongeza vitambulisho