T sql mifano. Utangulizi wa Seva ya MS SQL na T-SQL. Kuzuia maadili yaliyojumlishwa kwa kutumia masharti ya kupanga: kifungu cha HAVING

Sasisho la mwisho: 24.06.2017

Seva ya SQL ni mojawapo ya wengi mifumo maarufu usimamizi wa hifadhidata (DBMS) ulimwenguni. DBMS hii inafaa kwa aina mbalimbali za miradi: kutoka kwa programu ndogo hadi miradi mikubwa, iliyojaa sana.

Seva ya SQL iliundwa na Microsoft. Toleo la kwanza lilitolewa mnamo 1987. A toleo la sasa ni toleo la 16, ambalo lilitoka mwaka wa 2016 na litatumika katika mwongozo wa sasa.

Seva ya SQL kwa muda mrefu ulikuwa mfumo wa usimamizi wa hifadhidata kwa ajili ya Windows pekee, lakini tangu toleo la 16 mfumo huu unapatikana pia kwenye Linux.

Seva ya SQL ina sifa ya vipengele kama vile:

    Utendaji. Seva ya SQL ni haraka sana.

    Kuegemea na usalama. Seva ya SQL hutoa usimbaji fiche wa data.

    Urahisi. DBMS hii ni rahisi kufanya kazi nayo na kuisimamia.

Kipengele kikuu katika Seva ya MS SQL, kama katika DBMS yoyote, ni hifadhidata. Hifadhidata ni hifadhi ya data iliyopangwa kwa njia maalum. Mara nyingi hifadhidata inawakilisha faili kwenye gari ngumu, ingawa mawasiliano haya sio lazima. Mifumo ya usimamizi wa hifadhidata au DBMS hutumiwa kuhifadhi na kusimamia hifadhidata. Na tu MS SQL Server ni moja ya DBMS vile.

Ili kupanga hifadhidata, Seva ya MS SQL hutumia mfano wa uhusiano. Mtindo huu wa hifadhidata ulitengenezwa nyuma mnamo 1970 na Edgar Codd. Na leo ni kweli kiwango cha kuandaa hifadhidata.

Mfano wa uhusiano unahusisha kuhifadhi data kwa namna ya meza, ambayo kila moja ina safu na safu. Kila mstari huhifadhi kitu tofauti, na safu wima zina sifa za kitu hiki.

Ufunguo msingi hutumiwa kutambua kila safu ndani ya jedwali. Ufunguo msingi unaweza kuwa safu wima moja au zaidi. Kwa kutumia ufunguo msingi tunaweza kurejelea kamba maalum katika meza. Ipasavyo, safu mlalo mbili haziwezi kuwa na ufunguo wa msingi sawa.

Kupitia funguo, meza moja inaweza kuunganishwa na nyingine, yaani, mahusiano yanaweza kupangwa kati ya meza mbili. Na meza yenyewe inaweza kuwakilishwa kama uhusiano.

Ili kuingiliana na hifadhidata, lugha ya SQL (Lugha ya Maswali Iliyoundwa) hutumiwa. Mteja (kwa mfano, programu ya nje) hutuma ombi kwa Lugha ya SQL kupitia API maalum. DBMS inatafsiri vizuri na kutekeleza ombi, na kisha kutuma matokeo ya utekelezaji kwa mteja.

SQL ilitengenezwa awali na IBM kwa mfumo wa hifadhidata unaoitwa System/R. Wakati huo huo, lugha yenyewe iliitwa SEQUEL (Lugha ya Maswali ya Kiingereza Iliyoundwa). Ingawa si hifadhidata wala lugha yenyewe iliyochapishwa rasmi baadaye, jadi neno SQL lenyewe mara nyingi hutamkwa kama "mwisho."

Mnamo 1979, Relational Software Inc. ilitengeneza mfumo wa kwanza wa usimamizi wa hifadhidata, unaoitwa Oracle, ambao ulitumia lugha ya SQL. Kwa sababu ya mafanikio ya bidhaa hii, kampuni ilipewa jina la Oracle.

Baadaye, mifumo mingine ya hifadhidata iliyotumia SQL ilianza kuonekana. Kama matokeo, mnamo 1989, Taasisi ya Viwango ya Kitaifa ya Amerika (ANSI) iliratibu lugha na kuchapisha kiwango chake cha kwanza. Baada ya hayo, kiwango kilisasishwa mara kwa mara na kuongezewa. Sasisho lake la mwisho lilifanyika mnamo 2011. Lakini licha ya kuwepo kwa kiwango, wazalishaji wa DBMS mara nyingi hutumia wao wenyewe utekelezaji wenyewe Lugha za SQL, ambazo ni tofauti kidogo kutoka kwa kila mmoja.

Kuna aina mbili za lugha ya SQL: PL-SQL na T-SQL. PL-SQL inatumika katika DBMS kama vile Oracle na MySQL. T-SQL (Transact-SQL) inatumika katika Seva ya SQL. Kwa kweli, hii ndiyo sababu T-SQL itazingatiwa ndani ya mwongozo wa sasa.

Kulingana na kazi ambayo amri ya T-SQL hufanya, inaweza kuwa moja ya aina zifuatazo:

    DDL (Lugha ya Ufafanuzi wa Data). Aina hii inajumuisha amri mbalimbali zinazounda hifadhidata, meza, faharisi, taratibu zilizohifadhiwa, nk. Kwa ujumla, data imedhamiriwa.

    Hasa, tunaweza kuainisha amri zifuatazo kama aina hii:

    • CREATE : huunda vitu vya hifadhidata (database yenyewe, jedwali, faharisi, n.k.)

      ALTER: hurekebisha vitu vya hifadhidata

      DROP: Huondoa vitu vya hifadhidata

      TRUNCATE: huondoa data yote kutoka kwa jedwali

    DML (Lugha ya Udhibiti wa Data). Aina hii inajumuisha amri za kuchagua data, kuisasisha, kuiongeza, kuifuta - kwa ujumla, amri hizo zote ambazo tunaweza kudhibiti data.

    Amri zifuatazo ni za aina hii:

    • CHAGUA: hupata data kutoka kwa hifadhidata

      UPDATE: data inasasishwa

      INSERT: inaongeza data mpya

      FUTA: inafuta data

    DCL (Lugha ya Kudhibiti Data / Lugha ya Kudhibiti Ufikiaji wa Data). Aina hii inajumuisha amri zinazodhibiti haki za ufikiaji wa data. Hasa, hizi ni amri zifuatazo:

    • GRANT: inatoa ruhusa ya kufikia data

      BATILISHA: kubatilisha haki za ufikiaji wa data

Katika sehemu ya kwanza, tayari tuligusa kidogo kwenye lugha ya DML, kwa kutumia karibu seti nzima ya amri zake, isipokuwa amri ya MERGE.

Nitazungumza juu ya DML kulingana na mlolongo wangu mwenyewe, uliotengenezwa kutoka kwa uzoefu wa kibinafsi. Njiani, nitajaribu pia kuzungumza juu ya sehemu "zinazoteleza" ambazo zinafaa kuzingatia; sehemu hizi "zinazoteleza" zinafanana katika lahaja nyingi za lugha ya SQL.

Kwa sababu kitabu cha maandishi kinajitolea kwa wasomaji mbalimbali (sio watengeneza programu tu), basi maelezo wakati mwingine yatakuwa sahihi, i.e. ndefu na ya kuchosha. Hii ni maono yangu ya nyenzo, ambayo ilipatikana hasa katika mazoezi kama matokeo ya shughuli za kitaaluma.

Lengo kuu la somo hili, hatua kwa hatua, ni kukuza uelewa kamili wa kiini cha lugha ya SQL na kukufundisha jinsi ya kutumia kwa usahihi miundo yake. Wataalamu katika uwanja huu wanaweza pia kupendezwa na kuvinjari nyenzo hii, labda wataweza kujifunza kitu kipya kwao wenyewe, au labda itakuwa muhimu tu kusoma ili kuburudisha kumbukumbu zao. Natumaini kila mtu atapata kuvutia.

Kwa sababu DML katika lahaja ya hifadhidata ya MS SQL inahusiana kwa karibu sana na sintaksia ya muundo wa SELECT, kwa hivyo nitaanza kuzungumza nayo kuhusu DML. Kwa maoni yangu, ujenzi wa SELECT ndio muundo muhimu zaidi katika lugha ya DML, kwa sababu kwa sababu yake au sehemu zake, data muhimu hutolewa kutoka kwa hifadhidata.

Lugha ya DML ina miundo ifuatayo:

  • CHAGUA - uteuzi wa data
  • INSERT - kuingiza data mpya
  • UPDATE - sasisho la data
  • FUTA - kufuta data
  • MERGE - kuunganisha data

Katika sehemu hii, tutaangalia tu syntax ya msingi ya amri ya SELECT, ambayo inaonekana kama hii:

CHAGUA safu_orodha au * KUTOKA chanzo WHERE chuja ORDER BY sort_expression
Somo CHAGUA kauli pana sana, kwa hiyo katika sehemu hii nitazingatia tu miundo yake ya msingi. Ninaamini kuwa bila kujua misingi vizuri, huwezi kuanza kusoma miundo ngumu zaidi, kwa sababu ... basi kila kitu kitazunguka muundo huu wa msingi (subqueries, joins, nk).

Pia, kama sehemu ya sehemu hii, nitazungumza pia juu ya toleo la TOP. Kwa makusudi sikuonyesha sentensi hii katika sintaksia ya kimsingi, kwa sababu... inatekelezwa tofauti katika lahaja tofauti za SQL.

Ikiwa lugha ya DDL ni tuli zaidi, i.e. kwa msaada wake, miundo ngumu huundwa (meza, mahusiano, nk), basi lugha ya DML ina nguvu katika asili, hapa unaweza kupata matokeo sahihi kwa njia tofauti.

Mafunzo pia yataendelea katika hali ya Hatua kwa Hatua, i.e. Wakati wa kusoma, unapaswa kujaribu mara moja kukamilisha mfano kwa mikono yako mwenyewe. Kisha unachambua matokeo yaliyopatikana na jaribu kuelewa kwa intuitively. Ikiwa kitu bado haijulikani, kwa mfano, maana ya kazi, kisha ugeuke kwenye mtandao kwa usaidizi.

Mifano itaonyeshwa kwenye hifadhidata ya Jaribio, ambayo iliundwa kwa kutumia DDL+DML katika sehemu ya kwanza.

Kwa wale ambao hawakuunda hifadhidata katika sehemu ya kwanza (kwa kuwa sio kila mtu anayeweza kupendezwa na lugha ya DDL), wanaweza kutumia hati ifuatayo:

Jaribu hati ya kuunda hifadhidata

Kuunda hifadhidata CREATE DATABASE Test GO -- fanya hifadhidata ya Jaribio la sasa TUMIA Mtihani GO -- tengeneza majedwali ya marejeleo CREATE TABLE Nafasi(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions UFUNGUO WA MSINGI, Jina nvarchar(30) SI UFUPI) UNDA Idara za TABLE(ID int IDENTITY(1,1) NOT NULL CONSTRINT PK_Departments PRIMARY KEY, Jina nvarchar(30) NOT NULL) NENDA -- jaza majedwali ya marejeleo na data SET IDENTITY_INSERT Vyeo ONSER Vyeo(Kitambulisho,Jina)MAADILI (1,N"Mhasibu"), (2,N"Mkurugenzi"), (3,N"Mpangaji"), (4,N"Mtayarishaji Mwandamizi") WEKA Vyeo IDENTITY_INSERT ZIMWA NENDA WEKA IDENTITY_INSERT Idara KWENYE INGIZA Idara(KITAMBULISHO,Jina)MAADILI (1,N"Utawala"), (2,N"Uhasibu"), (3,N"IT") WEKA IDENTITY_INSERT Idara ZIMWA -- unda jedwali lenye wafanyakazi CREATE TABLE Wafanyakazi(ID int NOT NULL, Name nvarchar(30), Tarehe ya kuzaliwa, Email nvarchar(30), PositionID int, DepartmentID int, Tarehe ya Kukodisha NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATEM(), ManagerID int, CONTRAINT ID PK_Employees CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Nafasi(ID), CONSTRAINT FK_Employees_MenagerID FOREIGN KEY (MAJIRI_KITAMBULISHO_KITAMBULISHO_KITAMBULISHO) UNIQUE(Barua pepe), CONSTRAINT CK_Emplo yees_ID CHECK (KITAMBULISHO KATI YA 1000 NA 1999), INDEX IDX_Jina_la_Mfanyakazi(Jina)) NENDA -- ijaze na data WEKA Wafanyikazi (Kitambulisho,Jina,Siku ya Kuzaliwa,Barua pepe,Kitambulisho cha Nafasi,Kitambulisho cha Idara,Kitambulisho cha Msimamizi)MAADILI (1000,N"Ivanov I.I50."195) "," [barua pepe imelindwa]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [barua pepe imelindwa]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [barua pepe imelindwa]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [barua pepe imelindwa]",4,3,1000)

Ni hayo tu, sasa tuko tayari kuanza kujifunza lugha ya DML.

CHAGUA - kiendesha uteuzi wa data

Awali ya yote, kwa mhariri wa swala inayofanya kazi, hebu tufanye Jaribio la sasa la hifadhidata kwa kuichagua kwenye orodha ya kushuka au kutumia amri ya "TUMIA Mtihani".

Wacha tuanze na aina ya msingi zaidi ya SELECT:

CHAGUA * KUTOKA KWA Wafanyakazi
Katika swali hili, tunaomba kurudisha safu wima zote (zilizoonyeshwa na "*") kutoka kwa jedwali la Wafanyakazi - unaweza kusoma hili kama "CHAGUA nyanja_zote KUTOKA kwenye jedwali la wafanyikazi." Ikiwa kuna faharasa iliyounganishwa, data iliyorejeshwa ina uwezekano mkubwa wa kupangwa nayo, ndani kwa kesi hii kwa safu ya kitambulisho (lakini hii sio muhimu, kwani katika hali nyingi tutaonyesha wazi upangaji wenyewe kwa kutumia ORDER BY ...):

ID Jina Siku ya kuzaliwa Barua pepe PositionID Kitambulisho cha Idara HireDate Kitambulisho cha Msimamizi
1000 Ivanov I.I. 1955-02-19 [barua pepe imelindwa] 2 1 2015-04-08 NULL
1001 Petrov P.P. 1983-12-03 [barua pepe imelindwa] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [barua pepe imelindwa] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [barua pepe imelindwa] 4 3 2015-04-08 1000

Kwa ujumla, inafaa kusema kuwa katika lahaja ya MS SQL fomu rahisi zaidi ni CHAGUA swali inaweza isiwe na kizuizi cha FROM, kwa hali ambayo unaweza kuitumia kupata maadili kadhaa:

CHAGUA 5550/100*15, SYSDATETIME(), -- kupata tarehe ya mfumo wa hifadhidata SIN(0)+COS(0)

(Hakuna jina la safu wima) (Hakuna jina la safu wima) (Hakuna jina la safu wima)
825 2015-04-11 12:12:36.0406743 1

Tafadhali kumbuka kuwa usemi (5550/100*15) ulitoa matokeo 825, ingawa tukikokotoa kwenye kikokotoo thamani itakuwa (832.5). Matokeo 825 yalipatikana kwa sababu kwamba katika usemi wetu namba zote ni integers, kwa hiyo matokeo ni integer, i.e. (5550/100) inatupa 55, sio (55.5).

Kumbuka kwamba mantiki ifuatayo inafanya kazi katika MS SQL:

  • Nambari / Nambari = Nambari (yaani katika kesi hii mgawanyiko kamili hutokea)
  • Halisi / Nambari = Halisi
  • Nambari / Halisi = Halisi
Wale. matokeo hubadilishwa kuwa aina kubwa zaidi, kwa hivyo katika visa 2 vya mwisho tunapata nambari halisi (fikiria kama katika hisabati - anuwai ya nambari halisi ni kubwa kuliko safu ya nambari, kwa hivyo matokeo hubadilishwa kuwa hiyo):

CHAGUA 123/10, -- 12 123./10, -- 12.3 123/10. -- 12.3
Hapa (123.) = (123.0), ni kwamba katika kesi hii 0 inaweza kuachwa na hatua tu iliyoachwa.

Pamoja na wengine shughuli za hesabu Mantiki sawa inatumika, ni kwamba katika kesi ya mgawanyiko nuance hii inafaa zaidi.

Kwa hiyo, makini na aina ya data ya nguzo za nambari. Ikiwa ni nambari kamili, na unahitaji kupata matokeo halisi, basi tumia mabadiliko, au weka tu nukta baada ya nambari iliyoonyeshwa kama ya kudumu (123.).

Unaweza kutumia kitendakazi cha CAST au CONVERT kubadilisha sehemu. Kwa mfano, wacha tutumie uga wa kitambulisho, ni wa aina int:

CHAGUA kitambulisho, kitambulisho/100, -- mgawanyiko kamili utatokea hapa CAST(ID AS float)/100, -- tumia kitendakazi cha CAST kubadilisha hadi aina ya kuelea CONVERT(float,ID)/100, -- tumia kitendakazi cha CONVERT kugeuza kuwa aina ya kitambulisho cha kuelea/100. -- tumia mabadiliko kwa kubainisha kuwa dhehebu ni nambari halisi KUTOKA KWA Wafanyakazi

ID (Hakuna jina la safu wima) (Hakuna jina la safu wima) (Hakuna jina la safu wima) (Hakuna jina la safu wima)
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000

Kwa maelezo. Katika hifadhidata ya ORACLE, syntax bila kizuizi cha FROM haikubaliki; huko, kwa kusudi hili, jedwali la mfumo wa DUAL hutumiwa, ambalo lina mstari mmoja:

CHAGUA 5550/100*15, -- na katika ORACLE matokeo yatakuwa sawa na 832.5 sysdate, sin(0)+cos(0) KUTOKA DUAL


Kumbuka. Jina la jedwali katika RDB nyingi linaweza kutanguliwa na jina la schema:

CHAGUA * KUTOKA dbo.Wafanyakazi -- dbo - jina la schema

Schema ni kitengo cha kimantiki cha hifadhidata, ambacho kina jina lake na hukuruhusu kupanga vitu vya hifadhidata kama vile majedwali, maoni, n.k. ndani yake.

Ufafanuzi wa schema katika hifadhidata tofauti unaweza kutofautiana; katika hali zingine, schema inahusiana moja kwa moja na mtumiaji wa hifadhidata, i.e. katika kesi hii, tunaweza kusema kwamba schema na mtumiaji ni visawe na vitu vyote vilivyoundwa kwenye schema kimsingi ni vitu vya mtumiaji huyu. Katika MS SQL, schema ni kitengo cha kimantiki kinachojitegemea ambacho kinaweza kuundwa chenyewe (ona CREATE SCHEMA).

Kwa chaguo-msingi, schema moja huundwa katika hifadhidata ya MS SQL yenye jina dbo (Mmiliki wa Hifadhidata) na vitu vyote vilivyoundwa huundwa kwa chaguo-msingi katika schema hii. Ipasavyo, ikiwa tutataja tu jina la jedwali katika swali, basi itatafutwa kwenye schema ya dbo ya hifadhidata ya sasa. Ikiwa tunataka kuunda kipengee katika mpangilio maalum, itatubidi pia kutanguliza jina la kitu kwa kutumia jina la utaratibu, kwa mfano, "CREATE TABLE schema_name.table_name(...)".

Kwa upande wa MS SQL, jina la schema linaweza pia kutanguliwa na jina la hifadhidata ambayo schema iko:

CHAGUA * KUTOKA Test.dbo.Employees -- database_name.schema_name.table
Ufafanuzi huu unaweza kuwa na manufaa, kwa mfano, ikiwa:

  • katika ombi moja tunapata vitu vilivyo katika schemas au hifadhidata tofauti
  • unahitaji kuhamisha data kutoka kwa schema moja au hifadhidata hadi nyingine
  • kuwa katika hifadhidata moja, unahitaji kuomba data kutoka kwa hifadhidata nyingine
  • Nakadhalika.
Schema ni zana rahisi sana ambayo ni muhimu kutumia wakati wa kuunda usanifu wa hifadhidata, haswa hifadhidata kubwa.

Pia, usisahau kuwa katika maandishi ya ombi tunaweza kutumia mstari mmoja "-- ..." na maoni ya safu nyingi "/* ... */". Ikiwa ombi ni kubwa na ngumu, basi maoni yanaweza kukusaidia sana wewe au mtu mwingine, baada ya muda fulani, kukumbuka au kuelewa muundo wake.

Ikiwa kuna safu wima nyingi kwenye jedwali, na haswa ikiwa bado kuna safu nyingi kwenye jedwali, pamoja na ikiwa tunauliza kwenye hifadhidata kwenye mtandao, basi itakuwa vyema kuchagua na orodha ya moja kwa moja ya sehemu unazohitaji, zikitenganishwa na koma:

CHAGUA ID, Jina KUTOKA kwa Wafanyakazi

Wale. hapa tunasema kwamba tunahitaji tu kurudisha sehemu za Kitambulisho na Jina kutoka kwenye meza. Matokeo yake yatakuwa kama ifuatavyo (kwa njia, kiboreshaji hapa kiliamua kutumia faharisi iliyoundwa na uwanja wa Jina):

ID Jina
1003 Andreev A.A.
1000 Ivanov I.I.
1001 Petrov P.P.
1002 Sidorov S.S.

Kwa maelezo. Wakati mwingine ni muhimu kuangalia jinsi data inavyorejeshwa, kwa mfano, ili kujua ni faharisi gani zinazotumiwa. Hili linaweza kufanywa kwa kubofya kitufe cha "Onyesha Mpango Unaokadiriwa wa Utekelezaji" au kuweka "Jumuisha Mpango Halisi wa Utekelezaji" (katika kesi hii tutaweza kuona mpango wa kweli, mtawaliwa, tu baada ya kutekeleza ombi):

Uchambuzi wa mpango wa utekelezaji ni muhimu sana wakati wa kuongeza hoja; hukuruhusu kujua ni faharisi zipi hazipo au ni faharisi zipi hazitumiki kabisa na zinaweza kuondolewa.

Ikiwa umeanza kujifunza DML, basi sasa hii sio muhimu sana kwako, kumbuka tu na unaweza kuisahau kwa usalama (labda hautahitaji kamwe) - lengo letu la kwanza ni kujifunza misingi ya lugha ya DML na jifunze jinsi ya kuzitumia kwa usahihi, na uboreshaji tayari ni sanaa tofauti. Wakati mwingine ni muhimu zaidi kuwa na swali lililoandikwa kwa usahihi ambalo huleta matokeo sahihi kutoka kwa mtazamo wa somo, na kwamba watu binafsi tayari wanaliboresha. Kwanza, unahitaji kujifunza jinsi ya kuandika maswali kwa usahihi, kwa kutumia njia yoyote kufikia lengo. Lengo kuu unalohitaji kufikia sasa ni kwamba hoja yako irudishe matokeo sahihi.

Kuweka lakabu za jedwali

Wakati wa kuorodhesha safu, zinaweza kutanguliwa na jina la jedwali lililo kwenye kizuizi cha FROM:

CHAGUA Wafanyakazi.Kitambulisho,Wafanyakazi.Jina KUTOKA KWA Wafanyakazi

Lakini sintaksia hii kwa kawaida haifai kutumia, kwa sababu jina la jedwali linaweza kuwa refu. Kwa madhumuni haya, zaidi majina mafupi- lakabu:

CHAGUA emp.ID,emp.Jina KUTOKA KWA Wafanyakazi AS emp
au

CHAGUA emp.ID,emp.Name FROM Employees emp -- neno kuu la AS linaweza kuachwa (Napendelea chaguo hili)

Hapa emp ni lakabu la jedwali la Wafanyakazi ambalo linaweza kutumika katika muktadha wa taarifa hii ya CHAGUA. Wale. tunaweza kusema kwamba katika muktadha wa kauli hii CHAGUA tunaipa jedwali jina jipya.

Bila shaka, katika kesi hii, matokeo ya hoja yatakuwa sawa kabisa na ya "CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi". Kwa nini hii inahitajika itakuwa wazi baadaye (hata katika sehemu hii), kwa sasa tunakumbuka tu kwamba jina la safu linaweza kutanguliwa (kufafanuliwa) ama moja kwa moja na jina la jedwali, au kutumia pak. Hapa unaweza kutumia moja ya mambo mawili, i.e. Ikiwa utaweka lakabu, basi utahitaji kuitumia, lakini huwezi tena kutumia jina la jedwali.

Kwa maelezo. Katika ORACLE, chaguo pekee la kubainisha lakabu la jedwali bila neno kuu la AS linaruhusiwa.

DISTINCT - kutupa safu mlalo nakala

Neno kuu la DISTINCT linatumika kutupa nakala za safu mlalo kutoka kwa matokeo ya hoja. Kwa kusema, fikiria kwanza kutekeleza swali bila chaguo la DISTINCT, na kisha kutupa nakala zote kutoka kwa matokeo. Wacha tuonyeshe hili kwa uwazi zaidi kwa kutumia mfano:

Hebu tuunde jedwali la muda kwa ajili ya maonyesho TUNZA TABLE #Tupio(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) - jaza meza hii kila aina ya takataka WEKA #Tapio(ID,Col1,Col2,Col2)MAADILI (1,"A","A","A"), (2,"A","B","C"), ( 3, "C","A","B"), (4,"A","A","B"), (5,"B","B","B"), (6, "A ","A","B"), (7,"A","A","A"), (8,"C","A","B"), (9,"C ", "A","B"), (10,"A","A","B"), (11,"A",NULL,"B"), (12,"A",NULL, "B ") -- wacha tuone hoja italeta nini bila chaguo la DISTINCT CHAGUA Col1,Col2,Col3 FROM #Trash -- hebu tuone hoja italeta nini kwa chaguo DISTINCT CHAGUA DISTINCT Col1,Col2,Col3 FROM #Trash -- delete meza ya muda DROP TABLE # Takataka

Kwa kuibua, itaonekana kama hii (rudufu zote zimewekwa alama ya rangi sawa):

Sasa hebu tuangalie ni wapi hii inaweza kutumika, kwa kutumia mfano wa vitendo zaidi - tutarudisha vitambulisho vya kipekee vya idara kutoka kwa meza ya Wafanyikazi (yaani, tutapata vitambulisho vya idara ambazo wafanyikazi wamesajiliwa):

CHAGUA KITAMBULISHO CHA Idara KUTOKA KWA Wafanyakazi

Hapa tuna mistari 4, kwa sababu ... Hakuna mchanganyiko unaorudiwa (ID ya Idara, PositionID) kwenye jedwali letu.

Hebu turejee kwa DDL kwa muda.

Kwa kuwa tunaanza kukosa data kwa mifano ya onyesho, na tunataka kuzungumza kwa undani zaidi na kwa uwazi, hebu tupanue meza yetu ya Waajiri kidogo. Kwa kuongezea, wacha tukumbuke DDL kidogo, kama wanasema, "kurudia ni mama wa kujifunza," na zaidi, wacha turuke mbele tena na kutumia taarifa ya UPDATE:

Tunaunda safu wima mpya ALTER TABLE Wafanyakazi ONGEZA Jina la Mwisho nvarchar(30), -- jina la mwisho FirstName nvarchar(30), -- jina la kwanza MiddleName nvarchar(30), -- jina la kati Salary float, -- na bila shaka mshahara katika baadhi ya vitengo. BonusPercent float -- asilimia ya kukokotoa bonasi kutoka kwa mshahara wa GO -- ujaze data (baadhi ya data imeachwa kwa makusudi) SASISHA Wafanyakazi WEKA LastName=N"Ivanov", FirstName=N"Ivan", MiddleName=N"Ivanovich", Mshahara=5000,BonusPercent= 50 WAPI ID=1000 -- Ivanov I.I. SASISHA Wafanyakazi WEKA LastName=N"Petrov",FirstName=N"Petr",MiddleName=N"Petrovich", Mshahara=1500,BonusPercent= 15 WAPI ID=1001 -- Petrov P.P. SASISHA Wafanyakazi WEKA LastName=N"Sidor",FirstName=N"Sidor",MiddleName=NULL, Salary=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. SASISHA Wafanyakazi WEKA LastName=N"Andreev",FirstName=N"Andrey",MiddleName=NULL, Salary=2000,BonusPercent= 30 WHERE ID=1003 -- Andreev A.A.

Wacha tuhakikishe kuwa data imesasishwa kwa mafanikio:

CHAGUA * KUTOKA KWA Wafanyakazi

ID Jina Jina la familia Jina la kwanza Jina la kati Mshahara Asilimia ya Bonus
1000 Ivanov I.I. Ivanov Ivan Ivanovich 5000 50
1001 Petrov P.P. Petrov Peter Petrovich 1500 15
1002 Sidorov S.S. Sidorov Sidor NULL 2500 NULL
1003 Andreev A.A. Andreev Andrey NULL 2000 30

Kuweka lakabu za safu wima za hoja

Nadhani itakuwa rahisi kuonyesha hapa kuliko kuandika:

CHAGUA -- toa jina kwa safu wima iliyokokotwa LastName+" "+FirstName+" "+MiddleName AS Jina Kamili, -- matumizi nukuu mara mbili, kwa sababu nafasi inatumika HireDate AS "Tarehe ya mapokezi", -- matumizi ya mabano ya mraba, kwa sababu nafasi inatumika Siku ya Kuzaliwa AS [Tarehe ya Kuzaliwa], -- neno AS sio lazima Mshahara ZP KUTOKA KWA Wafanyakazi

Jina kamili tarehe ya kupokea Tarehe ya kuzaliwa ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovich 2015-04-08 1983-12-03 1500
NULL 2015-04-08 1976-06-07 2500
NULL 2015-04-08 1982-04-17 2000

Kama tunavyoona, lakabu za safu tulizoainisha zinaonyeshwa kwenye kichwa cha jedwali linalotokana. Kwa kweli, hili ndilo kusudi kuu la lakabu za safu.

Tafadhali kumbuka, kwa sababu wafanyakazi 2 wa mwisho hawakuwa na jina la kati lililobainishwa (thamani NULL), basi matokeo ya usemi "LastName+" "+FirstName+" "+MiddleName" pia yameturudishia NULL.

Ili kuunganisha (kuongeza, kuunganisha) mifuatano katika MS SQL, ishara ya "+" inatumiwa.

Kumbuka kwamba misemo yote ambayo inahusisha NULL (kwa mfano, mgawanyiko na NULL, kuongeza na NULL) itarudi NULL.

Kwa maelezo.
Kwa upande wa ORACLE, opereta "||" hutumiwa kuambatanisha mifuatano na muunganisho ungeonekana kama "LastName||" "||FirstName||" "||MiddleName". Kwa ORACLE, inafaa kuzingatia kuwa ina ubaguzi kwa aina za kamba, kwao NULL na kamba tupu "" ni kitu kimoja, kwa hivyo katika ORACLE usemi kama huo utarudi kwa wafanyikazi 2 wa mwisho "Sidor Sidor" na "Andrey. Andreev". Kwa sasa matoleo ya ORACLE 12c, nijuavyo, hakuna chaguo la kubadilisha tabia hii (ikiwa nimekosea, tafadhali nirekebishe). Hapa ni ngumu kwangu kuhukumu ikiwa hii ni nzuri au mbaya, kwa sababu ... Katika baadhi ya matukio, tabia ya kamba ya NULL ni rahisi zaidi, kama katika MS SQL, na kwa wengine, kama katika ORACLE.

Katika ORACLE, lakabu zote za safu wima zilizoorodheshwa hapo juu pia ni halali, isipokuwa [...].


Ili sio uzio wa ujenzi kwa kutumia kazi ya ISNULL, katika MS SQL tunaweza kutumia kazi ya CONCAT. Hebu fikiria na kulinganisha chaguzi 3:

CHAGUA Jina la Mwisho+" "+FirstName+" "+MiddleName FullName1, -- chaguzi 2 za kubadilisha NULL mistari tupu"" (tunapata tabia sawa na katika ORACLE) ISNULL(LastName,"")+" "+ISNULL(FirstName,"")+" "+ISNULL(MiddleName,"") FullName2, CONCAT(LastName," ", FirstName, " ",MiddleName) FullName3 KUTOKA KWA Wafanyakazi

Jina Kamili1 Jina Kamili2 Jina Kamili3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovich Petrov Petr Petrovich Petrov Petr Petrovich
NULL Sidorov Sidor Sidorov Sidor
NULL Andreev Andrey Andreev Andrey

Katika MS SQL, lakabu pia zinaweza kubainishwa kwa kutumia ishara sawa:

CHAGUA "Tarehe ya Mapokezi"=Tarehe ya Kuajiri, -- pamoja na "..." na [...] unaweza kutumia "..." [Tarehe ya Kuzaliwa]=Siku ya Kuzaliwa, ZP=Mshahara KUTOKA KWA Wafanyakazi

Kutumia neno kuu la AS au ishara sawa kutaja lakabu labda ni suala la ladha zaidi. Lakini wakati wa kuchambua maombi ya watu wengine, ujuzi huu unaweza kuwa na manufaa.

Mwishowe, nitasema kwamba ni bora kuweka majina ya lakabu kwa kutumia herufi na nambari za Kilatini tu, epuka matumizi ya "...", "…" na […], ambayo ni, tumia sheria zile zile tulizotumia wakati wa kutaja jedwali. . Zaidi ya hayo, katika mifano nitatumia tu majina kama haya na hakuna "...", "…" na […].

Waendeshaji Hesabu za Msingi za SQL


Kipaumbele cha utekelezaji waendeshaji hesabu sawa na katika hisabati. Ikiwa ni lazima, utaratibu wa matumizi ya waendeshaji unaweza kubadilishwa kwa kutumia mabano - (a+b)*(x/(y-z)).

Na ninarudia tena kwamba operesheni yoyote na NULL hutoa NULL, kwa mfano: 10+NULL, NULL*15/3, 100/NULL - yote haya yatasababisha NULL. Wale. kuweka tu isiyofafanuliwa haiwezi kutoa matokeo ya uhakika. Zingatia hili wakati wa kuunda hoja yako na, ikiwa ni lazima, shughulikia maadili NULL kwa kutumia kazi za ISNULL na COALESCE:

CHAGUA KITAMBULISHO,Jina, Mshahara/100*Asilimia ya Bonasi AS Matokeo1, -- bila kuchakata thamani NULL Mshahara/100*ISNULL(BonusPercent,0) AS Result2, -- tumia chaguo la kukokotoa la ISNULL Mshahara/100*COALESCE(Asilimia ya Ziada,0) AS Result3 - - tumia kipengele cha COALESCE KUTOKA KWA Wafanyakazi

Nitakuambia kidogo juu ya kazi ya COALESCE:

COALESCE (expr1, expr2, ..., exprn) - Hurejesha thamani ya kwanza isiyo ya NULL kutoka kwa orodha ya thamani.

CHAGUA COALESCE(f1, f1*f2, f2*f3) val -- katika hali hii thamani ya tatu itarejeshwa KUTOKA (CHAGUA null f1, 2 f2, 3 f3) q

Nitazingatia zaidi kuzungumza juu ya muundo wa DML, na kwa sehemu kubwa sitazungumza juu ya kazi ambazo zitaonekana kwenye mifano. Ikiwa hauelewi kazi fulani hufanya nini, tafuta maelezo yake kwenye mtandao, unaweza hata kutafuta habari kwa kikundi cha kazi mara moja, kwa mfano, kwa kuuliza. Utafutaji wa Google"M.S. Mifuatano ya SQL kazi", "MS SQL kazi za hisabati" au "MS Kazi za SQL usindikaji NULL." Kuna habari nyingi juu ya vitendaji, na unaweza kuipata kwa urahisi. Kwa mfano, katika maktaba ya MSDN, unaweza kujua zaidi juu ya kazi ya COALESCE:

Kupunguza kutoka kwa MSDN Ulinganisho wa COALESCE na KESI

Usemi wa COALESCE ni njia ya mkato ya kisintaksia ya usemi wa KESI. Hii inamaanisha kuwa COALESCE(expression1,...n) imeandikwa upya na kiboresha hoja kama usemi ufuatao wa KESI:

KISA WAKATI (maneno1 SIYO BATILI) KISHA usemi1 WAKATI (maneno2 SIYO BATILI) HALAFU usemi2 ... VINGINEVYO usemiMWISHO

Kwa mfano, hebu tuangalie jinsi unaweza kutumia salio la mgawanyiko (%). Opereta huyu muhimu sana unapohitaji kugawanya rekodi katika vikundi. Kwa mfano, hebu tuchukue wafanyakazi wote ambao wana hata nambari za wafanyikazi(Kitambulisho), i.e. vitambulisho hivyo vinavyoweza kugawanywa na 2:

CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi AMBAPO ID%2=0 -- salio ikigawanywa na 2 ni 0

AGIZA KWA - kupanga matokeo ya hoja

Kifungu cha ORDER BY kinatumika kupanga matokeo ya hoja.

CHAGUA Jina la Mwisho, Jina la Kwanza, Mshahara KUTOKA KWA Wafanyakazi AGIZA KWA Jina la Mwisho,Jina la Kwanza -- agiza matokeo kwa safu wima 2 - kwa Jina la Mwisho, na kisha kwa Jina la Kwanza.

Kwa maelezo. Kuna neno la msingi la ASC la kupanga kwa mpangilio wa kupanda, lakini kwa kuwa aina ya kupanda ni chaguo-msingi, unaweza kusahau kuhusu chaguo hili (sikumbuki wakati nilitumia chaguo hili).

Ni vyema kutambua kwamba ORDER BY clause pia inaweza kutumia sehemu ambazo hazijaorodheshwa katika kifungu CHA SELECT (isipokuwa kwa kesi wakati DISTINCT inatumiwa, ambayo nitazungumzia hapa chini). Kama mfano, nitaendesha mbele kidogo kwa kutumia chaguo la TOP na kuonyesha jinsi, kwa mfano, unaweza kuchagua wafanyikazi 3 ambao wana mishahara ya juu zaidi, kwa kuzingatia kwamba kwa madhumuni ya usiri sipaswi kuonyesha mshahara yenyewe:

CHAGUA TOP 3 -- rejesha tu rekodi 3 za kwanza kutoka kwa matokeo yote ya ID,LastName,FirstName KUTOKA KWA Wafanyakazi AGIZO KWA MSHAHARA DESC -- panga matokeo kwa mpangilio wa kushuka wa Mshahara.

ID Jina la familia Jina la kwanza
1000 Ivanov Ivan
1002 Sidorov Sidor

Kwa kweli, kuna kesi hapa kwamba wafanyikazi kadhaa wanaweza kuwa na mshahara sawa na ni ngumu kusema ni wafanyikazi gani watatu watarudi ombi hili; hii lazima isuluhishwe na mkurugenzi wa kazi. Wacha tuseme kwamba baada ya kujadili shida hii na mbuni, ulikubali na ukaamua kutumia chaguo linalofuata- fanya upangaji wa ziada kwa tarehe ya uwanja wa kuzaliwa (i.e. tunathamini vijana), na ikiwa tarehe ya kuzaliwa kwa wafanyikazi kadhaa inaweza sanjari (baada ya yote, hii pia inawezekana), basi unaweza kufanya upangaji wa tatu kwa mpangilio wa kushuka. ya maadili ya kitambulisho (mwisho Sampuli itajumuisha wale ambao wana kitambulisho cha juu - kwa mfano, wale ambao walikubaliwa mwisho, tuseme tunatoa nambari za wafanyikazi kwa mlolongo):

CHAGUA TOP 3 -- rejesha tu rekodi 3 za kwanza kutoka kwa matokeo yote ya ID,LastName,FirstName KUTOKA KWA Wafanyakazi AGIZO KWA DESC ya Mshahara, -- 1. panga matokeo kwa mpangilio wa kushuka kwa Siku ya Kuzaliwa ya Mshahara, -- 2. kisha kwa Tarehe ya Kuzaliwa ID DESC -- 3 .na kwa utata kamili wa matokeo, ongeza kupanga kwa kitambulisho

Wale. unapaswa kujaribu kufanya matokeo ya ombi kutabirika, ili katika tukio la mazungumzo unaweza kueleza kwa nini watu hawa hasa walijumuishwa kwenye "orodha nyeusi", i.e. kila kitu kilichaguliwa kwa uaminifu, kulingana na sheria zilizowekwa.

Unaweza pia kupanga kwa kutumia misemo tofauti katika ORDER BY clause:

CHAGUA Jina la Mwisho,Jina la Kwanza KUTOKA KWA Wafanyakazi AGIZO KWA CONCAT(LastName," ",FirstName) -- tumia usemi.

Unaweza pia kutumia lakabu zilizobainishwa kwa safu katika ORDER BY:

CHAGUA CONCAT(LastName," ",FirstName) fi KUTOKA KWA Wafanyakazi AGIZO KWA fi -- tumia lakabu

Inafaa kumbuka kuwa unapotumia kifungu cha DISTINCT, safu wima tu zilizoorodheshwa kwenye kizuizi cha SELECT zinaweza kutumika katika kifungu cha ORDER BY. Wale. baada ya kutumia operesheni ya DISTINCT tunayopata seti mpya data, na seti mpya ya safuwima. Kwa sababu hii, mfano ufuatao hautafanya kazi:

CHAGUA DISTINCT Jina la Mwisho,FirstName,Mshahara KUTOKA KWA Wafanyakazi AGIZO KWA KITAMBULISHO -- kitambulisho hakipo katika mpangilio tuliopata na DISTINCT

Wale. kifungu cha ORDER BY kinatumika kwa seti inayotokana kabla ya matokeo kurejeshwa kwa mtumiaji.

Kumbuka 1. Unaweza pia kutumia nambari za safu wima zilizoorodheshwa katika CHAGUA katika kifungu cha ORDER BY:

CHAGUA Jina la Mwisho,Jina la Kwanza,Mshahara KUTOKA KWA Wafanyakazi ORDER BY -- panga kwa mpangilio 3 DESC, -- 1. kushuka kwa Mshahara 1, -- 2. kwa Jina la Mwisho 2 -- 3. kwa Jina la Kwanza

Kwa Kompyuta inaonekana rahisi na inajaribu, lakini ni bora kusahau na kamwe usitumie chaguo hili la kuchagua.

Ikiwa katika kesi hii (wakati mashamba yameorodheshwa kwa uwazi), chaguo hili bado linakubalika, basi katika kesi ya kutumia "*" ni bora kamwe kutumia chaguo hili. Kwa nini - kwa sababu ikiwa mtu, kwa mfano, anabadilisha mpangilio wa safu kwenye jedwali, au kufuta safu (na hii ni hali ya kawaida), swali lako bado linaweza kufanya kazi, lakini kwa usahihi, kwa sababu. upangaji unaweza tayari kufanywa na safu wima zingine, na hii ni hila kwa kuwa hitilafu hii huenda isigunduliwe hivi karibuni.

Ikiwa nguzo ziliorodheshwa wazi, basi katika hali iliyo hapo juu, swala ingeendelea kufanya kazi, lakini pia kwa usahihi (kwa kuwa kila kitu kimefafanuliwa wazi), au ingetupa tu kosa ambalo ya safu hii haipo.

Kwa hivyo unaweza kusahau kwa usalama juu ya kupanga kwa nambari za safu.

Kumbuka 2.
Katika MS SQL, wakati wa kupanga kwa mpangilio wa kupanda, maadili NULL yataonyeshwa kwanza.

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyikazi AGIZO KWA BonusPercent

Ipasavyo, wakati wa kutumia DESC watakuwa mwisho

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyikazi AGIZO KWA BonusPercent DESC

Ikiwa unahitaji kubadilisha mantiki ya kupanga maadili NULL, basi tumia misemo, kwa mfano:

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyakazi AGIZO KWA ISNULL(BonusPercent,100)

ORACLE hutoa chaguo mbili kwa kusudi hili: NULLS FIRST na NULLS LAST (hutumiwa na chaguo-msingi). Kwa mfano:

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyakazi AGIZO KWA BonusPercent DESC NULLS LAST

Makini na hili wakati wa kubadili database fulani.

TOP - rudisha nambari maalum ya rekodi

Dondoo kutoka kwa MSDN. TOP - Hupunguza idadi ya safu mlalo zilizorejeshwa katika matokeo ya hoja yaliyowekwa nambari iliyopewa au thamani ya asilimia. Wakati kifungu cha TOP kinapotumiwa pamoja na ORDER BY clause, matokeo yaliyowekwa ni safumlalo N za kwanza za matokeo yaliyopangwa. Vinginevyo, safu mlalo za N za kwanza zitarejeshwa kwa mpangilio ambao haujabainishwa.

Kwa kawaida usemi huu inatumika pamoja na kifungu cha ORDER BY na tayari tumeangalia mifano ambapo ilihitajika kurejesha safu mlalo za N za kwanza kutoka kwa seti ya matokeo.

Bila ORDER BY, kifungu hiki kawaida hutumiwa wakati tunahitaji tu kuangalia meza isiyojulikana kwetu, ambayo inaweza kuwa na rekodi nyingi, katika kesi hii tunaweza, kwa mfano, kuuliza kurudisha safu 10 tu za kwanza, lakini kwa uwazi tutasema 2 tu:

CHAGUA TOP 2 * KUTOKA KWA Wafanyakazi

Unaweza pia kubainisha neno PERCENT ili kurudisha asilimia inayolingana ya safu mlalo kutoka kwa seti ya matokeo:

CHAGUA ASILIMIA 25 BORA * KUTOKA KWA Wafanyakazi

Katika mazoezi yangu, sampuli kwa idadi ya safu hutumiwa mara nyingi.

Unaweza pia kutumia chaguo la WITH TIES na TOP, ambayo itasaidia kurudisha safu zote katika kesi ya kupanga kwa utata, i.e. sentensi hii itarejesha safu mlalo zote ambazo ni sawa katika utunzi kwenye safu mlalo zinazoangukia katika uteuzi wa TOP N; kwa hivyo, zaidi ya safu mlalo N zinaweza kuchaguliwa. Hebu tuongeze "Programu" nyingine yenye mshahara wa 1500 kwa onyesho:

WEKA Wafanyakazi(Kitambulisho,Jina,Barua pepe,Kitambulisho cha Nafasi,Kitambulisho cha Idara,Kitambulisho cha Msimamizi,Mshahara) MAADILI(1004,N"Nikolaev N.N."," [barua pepe imelindwa]",3,3,1003,1500)

Na tuongeze mfanyakazi mwingine bila kuonyesha nafasi na idara na mshahara wa 2000:

WEKA Wafanyakazi(Kitambulisho,Jina,Barua pepe,Kitambulisho cha Nafasi,Kitambulisho cha Idara,Kitambulisho cha Msimamizi,Mshahara) MAADILI(1005,N"Alexandrov A.A."," [barua pepe imelindwa]",NULL,NULL,1000,2000)

Sasa wacha tuchague, kwa kutumia chaguo la WITH TIES, wafanyikazi wote ambao mishahara yao inalingana na mishahara ya wafanyikazi 3, na mshahara mdogo zaidi (natumai itakuwa wazi zaidi ninachopata):

CHAGUA 3 BORA KWA KITAMBULISHO CHA TIES,Jina,Mshahara KUTOKA KWA WAFANYAKAZI KWA AGIZO KWA Mshahara

Hapa, ingawa TOP 3 imeonyeshwa, ombi lilirudisha rekodi 4, kwa sababu thamani ya Mshahara iliyorejesha TOP 3 (1500 na 2000) ilipatikana katika wafanyikazi 4. Kwa kuibua inafanya kazi kama hii:

Kwa maelezo.
TOP inatekelezwa kwa njia tofauti katika hifadhidata tofauti; katika MySQL kuna kifungu cha LIMIT kwa hili, ambacho unaweza kuongeza urekebishaji wa kuanzia.

Katika ORACLE 12c, pia walianzisha analog yao wenyewe, wakichanganya utendaji wa TOP na LIMIT - tafuta maneno "ORACLE OFFSET FETCH". Kabla ya toleo la 12c, safu wima bandia ROWNUM ilitumika kwa madhumuni haya.


Nini kitatokea ikiwa utatumia vifungu vya DISTINCT na TOP kwa wakati mmoja? Maswali kama haya yanaweza kujibiwa kwa urahisi kwa kufanya majaribio. Kwa ujumla, usiogope na usiwe wavivu kufanya majaribio, kwa sababu ... Wengi wao hujifunza kupitia mazoezi. Mpangilio wa maneno katika kauli SELECT ni kama ifuatavyo: DISTINCT huja kwanza, ikifuatiwa na TOP, i.e. Ikiwa unafikiri kimantiki na kusoma kutoka kushoto kwenda kulia, basi ya kwanza ya kutupa nakala itatumika, na kisha TOP itafanywa kulingana na seti hii. Kweli, wacha tuangalie na tuhakikishe kuwa hii ndio kesi:

CHAGUA Mshahara WA TOP 2 WA TOP 2 KUTOKA KWA Wafanyakazi KWA AGIZO KWA Mshahara

Mshahara
1500
2000

Wale. kwa hiyo, tulipokea mishahara 2 midogo kuliko yote. Bila shaka, kunaweza kuwa na kesi kwamba mshahara kwa wafanyakazi wengine hauwezi kutajwa (NULL), kwa sababu Mpango huo unaturuhusu kufanya hivi. Kwa hivyo, kulingana na kazi hiyo, tunaamua kusindika maadili NULL katika ORDER BY kifungu, au tu kutupa rekodi zote ambazo Mshahara ni NULL, na kwa hili tunaendelea kusoma kifungu cha WHERE.

WAPI - hali ya uteuzi wa safu

Sentensi hii inatumika kuchuja rekodi kwa sharti fulani. Kwa mfano, hebu tuchague wafanyikazi wote wanaofanya kazi katika idara ya "IT" (Kitambulisho chake = 3):

CHAGUA ID,LastName,FirstName,Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO DepartmentID=3 -- HUAGIZA KWA LastName,FirstName

ID Jina la familia Jina la kwanza Mshahara
1004 NULL NULL 1500
1003 Andreev Andrey 2000
1001 Petrov Peter 1500

Kifungu cha WAPI kimeandikwa kabla ya ORDER BY command.

Agizo la kutumia amri kwa seti ya Wafanyikazi wa awali ni kama ifuatavyo.

  1. WAPI - ikiwa imeelezwa, basi hatua ya kwanza kutoka kwa seti nzima ya Wafanyakazi ni kuchagua rekodi tu zinazokidhi hali hiyo.
  2. DISTINCT - ikibainishwa, nakala zote hutupwa
  3. AGIZA KWA - ikiwa imebainishwa, matokeo yamepangwa
  4. TOP - ikiwa imebainishwa, nambari maalum tu ya rekodi inarudishwa kutoka kwa matokeo yaliyopangwa

Wacha tuangalie mfano kwa uwazi:

CHAGUA TOP 1 Mshahara WA 1 KUTOKA KWA Wafanyakazi AMBAPO DepartmentID=3 AMRI KWA Mshahara

Kwa kuibua itaonekana kama hii:

Inafaa kumbuka kuwa kuangalia kwa NULL hakufanyiki kwa ishara sawa, lakini kwa kutumia waendeshaji wa IS NULL na IS NOT NULL. Kumbuka tu kwamba huwezi kulinganisha kwenye NULL kwa kutumia opereta "=" (ishara sawa), kwa sababu matokeo ya usemi pia yatakuwa sawa na NULL.

Kwa mfano, hebu tuchague wafanyikazi wote ambao hawana idara iliyobainishwa (yaani, Kitambulisho cha Idara NI NULL):

CHAGUA KITAMBULISHO,Jina KUTOKA KWA WAFANYAKAZI AMBAPO ID ya Idara NI NULL

Sasa, kama mfano, hebu tuhesabu bonasi kwa wafanyikazi wote walio na thamani ya BonusPercent iliyobainishwa (yaani, BonusPercent SIYO BATILI):

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO Asilimia ya Bonus SIYO BATILI

Ndiyo, kwa njia, ikiwa unafikiri juu yake, thamani ya BonusPercent inaweza kuwa sawa na sifuri (0), na thamani inaweza pia kuingizwa na ishara ya minus, kwa sababu hatukuweka vikwazo vyovyote kwenye uwanja huu.

Kweli, baada ya kusema juu ya shida, tuliambiwa kwa sasa kuzingatia kwamba ikiwa (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO SIYO(BonusPercent<=0 OR BonusPercent IS NULL)

Wale. Hapa ndipo tulipoanza kujifunza kuhusu waendeshaji wa Boolean. Usemi katika mabano "(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Usemi huu unaweza pia kuandikwa upya kwa kusema mara moja "warudishe wafanyikazi wote walio na bonasi" kwa kuelezea hili kwa usemi (BonusPercent>0 na BonusPercent SI UFUPI):

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO BonusPercent>0 NA BonusPercent SIYO BATILI

Pia kwenye sehemu ya WHERE unaweza kuangalia aina mbalimbali za misemo kwa kutumia waendeshaji na utendakazi wa hesabu. Kwa mfano, ukaguzi kama huo unaweza kufanywa kwa kutumia usemi na kazi ya ISNULL:

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO ISNULL(BonusPercent,0)>0

Waendeshaji Boolean na waendeshaji rahisi wa kulinganisha

Ndiyo, hatuwezi kufanya bila hisabati hapa, kwa hivyo wacha tuchukue safari fupi katika waendeshaji wa kulinganisha wa Boolean na rahisi.

Kuna waendeshaji 3 pekee wa Boolean katika SQL - NA, AU na SIO:

Kwa kila mwendeshaji wa Boolean, unaweza kutoa majedwali ya ukweli ambayo yanaonyesha matokeo yatakuwa nini wakati masharti yanaweza kuwa NULL:

Kuna waendeshaji wafuatao rahisi wa kulinganisha ambao hutumiwa kuunda hali:

Pamoja kuna waendeshaji 2 kwa kuangalia thamani / usemi wa NULL:

NI NULL Inajaribu usawa NULL
SI UTUPU Kupima usawa NULL

Kipaumbele: 1) Waendeshaji wote wa kulinganisha; 2) HAPANA; 3) NA; 4) AU.

Wakati wa kujenga tata maneno yenye mantiki mabano hutumiwa:

((sharti1 NA sharti2) AU SI(sharti3 NA sharti4 NA sharti5)) AU (…)

Pia, kwa kutumia mabano, unaweza kubadilisha mlolongo wa kawaida wa mahesabu.

Hapa nilijaribu kutoa wazo la algebra ya Boolean kwa kiasi cha kutosha kwa kazi. Kama unavyoona, ili kuandika hali ngumu zaidi huwezi kufanya bila mantiki, lakini hakuna mengi yake hapa (NA, AU na SI) na iligunduliwa na watu, kwa hivyo kila kitu ni sawa.

Twende hadi mwisho wa sehemu ya pili

Kama unaweza kuona, hata juu ya syntax ya msingi ya SELECT operator tunaweza kuzungumza kwa muda mrefu sana, lakini ili kukaa ndani ya upeo wa makala, hatimaye nitaonyesha ziada. waendeshaji mantiki- KATI, NDANI na LIKE.

KATI - kuangalia kwa kujumuishwa katika masafa

Thamani_ya_mtihani KATI YA_thamani_ya_kuanza NA thamani_ya_mwisho

Vielezi vinaweza kutenda kama maadili.

Hebu tuangalie mfano:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO MSHAHARA KATI YA 2000 NA 3000 -- ambaye ana mshahara wa kati ya 2000-3000

Kwa kweli, KATI ni nukuu iliyorahisishwa ya fomu:

CHAGUA ID,Jina,Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO Mshahara>=2000 NA Mshahara<=3000 -- все у кого ЗП в диапозоне 2000-3000

Neno NOT linaweza kutumika kabla ya neno KATI, ambalo litaangalia ikiwa thamani haiko ndani ya masafa maalum:

CHAGUA Kitambulisho, Jina, Mshahara KUTOKA KWA Wafanyakazi AMBAPO Mshahara SIO KATI YA 2000 NA 3000 - sawa na NOT(Mshahara>=2000 NA Mshahara<=3000)

Ipasavyo, ikiwa unatumia KATI, IN, LIKE, unaweza pia kuchanganya na masharti mengine kwa kutumia NA na AU:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO MSHAHARA KATI YA 2000 NA 3000 -- ambaye ana mshahara wa kati ya 2000-3000 NA DepartmentID=3 -- kuzingatia wafanyakazi wa idara 3 pekee.

IN - angalia kujumuishwa katika orodha ya maadili

Opereta huyu ana fomu ifuatayo:

Thamani_ya_Mtihani KATIKA (thamani1, thamani2, ...)

Nadhani ni rahisi kuonyesha na mfano:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO KITAMBULISHO CHA NAFASI (3,4) -- ambaye nafasi yake ni 3 au 4

Wale. hii kimsingi ni sawa na usemi ufuatao:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA Wafanyakazi AMBAPO PositionID=3 AU PositionID=4 -- ambao nafasi yao ni 3 au 4

Kwa upande wa NOT itakuwa sawa (tutapata kila mtu isipokuwa wale kutoka idara ya 3 na 4):

CHAGUA KITAMBULISHO,Jina,Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO KITAMBULISHO CHA NAFASI HAKUNA(3,4) -- sawa na NOT(PositionID=3 AU PositionID=4)

Swali lenye NOT IN linaweza pia kuonyeshwa kwa kutumia NA:

CHAGUA Kitambulisho, Jina, Mshahara KUTOKA KWA Wafanyakazi AMBAPO KITAMBULISHO CHA Nafasi<>3NA PositionID<>4 -- sawa na PositionID NOT IN(3,4)

Tafadhali kumbuka kuwa kutafuta maadili NULL kwa kutumia IN construct haitafanya kazi, kwa sababu kuangalia NULL=NULL pia itarudisha NULL, sio Kweli:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO ID ya Idara IN(1,2,NULL) -- Rekodi NULL hazitajumuishwa kwenye matokeo.

Katika kesi hii, vunja hundi katika hali kadhaa:

CHAGUA KITAMBULISHO, Jina,Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO KITAMBULISHO CHA Idara (1,2) -- 1 au 2 AU KITAMBULISHO CHA Idara NI BATILI -- au BATILI

Au unaweza kuandika kitu kama:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA WAFANYAKAZI AMBAPO ISNULL(ID ya Idara,-1) NDANI YA(1,2,-1) -- ikiwa una uhakika kuwa hakuna idara yenye ID=-1

Nadhani chaguo la kwanza, katika kesi hii, litakuwa sahihi zaidi na la kuaminika. Sawa, huu ni mfano tu wa kuonyesha ni miundo gani mingine inaweza kujengwa.

Inafaa pia kutaja kosa la siri zaidi linalohusishwa na NULL, ambalo linaweza kufanywa wakati wa kutumia NOT IN construct. Kwa mfano, tujaribu kuchagua wafanyakazi wote isipokuwa wale ambao idara yao ni 1 au idara yao haijaainishwa kabisa, i.e. sawa na NULL. Kama suluhisho, chaguo lifuatalo linajipendekeza:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO KITAMBULISHO CHA Idara (1,NULL)

Lakini baada ya kutekeleza hoja, hatutapokea safu hata moja, ingawa tulitarajia kuona yafuatayo:

Tena, utani hapa ulichezwa na NULL iliyoainishwa kwenye orodha ya maadili.

Hebu tuangalie kwa nini hitilafu ya kimantiki ilitokea katika kesi hii. Wacha tupanue swala kwa kutumia NA:

CHAGUA Kitambulisho, Jina, Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO ID ya Idara<>1 NA Kitambulisho cha Idara<>NULL -- shida ni kwa sababu ya ukaguzi huu NULL - hali hii itarudi NULL kila wakati

Hali ya kulia (ID ya Idara<>NULL) itatupa kutokuwa na uhakika hapa kila wakati, i.e. NULL. Sasa kumbuka jedwali la ukweli la AND operator, ambapo (TRUE AND NULL) inatoa NULL. Wale. wakati hali ya kushoto inafikiwa (ID ya Idara<>1) kwa sababu ya hali sahihi isiyobainishwa, tutaishia na thamani isiyofafanuliwa ya usemi mzima (ID ya Idara<>1 NA Kitambulisho cha Idara<>NULL), kwa hivyo kamba haitajumuishwa kwenye matokeo.

Hali inaweza kuandikwa upya kwa usahihi kama ifuatavyo:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA WAFANYAKAZI AMBAPO KITAMBULISHO CHA Idara HAKUNA(1) -- au kwa hali hii kitambulisho cha Idara<>1 NA Kitambulisho cha Idara SI TUPU -- na angalia kando kwa NOT NULL

IN pia inaweza kutumika pamoja na maswali madogo, lakini tutarejea kwa fomu hii katika sehemu zinazofuata za mafunzo haya.

LIKE - kuangalia kamba kwa kutumia muundo

Nitazungumza juu ya mwendeshaji huyu kwa fomu yake rahisi tu, ambayo ni ya kawaida na inaungwa mkono na lahaja nyingi za lugha ya SQL. Hata katika fomu hii, inaweza kutumika kutatua matatizo mengi ambayo yanahitaji kuangalia yaliyomo ya kamba.

Opereta huyu ana fomu ifuatayo:

Mfuatano_wa_mtihani KAMA string_pattern

Herufi maalum zifuatazo zinaweza kutumika katika "pattern_string":

  1. Mstari "_" inamaanisha kuwa mhusika yeyote anaweza kuchukua nafasi yake
  2. Ishara ya asilimia "%" - inasema kwamba inaweza kubadilishwa na idadi yoyote ya wahusika, ikiwa ni pamoja na hakuna
Wacha tuangalie mifano na ishara ya "%" (kwa mazoezi, kwa njia, hutumiwa mara nyingi zaidi):

CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi AMBAPO Jina KAMA "Pet%" -- ambaye jina lake linaanza na herufi "Pet" CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA KWA Wafanyakazi AMBAPO Jina la Mwisho LIKE "%ov" -- ambaye jina lake la mwisho linaishia na "ov" CHAGUA KITAMBULISHO, Jina la Mwisho KUTOKA KWA Wafanyakazi AMBAPO Jina la Mwisho LINAPENDA "%re%" -- ambaye jina lake la mwisho lina mchanganyiko "re"

Wacha tuangalie mifano iliyo na ishara "_":

CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA kwa Wafanyakazi AMBAPO Jina la Mwisho KAMA "_etrov" -- ambaye jina lake la mwisho lina herufi yoyote ya kwanza na herufi zinazofuata "etrov" CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA KWA Wafanyakazi AMBAPO Jina la Mwisho KAMA "____ov" -- ambaye jina lake la mwisho lina herufi zozote nne. na herufi zinazofuata "ov"

Kwa kutumia ESCAPE, unaweza kubainisha herufi ya kutoroka ambayo inaghairi athari ya kuangalia ya herufi maalum "_" na "%". Kifungu hiki kinatumika unapotaka kuangalia moja kwa moja ishara ya asilimia au chini katika mfuatano.

Ili kuonyesha ESCAPE, wacha tuweke takataka kwenye ingizo moja:

SASISHA Wafanyakazi WEKA FirstName="Hii ni tupio iliyo na %" WHERE ID=1005

Na wacha tuone maswali yafuatayo yanarudi:

CHAGUA * KUTOKA KWA Wafanyakazi AMBAPO Jina la Kwanza LINAPENDA "%!%%" ESCAPE "!" -- mstari una ishara "%" CHAGUA * KUTOKA KWA Wafanyakazi AMBAPO Jina la Kwanza KAMA "%!_%" ESCAPE "!" -- mstari una ishara "_".

Ikiwa unahitaji kuangalia kamba kwa mechi kamili, basi badala ya LIKE ni bora kutumia ishara "=":

CHAGUA * KUTOKA KWA Wafanyakazi WAPI FirstName="Peter"

Kwa maelezo.
Katika MS SQL, kwenye kiolezo cha waendeshaji KAMA, unaweza pia kutaja utaftaji kwa kutumia misemo ya kawaida; soma juu yake kwenye mtandao ikiwa uwezo wa kawaida wa mwendeshaji huyu hautoshi kwako.

ORACLE hutumia kitendakazi cha REGEXP_LIKE kutafuta kwa kutumia misemo ya kawaida.

Kidogo kuhusu masharti

Katika kesi ya kuangalia kamba kwa kuwepo kwa wahusika wa Unicode, utahitaji kuweka tabia N kabla ya quotes, i.e. N"…". Lakini kwa kuwa sehemu zote za herufi kwenye jedwali letu ziko katika umbizo la Unicode (aina ya nvarchar), unaweza kutumia umbizo hili kila mara kwa nyanja hizi. Mfano:

CHAGUA Kitambulisho,Jina KUTOKA KWA Wafanyakazi AMBAPO Jina LIKE N"Pet%" CHAGUA ID,Jina la Mwisho KUTOKA KWA Wafanyakazi WAPI LastName=N"Petrov"

Inapofanywa kwa usahihi, unapolinganisha dhidi ya uwanja wa aina ya varchar (ASCII), unapaswa kujaribu kutumia majaribio kwa kutumia "...", na unapolinganisha shamba na aina ya nvarchar (Unicode), unapaswa kujaribu kutumia majaribio kwa kutumia N" ...". Hii inafanywa ili kuzuia ubadilishaji wa aina zisizo wazi wakati wa utekelezaji wa hoja. Tunatumia sheria sawa wakati wa kuingiza (INSERT) maadili kwenye uwanja au kusasisha (UPDATE).

Wakati wa kulinganisha kamba, inafaa kuzingatia ukweli kwamba, kulingana na mipangilio ya hifadhidata (mgongano), ulinganisho wa kamba unaweza kuwa usio na hisia (wakati "Petrov" = "PETROV") au nyeti (wakati "Petrov"<>"PETROV").
Katika hali ya mpangilio unaozingatia kesi, ikiwa unataka kufanya utafutaji usiojali kesi, unaweza, kwa mfano, kubadilisha awali maneno ya kulia na kushoto hadi kesi moja - juu au chini:

CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi AMBAPO JUU(Jina) LIKE JUU(N"Pet%") -- au CHINI(Jina) KAMA CHINI(N"Pet%") CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA KWA WAFANYAKAZI WAPI JUU(LastName)=JUU( N"Petrov") -- au LOWER(LastName)=LOWER(N"Petrov")

Kidogo kuhusu tarehe

Wakati wa kuangalia tarehe, unaweza kutumia, kama kwa kamba, nukuu moja "...".

Bila kujali mipangilio ya kikanda katika MS SQL, unaweza kutumia sintaksia ya tarehe ifuatayo "YYYYMMDD" (mwaka, mwezi, siku pamoja bila nafasi). MS SQL itaelewa muundo huu wa tarehe kila wakati:

CHAGUA KITAMBULISHO, Jina, Siku ya Kuzaliwa KUTOKA KWA WAFANYAKAZI AMBAPO Siku ya Kuzaliwa KATI YA "19800101" NA "19891231" -- wafanyakazi wa miaka ya 80 AGIZA KWA Siku ya Kuzaliwa

Katika baadhi ya matukio, ni rahisi zaidi kuweka tarehe kwa kutumia kazi ya DATEFROMPARTS:

CHAGUA KITAMBULISHO,Jina,Siku ya Kuzaliwa KUTOKA KWA Wafanyakazi AMBAPO Siku ya Kuzaliwa KATI YA TAREHEFROMPARTS(1980,1,1) NA TAREHEKUTOKA(1989,12,31) AGIZO KWA Siku ya Kuzaliwa

Pia kuna chaguo la kukokotoa linalofanana DATETIMEFROMPARTS, ambalo hutumika kuweka Tarehe na Wakati (kwa aina ya tarehe).

Unaweza pia kutumia kitendakazi cha CONVERT ikiwa unahitaji kubadilisha mfuatano kuwa tarehe au thamani ya tarehe:

CHAGUA CONVERT(tarehe,"12.03.2015",104), CONVERT(tarehe,"2014-11-30 17:20:15",120)

Thamani 104 na 120 zinaonyesha ni muundo gani wa tarehe unatumika kwenye mfuatano. Unaweza kupata maelezo ya fomati zote halali katika maktaba ya MSDN kwa kutafuta "MS SQL CONVERT".

Kuna vitendaji vingi vya kufanya kazi na tarehe katika MS SQL, tafuta "vitendaji vya ms sql vya kufanya kazi na tarehe."

Kumbuka. Lahaja zote za lugha ya SQL zina seti zao za kazi za kufanya kazi na tarehe na hutumia mbinu yao ya kufanya kazi nazo.

Kidogo kuhusu nambari na mabadiliko yao

Taarifa katika sehemu hii pengine itakuwa muhimu zaidi kwa wataalamu wa IT. Ikiwa wewe sio mmoja, na lengo lako ni kujifunza jinsi ya kuandika maswali ili kupata habari unayohitaji kutoka kwa hifadhidata, basi unaweza usihitaji ujanja kama huo, lakini kwa hali yoyote, unaweza kupitia maandishi haraka na kuandika maelezo. , kwa sababu. Ikiwa umechukua kusoma SQL, basi tayari unajiunga na IT.

Tofauti na kitendakazi cha ubadilishaji wa CAST, unaweza kutaja kigezo cha tatu katika kitendakazi cha CONVERT, ambacho kinawajibika kwa mtindo wa uongofu (umbizo). Aina tofauti za data zinaweza kuwa na seti zao za mitindo, ambayo inaweza kuathiri matokeo yaliyorejeshwa. Tayari tumegusia matumizi ya mitindo wakati wa kuzingatia ubadilishaji wa mfuatano kwa kutumia kitendakazi cha CONVERT kuwa tarehe na aina za tarehe.

Unaweza kusoma zaidi kuhusu CAST, CONVERT kazi na mitindo katika MSDN - "CAST na CONVERT Kazi (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

Ili kurahisisha mifano, taarifa za lugha za Transact-SQL DECLARE na SET zitatumika hapa.

Kwa kweli, katika kesi ya kubadilisha nambari kuwa nambari halisi (ambayo nilitoa mwanzoni mwa somo hili, ili kuonyesha tofauti kati ya nambari kamili na mgawanyiko halisi), ufahamu wa nuances ya ubadilishaji sio muhimu sana, kwa sababu hapo tulifanya nambari kamili hadi ubadilishaji halisi (aina ambayo ni kubwa zaidi kuliko anuwai ya nambari):

TANGAZA @min_int int SET @min_int=-2147483648 TANGAZA @max_int int SET @max_int=2147483647 CHAGUA -- (-2147483648) @min_int,CAST(@min_int AS float),CONVERT(float_4) , CONVERT_int4_8 dakika 8,@float_x3,@x3648 ,CAST(@max_int AS float),CONVERT(float,@max_int), -- numeric(16,6) @min_int/1., -- (-2147483648.000000) @max_int/1. -- 2147483647.000000

Labda haikufaa kutaja njia ya uongofu kamili uliopatikana kwa kugawanya na (1.), kwa sababu Inashauriwa kujaribu kufanya ubadilishaji wazi kwa udhibiti mkubwa juu ya aina ya matokeo yaliyopatikana. Ingawa, ikiwa tunataka kupata matokeo ya aina ya nambari, yenye nambari maalum ya tarakimu baada ya nukta ya desimali, basi tunaweza kutumia hila katika MS SQL kuzidisha thamani kamili kwa (1., 1.0, 1.00, nk.) :

TANGAZA @int int SET @int=123 CHAGUA @int*1., -- nambari(12, 0) - maeneo 0 decimal @int*1.0, -- nambari(13, 1) - 1 decimal mahali @int*1.00, -- nambari(14, 2) - herufi 2 -- ingawa wakati mwingine ni bora kufanya ubadilishaji wazi CAST(@int AS numeric(20, 0)), -- 123 CAST(@int AS numeric(20, 1) ), -- 123.0 CAST(@int AS nambari(20, 2)) -- 123.00

Katika baadhi ya matukio, maelezo ya uongofu yanaweza kuwa muhimu sana, kwa sababu... zinaathiri usahihi wa matokeo yaliyopatikana, kwa mfano, katika kesi wakati uongofu unafanywa kutoka kwa thamani ya nambari hadi kwenye kamba (varchar). Wacha tuangalie mifano ya kubadilisha pesa na maadili ya kuelea kuwa varchar:

Tabia wakati wa kubadilisha pesa kuwa varchar TANGAZA @money money SET @money = 1025.123456789 -- kutakuwa na ubadilishaji kamili hadi 1025.1235, kwa sababu aina ya pesa huhifadhi tarakimu 4 pekee baada ya nukta ya desimali CHAGUA @money, -- 1025.1235 -- kwa chaguo-msingi, CAST na CONVERT zinatenda sawa (yaani, kwa kusema, mtindo wa 0 unatumika) CAST(@money as varchar(20)) , -- 1025.12 CONVERT(varchar(20), @money), -- 1025.12 CONVERT(varchar(20), @money, 0), -- 1025.12 (mtindo 0 - hakuna kitenganishi cha elfu na nafasi 2 za desimali (muundo chaguomsingi) CONVERT( varchar(20), @money, 1), -- 1.025.12 (mtindo wa 1 - hutumia kitenganishi cha elfu moja na maeneo 2 ya desimali) CONVERT(varchar(20), @money, 2) -- 1025.1235 (mtindo wa 2 - hakuna kitenganishi na nambari 4 baada ya nukta ya decimal)

Tabia wakati wa kubadilisha kuelea kuwa varchar TANGAZA @float1 float SET @float1 = 1025.123456789 TANGAZA @float2 float SET @float2 = 1231025.123456789 CHAGUA @float1, -- 10402252,10252,10252. 345679 -- Kwa chaguo-msingi, CAST na CONVERT hufanya sawa (yaani, kwa kusema, mtindo 0 unatumika) -- mtindo 0 - Sio zaidi ya tarakimu 6. Nukuu ya kielelezo inatumika kwa lazima -- mambo ya kutisha sana hutokea hapa wakati wa kugeuzwa kuwa varchar CAST(@float1 kama varchar(20)), -- 1025.12 CONVERT(varchar(20), @float1), -- 1025.12 CONVERT(varchar( 20 ), @float1, 0), -- 1025.12 CAST(@float2 kama varchar(20)), -- 1.23103e+006 CONVERT(varchar(20), @float2), -- 1.23103e+006 CONVERT(varchar( 20 ), @float2, 0), -- 1.23103e+006 -- mtindo 1 - Kila mara tarakimu 8. Nukuu za kisayansi za nambari hutumiwa kila wakati. -- mtindo huu wa kuelea pia si sahihi sana CONVERT(varchar(20), @float1, 1), -- 1.0251235e+003 CONVERT(varchar(20), @float2, 1), -- 1.2310251e+006 - - style 2 - Daima 16 bits. Nukuu za kisayansi za nambari hutumiwa kila wakati. -- hapa usahihi ni bora CONVERT(varchar(30), @float1, 2), -- 1.025123456789000e+003 - SAWA CONVERT(varchar(30), @float2, 2) -- 1.231025123450678 -9e+OK

Kama inavyoonekana kutoka kwa mfano, aina za kuelea huelea, halisi katika hali zingine zinaweza kuunda kosa kubwa, haswa ikiwa inabadilishwa kuwa kamba na nyuma (hii inaweza kutokea na aina anuwai za ujumuishaji, wakati data, kwa mfano, inahamishwa ndani. faili za maandishi kutoka kwa mfumo mmoja hadi mwingine).

Ikiwa unahitaji kudhibiti kwa uwazi usahihi hadi ishara fulani, zaidi ya 4, basi wakati mwingine ni bora kutumia aina ya desimali/nambari kuhifadhi data. Ikiwa herufi 4 zinatosha, basi unaweza kutumia aina ya pesa - takriban inalingana na nambari (20,4).

Desimali na nambari DECLARE @money money SET @money = 1025.123456789 -- 1025.1235 DECLARE @float1 float SET @float1 = 1025.123456789 TAMBUA @float2 float SET @float2 float SET @float1207 namba 25 DECLARE = ​​625 DECLARE 6 25 CLARE 5 5 12. 9) WEKA @numeric = 1025.123456789 CHAGUA CAST( @numeric kama varchar(20)), -- 1025.12345679 CONVERT(varchar(20), @numeric), -- 1025.12345679 CAST(@pesa kama nambari(28,9)), -- 1025.123500000 CAST (@2float CAST) ,9)), -- 1025.123456789 CAST(@float2 kama nambari(28,9)) -- 1231025.123456789

Kumbuka.
Kutoka kwa toleo la MS SQL 2008, unaweza kutumia badala ya ujenzi: Ongeza lebo

Lugha ya SQL hutumiwa kupata data kutoka kwa hifadhidata. SQL ni lugha ya programu ambayo inafanana kwa karibu na Kiingereza lakini imekusudiwa kwa programu za usimamizi wa hifadhidata. SQL inatumika katika kila swali katika Ufikiaji.

Kuelewa jinsi SQL inavyofanya kazi hukusaidia kuunda maswali sahihi zaidi na kurahisisha kusahihisha hoja zinazoleta matokeo yasiyo sahihi.

Haya ni makala kutoka kwa mfululizo wa makala kuhusu lugha ya SQL kwa Ufikiaji. Inafafanua misingi ya kutumia SQL kupata data na inatoa mifano ya sintaksia ya SQL.

Katika makala hii

SQL ni nini?

SQL ni lugha ya programu iliyoundwa kufanya kazi na seti za ukweli na uhusiano kati yao. Mipango ya uhusiano ya usimamizi wa hifadhidata kama vile Microsoft Office Access hutumia SQL kudhibiti data. Tofauti na lugha nyingi za programu, SQL inasomeka na inaeleweka hata kwa wanaoanza. Kama lugha nyingi za programu, SQL ni kiwango cha kimataifa kinachotambuliwa na kamati za viwango kama vile ISO na ANSI.

Seti za data zimefafanuliwa katika SQL ili kusaidia kujibu maswali. Unapotumia SQL, lazima utumie syntax sahihi. Sintaksia ni seti ya kanuni zinazoruhusu vipengele vya lugha kuunganishwa ipasavyo. Sintaksia ya SQL inategemea sintaksia ya Kiingereza na hushiriki vipengele vingi na sintaksia ya Visual Basic for Applications (VBA).

Kwa mfano, rahisi Taarifa ya SQL, ambayo hupata orodha ya majina ya mwisho ya watu wanaowasiliana nao wanaoitwa Mary, inaweza kuonekana kama hii:

CHAGUA Jina_la_Mwisho
KUTOKA kwa Anwani
WAPI First_Name = "Mariamu";

Kumbuka: Lugha ya SQL haitumiwi tu kufanya shughuli kwenye data, lakini pia kuunda na kubadilisha muundo wa vitu vya hifadhidata, kama vile majedwali. Sehemu ya SQL ambayo hutumiwa kuunda na kurekebisha vitu vya hifadhidata inaitwa DDL. DDL haijashughulikiwa katika nakala hii. Kwa maelezo zaidi, angalia Unda au urekebishe majedwali au faharasa kwa kutumia hoja ya ufafanuzi wa data.

CHAGUA kauli

Taarifa ya SELECT hutumiwa kuelezea seti ya data katika SQL. Ina maelezo kamili ya seti ya data ambayo inahitaji kurejeshwa kutoka kwa hifadhidata, ikijumuisha yafuatayo:

    meza ambazo zina data;

    uhusiano kati ya data kutoka vyanzo mbalimbali;

    mashamba au mahesabu kulingana na data iliyochaguliwa;

    masharti ya uteuzi ambayo lazima yatimizwe na data iliyojumuishwa katika matokeo ya swala;

    hitaji na njia ya kupanga.

Taarifa za SQL

Taarifa ya SQL inaundwa na sehemu kadhaa zinazoitwa vifungu. Kila kifungu katika taarifa ya SQL kina madhumuni. Baadhi ya matoleo yanahitajika. Jedwali hapa chini linaonyesha taarifa za SQL zinazotumiwa sana.

Taarifa ya SQL

Maelezo

Lazima

Inafafanua sehemu ambazo zina data inayohitajika.

Inafafanua majedwali ambayo yana sehemu zilizoainishwa katika kifungu cha CHAGUA.

Inafafanua masharti ya uteuzi wa sehemu ambayo rekodi zote zilizojumuishwa kwenye matokeo lazima zitimize.

Huamua mpangilio wa matokeo.

Katika taarifa ya SQL ambayo ina vipengele vya kukokotoa, hubainisha sehemu ambazo thamani ya muhtasari wake haijahesabiwa katika kifungu cha SELECT.

Ikiwa tu sehemu kama hizo zipo

Taarifa ya SQL iliyo na fomula za kukokotoa hufafanua masharti yanayotumika kwa sehemu ambazo thamani ya muhtasari wake inakokotolewa katika kifungu cha SELECT.

Masharti ya SQL

Kila sentensi ya SQL ina maneno ambayo yanaweza kulinganishwa na sehemu za hotuba. Jedwali hapa chini linaonyesha aina za maneno ya SQL.

Muda wa SQL

Sehemu inayolinganishwa ya hotuba

Ufafanuzi

Mfano

kitambulisho

nomino

Jina linalotumiwa kutambua kitu cha hifadhidata, kama vile jina la sehemu.

Wateja.[Nambari ya Simu]

mwendeshaji

kitenzi au kielezi

Neno kuu linalowakilisha au kurekebisha kitendo.

mara kwa mara

nomino

Thamani ambayo haibadiliki, kama vile nambari au NULL.

kujieleza

kivumishi

Mchanganyiko wa vitambulishi, waendeshaji, vidhibiti na vitendakazi vilivyoundwa ili kukokotoa thamani moja.

>= Bidhaa.[Bei]

Vifungu vya Msingi vya SQL: CHAGUA, KUTOKA, na WAPI

Muundo wa jumla wa taarifa za SQL ni:

CHAGUA uga_1
KUTOKA jedwali_1
WAPI kigezo_1
;

Vidokezo:

    Ufikiaji hauheshimu mapumziko ya mstari katika taarifa za SQL. Licha ya hili, inashauriwa kuanza kila sentensi na mstari mpya ili taarifa ya SQL iwe rahisi kusoma kwa mtu aliyeiandika na kwa kila mtu mwingine.

    Kila kauli SELECT inaisha na nusu koloni (;). Nusu koloni inaweza kuonekana mwishoni mwa sentensi ya mwisho au kwenye mstari tofauti mwishoni mwa taarifa ya SQL.

Mfano katika Ufikiaji

Mfano hapa chini unaonyesha jinsi taarifa ya SQL inavyoweza kuonekana katika Upataji ombi rahisi kwa sampuli.

1. CHAGUA kifungu

2. KUTOKA kifungu

3. WAPI kifungu

Wacha tuangalie mfano wa sentensi kwa sentensi ili kuelewa jinsi syntax ya SQL inavyofanya kazi.

CHAGUA kifungu

CHAGUA, Kampuni

Hiki ni kifungu cha CHAGUA. Ina (CHAGUA) taarifa ikifuatwa na vitambulishi viwili ("[Anwani ya Barua pepe]" na "Kampuni").

Ikiwa kitambulisho kina nafasi au ishara maalum(kwa mfano, "Anwani ya Barua pepe"), lazima iwekwe kwenye mabano ya mstatili.

Kifungu cha SELECT hakihitaji kutaja meza zilizo na mashamba, na huwezi kutaja masharti ya uteuzi ambayo lazima yatimizwe na data iliyojumuishwa katika matokeo.

Katika taarifa CHAGUA, kifungu cha SELECT daima huja mbele ya kifungu cha KUTOKA.

KUTOKA kifungu

KUTOKA kwa Anwani

Hiki ni kifungu cha KUTOKA. Ina taarifa ya (KUTOKA) ikifuatiwa na kitambulisho (Anwani).

Kifungu cha FROM hakibainishi sehemu za kuchagua.

WAPI kifungu

WAPI City="Seattle"

Hiki ndicho kifungu cha WAPI. Ina taarifa (WHERE) ikifuatiwa na usemi (Mji="Rostov").

Kuna mambo mengi unaweza kufanya kwa SELECT, FROM, na WHERE vifungu. Kwa habari zaidi kuhusu kutumia ofa hizi, angalia makala zifuatazo:

Matokeo ya kupanga: ORDER BY

Kama Microsoft Excel, Ufikiaji hukuruhusu kupanga matokeo ya swali kwenye jedwali. Kwa kutumia kifungu cha ORDER BY, unaweza pia kubainisha jinsi matokeo yanapangwa wakati hoja inatekelezwa. Ikiwa kifungu cha ORDER BY kinatumika, lazima kionekane mwishoni mwa taarifa ya SQL.

Kifungu cha ORDER BY kina orodha ya sehemu za kupanga, kwa mpangilio ule ule ambao aina itatumika.

Tuseme, kwa mfano, kwamba matokeo yanahitaji kupangwa kwanza na uga wa "Kampuni" kwa mpangilio wa kushuka, na kisha ikiwa kuna rekodi zilizo na thamani sawa mashamba "Kampuni", - yapange kwa shamba "Anwani ya Barua pepe" kwa utaratibu wa kupanda. Kifungu cha ORDER BY kingeonekana kama hii:

AGIZA KWA Kampuni DESC,

Kumbuka: Kwa chaguo-msingi, Ufikiaji hupanga maadili kwa mpangilio wa kupanda (A hadi Z, ndogo hadi kubwa). Ili kupanga maadili kwa mpangilio wa kushuka badala yake, lazima ubainishe neno kuu la DESC.

Kwa habari zaidi kuhusu ORDER BY clause, angalia ORDER BY clause article.

Kufanya kazi na data ya muhtasari: KUNDI KWA na KUWA NA vifungu

Wakati mwingine unahitaji kufanya kazi na data ya muhtasari, kama vile mauzo ya jumla ya mwezi au bidhaa ghali zaidi katika hisa. Ili kufanya hivyo, kifungu cha SELECT kinatumika kazi ya jumla kwenye uwanja. Kwa mfano, ikiwa ungeendesha hoja ili kupata idadi ya anwani za barua pepe kwa kila kampuni, kifungu cha SELECT kinaweza kuonekana kama hii:

Uwezo wa kutumia kitendakazi fulani cha jumla hutegemea aina ya data kwenye uwanja na usemi unaotaka. Kwa maelezo zaidi kuhusu utendaji wa jumla unaopatikana, angalia Kazi za Takwimu za SQL.

Inabainisha sehemu ambazo hazitumiki katika kukokotoa kwa jumla: kifungu cha GROUP BY

Unapotumia vipengele vya kukokotoa vya jumla, kwa kawaida unahitaji kuunda GROUP BY kifungu. Kifungu cha GROUP BY kinabainisha sehemu zote ambazo utendakazi wa jumla hautumiki. Ikiwa jumla ya chaguo za kukokotoa zitatumika kwa sehemu zote katika hoja, huhitaji kuunda kifungu cha GROUP BY.

KUNDI KWA kifungu lazima kifuate mara moja kifungu cha WAPI au KUTOKA ikiwa hakuna kifungu cha WAPI. Kifungu cha GROUP BY kinaorodhesha sehemu kwa mpangilio sawa na kifungu cha CHAGUA.

Wacha tuendelee mfano uliopita. Katika kifungu cha SELECT, ikiwa fomula ya jumla inatumika kwa uga wa [Anwani ya Barua pepe] tu, basi kifungu cha GROUP BY kingeonekana kama hii:

KUNDI KWA Kampuni

Kwa habari zaidi kuhusu KUNDI KWA kifungu, angalia kifungu cha KUNDI KWA KIFUNGU.

Kuzuia maadili yaliyojumlishwa kwa kutumia masharti ya kupanga: kifungu cha HAVING

Ikiwa unahitaji kutaja masharti ili kupunguza matokeo, lakini sehemu ambayo ungependa kuyatumia inatumika kazi ya jumla, kifungu cha WAPI hakiwezi kutumika. Ibara ya HAVING inapaswa kutumika badala yake. Kifungu cha HAVING kinafanya kazi sawa na kifungu cha WHERE, lakini kinatumika kwa data iliyojumlishwa.

Kwa mfano, tuseme kwamba chaguo la kukokotoa la AVG (ambalo linakokotoa wastani) linatumika kwa sehemu ya kwanza katika kifungu cha SELECT:

CHAGUA COUNT(), Kampuni

Ikiwa ungependa kuweka kikomo matokeo ya hoja kulingana na thamani ya chaguo za kukokotoa COUNT, huwezi kutumia sharti la uteuzi kwenye sehemu hii katika kifungu cha WHERE. Badala yake, sharti liwekwe katika kifungu cha HAVING. Kwa mfano, ikiwa ungependa hoja yako irudishe safu mlalo ikiwa tu kampuni ina anwani nyingi za barua pepe, unaweza kutumia kifungu kifuatacho cha HAVING:

KUWA NA HESABU()>1

Kumbuka: Hoja inaweza kujumuisha kifungu cha WHERE na kifungu cha KUWA NA, pamoja na masharti ya uteuzi wa sehemu ambazo hazitumiki katika kazi za takwimu, yamebainishwa katika kifungu cha WAPI, na masharti ya sehemu zinazotumika katika utendaji wa takwimu yamebainishwa katika kifungu cha HAVING.

Kwa habari zaidi kuhusu KUWA NA kifungu, angalia kifungu cha KUWA NA KUWA NA .

Kuchanganya matokeo ya hoja: Opereta wa UNION

Opereta wa UNION hutumiwa kutazama wakati huo huo data yote inayoletwa na hoja nyingi sawa kama seti iliyounganishwa.

Opereta wa UNION hukuruhusu kuchanganya kauli mbili SELECT kuwa moja. CHAGUA taarifa za kuunganishwa lazima ziwe nazo nambari sawa na mpangilio wa sehemu za pato zilizo na aina sawa au zinazolingana za data. Hoja inapotekelezwa, data kutoka kwa kila seti ya sehemu zinazolingana huunganishwa kuwa sehemu moja ya matokeo, kwa hivyo matokeo ya hoja huwa na sehemu nyingi kama kila taarifa ya mtu binafsi CHAGUA.

Kumbuka: Katika maswali ya kujiunga, aina za data za nambari na maandishi zinaoana.

Kwa kutumia opereta wa UNION, unaweza kubainisha kama nakala za safu mlalo, ikiwa zipo, zinapaswa kujumuishwa katika matokeo ya hoja. Ili kufanya hivyo, tumia neno kuu la YOTE.

Hoja ya kuchanganya kauli mbili SELECT ina sintaksia ya msingi ifuatayo:

CHAGUA uga_1
KUTOKA jedwali_1
MUUNGANO
CHAGUA sehemu_a
KUTOKA jedwali_a
;

Kwa mfano, tuseme una jedwali mbili zinazoitwa "Bidhaa" na "Huduma". Majedwali yote mawili yana sehemu zenye jina la bidhaa au huduma, bei na maelezo ya udhamini, pamoja na sehemu inayoonyesha upekee wa bidhaa au huduma inayotolewa. Ingawa jedwali la "Bidhaa" na "Huduma" hutoa aina tofauti dhamana, maelezo ya msingi ni sawa (ikiwa bidhaa au huduma fulani zimetolewa kwa dhamana ya ubora). Unaweza kutumia swali la kujiunga lifuatalo ili kuunganisha sehemu nne kutoka kwa jedwali mbili:

CHAGUA jina, bei, dhamana_inapatikana, ofa_ya_kipekee
KUTOKA kwa Bidhaa
MUUNGANO WOTE
CHAGUA jina, bei, dhamana_inapatikana, ofa_ya_kipekee
KUTOKA kwa Huduma
;

Kwa habari zaidi kuhusu kuchanganya kauli SELECT kwa kutumia opereta UNION, ona

Wakati wa kuhama kutoka MS SQL hadi MySQL, pamoja na kuhamisha data, lazima pia uhamishe msimbo wa programu ambayo iko kwenye hifadhidata.

Hapo awali tulijadili jinsi ya kutumia zana ya WorkSQL Workbench.

Kama sehemu ya uhamishaji, itabadilisha majedwali na kunakili data pekee, lakini haitabadilisha vichochezi, maoni au taratibu zilizohifadhiwa. Lazima ubadilishe wewe mwenyewe kuwa hifadhidata ya MySQL.

Ili kutekeleza ubadilishaji huu wewe mwenyewe, ni lazima uelewe tofauti za kimsingi kati ya hoja za MS SQL na MySQL.

Wakati wa uongofu wangu kutoka Microsoft SQL Seva kwa hifadhidata ya MySQL, nilikutana na taarifa na maswali yafuatayo ya MS SQL ambayo hayakuendana na MySQL na ilibidi nibadilishe kama ilivyo hapo chini.

1. Kuunda taratibu zilizohifadhiwa. Sintaksia

Syntax ya msingi ya kuunda taratibu zilizohifadhiwa ni tofauti.

MS SQL Imehifadhiwa, syntax ya kuunda utaratibu:

TENGENEZA UTARATIBU. @someString VarChar(150) Kama BEGIN -- hoja za Sql huenda hapa END

kwa MySQL syntax ya kuunda utaratibu ni:

TENGENEZA UTARATIBU uliohifadhiwaJina la Utaratibu(IN someString VarChar(150)) ANZA -- hoja za Sql huenda hapa END

2. Kuunda meza za muda

Katika nambari ya MS SQL, nimeunda meza kadhaa za muda ambazo zinahitajika kwa programu. Sintaksia ya kuunda jedwali la muda inatofautiana kama inavyoonyeshwa hapa chini.

Syntax ya MS SQL ya kuunda jedwali la muda:

TUNZA TABLE #JedwaliJina(emp_id VARCHAR(10)COLLATE Database_Default PRIMARY KEY, emp_Jina VARCHAR(50) COLLATE Hifadhidata_Chaguo-msingi, emp_Code VARCHAR(30) COLLATE Hifadhidata_Chaguo-msingi, emp_Department_Default VARCHAR_Default_Default_Default_Default)3

Syntax ya MySQL ya kuunda jedwali la muda ni:

TUNDA jedwali la JEDWALI LA MUDAJina(emp_id VARCHAR(10), emp_Name VARCHAR(50), emp_Code VARCHAR(30), emp_Department VARCHAR(30));

3. IF Sintaksia

Nimetumia hali nyingi katika taratibu zangu zilizohifadhiwa na vichochezi ambavyo havikufanya kazi baada ya kubadilika kuwa MySQL kwani syntax ni tofauti kama inavyoonyeshwa hapa chini.

Sintaksia ya Masharti ya MS SQL IF:

Ikiwa(@intSomeVal="") ANZA WEKA @intSomeVal=10 MWISHO

Syntax ya Hali ya MySQL IF:

IKIWA @intSomeVal=""BASI WEKA @intSomeVal=10; ENDIF;

4. IKIWA ipo hali

Matumizi mengine ya kawaida ni, ikiwa ni hali, kuangalia kama hoja ilirejesha safu mlalo au la; na ikiwa inarudisha safu nyingi, fanya kitu. Kwa hili nimetumia IF EXISTS katika MS SQL ambayo inahitaji kubadilishwa kuwa amri za MySQL IF kama ilivyoelezewa hapa chini.

MS SQL IKIWA IMEONDOKA Mfano:

IKIWA IPO(CHAGUA 1 KUTOKA #tableName NA(NOLOCK) AMBAPO ColName="empType") ANZA -- hoja za Sql huenda hapa END

Sawa ya MySQL ya hapo juu, kwa kutumia hali inapofikiwa:

IF(CHAGUA hesabu(*) KUTOKA tableName WHERE ColName="empType") > 0 BASI -- hoja za Sql huenda hapa END IF;

5. Kazi za tarehe

Kutumia vitendaji vya data ndani ya utaratibu uliohifadhiwa ni kawaida sana. Jedwali lifuatalo linaonyesha tofauti kati ya MS SQL na Data ya MySQL, vitendaji vinavyohusiana.

Seva ya MS SQLSeva ya MySQL
GETDATE()SASA()
SYSDATE()
CURRENT_TIMESTAMP()
GETDATE() + 1SASA() + KIPINDI CHA SIKU 1
CURRENT_TIMESTAMP +INTERVAL SIKU 1
DATEADD(dd, -1, GETDATE())ONGEZA(SASA(), MUDA -SIKU 1)
CONVERT(VARCHAR(19),GETDATE())DATE_FORMAT(SASA(),’%b %d %Y %h:%i %p’)
CONVERT(VARCHAR(10),GETDATE(),110)DATE_FORMAT(SASA(),’%m-%d-%Y’)
CONVERT(VARCHAR(24),GETDATE(),113)DATE_FORMAT(SASA(),’%d %b %Y %T:%f’)
BADILISHA(VARCHAR(11),TAREHE(),6)DATE_FORMAT(SASA(),’%d %b %y’)

6. Kutangaza vigezo

Katika taratibu zilizohifadhiwa za MS SQL, unaweza kutangaza vigeu mahali fulani kati ya "Anza" na "mwisho"

Hata hivyo, katika MySql unapaswa kuzitangaza tu baada ya kutangaza "kuanza" utaratibu uliohifadhiwa. Hairuhusiwi kutangaza tofauti wakati wowote.

7. Chagua rekodi za kwanza za N

Katika MS SQL, utatumia SELECT, TOP ikiwa ungependa kuchagua rekodi chache za kwanza pekee. Kwa mfano, ili kuchagua rekodi 10 za kwanza, ungefanya yafuatayo:

CHAGUA TOP 10 * KUTOKA TABLE;

Katika MySQL, itabidi utumie LIMIT badala ya TOP kama inavyoonyeshwa hapa chini.

CHAGUA * KUTOKA JEDWALI LIMIT 10;

8. Badilisha Nambari iwe Chati

Katika MS SQL ungefanya vitendo vifuatavyo(Geuza vitendaji) ili kubadilisha nambari kamili kuwa herufi.

CONVERT(VARCHAR(50), someIntVal)

Katika MySQL, utatumia kitendakazi cha CAST kubadilisha nambari kamili kuwa herufi, kama inavyoonyeshwa hapa chini.

CAST (someIntVal kama CHAR)

9. Concatenation operator

Ikiwa unadanganya data nyingi ndani ya utaratibu uliohifadhiwa, unaweza kutaka kutumia kufanya uunganishaji wa kamba.

Katika MS SQL ishara ya opereta ya uunganishaji. Mfano wa matumizi kama haya umeonyeshwa hapa chini.

WEKA @someString = "%|" + @someStringVal + "|%"

Katika MySQL, ikiwa unatumia hali ya AnSi, basi ni sawa na katika MS SQL. hizo. + ishara, itafanya kazi kwa upatanisho.

Lakini, katika hali ya msingi, katika MySQL, tunapaswa kutumia kazi ya CONCAT ("str1", "str2", "str3".. "strN").

SET someString = CONCAT("%|", someStringVal, "|%");

Katika sehemu ya kwanza, tayari tuligusa kidogo kwenye lugha ya DML, kwa kutumia karibu seti nzima ya amri zake, isipokuwa amri ya MERGE.

Nitazungumza juu ya DML kulingana na mlolongo wangu mwenyewe, uliotengenezwa kutoka kwa uzoefu wa kibinafsi. Njiani, nitajaribu pia kuzungumza juu ya sehemu "zinazoteleza" ambazo zinafaa kuzingatia; sehemu hizi "zinazoteleza" zinafanana katika lahaja nyingi za lugha ya SQL.

Kwa sababu kitabu cha maandishi kinajitolea kwa wasomaji mbalimbali (sio watengeneza programu tu), basi maelezo wakati mwingine yatakuwa sahihi, i.e. ndefu na ya kuchosha. Hii ni maono yangu ya nyenzo, ambayo ilipatikana hasa katika mazoezi kama matokeo ya shughuli za kitaaluma.

Lengo kuu la somo hili, hatua kwa hatua, ni kukuza uelewa kamili wa kiini cha lugha ya SQL na kukufundisha jinsi ya kutumia kwa usahihi miundo yake. Wataalamu katika uwanja huu wanaweza pia kupendezwa na nyenzo hii, labda wataweza kujifunza kitu kipya kwao, au labda itakuwa muhimu kuisoma ili kuburudisha kumbukumbu zao. Natumaini kila mtu atapata kuvutia.

Kwa sababu DML katika lahaja ya hifadhidata ya MS SQL inahusiana kwa karibu sana na sintaksia ya muundo wa SELECT, kwa hivyo nitaanza kuzungumza nayo kuhusu DML. Kwa maoni yangu, ujenzi wa SELECT ndio muundo muhimu zaidi katika lugha ya DML, kwa sababu kwa sababu yake au sehemu zake, data muhimu hutolewa kutoka kwa hifadhidata.

Lugha ya DML ina miundo ifuatayo:

  • CHAGUA - uteuzi wa data
  • INSERT - kuingiza data mpya
  • UPDATE - sasisho la data
  • FUTA - kufuta data
  • MERGE - kuunganisha data

Katika sehemu hii, tutaangalia tu syntax ya msingi ya amri ya SELECT, ambayo inaonekana kama hii:

CHAGUA safu_orodha au * KUTOKA chanzo WHERE chuja ORDER BY sort_expression
Mada ya taarifa ya SELECT ni pana sana, kwa hiyo katika sehemu hii nitazingatia tu miundo yake ya msingi. Ninaamini kuwa bila kujua misingi vizuri, huwezi kuanza kusoma miundo ngumu zaidi, kwa sababu ... basi kila kitu kitazunguka muundo huu wa msingi (subqueries, joins, nk).

Pia, kama sehemu ya sehemu hii, nitazungumza pia juu ya toleo la TOP. Kwa makusudi sikuonyesha sentensi hii katika sintaksia ya kimsingi, kwa sababu... inatekelezwa tofauti katika lahaja tofauti za SQL.

Ikiwa lugha ya DDL ni tuli zaidi, i.e. kwa msaada wake, miundo ngumu huundwa (meza, mahusiano, nk), basi lugha ya DML ina nguvu katika asili, hapa unaweza kupata matokeo sahihi kwa njia tofauti.

Mafunzo pia yataendelea katika hali ya Hatua kwa Hatua, i.e. Wakati wa kusoma, unapaswa kujaribu mara moja kukamilisha mfano kwa mikono yako mwenyewe. Kisha unachambua matokeo yaliyopatikana na jaribu kuelewa kwa intuitively. Ikiwa kitu bado haijulikani, kwa mfano, maana ya kazi, kisha ugeuke kwenye mtandao kwa usaidizi.

Mifano itaonyeshwa kwenye hifadhidata ya Jaribio, ambayo iliundwa kwa kutumia DDL+DML katika sehemu ya kwanza.

Kwa wale ambao hawakuunda hifadhidata katika sehemu ya kwanza (kwa kuwa sio kila mtu anayeweza kupendezwa na lugha ya DDL), wanaweza kutumia hati ifuatayo:

Jaribu hati ya kuunda hifadhidata

Kuunda hifadhidata CREATE DATABASE Test GO -- fanya hifadhidata ya Mtihani TUMIA Mtihani GO -- unda majedwali ya marejeleo UNDA Vyeo vya TABLE(ID int IDENTITY(1,1) NOT NULL CONSTRINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE Idara za TABLE (ID int IDENTITY(1,1) NOT NULL CONSTRINT PK_Departments PRIMARY KEY, Jina nvarchar(30) NOT NULL) GO -- jaza majedwali ya marejeleo na data SET IDENTITY_INSERT Vyeo KWENYE WEKA Vyeo(KITAMBULISHO,Jina)THAMANI (1, N"Mhasibu" ), (2,N"Mkurugenzi"), (3,N"Programu"), (4,N"Mtayarishaji Mwandamizi") WEKA IDENTITY_INSERT Vyeo ZIMWEKA WEKA WEKA IDENTITY_INSERT Idara KWENYE INGIZA Idara(KITAMBULISHO,Jina)MAADILI. (1,N "Utawala"), (2,N"Uhasibu"), (3,N"IT") WEKA IDENTITY_INSERT Idara ZIMZIMA -- tengeneza jedwali na wafanyakazi TUNZA WAFANYAKAZI WA JEDWALI(KITAMBULISHO SI BATILI, Jina nvarchar( Siku ya kuzaliwa s( ID), CONSTRA INT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Vyeo(ID), CONSTRAINT FK_Employees_MenagerID FOREIGN KEY (MenejaID) REFERENCES Employees(ID), CONSTRAINT UQ_Employees_Email UNIQUE(Email) ya CONSQUEID_WECKEN0(Barua pepe ya CONSQUE)(KKKK_) 1999), INDEX IDX_Employ ees_Name(Jina)) NENDA - - ijaze na data WEKA Wafanyikazi (Kitambulisho,Jina,Siku ya Kuzaliwa,Barua pepe,Kitambulisho cha Nafasi,Kitambulisho cha Idara,Kitambulisho cha Msimamizi)MAADILI (1000,N"Ivanov I.I.","19550219"," [barua pepe imelindwa]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [barua pepe imelindwa]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [barua pepe imelindwa]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [barua pepe imelindwa]",4,3,1000)

Ni hayo tu, sasa tuko tayari kuanza kujifunza lugha ya DML.

CHAGUA - kiendesha uteuzi wa data

Awali ya yote, kwa mhariri wa swala inayofanya kazi, hebu tufanye Jaribio la sasa la hifadhidata kwa kuichagua kwenye orodha ya kushuka au kutumia amri ya "TUMIA Mtihani".

Wacha tuanze na aina ya msingi zaidi ya SELECT:

CHAGUA * KUTOKA KWA Wafanyakazi
Katika swali hili, tunaomba kurudisha safu wima zote (zilizoonyeshwa na "*") kutoka kwa jedwali la Wafanyakazi - unaweza kusoma hili kama "CHAGUA nyanja_zote KUTOKA kwenye jedwali la wafanyikazi." Ikiwa kuna faharisi iliyounganishwa, data iliyorejeshwa itapangwa kwa urahisi nayo, katika kesi hii na safu wima ya kitambulisho (lakini hii sio muhimu, kwani katika hali nyingi tutabainisha wazi upangaji wenyewe kwa kutumia ORDER BY ...) :

ID Jina Siku ya kuzaliwa Barua pepe PositionID Kitambulisho cha Idara HireDate Kitambulisho cha Msimamizi
1000 Ivanov I.I. 1955-02-19 [barua pepe imelindwa] 2 1 2015-04-08 NULL
1001 Petrov P.P. 1983-12-03 [barua pepe imelindwa] 3 3 2015-04-08 1003
1002 Sidorov S.S. 1976-06-07 [barua pepe imelindwa] 1 2 2015-04-08 1000
1003 Andreev A.A. 1982-04-17 [barua pepe imelindwa] 4 3 2015-04-08 1000

Kwa ujumla, inafaa kusema kwamba katika lahaja ya MS SQL fomu rahisi zaidi ya swali SELECT inaweza isiwe na kizuizi cha FROM, kwa hali ambayo unaweza kuitumia kupata maadili kadhaa:

CHAGUA 5550/100*15, SYSDATETIME(), -- kupata tarehe ya mfumo wa hifadhidata SIN(0)+COS(0)

(Hakuna jina la safu wima) (Hakuna jina la safu wima) (Hakuna jina la safu wima)
825 2015-04-11 12:12:36.0406743 1

Tafadhali kumbuka kuwa usemi (5550/100*15) ulitoa matokeo 825, ingawa tukikokotoa kwenye kikokotoo thamani itakuwa (832.5). Matokeo 825 yalipatikana kwa sababu kwamba katika usemi wetu namba zote ni integers, kwa hiyo matokeo ni integer, i.e. (5550/100) inatupa 55, sio (55.5).

Kumbuka kwamba mantiki ifuatayo inafanya kazi katika MS SQL:

  • Nambari / Nambari = Nambari (yaani katika kesi hii mgawanyiko kamili hutokea)
  • Halisi / Nambari = Halisi
  • Nambari / Halisi = Halisi
Wale. matokeo hubadilishwa kuwa aina kubwa, kwa hivyo katika kesi 2 za mwisho tunapata nambari halisi (fikiria kama katika hisabati - anuwai ya nambari halisi ni kubwa kuliko safu ya nambari, kwa hivyo matokeo hubadilishwa kwake):

CHAGUA 123/10, -- 12 123./10, -- 12.3 123/10. -- 12.3
Hapa (123.) = (123.0), ni kwamba katika kesi hii 0 inaweza kuachwa na hatua tu iliyoachwa.

Mantiki hiyo inatumika kwa shughuli nyingine za hesabu, lakini katika kesi ya mgawanyiko nuance hii inafaa zaidi.

Kwa hiyo, makini na aina ya data ya nguzo za nambari. Ikiwa ni nambari kamili, na unahitaji kupata matokeo halisi, basi tumia mabadiliko, au weka tu nukta baada ya nambari iliyoonyeshwa kama ya kudumu (123.).

Unaweza kutumia kitendakazi cha CAST au CONVERT kubadilisha sehemu. Kwa mfano, wacha tutumie uga wa kitambulisho, ni wa aina int:

CHAGUA kitambulisho, kitambulisho/100, -- mgawanyiko kamili utatokea hapa CAST(ID AS float)/100, -- tumia kitendakazi cha CAST kubadilisha hadi aina ya kuelea CONVERT(float,ID)/100, -- tumia kitendakazi cha CONVERT kugeuza kuwa aina ya kitambulisho cha kuelea/100. -- tumia mabadiliko kwa kubainisha kuwa dhehebu ni nambari halisi KUTOKA KWA Wafanyakazi

ID (Hakuna jina la safu wima) (Hakuna jina la safu wima) (Hakuna jina la safu wima) (Hakuna jina la safu wima)
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000

Kwa maelezo. Katika hifadhidata ya ORACLE, syntax bila kizuizi cha FROM haikubaliki; huko, kwa kusudi hili, jedwali la mfumo wa DUAL hutumiwa, ambalo lina mstari mmoja:

CHAGUA 5550/100*15, -- na katika ORACLE matokeo yatakuwa sawa na 832.5 sysdate, sin(0)+cos(0) KUTOKA DUAL


Kumbuka. Jina la jedwali katika RDB nyingi linaweza kutanguliwa na jina la schema:

CHAGUA * KUTOKA dbo.Wafanyakazi -- dbo - jina la schema

Schema ni kitengo cha kimantiki cha hifadhidata, ambacho kina jina lake na hukuruhusu kupanga vitu vya hifadhidata kama vile majedwali, maoni, n.k. ndani yake.

Ufafanuzi wa schema katika hifadhidata tofauti unaweza kutofautiana; katika hali zingine, schema inahusiana moja kwa moja na mtumiaji wa hifadhidata, i.e. katika kesi hii, tunaweza kusema kwamba schema na mtumiaji ni visawe na vitu vyote vilivyoundwa kwenye schema kimsingi ni vitu vya mtumiaji huyu. Katika MS SQL, schema ni kitengo cha kimantiki kinachojitegemea ambacho kinaweza kuundwa chenyewe (ona CREATE SCHEMA).

Kwa chaguo-msingi, schema moja huundwa katika hifadhidata ya MS SQL yenye jina dbo (Mmiliki wa Hifadhidata) na vitu vyote vilivyoundwa huundwa kwa chaguo-msingi katika schema hii. Ipasavyo, ikiwa tutataja tu jina la jedwali katika swali, basi itatafutwa kwenye schema ya dbo ya hifadhidata ya sasa. Ikiwa tunataka kuunda kipengee katika mpangilio maalum, itatubidi pia kutanguliza jina la kitu kwa kutumia jina la utaratibu, kwa mfano, "CREATE TABLE schema_name.table_name(...)".

Kwa upande wa MS SQL, jina la schema linaweza pia kutanguliwa na jina la hifadhidata ambayo schema iko:

CHAGUA * KUTOKA Test.dbo.Employees -- database_name.schema_name.table
Ufafanuzi huu unaweza kuwa na manufaa, kwa mfano, ikiwa:

  • katika ombi moja tunapata vitu vilivyo katika schemas au hifadhidata tofauti
  • unahitaji kuhamisha data kutoka kwa schema moja au hifadhidata hadi nyingine
  • kuwa katika hifadhidata moja, unahitaji kuomba data kutoka kwa hifadhidata nyingine
  • Nakadhalika.
Schema ni zana rahisi sana ambayo ni muhimu kutumia wakati wa kuunda usanifu wa hifadhidata, haswa hifadhidata kubwa.

Pia, usisahau kuwa katika maandishi ya ombi tunaweza kutumia mstari mmoja "-- ..." na maoni ya safu nyingi "/* ... */". Ikiwa ombi ni kubwa na ngumu, basi maoni yanaweza kukusaidia sana wewe au mtu mwingine, baada ya muda fulani, kukumbuka au kuelewa muundo wake.

Ikiwa kuna safu wima nyingi kwenye jedwali, na haswa ikiwa bado kuna safu nyingi kwenye jedwali, pamoja na ikiwa tunauliza kwenye hifadhidata kwenye mtandao, basi itakuwa vyema kuchagua na orodha ya moja kwa moja ya sehemu unazohitaji, zikitenganishwa na koma:

CHAGUA ID, Jina KUTOKA kwa Wafanyakazi

Wale. hapa tunasema kwamba tunahitaji tu kurudisha sehemu za Kitambulisho na Jina kutoka kwenye meza. Matokeo yake yatakuwa kama ifuatavyo (kwa njia, kiboreshaji hapa kiliamua kutumia faharisi iliyoundwa na uwanja wa Jina):

ID Jina
1003 Andreev A.A.
1000 Ivanov I.I.
1001 Petrov P.P.
1002 Sidorov S.S.

Kwa maelezo. Wakati mwingine ni muhimu kuangalia jinsi data inavyorejeshwa, kwa mfano, ili kujua ni faharisi gani zinazotumiwa. Hili linaweza kufanywa kwa kubofya kitufe cha "Onyesha Mpango Unaokadiriwa wa Utekelezaji" au kuweka "Jumuisha Mpango Halisi wa Utekelezaji" (katika kesi hii, tutaweza kuona mpango halisi, mtawaliwa, tu baada ya kutekeleza ombi) :

Uchambuzi wa mpango wa utekelezaji ni muhimu sana wakati wa kuongeza hoja; hukuruhusu kujua ni faharisi zipi hazipo au ni faharisi zipi hazitumiki kabisa na zinaweza kuondolewa.

Ikiwa umeanza kujifunza DML, basi sasa hii sio muhimu sana kwako, kumbuka tu na unaweza kuisahau kwa usalama (labda hautahitaji kamwe) - lengo letu la kwanza ni kujifunza misingi ya lugha ya DML na jifunze jinsi ya kuzitumia kwa usahihi, na uboreshaji tayari ni sanaa tofauti. Wakati mwingine ni muhimu zaidi kuwa na swali lililoandikwa kwa usahihi ambalo huleta matokeo sahihi kutoka kwa mtazamo wa somo, na kwamba watu binafsi tayari wanaliboresha. Kwanza, unahitaji kujifunza jinsi ya kuandika maswali kwa usahihi, kwa kutumia njia yoyote kufikia lengo. Lengo kuu unalohitaji kufikia sasa ni kwamba hoja yako irudishe matokeo sahihi.

Kuweka lakabu za jedwali

Wakati wa kuorodhesha safu, zinaweza kutanguliwa na jina la jedwali lililo kwenye kizuizi cha FROM:

CHAGUA Wafanyakazi.Kitambulisho,Wafanyakazi.Jina KUTOKA KWA Wafanyakazi

Lakini sintaksia hii kwa kawaida haifai kutumia, kwa sababu jina la jedwali linaweza kuwa refu. Kwa madhumuni haya, majina mafupi kawaida hutajwa na kutumika - lakabu:

CHAGUA emp.ID,emp.Jina KUTOKA KWA Wafanyakazi AS emp
au

CHAGUA emp.ID,emp.Name FROM Employees emp -- neno kuu la AS linaweza kuachwa (Napendelea chaguo hili)

Hapa emp ni lakabu la jedwali la Wafanyakazi ambalo linaweza kutumika katika muktadha wa taarifa hii ya CHAGUA. Wale. tunaweza kusema kwamba katika muktadha wa kauli hii CHAGUA tunaipa jedwali jina jipya.

Bila shaka, katika kesi hii, matokeo ya hoja yatakuwa sawa kabisa na ya "CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi". Kwa nini hii inahitajika itakuwa wazi baadaye (hata katika sehemu hii), kwa sasa tunakumbuka tu kwamba jina la safu linaweza kutanguliwa (kufafanuliwa) ama moja kwa moja na jina la jedwali, au kutumia pak. Hapa unaweza kutumia moja ya mambo mawili, i.e. Ikiwa utaweka lakabu, basi utahitaji kuitumia, lakini huwezi tena kutumia jina la jedwali.

Kwa maelezo. Katika ORACLE, chaguo pekee la kubainisha lakabu la jedwali bila neno kuu la AS linaruhusiwa.

DISTINCT - kutupa safu mlalo nakala

Neno kuu la DISTINCT linatumika kutupa nakala za safu mlalo kutoka kwa matokeo ya hoja. Kwa kusema, fikiria kwanza kutekeleza swali bila chaguo la DISTINCT, na kisha kutupa nakala zote kutoka kwa matokeo. Wacha tuonyeshe hili kwa uwazi zaidi kwa kutumia mfano:

Hebu tuunde jedwali la muda kwa ajili ya maonyesho TUNZA TABLE #Trash(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) -- jaza jedwali hili na kila aina ya takataka WEKA #Tupio (ID,Col1, Col2,Col3)MAADILI (1,"A","A","A"), (2,"A","B","C"), (3,"C"," A","B "), (4,"A","A","B"), (5,"B","B","B"), (6,"A","A" ,"B") , (7,"A","A","A"), (8,"C","A","B"), (9,"C","A"," B"), (10,"A","A","B"), (11,"A",NULL,"B"), (12,"A",NULL,"B") - wacha tuone ombi litaleta nini bila chaguo DISTINCT CHAGUA Col1,Col2,Col3 FROM #Trash -- hebu tuone hoja italeta nini kwa chaguo la DISTINCT SELECT DISTINCT Col1,Col2,Col3 FROM #Trash -- futa jedwali la muda DROP TABLE #Trash

Kwa kuibua, itaonekana kama hii (rudufu zote zimewekwa alama ya rangi sawa):

Sasa hebu tuangalie ni wapi hii inaweza kutumika, kwa kutumia mfano wa vitendo zaidi - tutarudisha vitambulisho vya kipekee vya idara kutoka kwa meza ya Wafanyikazi (yaani, tutapata vitambulisho vya idara ambazo wafanyikazi wamesajiliwa):

CHAGUA KITAMBULISHO CHA Idara KUTOKA KWA Wafanyakazi

Hapa tuna mistari 4, kwa sababu ... Hakuna mchanganyiko unaorudiwa (ID ya Idara, PositionID) kwenye jedwali letu.

Hebu turejee kwa DDL kwa muda.

Kwa kuwa tunaanza kukosa data kwa mifano ya onyesho, na tunataka kuzungumza kwa undani zaidi na kwa uwazi, hebu tupanue meza yetu ya Waajiri kidogo. Kwa kuongezea, wacha tukumbuke DDL kidogo, kama wanasema, "kurudia ni mama wa kujifunza," na zaidi, wacha turuke mbele tena na kutumia taarifa ya UPDATE:

Tunaunda safu wima mpya ALTER TABLE Wafanyakazi ONGEZA Jina la Mwisho nvarchar(30), -- jina la mwisho FirstName nvarchar(30), -- jina la kwanza MiddleName nvarchar(30), -- jina la kati Salary float, -- na bila shaka mshahara katika baadhi ya vitengo. BonusPercent float -- asilimia ya kukokotoa bonasi kutoka kwa mshahara wa GO -- ujaze data (baadhi ya data imeachwa kwa makusudi) SASISHA Wafanyakazi WEKA LastName=N"Ivanov", FirstName=N"Ivan", MiddleName=N"Ivanovich", Mshahara=5000,BonusPercent= 50 WAPI ID=1000 -- Ivanov I.I. SASISHA Wafanyakazi WEKA LastName=N"Petrov",FirstName=N"Petr",MiddleName=N"Petrovich", Mshahara=1500,BonusPercent= 15 WAPI ID=1001 -- Petrov P.P. SASISHA Wafanyakazi WEKA LastName=N"Sidor",FirstName=N"Sidor",MiddleName=NULL, Salary=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. SASISHA Wafanyakazi WEKA LastName=N"Andreev",FirstName=N"Andrey",MiddleName=NULL, Salary=2000,BonusPercent= 30 WHERE ID=1003 -- Andreev A.A.

Wacha tuhakikishe kuwa data imesasishwa kwa mafanikio:

CHAGUA * KUTOKA KWA Wafanyakazi

ID Jina Jina la familia Jina la kwanza Jina la kati Mshahara Asilimia ya Bonus
1000 Ivanov I.I. Ivanov Ivan Ivanovich 5000 50
1001 Petrov P.P. Petrov Peter Petrovich 1500 15
1002 Sidorov S.S. Sidorov Sidor NULL 2500 NULL
1003 Andreev A.A. Andreev Andrey NULL 2000 30

Kuweka lakabu za safu wima za hoja

Nadhani itakuwa rahisi kuonyesha hapa kuliko kuandika:

CHAGUA -- toa jina kwa safu wima iliyokokotwa LastName+" "+FirstName+" "+MiddleName AS Jina kamili, -- tumia nukuu mbili, kwa sababu nafasi inatumika HireDate AS "Tarehe ya mapokezi", -- matumizi ya mabano ya mraba, kwa sababu nafasi inatumika Siku ya Kuzaliwa AS [Tarehe ya Kuzaliwa], -- neno AS sio lazima Mshahara ZP KUTOKA KWA Wafanyakazi

Jina kamili tarehe ya kupokea Tarehe ya kuzaliwa ZP
Ivanov Ivan Ivanovich 2015-04-08 1955-02-19 5000
Petrov Petr Petrovich 2015-04-08 1983-12-03 1500
NULL 2015-04-08 1976-06-07 2500
NULL 2015-04-08 1982-04-17 2000

Kama tunavyoona, lakabu za safu tulizoainisha zinaonyeshwa kwenye kichwa cha jedwali linalotokana. Kwa kweli, hili ndilo kusudi kuu la lakabu za safu.

Tafadhali kumbuka, kwa sababu wafanyakazi 2 wa mwisho hawakuwa na jina la kati lililobainishwa (thamani NULL), basi matokeo ya usemi "LastName+" "+FirstName+" "+MiddleName" pia yameturudishia NULL.

Ili kuunganisha (kuongeza, kuunganisha) mifuatano katika MS SQL, ishara ya "+" inatumiwa.

Kumbuka kwamba misemo yote ambayo inahusisha NULL (kwa mfano, mgawanyiko na NULL, kuongeza na NULL) itarudi NULL.

Kwa maelezo.
Kwa upande wa ORACLE, opereta "||" hutumiwa kuambatanisha mifuatano na muunganisho ungeonekana kama "LastName||" "||FirstName||" "||MiddleName". Kwa ORACLE, inafaa kuzingatia kuwa ina ubaguzi kwa aina za kamba, kwao NULL na kamba tupu "" ni kitu kimoja, kwa hivyo katika ORACLE usemi kama huo utarudi kwa wafanyikazi 2 wa mwisho "Sidor Sidor" na "Andrey. Andreev". Wakati wa ORACLE 12c, nijuavyo, hakuna chaguo la kubadilisha tabia hii (ikiwa nimekosea, tafadhali nirekebishe). Hapa ni ngumu kwangu kuhukumu ikiwa hii ni nzuri au mbaya, kwa sababu ... Katika baadhi ya matukio, tabia ya kamba ya NULL ni rahisi zaidi, kama katika MS SQL, na kwa wengine, kama katika ORACLE.

Katika ORACLE, lakabu zote za safu wima zilizoorodheshwa hapo juu pia ni halali, isipokuwa [...].


Ili sio uzio wa ujenzi kwa kutumia kazi ya ISNULL, katika MS SQL tunaweza kutumia kazi ya CONCAT. Hebu fikiria na kulinganisha chaguzi 3:

CHAGUA LastName+" "+FirstName+" "+MiddleName FullName1, -- chaguo 2 za kubadilisha NULL kwa mifuatano tupu "" (tunapata tabia sawa na katika ORACLE) ISNULL(LastName,"")+" "+ISNULL(FirstName," ")+ " "+ISNULL(MiddleName,"") FullName2, CONCAT(LastName," ",FirstName," ",MiddleName) FullName3 KUTOKA KWA Wafanyakazi.

Jina Kamili1 Jina Kamili2 Jina Kamili3
Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich Ivanov Ivan Ivanovich
Petrov Petr Petrovich Petrov Petr Petrovich Petrov Petr Petrovich
NULL Sidorov Sidor Sidorov Sidor
NULL Andreev Andrey Andreev Andrey

Katika MS SQL, lakabu pia zinaweza kubainishwa kwa kutumia ishara sawa:

CHAGUA "Tarehe ya Mapokezi"=Tarehe ya Kuajiri, -- pamoja na "..." na [...] unaweza kutumia "..." [Tarehe ya Kuzaliwa]=Siku ya Kuzaliwa, ZP=Mshahara KUTOKA KWA Wafanyakazi

Kutumia neno kuu la AS au ishara sawa kutaja lakabu labda ni suala la ladha zaidi. Lakini wakati wa kuchambua maombi ya watu wengine, ujuzi huu unaweza kuwa na manufaa.

Mwishowe, nitasema kwamba ni bora kuweka majina ya lakabu kwa kutumia herufi na nambari za Kilatini tu, epuka matumizi ya "...", "…" na […], ambayo ni, tumia sheria zile zile tulizotumia wakati wa kutaja jedwali. . Zaidi ya hayo, katika mifano nitatumia tu majina kama haya na hakuna "...", "…" na […].

Waendeshaji Hesabu za Msingi za SQL


Kipaumbele cha utekelezaji wa waendeshaji hesabu ni sawa na katika hisabati. Ikiwa ni lazima, utaratibu wa matumizi ya waendeshaji unaweza kubadilishwa kwa kutumia mabano - (a+b)*(x/(y-z)).

Na ninarudia tena kwamba operesheni yoyote na NULL hutoa NULL, kwa mfano: 10+NULL, NULL*15/3, 100/NULL - yote haya yatasababisha NULL. Wale. kwa ufupi, thamani isiyofafanuliwa haiwezi kutoa matokeo dhahiri. Zingatia hili wakati wa kuunda hoja yako na, ikiwa ni lazima, shughulikia maadili NULL kwa kutumia kazi za ISNULL na COALESCE:

CHAGUA KITAMBULISHO,Jina, Mshahara/100*Asilimia ya Bonasi AS Matokeo1, -- bila kuchakata thamani NULL Mshahara/100*ISNULL(BonusPercent,0) AS Result2, -- tumia chaguo la kukokotoa la ISNULL Mshahara/100*COALESCE(Asilimia ya Ziada,0) AS Result3 - - tumia kipengele cha COALESCE KUTOKA KWA Wafanyakazi

Nitakuambia kidogo juu ya kazi ya COALESCE:

COALESCE (expr1, expr2, ..., exprn) - Hurejesha thamani ya kwanza isiyo ya NULL kutoka kwa orodha ya thamani.

CHAGUA COALESCE(f1, f1*f2, f2*f3) val -- katika hali hii thamani ya tatu itarejeshwa KUTOKA (CHAGUA null f1, 2 f2, 3 f3) q

Nitazingatia zaidi kuzungumza juu ya muundo wa DML, na kwa sehemu kubwa sitazungumza juu ya kazi ambazo zitaonekana kwenye mifano. Ikiwa hauelewi kazi fulani hufanya nini, tafuta maelezo yake kwenye Mtandao, unaweza hata kutafuta habari kwa kikundi cha kazi mara moja, kwa mfano, kwa kutafuta katika Google "kazi za kamba za MS SQL", "MS SQL". kazi za hisabati" au "kazi za SQL za MS" usindikaji NULL." Kuna habari nyingi juu ya vitendaji, na unaweza kuipata kwa urahisi. Kwa mfano, katika maktaba ya MSDN, unaweza kujua zaidi juu ya kazi ya COALESCE:

Kupunguza kutoka kwa MSDN Ulinganisho wa COALESCE na KESI

Usemi wa COALESCE ni njia ya mkato ya kisintaksia ya usemi wa KESI. Hii inamaanisha kuwa COALESCE(expression1,...n) imeandikwa upya na kiboresha hoja kama usemi ufuatao wa KESI:

KISA WAKATI (maneno1 SIYO BATILI) KISHA usemi1 WAKATI (maneno2 SIYO BATILI) HALAFU usemi2 ... VINGINEVYO usemiMWISHO

Kwa mfano, hebu tuangalie jinsi unaweza kutumia salio la mgawanyiko (%). Opereta huyu ni muhimu sana wakati unahitaji kugawanya rekodi katika vikundi. Kwa mfano, hebu tuondoe wafanyakazi wote ambao wana nambari za wafanyakazi (ID), i.e. vitambulisho hivyo vinavyoweza kugawanywa na 2:

CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi AMBAPO ID%2=0 -- salio ikigawanywa na 2 ni 0

AGIZA KWA - kupanga matokeo ya hoja

Kifungu cha ORDER BY kinatumika kupanga matokeo ya hoja.

CHAGUA Jina la Mwisho, Jina la Kwanza, Mshahara KUTOKA KWA Wafanyakazi AGIZA KWA Jina la Mwisho,Jina la Kwanza -- agiza matokeo kwa safu wima 2 - kwa Jina la Mwisho, na kisha kwa Jina la Kwanza.

Kwa maelezo. Kuna neno la msingi la ASC la kupanga kwa mpangilio wa kupanda, lakini kwa kuwa aina ya kupanda ni chaguo-msingi, unaweza kusahau kuhusu chaguo hili (sikumbuki wakati nilitumia chaguo hili).

Ni vyema kutambua kwamba ORDER BY clause pia inaweza kutumia sehemu ambazo hazijaorodheshwa katika kifungu CHA SELECT (isipokuwa kwa kesi wakati DISTINCT inatumiwa, ambayo nitazungumzia hapa chini). Kama mfano, nitaendesha mbele kidogo kwa kutumia chaguo la TOP na kuonyesha jinsi, kwa mfano, unaweza kuchagua wafanyikazi 3 ambao wana mishahara ya juu zaidi, kwa kuzingatia kwamba kwa madhumuni ya usiri sipaswi kuonyesha mshahara yenyewe:

CHAGUA TOP 3 -- rejesha tu rekodi 3 za kwanza kutoka kwa matokeo yote ya ID,LastName,FirstName KUTOKA KWA Wafanyakazi AGIZO KWA MSHAHARA DESC -- panga matokeo kwa mpangilio wa kushuka wa Mshahara.

ID Jina la familia Jina la kwanza
1000 Ivanov Ivan
1002 Sidorov Sidor

Kwa kweli, kuna kesi hapa kwamba wafanyikazi kadhaa wanaweza kuwa na mshahara sawa na ni ngumu kusema ni wafanyikazi gani watatu watarudi ombi hili; hii lazima isuluhishwe na mkurugenzi wa kazi. Wacha tuseme, baada ya kujadili kazi hii na meneja, ulikubali na ukaamua kutumia chaguo lifuatalo - kufanya upangaji wa ziada kwa tarehe ya uwanja wa kuzaliwa (yaani tunathamini vijana), na ikiwa tarehe ya kuzaliwa kwa wafanyikazi kadhaa inaweza sanjari. (baada ya yote, hii pia haijatengwa), basi unaweza kufanya upangaji wa tatu kwa mpangilio wa kushuka wa maadili ya kitambulisho (mwisho katika sampuli itakuwa wale walio na kitambulisho cha juu zaidi - kwa mfano, wale ambao walikubaliwa mwisho, wacha tuseme. nambari za wafanyikazi hutolewa kwa mlolongo):

CHAGUA TOP 3 -- rejesha tu rekodi 3 za kwanza kutoka kwa matokeo yote ya ID,LastName,FirstName KUTOKA KWA Wafanyakazi AGIZO KWA DESC ya Mshahara, -- 1. panga matokeo kwa mpangilio wa kushuka kwa Siku ya Kuzaliwa ya Mshahara, -- 2. kisha kwa Tarehe ya Kuzaliwa ID DESC -- 3 .na kwa utata kamili wa matokeo, ongeza kupanga kwa kitambulisho

Wale. unapaswa kujaribu kufanya matokeo ya ombi kutabirika, ili katika tukio la mazungumzo unaweza kueleza kwa nini watu hawa hasa walijumuishwa kwenye "orodha nyeusi", i.e. kila kitu kilichaguliwa kwa uaminifu, kulingana na sheria zilizowekwa.

Unaweza pia kupanga kwa kutumia misemo tofauti katika ORDER BY clause:

CHAGUA Jina la Mwisho,Jina la Kwanza KUTOKA KWA Wafanyakazi AGIZO KWA CONCAT(LastName," ",FirstName) -- tumia usemi.

Unaweza pia kutumia lakabu zilizobainishwa kwa safu katika ORDER BY:

CHAGUA CONCAT(LastName," ",FirstName) fi KUTOKA KWA Wafanyakazi AGIZO KWA fi -- tumia lakabu

Inafaa kumbuka kuwa unapotumia kifungu cha DISTINCT, safu wima tu zilizoorodheshwa kwenye kizuizi cha SELECT zinaweza kutumika katika kifungu cha ORDER BY. Wale. baada ya kutumia operesheni ya DISTINCT, tunapata seti mpya ya data, na safu mpya ya safu. Kwa sababu hii, mfano ufuatao hautafanya kazi:

CHAGUA DISTINCT Jina la Mwisho,FirstName,Mshahara KUTOKA KWA Wafanyakazi AGIZO KWA KITAMBULISHO -- kitambulisho hakipo katika mpangilio tuliopata na DISTINCT

Wale. kifungu cha ORDER BY kinatumika kwa seti inayotokana kabla ya matokeo kurejeshwa kwa mtumiaji.

Kumbuka 1. Unaweza pia kutumia nambari za safu wima zilizoorodheshwa katika CHAGUA katika kifungu cha ORDER BY:

CHAGUA Jina la Mwisho,Jina la Kwanza,Mshahara KUTOKA KWA Wafanyakazi ORDER BY -- panga kwa mpangilio 3 DESC, -- 1. kushuka kwa Mshahara 1, -- 2. kwa Jina la Mwisho 2 -- 3. kwa Jina la Kwanza

Kwa Kompyuta inaonekana rahisi na inajaribu, lakini ni bora kusahau na kamwe usitumie chaguo hili la kuchagua.

Ikiwa katika kesi hii (wakati mashamba yameorodheshwa kwa uwazi), chaguo hili bado linakubalika, basi katika kesi ya kutumia "*" ni bora kamwe kutumia chaguo hili. Kwa nini - kwa sababu ikiwa mtu, kwa mfano, anabadilisha mpangilio wa safu kwenye jedwali, au kufuta safu (na hii ni hali ya kawaida), swali lako bado linaweza kufanya kazi, lakini kwa usahihi, kwa sababu. upangaji unaweza tayari kufanywa na safu wima zingine, na hii ni hila kwa kuwa hitilafu hii huenda isigunduliwe hivi karibuni.

Ikiwa nguzo ziliorodheshwa kwa uwazi, basi katika hali iliyo juu, swala ingeendelea kufanya kazi, lakini pia kwa usahihi (kwa kuwa kila kitu kinafafanuliwa wazi), au ingekuwa tu kutupa kosa ambalo safu hii haipo.

Kwa hivyo unaweza kusahau kwa usalama juu ya kupanga kwa nambari za safu.

Kumbuka 2.
Katika MS SQL, wakati wa kupanga kwa mpangilio wa kupanda, maadili NULL yataonyeshwa kwanza.

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyikazi AGIZO KWA BonusPercent

Ipasavyo, wakati wa kutumia DESC watakuwa mwisho

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyikazi AGIZO KWA BonusPercent DESC

Ikiwa unahitaji kubadilisha mantiki ya kupanga maadili NULL, basi tumia misemo, kwa mfano:

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyakazi AGIZO KWA ISNULL(BonusPercent,100)

ORACLE hutoa chaguo mbili kwa kusudi hili: NULLS FIRST na NULLS LAST (hutumiwa na chaguo-msingi). Kwa mfano:

CHAGUA Asilimia Ya Bonasi KUTOKA KWA Wafanyakazi AGIZO KWA BonusPercent DESC NULLS LAST

Makini na hili wakati wa kubadili database fulani.

TOP - rudisha nambari maalum ya rekodi

Dondoo kutoka kwa MSDN. TOP—Hupunguza idadi ya safu mlalo zilizorejeshwa katika matokeo ya hoja iliyowekwa kwa nambari au asilimia maalum. Wakati kifungu cha TOP kinapotumiwa pamoja na ORDER BY clause, matokeo yaliyowekwa ni safumlalo N za kwanza za matokeo yaliyopangwa. Vinginevyo, safu mlalo za N za kwanza zitarejeshwa kwa mpangilio ambao haujabainishwa.

Kwa kawaida usemi huu hutumiwa pamoja na kifungu cha ORDER BY, na tayari tumeangalia mifano ambapo ilikuwa muhimu kurejesha safu mlalo za N kutoka kwa seti ya matokeo.

Bila ORDER BY, kifungu hiki kawaida hutumiwa wakati tunahitaji tu kuangalia meza isiyojulikana kwetu, ambayo inaweza kuwa na rekodi nyingi, katika kesi hii tunaweza, kwa mfano, kuuliza kurudisha safu 10 tu za kwanza, lakini kwa uwazi tutasema 2 tu:

CHAGUA TOP 2 * KUTOKA KWA Wafanyakazi

Unaweza pia kubainisha neno PERCENT ili kurudisha asilimia inayolingana ya safu mlalo kutoka kwa seti ya matokeo:

CHAGUA ASILIMIA 25 BORA * KUTOKA KWA Wafanyakazi

Katika mazoezi yangu, sampuli kwa idadi ya safu hutumiwa mara nyingi.

Unaweza pia kutumia chaguo la WITH TIES na TOP, ambayo itasaidia kurudisha safu zote katika kesi ya kupanga kwa utata, i.e. sentensi hii itarejesha safu mlalo zote ambazo ni sawa katika utunzi kwenye safu mlalo zinazoangukia katika uteuzi wa TOP N; kwa hivyo, zaidi ya safu mlalo N zinaweza kuchaguliwa. Hebu tuongeze "Programu" nyingine yenye mshahara wa 1500 kwa onyesho:

WEKA Wafanyakazi(Kitambulisho,Jina,Barua pepe,Kitambulisho cha Nafasi,Kitambulisho cha Idara,Kitambulisho cha Msimamizi,Mshahara) MAADILI(1004,N"Nikolaev N.N."," [barua pepe imelindwa]",3,3,1003,1500)

Na tuongeze mfanyakazi mwingine bila kuonyesha nafasi na idara na mshahara wa 2000:

WEKA Wafanyakazi(Kitambulisho,Jina,Barua pepe,Kitambulisho cha Nafasi,Kitambulisho cha Idara,Kitambulisho cha Msimamizi,Mshahara) MAADILI(1005,N"Alexandrov A.A."," [barua pepe imelindwa]",NULL,NULL,1000,2000)

Sasa wacha tuchague, kwa kutumia chaguo la WITH TIES, wafanyikazi wote ambao mishahara yao inalingana na mishahara ya wafanyikazi 3, na mshahara mdogo zaidi (natumai itakuwa wazi zaidi ninachopata):

CHAGUA 3 BORA KWA KITAMBULISHO CHA TIES,Jina,Mshahara KUTOKA KWA WAFANYAKAZI KWA AGIZO KWA Mshahara

Hapa, ingawa TOP 3 imeonyeshwa, ombi lilirudisha rekodi 4, kwa sababu thamani ya Mshahara iliyorejesha TOP 3 (1500 na 2000) ilipatikana katika wafanyikazi 4. Kwa kuibua inafanya kazi kama hii:

Kwa maelezo.
TOP inatekelezwa kwa njia tofauti katika hifadhidata tofauti; katika MySQL kuna kifungu cha LIMIT kwa hili, ambacho unaweza kuongeza urekebishaji wa kuanzia.

Katika ORACLE 12c, pia walianzisha analog yao wenyewe, wakichanganya utendaji wa TOP na LIMIT - tafuta maneno "ORACLE OFFSET FETCH". Kabla ya toleo la 12c, safu wima bandia ROWNUM ilitumika kwa madhumuni haya.


Nini kitatokea ikiwa utatumia vifungu vya DISTINCT na TOP kwa wakati mmoja? Maswali kama haya yanaweza kujibiwa kwa urahisi kwa kufanya majaribio. Kwa ujumla, usiogope na usiwe wavivu kufanya majaribio, kwa sababu ... Wengi wao hujifunza kupitia mazoezi. Mpangilio wa maneno katika kauli SELECT ni kama ifuatavyo: DISTINCT huja kwanza, ikifuatiwa na TOP, i.e. Ikiwa unafikiri kimantiki na kusoma kutoka kushoto kwenda kulia, basi ya kwanza ya kutupa nakala itatumika, na kisha TOP itafanywa kulingana na seti hii. Kweli, wacha tuangalie na tuhakikishe kuwa hii ndio kesi:

CHAGUA Mshahara WA TOP 2 WA TOP 2 KUTOKA KWA Wafanyakazi KWA AGIZO KWA Mshahara

Mshahara
1500
2000

Wale. kwa hiyo, tulipokea mishahara 2 midogo kuliko yote. Bila shaka, kunaweza kuwa na kesi kwamba mshahara kwa wafanyakazi wengine hauwezi kutajwa (NULL), kwa sababu Mpango huo unaturuhusu kufanya hivi. Kwa hivyo, kulingana na kazi hiyo, tunaamua kusindika maadili NULL katika ORDER BY kifungu, au tu kutupa rekodi zote ambazo Mshahara ni NULL, na kwa hili tunaendelea kusoma kifungu cha WHERE.

WAPI - hali ya uteuzi wa safu

Sentensi hii inatumika kuchuja rekodi kwa sharti fulani. Kwa mfano, hebu tuchague wafanyikazi wote wanaofanya kazi katika idara ya "IT" (Kitambulisho chake = 3):

CHAGUA ID,LastName,FirstName,Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO DepartmentID=3 -- HUAGIZA KWA LastName,FirstName

ID Jina la familia Jina la kwanza Mshahara
1004 NULL NULL 1500
1003 Andreev Andrey 2000
1001 Petrov Peter 1500

Kifungu cha WAPI kimeandikwa kabla ya ORDER BY command.

Agizo la kutumia amri kwa seti ya Wafanyikazi wa awali ni kama ifuatavyo.

  1. WAPI - ikiwa imeelezwa, basi hatua ya kwanza kutoka kwa seti nzima ya Wafanyakazi ni kuchagua rekodi tu zinazokidhi hali hiyo.
  2. DISTINCT - ikibainishwa, nakala zote hutupwa
  3. AGIZA KWA - ikiwa imebainishwa, matokeo yamepangwa
  4. TOP - ikiwa imebainishwa, nambari maalum tu ya rekodi inarudishwa kutoka kwa matokeo yaliyopangwa

Wacha tuangalie mfano kwa uwazi:

CHAGUA TOP 1 Mshahara WA 1 KUTOKA KWA Wafanyakazi AMBAPO DepartmentID=3 AMRI KWA Mshahara

Kwa kuibua itaonekana kama hii:

Inafaa kumbuka kuwa kuangalia kwa NULL hakufanyiki kwa ishara sawa, lakini kwa kutumia waendeshaji wa IS NULL na IS NOT NULL. Kumbuka tu kwamba huwezi kulinganisha kwenye NULL kwa kutumia opereta "=" (ishara sawa), kwa sababu matokeo ya usemi pia yatakuwa sawa na NULL.

Kwa mfano, hebu tuchague wafanyikazi wote ambao hawana idara iliyobainishwa (yaani, Kitambulisho cha Idara NI NULL):

CHAGUA KITAMBULISHO,Jina KUTOKA KWA WAFANYAKAZI AMBAPO ID ya Idara NI NULL

Sasa, kama mfano, hebu tuhesabu bonasi kwa wafanyikazi wote walio na thamani ya BonusPercent iliyobainishwa (yaani, BonusPercent SIYO BATILI):

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO Asilimia ya Bonus SIYO BATILI

Ndiyo, kwa njia, ikiwa unafikiri juu yake, thamani ya BonusPercent inaweza kuwa sawa na sifuri (0), na thamani inaweza pia kuingizwa na ishara ya minus, kwa sababu hatukuweka vikwazo vyovyote kwenye uwanja huu.

Kweli, baada ya kusema juu ya shida, tuliambiwa kwa sasa kuzingatia kwamba ikiwa (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO SIYO(BonusPercent<=0 OR BonusPercent IS NULL)

Wale. Hapa ndipo tulipoanza kujifunza kuhusu waendeshaji wa Boolean. Usemi katika mabano "(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

Usemi huu unaweza pia kuandikwa upya kwa kusema mara moja "warudishe wafanyikazi wote walio na bonasi" kwa kuelezea hili kwa usemi (BonusPercent>0 na BonusPercent SI UFUPI):

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO BonusPercent>0 NA BonusPercent SIYO BATILI

Pia kwenye sehemu ya WHERE unaweza kuangalia aina mbalimbali za misemo kwa kutumia waendeshaji na utendakazi wa hesabu. Kwa mfano, ukaguzi kama huo unaweza kufanywa kwa kutumia usemi na kazi ya ISNULL:

CHAGUA KITAMBULISHO,Jina,Mshahara/100*BonusPercent AS Bonasi KUTOKA KWA Wafanyakazi AMBAPO ISNULL(BonusPercent,0)>0

Waendeshaji Boolean na waendeshaji rahisi wa kulinganisha

Ndiyo, hatuwezi kufanya bila hisabati hapa, kwa hivyo wacha tuchukue safari fupi katika waendeshaji wa kulinganisha wa Boolean na rahisi.

Kuna waendeshaji 3 pekee wa Boolean katika SQL - NA, AU na SIO:

Kwa kila mwendeshaji wa Boolean, unaweza kutoa majedwali ya ukweli ambayo yanaonyesha matokeo yatakuwa nini wakati masharti yanaweza kuwa NULL:

Kuna waendeshaji wafuatao rahisi wa kulinganisha ambao hutumiwa kuunda hali:

Pamoja kuna waendeshaji 2 kwa kuangalia thamani / usemi wa NULL:

NI NULL Inajaribu usawa NULL
SI UTUPU Kupima usawa NULL

Kipaumbele: 1) Waendeshaji wote wa kulinganisha; 2) HAPANA; 3) NA; 4) AU.

Wakati wa kuunda misemo ngumu ya kimantiki, mabano hutumiwa:

((sharti1 NA sharti2) AU SI(sharti3 NA sharti4 NA sharti5)) AU (…)

Pia, kwa kutumia mabano, unaweza kubadilisha mlolongo wa kawaida wa mahesabu.

Hapa nilijaribu kutoa wazo la algebra ya Boolean kwa kiasi cha kutosha kwa kazi. Kama unavyoona, ili kuandika hali ngumu zaidi huwezi kufanya bila mantiki, lakini hakuna mengi yake hapa (NA, AU na SI) na iligunduliwa na watu, kwa hivyo kila kitu ni sawa.

Twende hadi mwisho wa sehemu ya pili

Kama unaweza kuona, hata juu ya syntax ya msingi ya SELECT operator tunaweza kuzungumza kwa muda mrefu sana, lakini ili kukaa ndani ya upeo wa makala, hatimaye nitaonyesha waendeshaji wa ziada wa kimantiki - KATI, IN na LIKE.

KATI - kuangalia kwa kujumuishwa katika masafa

Thamani_ya_mtihani KATI YA_thamani_ya_kuanza NA thamani_ya_mwisho

Vielezi vinaweza kutenda kama maadili.

Hebu tuangalie mfano:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO MSHAHARA KATI YA 2000 NA 3000 -- ambaye ana mshahara wa kati ya 2000-3000

Kwa kweli, KATI ni nukuu iliyorahisishwa ya fomu:

CHAGUA ID,Jina,Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO Mshahara>=2000 NA Mshahara<=3000 -- все у кого ЗП в диапозоне 2000-3000

Neno NOT linaweza kutumika kabla ya neno KATI, ambalo litaangalia ikiwa thamani haiko ndani ya masafa maalum:

CHAGUA Kitambulisho, Jina, Mshahara KUTOKA KWA Wafanyakazi AMBAPO Mshahara SIO KATI YA 2000 NA 3000 - sawa na NOT(Mshahara>=2000 NA Mshahara<=3000)

Ipasavyo, ikiwa unatumia KATI, IN, LIKE, unaweza pia kuchanganya na masharti mengine kwa kutumia NA na AU:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO MSHAHARA KATI YA 2000 NA 3000 -- ambaye ana mshahara wa kati ya 2000-3000 NA DepartmentID=3 -- kuzingatia wafanyakazi wa idara 3 pekee.

IN - angalia kujumuishwa katika orodha ya maadili

Opereta huyu ana fomu ifuatayo:

Thamani_ya_Mtihani KATIKA (thamani1, thamani2, ...)

Nadhani ni rahisi kuonyesha na mfano:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO KITAMBULISHO CHA NAFASI (3,4) -- ambaye nafasi yake ni 3 au 4

Wale. hii kimsingi ni sawa na usemi ufuatao:

CHAGUA KITAMBULISHO, Jina, Mshahara KUTOKA KWA Wafanyakazi AMBAPO PositionID=3 AU PositionID=4 -- ambao nafasi yao ni 3 au 4

Kwa upande wa NOT itakuwa sawa (tutapata kila mtu isipokuwa wale kutoka idara ya 3 na 4):

CHAGUA KITAMBULISHO,Jina,Mshahara KUTOKA KWA WAFANYAKAZI AMBAPO KITAMBULISHO CHA NAFASI HAKUNA(3,4) -- sawa na NOT(PositionID=3 AU PositionID=4)

Swali lenye NOT IN linaweza pia kuonyeshwa kwa kutumia NA:

CHAGUA Kitambulisho, Jina, Mshahara KUTOKA KWA Wafanyakazi AMBAPO KITAMBULISHO CHA Nafasi<>3NA PositionID<>4 -- sawa na PositionID NOT IN(3,4)

Tafadhali kumbuka kuwa kutafuta maadili NULL kwa kutumia IN construct haitafanya kazi, kwa sababu kuangalia NULL=NULL pia itarudisha NULL, sio Kweli:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO ID ya Idara IN(1,2,NULL) -- Rekodi NULL hazitajumuishwa kwenye matokeo.

Katika kesi hii, vunja hundi katika hali kadhaa:

CHAGUA KITAMBULISHO, Jina,Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO KITAMBULISHO CHA Idara (1,2) -- 1 au 2 AU KITAMBULISHO CHA Idara NI BATILI -- au BATILI

Au unaweza kuandika kitu kama:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA WAFANYAKAZI AMBAPO ISNULL(ID ya Idara,-1) NDANI YA(1,2,-1) -- ikiwa una uhakika kuwa hakuna idara yenye ID=-1

Nadhani chaguo la kwanza, katika kesi hii, litakuwa sahihi zaidi na la kuaminika. Sawa, huu ni mfano tu wa kuonyesha ni miundo gani mingine inaweza kujengwa.

Inafaa pia kutaja kosa la siri zaidi linalohusishwa na NULL, ambalo linaweza kufanywa wakati wa kutumia NOT IN construct. Kwa mfano, tujaribu kuchagua wafanyakazi wote isipokuwa wale ambao idara yao ni 1 au idara yao haijaainishwa kabisa, i.e. sawa na NULL. Kama suluhisho, chaguo lifuatalo linajipendekeza:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO KITAMBULISHO CHA Idara (1,NULL)

Lakini baada ya kutekeleza hoja, hatutapokea safu hata moja, ingawa tulitarajia kuona yafuatayo:

Tena, utani hapa ulichezwa na NULL iliyoainishwa kwenye orodha ya maadili.

Hebu tuangalie kwa nini hitilafu ya kimantiki ilitokea katika kesi hii. Wacha tupanue swala kwa kutumia NA:

CHAGUA Kitambulisho, Jina, Kitambulisho cha Idara KUTOKA KWA Wafanyakazi AMBAPO ID ya Idara<>1 NA Kitambulisho cha Idara<>NULL -- shida ni kwa sababu ya ukaguzi huu NULL - hali hii itarudi NULL kila wakati

Hali ya kulia (ID ya Idara<>NULL) itatupa kutokuwa na uhakika hapa kila wakati, i.e. NULL. Sasa kumbuka jedwali la ukweli la AND operator, ambapo (TRUE AND NULL) inatoa NULL. Wale. wakati hali ya kushoto inafikiwa (ID ya Idara<>1) kwa sababu ya hali sahihi isiyobainishwa, tutaishia na thamani isiyofafanuliwa ya usemi mzima (ID ya Idara<>1 NA Kitambulisho cha Idara<>NULL), kwa hivyo kamba haitajumuishwa kwenye matokeo.

Hali inaweza kuandikwa upya kwa usahihi kama ifuatavyo:

CHAGUA KITAMBULISHO,Jina,Kitambulisho cha Idara KUTOKA KWA WAFANYAKAZI AMBAPO KITAMBULISHO CHA Idara HAKUNA(1) -- au kwa hali hii kitambulisho cha Idara<>1 NA Kitambulisho cha Idara SI TUPU -- na angalia kando kwa NOT NULL

IN pia inaweza kutumika pamoja na maswali madogo, lakini tutarejea kwa fomu hii katika sehemu zinazofuata za mafunzo haya.

LIKE - kuangalia kamba kwa kutumia muundo

Nitazungumza juu ya mwendeshaji huyu kwa fomu yake rahisi tu, ambayo ni ya kawaida na inaungwa mkono na lahaja nyingi za lugha ya SQL. Hata katika fomu hii, inaweza kutumika kutatua matatizo mengi ambayo yanahitaji kuangalia yaliyomo ya kamba.

Opereta huyu ana fomu ifuatayo:

Mfuatano_wa_mtihani KAMA string_pattern

Herufi maalum zifuatazo zinaweza kutumika katika "pattern_string":

  1. Mstari "_" inamaanisha kuwa mhusika yeyote anaweza kuchukua nafasi yake
  2. Ishara ya asilimia "%" - inasema kwamba inaweza kubadilishwa na idadi yoyote ya wahusika, ikiwa ni pamoja na hakuna
Wacha tuangalie mifano na ishara ya "%" (kwa mazoezi, kwa njia, hutumiwa mara nyingi zaidi):

CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi AMBAPO Jina KAMA "Pet%" -- ambaye jina lake linaanza na herufi "Pet" CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA KWA Wafanyakazi AMBAPO Jina la Mwisho LIKE "%ov" -- ambaye jina lake la mwisho linaishia na "ov" CHAGUA KITAMBULISHO, Jina la Mwisho KUTOKA KWA Wafanyakazi AMBAPO Jina la Mwisho LINAPENDA "%re%" -- ambaye jina lake la mwisho lina mchanganyiko "re"

Wacha tuangalie mifano iliyo na ishara "_":

CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA kwa Wafanyakazi AMBAPO Jina la Mwisho KAMA "_etrov" -- ambaye jina lake la mwisho lina herufi yoyote ya kwanza na herufi zinazofuata "etrov" CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA KWA Wafanyakazi AMBAPO Jina la Mwisho KAMA "____ov" -- ambaye jina lake la mwisho lina herufi zozote nne. na herufi zinazofuata "ov"

Kwa kutumia ESCAPE, unaweza kubainisha herufi ya kutoroka ambayo inaghairi athari ya kuangalia ya herufi maalum "_" na "%". Kifungu hiki kinatumika unapotaka kuangalia moja kwa moja ishara ya asilimia au chini katika mfuatano.

Ili kuonyesha ESCAPE, wacha tuweke takataka kwenye ingizo moja:

SASISHA Wafanyakazi WEKA FirstName="Hii ni tupio iliyo na %" WHERE ID=1005

Na wacha tuone maswali yafuatayo yanarudi:

CHAGUA * KUTOKA KWA Wafanyakazi AMBAPO Jina la Kwanza LINAPENDA "%!%%" ESCAPE "!" -- mstari una ishara "%" CHAGUA * KUTOKA KWA Wafanyakazi AMBAPO Jina la Kwanza KAMA "%!_%" ESCAPE "!" -- mstari una ishara "_".

Ikiwa unahitaji kuangalia kamba kwa mechi kamili, basi badala ya LIKE ni bora kutumia ishara "=":

CHAGUA * KUTOKA KWA Wafanyakazi WAPI FirstName="Peter"

Kwa maelezo.
Katika MS SQL, kwenye kiolezo cha waendeshaji KAMA, unaweza pia kutaja utaftaji kwa kutumia misemo ya kawaida; soma juu yake kwenye mtandao ikiwa uwezo wa kawaida wa mwendeshaji huyu hautoshi kwako.

ORACLE hutumia kitendakazi cha REGEXP_LIKE kutafuta kwa kutumia misemo ya kawaida.

Kidogo kuhusu masharti

Katika kesi ya kuangalia kamba kwa kuwepo kwa wahusika wa Unicode, utahitaji kuweka tabia N kabla ya quotes, i.e. N"…". Lakini kwa kuwa sehemu zote za herufi kwenye jedwali letu ziko katika umbizo la Unicode (aina ya nvarchar), unaweza kutumia umbizo hili kila mara kwa nyanja hizi. Mfano:

CHAGUA Kitambulisho,Jina KUTOKA KWA Wafanyakazi AMBAPO Jina LIKE N"Pet%" CHAGUA ID,Jina la Mwisho KUTOKA KWA Wafanyakazi WAPI LastName=N"Petrov"

Inapofanywa kwa usahihi, unapolinganisha dhidi ya uwanja wa aina ya varchar (ASCII), unapaswa kujaribu kutumia majaribio kwa kutumia "...", na unapolinganisha shamba na aina ya nvarchar (Unicode), unapaswa kujaribu kutumia majaribio kwa kutumia N" ...". Hii inafanywa ili kuzuia ubadilishaji wa aina zisizo wazi wakati wa utekelezaji wa hoja. Tunatumia sheria sawa wakati wa kuingiza (INSERT) maadili kwenye uwanja au kusasisha (UPDATE).

Wakati wa kulinganisha kamba, inafaa kuzingatia ukweli kwamba, kulingana na mipangilio ya hifadhidata (mgongano), ulinganisho wa kamba unaweza kuwa usio na hisia (wakati "Petrov" = "PETROV") au nyeti (wakati "Petrov"<>"PETROV").
Katika hali ya mpangilio unaozingatia kesi, ikiwa unataka kufanya utafutaji usiojali kesi, unaweza, kwa mfano, kubadilisha awali maneno ya kulia na kushoto hadi kesi moja - juu au chini:

CHAGUA KITAMBULISHO,Jina KUTOKA KWA Wafanyakazi AMBAPO JUU(Jina) LIKE JUU(N"Pet%") -- au CHINI(Jina) KAMA CHINI(N"Pet%") CHAGUA KITAMBULISHO,Jina la Mwisho KUTOKA KWA WAFANYAKAZI WAPI JUU(LastName)=JUU( N"Petrov") -- au LOWER(LastName)=LOWER(N"Petrov")

Kidogo kuhusu tarehe

Wakati wa kuangalia tarehe, unaweza kutumia, kama kwa kamba, nukuu moja "...".

Bila kujali mipangilio ya kikanda katika MS SQL, unaweza kutumia sintaksia ya tarehe ifuatayo "YYYYMMDD" (mwaka, mwezi, siku pamoja bila nafasi). MS SQL itaelewa muundo huu wa tarehe kila wakati:

CHAGUA KITAMBULISHO, Jina, Siku ya Kuzaliwa KUTOKA KWA WAFANYAKAZI AMBAPO Siku ya Kuzaliwa KATI YA "19800101" NA "19891231" -- wafanyakazi wa miaka ya 80 AGIZA KWA Siku ya Kuzaliwa

Katika baadhi ya matukio, ni rahisi zaidi kuweka tarehe kwa kutumia kazi ya DATEFROMPARTS:

CHAGUA KITAMBULISHO,Jina,Siku ya Kuzaliwa KUTOKA KWA Wafanyakazi AMBAPO Siku ya Kuzaliwa KATI YA TAREHEFROMPARTS(1980,1,1) NA TAREHEKUTOKA(1989,12,31) AGIZO KWA Siku ya Kuzaliwa

Pia kuna chaguo la kukokotoa linalofanana DATETIMEFROMPARTS, ambalo hutumika kuweka Tarehe na Wakati (kwa aina ya tarehe).

Unaweza pia kutumia kitendakazi cha CONVERT ikiwa unahitaji kubadilisha mfuatano kuwa tarehe au thamani ya tarehe:

CHAGUA CONVERT(tarehe,"12.03.2015",104), CONVERT(tarehe,"2014-11-30 17:20:15",120)

Thamani 104 na 120 zinaonyesha ni muundo gani wa tarehe unatumika kwenye mfuatano. Unaweza kupata maelezo ya fomati zote halali katika maktaba ya MSDN kwa kutafuta "MS SQL CONVERT".

Kuna vitendaji vingi vya kufanya kazi na tarehe katika MS SQL, tafuta "vitendaji vya ms sql vya kufanya kazi na tarehe."

Kumbuka. Lahaja zote za lugha ya SQL zina seti zao za kazi za kufanya kazi na tarehe na hutumia mbinu yao ya kufanya kazi nazo.

Kidogo kuhusu nambari na mabadiliko yao

Taarifa katika sehemu hii pengine itakuwa muhimu zaidi kwa wataalamu wa IT. Ikiwa wewe sio mmoja, na lengo lako ni kujifunza jinsi ya kuandika maswali ili kupata habari unayohitaji kutoka kwa hifadhidata, basi unaweza usihitaji ujanja kama huo, lakini kwa hali yoyote, unaweza kupitia maandishi haraka na kuandika maelezo. , kwa sababu. Ikiwa umechukua kusoma SQL, basi tayari unajiunga na IT.

Tofauti na kitendakazi cha ubadilishaji wa CAST, unaweza kutaja kigezo cha tatu katika kitendakazi cha CONVERT, ambacho kinawajibika kwa mtindo wa uongofu (umbizo). Aina tofauti za data zinaweza kuwa na seti zao za mitindo, ambayo inaweza kuathiri matokeo yaliyorejeshwa. Tayari tumegusia matumizi ya mitindo wakati wa kuzingatia ubadilishaji wa mfuatano kwa kutumia kitendakazi cha CONVERT kuwa tarehe na aina za tarehe.

Unaweza kusoma zaidi kuhusu CAST, CONVERT kazi na mitindo katika MSDN - "CAST na CONVERT Kazi (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

Ili kurahisisha mifano, taarifa za lugha za Transact-SQL DECLARE na SET zitatumika hapa.

Kwa kweli, katika kesi ya kubadilisha nambari kuwa nambari halisi (ambayo nilitoa mwanzoni mwa somo hili, ili kuonyesha tofauti kati ya nambari kamili na mgawanyiko halisi), ufahamu wa nuances ya ubadilishaji sio muhimu sana, kwa sababu hapo tulifanya nambari kamili hadi ubadilishaji halisi (aina ambayo ni kubwa zaidi kuliko anuwai ya nambari):

TANGAZA @min_int int SET @min_int=-2147483648 TANGAZA @max_int int SET @max_int=2147483647 CHAGUA -- (-2147483648) @min_int,CAST(@min_int AS float),CONVERT(float_4) , CONVERT_int4_8 dakika 8,@float_x3,@x3648 ,CAST(@max_int AS float),CONVERT(float,@max_int), -- numeric(16,6) @min_int/1., -- (-2147483648.000000) @max_int/1. -- 2147483647.000000

Labda haikufaa kutaja njia ya uongofu kamili uliopatikana kwa kugawanya na (1.), kwa sababu Inashauriwa kujaribu kufanya ubadilishaji wazi kwa udhibiti mkubwa juu ya aina ya matokeo yaliyopatikana. Ingawa, ikiwa tunataka kupata matokeo ya aina ya nambari, yenye nambari maalum ya tarakimu baada ya nukta ya desimali, basi tunaweza kutumia hila katika MS SQL kuzidisha thamani kamili kwa (1., 1.0, 1.00, nk.) :

TANGAZA @int int SET @int=123 CHAGUA @int*1., -- nambari(12, 0) - maeneo 0 decimal @int*1.0, -- nambari(13, 1) - 1 decimal mahali @int*1.00, -- nambari(14, 2) - herufi 2 -- ingawa wakati mwingine ni bora kufanya ubadilishaji wazi CAST(@int AS numeric(20, 0)), -- 123 CAST(@int AS numeric(20, 1) ), -- 123.0 CAST(@int AS nambari(20, 2)) -- 123.00

Katika baadhi ya matukio, maelezo ya uongofu yanaweza kuwa muhimu sana, kwa sababu... zinaathiri usahihi wa matokeo yaliyopatikana, kwa mfano, katika kesi wakati uongofu unafanywa kutoka kwa thamani ya nambari hadi kwenye kamba (varchar). Wacha tuangalie mifano ya kubadilisha pesa na maadili ya kuelea kuwa varchar:

Tabia wakati wa kubadilisha pesa kuwa varchar TANGAZA @money money SET @money = 1025.123456789 -- kutakuwa na ubadilishaji kamili hadi 1025.1235, kwa sababu aina ya pesa huhifadhi tarakimu 4 pekee baada ya nukta ya desimali CHAGUA @money, -- 1025.1235 -- kwa chaguo-msingi, CAST na CONVERT zinatenda sawa (yaani, kwa kusema, mtindo wa 0 unatumika) CAST(@money as varchar(20)) , -- 1025.12 CONVERT(varchar(20), @money), -- 1025.12 CONVERT(varchar(20), @money, 0), -- 1025.12 (mtindo 0 - hakuna kitenganishi cha elfu na nafasi 2 za desimali (muundo chaguomsingi) CONVERT( varchar(20), @money, 1), -- 1.025.12 (mtindo wa 1 - hutumia kitenganishi cha elfu moja na maeneo 2 ya desimali) CONVERT(varchar(20), @money, 2) -- 1025.1235 (mtindo wa 2 - hakuna kitenganishi na nambari 4 baada ya nukta ya decimal)

Tabia wakati wa kubadilisha kuelea kuwa varchar TANGAZA @float1 float SET @float1 = 1025.123456789 TANGAZA @float2 float SET @float2 = 1231025.123456789 CHAGUA @float1, -- 10402252,10252,10252. 345679 -- Kwa chaguo-msingi, CAST na CONVERT hufanya sawa (yaani, kwa kusema, mtindo 0 unatumika) -- mtindo 0 - Sio zaidi ya tarakimu 6. Nukuu ya kielelezo inatumika kwa lazima -- mambo ya kutisha sana hutokea hapa wakati wa kugeuzwa kuwa varchar CAST(@float1 kama varchar(20)), -- 1025.12 CONVERT(varchar(20), @float1), -- 1025.12 CONVERT(varchar( 20 ), @float1, 0), -- 1025.12 CAST(@float2 kama varchar(20)), -- 1.23103e+006 CONVERT(varchar(20), @float2), -- 1.23103e+006 CONVERT(varchar( 20 ), @float2, 0), -- 1.23103e+006 -- mtindo 1 - Kila mara tarakimu 8. Nukuu za kisayansi za nambari hutumiwa kila wakati. -- mtindo huu wa kuelea pia si sahihi sana CONVERT(varchar(20), @float1, 1), -- 1.0251235e+003 CONVERT(varchar(20), @float2, 1), -- 1.2310251e+006 - - style 2 - Daima 16 bits. Nukuu za kisayansi za nambari hutumiwa kila wakati. -- hapa usahihi ni bora CONVERT(varchar(30), @float1, 2), -- 1.025123456789000e+003 - SAWA CONVERT(varchar(30), @float2, 2) -- 1.231025123450678 -9e+OK

Kama inavyoonekana kutoka kwa mfano, aina za kuelea huelea, halisi katika hali zingine zinaweza kuunda kosa kubwa, haswa ikiwa inabadilishwa kuwa kamba na nyuma (hii inaweza kutokea na aina anuwai za ujumuishaji, wakati data, kwa mfano, inahamishwa ndani. faili za maandishi kutoka kwa mfumo mmoja hadi mwingine).

Ikiwa unahitaji kudhibiti kwa uwazi usahihi hadi ishara fulani, zaidi ya 4, basi wakati mwingine ni bora kutumia aina ya desimali/nambari kuhifadhi data. Ikiwa herufi 4 zinatosha, basi unaweza kutumia aina ya pesa - takriban inalingana na nambari (20,4).

Desimali na nambari DECLARE @money money SET @money = 1025.123456789 -- 1025.1235 DECLARE @float1 float SET @float1 = 1025.123456789 TAMBUA @float2 float SET @float2 float SET @float1207 namba 25 DECLARE = ​​625 DECLARE 6 25 CLARE 5 5 12. 9) WEKA @numeric = 1025.123456789 CHAGUA CAST( @numeric kama varchar(20)), -- 1025.12345679 CONVERT(varchar(20), @numeric), -- 1025.12345679 CAST(@pesa kama nambari(28,9)), -- 1025.123500000 CAST (@2float CAST) ,9)), -- 1025.123456789 CAST(@float2 kama nambari(28,9)) -- 1231025.123456789

Kumbuka.
Kwa kuwa toleo la MS SQL 2008, unaweza kutumia ujenzi ufuatao badala yake:
  • ms sql seva
  • Ongeza vitambulisho