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 | Mandarin | 50 |
2 | Tikiti maji | 120 |
3 | Nanasi | 80 |
4 | Ndizi | 40 |
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 | Nanasi | 80 |
2 | Tikiti maji | 120 |
4 | Ndizi | 40 |
1 | Mandarin | 50 |
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
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