Bukas
Isara

Mga naka-imbak na pamamaraan at pag-trigger. Magsanay gamit ang MySQL count function Mysql functions paglalarawan at mga halimbawa

Pansin! Ang gawaing ito ay batay sa pagsasalin ng seksyong “17.1. Stored Routines and the Grant Tables" paglalarawan ng MySQL 5.0.19 software, "Reference Manual. Ito ay nagdodokumento ng MySQL 5.0 hanggang 5.0.19. Nabuo ang dokumento noong: 2006-01-23 (rebisyon:995)"
``Basahin muna ang lahat, pagkatapos ay subukan ang mga halimbawa.''

Ang mga nakaimbak na pamamaraan ay isang hanay ng mga SQL command na maaaring i-compile at iimbak sa isang server. Sa ganitong paraan, sa halip na mag-imbak ng isang madalas na ginagamit na query, ang mga kliyente ay maaaring sumangguni sa kaukulang naka-imbak na pamamaraan. Nagbibigay ito ng mas mahusay na pagganap dahil ang isang naibigay na kahilingan ay kailangan lang i-parse nang isang beses at binabawasan ang trapiko sa pagitan ng server at client. Ang antas ng konsepto ay maaari ding tumaas sa pamamagitan ng paglikha ng isang library ng mga function sa server.

Ang trigger ay isang naka-imbak na pamamaraan na isinasagawa kapag naganap ang isang partikular na kaganapan. Halimbawa, maaari mong tukuyin ang isang naka-imbak na pamamaraan na tumatakbo sa bawat oras na ang isang tala ay tinanggal mula sa isang talahanayan ng transaksyon, sa gayon ay matiyak na ang kaukulang customer ay awtomatikong tatanggalin mula sa talahanayan ng customer kapag ang lahat ng mga transaksyon nito ay tinanggal.

Ang mga nakaimbak na programa (mga pamamaraan at function) ay sinusuportahan sa MySQL 5.0. Ang mga nakaimbak na pamamaraan ay isang hanay ng mga SQL expression na maaaring maimbak sa server. Kapag ito ay tapos na, hindi na kailangan ng kliyente na muling ipadala ang kahilingan, ngunit tawagan na lamang ang nakaimbak na programa.

Ito ay maaaring maging kapaki-pakinabang kapag:

  • Maraming mga application ng kliyente ang nakasulat sa iba't ibang mga wika o tumatakbo sa iba't ibang mga platform, ngunit dapat gumamit ng parehong database ng transaksyon
  • unahin ang kaligtasan

Ang mga nakaimbak na pamamaraan at function (routines) ay maaaring magbigay ng mas mahusay na pagganap dahil mas kaunting impormasyon ang kinakailangan upang maipadala sa pagitan ng kliyente at server. Ang pagpipilian ay nagpapataas ng pagkarga sa database server, ngunit binabawasan ang mga gastos sa panig ng kliyente. Gamitin ito kung maraming mga client machine (tulad ng mga Web server) ang inihahatid ng isa o higit pang mga database.

Nagbibigay-daan din sa iyo ang mga nakaimbak na gawain na gumamit ng mga function library na nakaimbak sa database ng server. Ang tampok na ito ay ibinibigay para sa maraming modernong programming language, na nagpapahintulot sa kanila na direktang tawagan (halimbawa, gamit ang mga klase).

Sinusundan ng MySQL ang syntax ng SQL:2003 para sa mga nakaimbak na pamamaraan, na ginagamit na sa DB2 ng IBM.

Mula sa salita hanggang sa gawa...

Kapag gumagawa, nagbabago, nagtatanggal ng mga nakaimbak na gawain, minamanipula ng server ang mysql.proc table

Sa MySQL 5.0.3 ang mga sumusunod na pribilehiyo ay kinakailangan:

GUMAWA NG ROUTINE upang lumikha ng mga nakaimbak na pamamaraan

ALTER ROUTINE kinakailangan upang baguhin o tanggalin ang mga pamamaraan. Ang pribilehiyong ito ay awtomatikong itinalaga sa lumikha ng pamamaraan (function)

IPATUPAD Kakailanganin ang pribilehiyo upang maisagawa ang subroutine. Gayunpaman, awtomatiko itong itinalaga sa lumikha ng pamamaraan (function). Gayundin, bilang default, ang parameter ng SQL SECURITY para sa DEFINER routine, na nagbibigay-daan sa mga user na may access sa database na tumawag sa mga routine na nauugnay sa database na ito.

Syntax ng mga naka-imbak na pamamaraan at pag-andar

Ang nakaimbak na gawain ay isang pamamaraan o function. Ginagawa ang mga nakaimbak na gawain gamit ang CREATE PROCEDURE o CREATE FUNCTION na mga pahayag. Ang isang nakaimbak na gawain ay tinatawag gamit ang isang CALL na pahayag, na may mga variable na bumabalik ng halaga lamang ang ginagamit bilang mga variable ng output. Ang function ay maaaring tawaging tulad ng anumang iba pang function at maaaring magbalik ng scalar value. Ang mga nakaimbak na gawain ay maaaring tumawag sa iba pang mga nakaimbak na gawain.

Dahil ang MySQL 5.0.1, ang na-load na procedure o function ay nauugnay sa isang partikular na database. Ito ay may ilang mga kahulugan:

  • Kapag tinawag ang isang subroutine, ang layunin ay tawagan ang USE db_name (at itapon ang database kapag nakumpleto na ang subroutine at hindi na kailangan ang database)
  • Maaari kang maging kwalipikado sa mga regular na pangalan na may pangalan ng database. Ito ay maaaring gamitin upang sumangguni sa isang gawain na wala sa kasalukuyang database. Halimbawa, upang magsagawa ng naka-imbak na pamamaraan p o isang function f na nauugnay sa database ng pagsubok, maaari mong sabihin sa command interpreter tulad nito: TUMAWAG test.p() o test.f() .
  • Kapag ang isang database ay tinanggal, ang lahat ng mga naka-load na gawain na nauugnay dito ay tatanggalin din. Sa MySQL 5.0.0, ang mga naka-load na gawain ay pandaigdigan at hindi nauugnay sa database. Namana nila ang default na database mula sa calling statement. Kung ang USE db_name ay isinagawa sa loob ng isang subroutine, ang orihinal na kasalukuyang database ay maibabalik pagkatapos lumabas sa subroutine (Halimbawa, ang kasalukuyang database ay db_11, tinatawag namin ang isang subroutine na gumagamit ng db_22, pagkatapos lumabas sa subroutine ang kasalukuyang db_11 ay nananatili)

Ganap na sinusuportahan ng MySQL ang mga extension na nagbibigay-daan sa iyong gumamit ng mga regular na SELECT expression (nang hindi gumagamit ng mga cursor o lokal na variable) sa loob ng mga nakaimbak na pamamaraan. Ang resultang set na ibinalik mula sa query ay direktang ipinadala sa kliyente. Ang isang maramihang SELECT query ay bumubuo ng maraming mga set ng resulta, kaya ang kliyente ay dapat gumamit ng isang library na sumusuporta sa maramihang mga set ng resulta.

GUMAWA NG PAMAMARAAN- lumikha ng isang naka-imbak na pamamaraan.

GUMAWA NG FUNCTION- lumikha ng isang naka-imbak na function.

Syntax:

GUMAWA NG PAMAMARAAN procedure_name ([procedure_parameter[,...]])
[mga katangian...] subroutine_body

GUMAWA NG FUNCTION function_name ([function_parameter[,...]])
NAGBABALIK uri
[characteristic...] subroutine_body

procedure_parameter:
[ SA | LABAS | INOUT] uri ng parameter_name
function_parameter:
uri ng parameter_name

uri:
Anumang uri ng data ng MySQL

katangian:
WIKA SQL
| DETERMINISTIC
| ( NAGLALAMAN NG SQL | WALANG SQL | NAGBASA NG SQL DATA | NAGBABAGO NG SQL DATA )
| SQL SECURITY (DEFINER | INVOKER)
| COMMENT "string"

subroutine_body:
Tamang SQL expression.

Tingnan natin ang lahat sa pagsasanay.

Una, gumawa tayo ng nakaimbak na pamamaraan na may sumusunod na query:

GUMAWA NG PAMAMARAAN `my_proc`(OUT t INTEGER(11))
HINDI DETERMINISTIC
SQL SECURITY INVOKER
COMMENT ""
MAGSIMULA
piliin ang val1+val2 sa "t" mula sa `my` LIMIT 0,1;
WAKAS;

Ang paggamit ng LIMIT na expression sa query na ito ay ginawa bilang pagkilala sa katotohanang hindi lahat ng kliyente ay may kakayahang tumanggap ng isang hanay ng resulta ng maraming hilera.

Pagkatapos nito, tawagan natin ito:

TUMAWAG sa aking_proc(@a);
Pumili ng;

Upang paghiwalayin ang isang panloob na kahilingan mula sa isang panlabas, isang separator na naiiba sa karaniwan ay palaging ginagamit (para sa gawain, gamitin ang command DELIMITER <строка/символ>)

Narito ang isa pang halimbawa na isinasaalang-alang ang lahat ng mga kinakailangan.

Mysql> delimiter //
mysql> GUMAWA NG PROCEDURE simpleproc (OUT param1 INT)
-> MAGSIMULA
-> PUMILI NG BILANG(*) SA param1 MULA t;
->WAKAS;
-> //

mysql>delimiter;
mysql> TUMAWAG simpleproc(@a);
OK ang query, 0 row ang apektado (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row sa set (0.00 sec)

Ang buong proseso ay makikita sa figure sa ibaba:

Mga nag-trigger

Ang suporta sa trigger ay magagamit sa MySQL mula noong bersyon 5.0.2.

Trigger- isang pinangalanang object ng database na nauugnay sa isang talahanayan at naisaaktibo kapag may nangyaring partikular na kaganapan, isang kaganapan na nauugnay sa talahanayang ito.

Halimbawa, ang sumusunod na code ay lumilikha ng isang talahanayan at isang INSERT trigger. Binubuo ng trigger ang mga value na ipinasok sa isa sa mga column ng talahanayan.

Mysql> GUMAWA NG TABLE account (acct_num INT, halagang DECIMAL(10,2));
OK ang query, 0 row ang apektado (0.03 sec)
mysql> GUMAWA NG TRIGGER ins_sum BAGO MAG-INSERT SA account
-> PARA SA BAWAT ROW SET @sum = @sum + NEW.amount;
OK ang query, 0 row ang apektado (0.06 sec)

Ideklara natin ang variable sum at italaga ito ng value 1. Pagkatapos nito, sa tuwing ilalagay natin sa table account tataas ang halaga ng variable na ito ayon sa ipinasok na bahagi.

Magkomento. Kung hindi nasimulan ang value ng variable, hindi gagana ang trigger!

Syntax para sa paggawa ng trigger

GUMAWA

TRIGGER trigger_name trigger_time trigger_event
SA table_name PARA SA BAWAT ROW expression_executed_when_trigger_fires

Kung malinaw na kaagad ang lahat sa trigger name at user name, pag-uusapan natin ang tungkol sa "oras ng pag-trigger" at "kaganapan" nang hiwalay.

trigger_time

Tinutukoy ang oras kung kailan nagaganap ang pagkilos ng trigger. BEFORE ay nangangahulugan na ang trigger ay isasagawa bago makumpleto ang trigger na kaganapan, at PAGKATAPOS ay nangangahulugan pagkatapos. Halimbawa, kapag naglalagay ng mga tala (tingnan ang halimbawa sa itaas), ang aming trigger ay nagpaputok bago ang aktwal na pagpasok ng tala at kinakalkula ang kabuuan. Ang pagpipiliang ito ay angkop para sa paunang pagkalkula ng ilang karagdagang mga patlang sa talahanayan o parallel na pagpapasok sa isa pang talahanayan.

trigger_event

Mas simple ang lahat dito. Ito ay malinaw na nagsasaad sa kung anong kaganapan ang trigger ay isinasagawa.

  • INSERT: ibig sabihin. sa panahon ng mga operasyon ng pagpasok o katulad na mga expression (INSERT, LOAD DATA, at REPLACE)
  • I-UPDATE: kapag binago ang isang entity (row).
  • DELETE: Kapag ang isang tala ay tinanggal (mga query na naglalaman ng DELETE at/o REPLACE na mga pahayag)

Ano ang mga function?

Ang MySQL ay maaaring gumawa ng higit pa kaysa sa pag-imbak at pagkuha ng data. Maaari din namin magsagawa ng mga manipulasyon sa data bago ito kunin o i-save. Doon pumapasok ang MySQL Functions. Ang mga function ay simpleng piraso ng code na nagsasagawa ng ilang operasyon at pagkatapos ay nagbabalik ng resulta Ang ilang function ay tumatanggap ng mga parameter habang ang ibang mga function ay hindi tumatanggap ng mga parameter.

Hayaan" sandali na tumingin sa isang halimbawa ng MySQL function. Bilang default, ang MySQL ay nagse-save ng mga uri ng data ng petsa sa format na "YYYY-MM-DD". Ipagpalagay na nakagawa kami ng isang application at gusto ng aming mga user na ibalik ang petsa sa format na "DD -MM-YYYY", maaari nating gamitin ang MySQL built in na function na DATE_FORMAT para makamit ito. Ang DATE_FORMAT ay isa sa mga pinaka ginagamit na function sa MySQL. Titingnan natin ito nang mas detalyado habang binubuksan natin ang aralin.

Bakit gumagamit ng mga function?

Batay sa halimbawang ibinigay sa panimula, maaaring nag-iisip ang mga taong may karanasan sa computer programming "Bakit abalahin ang MySQL Functions? Ang parehong epekto ay maaaring makamit sa scripting/programming language?" Totoong makakamit natin iyon sa pamamagitan ng pagsulat ng ilang pamamaraan/function sa application program.

Ang pagbabalik sa aming halimbawa ng DATE sa panimula, para makuha ng aming mga user ang data sa nais na format, kailangang gawin ng layer ng negosyo ang kinakailangang pagproseso.

Nagiging problema ito kapag kailangang isama ang application sa ibang mga system. Kapag gumagamit kami ng mga function ng MySQL tulad ng DATE_FORMAT, maaari naming i-embed ang functionality na iyon sa database at makukuha ito ng anumang application na nangangailangan ng data sa kinakailangang format. Ito binabawasan ang muling pagtatrabaho sa lohika ng negosyo at binabawasan ang mga hindi pagkakapare-pareho ng data.

Isa pang dahilan kung bakit dapat nating isaalang-alang ang paggamit Ang mga function ng MySQL ay ang katotohanan na makakatulong ito sa pagbawas ng trapiko sa network sa mga application ng client/server. Kakailanganin lamang ng Business Layer na tumawag sa mga naka-imbak na function nang hindi nangangailangang manipulahin ang data .Sa karaniwan, ang paggamit ng mga function ay makakatulong nang malaki sa pagpapabuti ng pangkalahatang pagganap ng system.

Mga uri ng pag-andar

Mga built-in na function

Ang MySQL ay kasama ng isang bilang ng mga built in na function. Ang mga built in na function ay simpleng function na naipatupad na sa MySQL server. Binibigyang-daan kami ng mga function na ito na magsagawa ng iba't ibang uri ng manipulasyon sa data. Ang mga built in na function ay maaaring karaniwang ikategorya sa mga sumusunod na pinakaginagamit na kategorya.

  • Mga function ng string- gumana sa mga uri ng data ng string
  • Mga function ng numero- gumana sa mga numeric na uri ng data
  • Mga function ng petsa- gumana sa mga uri ng data ng petsa
  • Pinagsama-samang mga function- gumana sa lahat ng mga uri ng data sa itaas at gumawa ng mga summarized na set ng resulta.
  • Iba pang mga function- Sinusuportahan din ng MySQL ang iba pang mga uri ng built in na mga function ngunit lilimitahan namin ang aming aralin sa mga pinangalanang function sa itaas lamang.

Tingnan natin ang bawat isa sa mga function na binanggit sa itaas nang detalyado.

Mga function ng string

Tiningnan na namin kung ano ang ginagawa ng mga string function. Titingnan natin ang isang praktikal na halimbawa na gumagamit ng mga ito. Sa aming talahanayan ng mga pelikula, iniimbak ang mga pamagat ng pelikula gamit ang mga kumbinasyon ng maliliit at malalaking titik. Ipagpalagay na gusto naming makakuha ng listahan ng query na nagbabalik ng mga pamagat ng pelikula sa malalaking titik. Maaari naming gamitin ang function na "UCASE" upang gawin iyon. Ito ay tumatagal ng isang string bilang isang parameter at kino-convert ang lahat ng mga titik sa upper case. Ang script na ipinapakita sa ibaba ay nagpapakita ng paggamit ng "UCASE" function.

PUMILI `movie_id`,`title`, UCASE(`title`) MULA SA `movies`;

  • Ang UCASE(`title`) ay ang built in na function na kumukuha ng pamagat bilang parameter at ibinabalik ito sa malalaking titik na may pangalang alias `upper_case_title`.

Ang pagpapatupad ng script sa itaas sa MySQL workbench laban sa Myflixdb ay nagbibigay sa amin ng mga sumusunod na resulta na ipinapakita sa ibaba.

movie_idpamagatUCASE("pamagat")
16 67% Nagkasala67% GUILTY
6 mga anghel at demonyoMGA ANGHEL AT DEMONYO
4 Code Name BlackCODE NAME BLACK
5 Mga Little Girls ni DaddyMGA MALIIT NA BABAE NI DADDY
7 Davinci CodeDAVINCI CODE
2 Nakakalimutan si Sarah MarshalNAKALIMUTAN SI SARAH MARSHAL
9 Honey moonersMGA HONEY MOONERS
19 pelikula 3PELIKULA 3
1 Pirates of the Caribbean 4PIRATES OF THE CARIBEAN 4
18 sample na pelikulaHALIMBAWA NG PELIKULA
17 Ang Dakilang DiktadorANG DAKILANG DIKTADOR
3 X-MenX-MEN

Sinusuportahan ng MySQL ang isang bilang ng mga function ng string. Para sa kumpletong listahan ng lahat ng built in na string function, sumangguni sa link na ito http://dev.mysql.com/doc/refman/5.0/en/string-functions.html sa MySQL website.

Mga function ng numero

Gaya ng naunang nabanggit, ang mga function na ito ay gumagana sa mga numeric na uri ng data. Maaari kaming magsagawa ng mathematical computations sa numeric data sa mga SQL statement.

Mga operator ng arithematic

Sinusuportahan ng MySQL ang mga sumusunod na operator ng arithmatic na maaaring magamit upang magsagawa ng mga pagkalkula sa mga pahayag ng SQL.

Paglalarawan

Dibisyon ng integer

Tingnan natin ngayon ang mga halimbawa ng bawat isa sa operator sa itaas

Integer Division (DIV)

PILIIN 23 DIV 6 ;

Operator ng dibisyon (/)

Tingnan natin ngayon ang halimbawa ng operator ng dibisyon.

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng mga sumusunod na resulta.

Operator ng pagbabawas (-)

Tingnan natin ngayon ang halimbawa ng operator ng pagbabawas Gagamitin natin ang parehong mga halaga tulad ng sa nakaraang dalawang halimbawa

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng 17

Operator ng karagdagan (+)

Tingnan natin ngayon ang halimbawa ng karagdagan operator.

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng 29

Multiplikasyon operator (*)

Tingnan natin ngayon ang halimbawa ng multiplication operator Gagamitin natin ang parehong mga halaga tulad ng sa mga nakaraang halimbawa.

PUMILI 23 * 6 BILANG `multiplication_result`;

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng mga sumusunod na resulta.

multiplication_result

Modulo operator (-)

Hinahati ng modulo operator ang N sa M at binibigyan tayo ng paalala. Tingnan natin ngayon ang halimbawa ng modulo operator Gagamitin natin ang parehong mga halaga tulad ng sa mga nakaraang halimbawa.

SELECT 23 MOD 6 ;

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng 5

Tingnan natin ngayon ang ilan sa mga karaniwang numeric function sa MySQL.

Sahig- ang function na ito ay nag-aalis ng mga decimal na lugar mula sa isang numero at ni-round ito sa pinakamalapit na pinakamababang numero. Ang script na ipinapakita sa ibaba ay nagpapakita ng paggamit nito.

PUMILI NG FLOOR(23 / 6) BILANG `floor_result`;

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng mga sumusunod na resulta.

Floor_result

Bilog- ang function na ito ay nagpapaikot ng isang numero na may mga decimal na lugar sa pinakamalapit na buong numero. Ang script na ipinapakita sa ibaba ay nagpapakita ng paggamit nito.

PUMILI NG ROUND(23 / 6) BILANG `round_result`;

Ang pagpapatupad ng script sa itaas ay nagbibigay sa amin ng mga sumusunod na resulta.

Round_resulta

rand- Ang function na ito ay ginagamit upang bumuo ng isang random na numero, ang halaga nito ay nagbabago sa bawat oras na ang function ay tinatawag. Ang script na ipinapakita sa ibaba ay nagpapakita ng paggamit nito.

PUMILI RAND() BILANG `random_result`;

Mga naka-imbak na function

Ang mga naka-imbak na function ay katulad lamang ng mga built in na function maliban na kailangan mong tukuyin ang nakaimbak na function sa iyong sarili. Kapag nalikha na ang isang naka-imbak na function, maaari itong magamit sa mga SQL statement tulad ng anumang iba pang function. Ang pangunahing syntax para sa paglikha ng isang naka-imbak na function ay tulad ng ipinapakita sa ibaba

GUMAWA NG FUNCTION sf_name () NAGBABALIK NG uri ng data NG MGA DETERMINISTIC NA PAHAYAG

  • "GUMAWA NG FUNCTION sf_name()" ay sapilitan at nagsasabi sa MySQL server na lumikha ng isang function na pinangalanang `sf_name" na may mga opsyonal na parameter na tinukoy sa panaklong.
  • "Ibinabalik ang uri ng data" ay sapilitan at tinutukoy ang uri ng data na dapat ibalik ng function.
  • "DETERMINISTIC" nangangahulugan na ang function ay magbabalik ng parehong mga halaga kung ang parehong mga argumento ay ibinibigay dito.
  • "MGA PAHAYAG" ay ang procedural code na pinapagana ng function.

Tingnan natin ngayon ang isang praktikal na halimbawa na nagpapatupad ng built in na function sa MySQL server kung ang kasalukuyang petsa ay mas mababa kaysa sa petsa ng pagbabalik ng pelikula, ibabalik namin ang "Hindi" kung hindi, ibabalik namin ang "Oo."

DELIMITER | GUMAWA NG FUNCTION sf_past_movie_return_date (return_date DATE) IBINALIK ANG VARCHAR(3) DETERMINISTIC BEGIN DECLARE sf_value VARCHAR(3); KUNG curdate() > return_date THEN SET sf_value = "Yes"; ELSEIF curdate() !}<= return_date THEN SET sf_value = "Hindi"; END IF; RETURN sf_value; END|

Ang pagpapatupad ng script sa itaas ay lumikha ng nakaimbak na function na `sf_past_movie_return_date`.

Subukan natin ngayon ang aming nakaimbak na function.

PUMILI ng `movie_id`,`membership_number`,`return_date`,CURDATE() ,sf_past_movie_return_date(`return_date`) MULA SA `movierentals`;

Ang pagpapatupad ng script sa itaas sa MySQL workbench laban sa myflixdb ay nagbibigay sa amin ng mga sumusunod na resulta.

movie_idmembership_numberreturn_dateCURDATE()sf_past_movie_return_date("return_date")
1 1 WALA04-08-2012 WALA
2 1 25-06-2012 04-08-2012 oo
2 3 25-06-2012 04-08-2012 oo
2 2 25-06-2012 04-08-2012 oo
3 3 WALA04-08-2012 WALA

Mga function na tinukoy ng user

Sinusuportahan din ng MySQL ang mga function na tinukoy ng gumagamit na nagpapalawak ng MySQL. Ang mga function na tinukoy ng gumagamit ay mga function na maaari mong gawin gamit ang isang programming language tulad ng C, C++ atbp. at pagkatapos ay idagdag ang mga ito sa MySQL server. Kapag naidagdag na, magagamit ang mga ito tulad ng anumang iba pang function.

Buod

  • Binibigyang-daan kami ng mga function na pahusayin ang mga kakayahan ng MySQL.
  • Palaging nagbabalik ng value ang mga function at maaaring opsyonal na tumanggap ng mga parameter.
  • Ang mga built in na function ay mga function na ipinadala gamit ang MySQL. Maaari silang ikategorya ayon sa mga uri ng data kung saan sila nagpapatakbo i.e. string, petsa at numeric na built in na mga function.
  • Ang mga naka-imbak na function ay nilikha ng user sa loob ng MySQL server at maaaring gamitin sa mga SQL statement.
  • Ang mga function na tinukoy ng gumagamit ay nilikha sa labas ng MySQL at maaaring isama sa MySQL server.

Ipadala ang iyong mabuting gawa sa base ng kaalaman ay simple. Gamitin ang form sa ibaba

Ang mga mag-aaral, nagtapos na mga mag-aaral, mga batang siyentipiko na gumagamit ng base ng kaalaman sa kanilang pag-aaral at trabaho ay lubos na magpapasalamat sa iyo.

Nai-post sa http://www.allbest.ru/

Praktikal na trabaho

Mga function sa MySQL

Gawain 1. Mga built-in na function

mathematical function programming

Ang mga function ay mga pagpapatakbo na nagbibigay-daan sa iyong manipulahin ang data. Mayroong ilang mga grupo ng mga built-in na function sa MySQL:

Mga function ng string. Ginagamit upang manipulahin ang mga string ng text, tulad ng mga halaga ng pag-trim o padding.

Mga function ng numero. Ginagamit upang magsagawa ng mga pagpapatakbo ng matematika sa numerical na data. Kasama sa mga numerical function ang mga function na nagbabalik ng mga absolute value, sine at cosine ng mga anggulo, ang square root ng isang numero, atbp. Ginagamit lamang ang mga ito para sa algebraic, trigonometric at geometric na mga kalkulasyon. Sa pangkalahatan, ang mga ito ay bihirang ginagamit, kaya hindi namin isasaalang-alang ang mga ito. Ngunit dapat mong malaman na mayroon sila at kumunsulta sa dokumentasyon ng MySQL kung kinakailangan.

Mga function ng buod. Ginagamit ang mga ito upang makakuha ng buod ng data mula sa mga talahanayan, halimbawa, kapag kailangan mong ibuod ang ilang data nang hindi ito pinipili.

Mga function ng petsa at oras. Ginagamit upang manipulahin ang mga halaga ng petsa at oras, halimbawa upang ibalik ang pagkakaiba sa pagitan ng mga petsa.

Mga function ng system. Ibalik ang impormasyon ng serbisyo ng DBMS.

Upang tingnan ang mga pangunahing built-in na function, kakailanganin naming lumikha ng bagong database upang maglaman ng mga halaga ng numero at petsa.

Kunin natin ang isang online na tindahan bilang isang halimbawa.

Konseptwal na modelo:

Relational model:

Kaya, tingnan natin ang huling diagram at lumikha ng isang database - shop.

lumikha ng database shop;

Pinipili namin ito para sa trabaho:

At gumawa kami ng 8 table sa loob nito, tulad ng sa diagram: Mga Mamimili (customer), Supplier (vendor), Mga Pagbili (sale), Supplies (papasok), Purchase log (magazine_sales), Delivery log (magazine_incoming), Mga Produkto (mga produkto), Mga presyo (mga presyo). Isang caveat, magbebenta ang aming tindahan ng mga libro, kaya magdaragdag kami ng isa pang column sa talahanayan ng Mga Produkto - May-akda, sa prinsipyo hindi ito kinakailangan, ngunit ito ay mas karaniwan.

Pakitandaan na sa mga talahanayan ng Purchase Journal, Delivery Journal at Prices, ang mga pangunahing susi ay pinagsama-sama, i.e. ang kanilang mga natatanging halaga ay binubuo ng mga pares ng halaga (ang isang talahanayan ay hindi maaaring magkaroon ng dalawang hanay na may parehong mga pares ng halaga). Ang mga pangalan ng column ng mga pares ng halaga na ito ay ipinapahiwatig ng mga kuwit pagkatapos ng PRIMARY KEY na keyword.

Sa isang tunay na online na tindahan, ang data ay ipapasok sa mga talahanayang ito gamit ang mga script sa ilang wika (gaya ng PHP), ngunit sa ngayon ay kailangan nating ipasok ang mga ito nang manu-mano. Maaari kang magpasok ng anumang data, tandaan lamang na ang mga halaga sa mga hanay ng parehong pangalan sa mga nauugnay na talahanayan ay dapat tumugma. O kopyahin ang data sa ibaba:

Kaya, sa aming tindahan mayroong 24 na mga item ng mga kalakal, dinala sa tatlong paghahatid mula sa tatlong mga supplier, at ganap na tatlong benta. Handa na ang lahat, maaari na nating simulan na pag-aralan ang mga built-in na function ng MySQL.

Gawain 2. Kabuuang mga function, kalkuladong column, at view

Ang kabuuang function ay tinatawag ding statistical, aggregate, o sum functions. Pinoproseso ng mga function na ito ang isang hanay ng mga string upang mabilang at magbalik ng isang halaga. Mayroon lamang limang ganoong pag-andar:

Ibinabalik ng AVG() Function ang average na halaga ng isang column.

Ibinabalik ng COUNT() Function ang bilang ng mga row sa isang column.

Ang MAX() Function ay nagbabalik ng pinakamalaking halaga sa isang column.

Ibinabalik ng MIN() Function ang pinakamaliit na value sa column.

SUM() Ibinabalik ng function ang kabuuan ng mga value ng column.

Nakilala na namin ang isa sa kanila - COUNT() - http://www.site-do.ru/db/sql8.php. Ngayon, kilalanin natin ang iba. Sabihin nating gusto naming malaman ang minimum, maximum at average na presyo ng mga aklat sa aming tindahan. Pagkatapos mula sa talahanayan ng mga presyo, kailangan mong kunin ang pinakamababa, maximum at average na halaga para sa hanay ng presyo. Ang kahilingan ay simple:

PUMILI NG MIN(presyo), MAX(presyo), AVG(presyo) MULA sa mga presyo;

Ngayon, gusto naming malaman kung magkano ang mga kalakal na dinala sa amin ng supplier na "House of Printing" (id=2). Ang paggawa ng ganoong kahilingan ay hindi ganoon kadali. Pag-isipan natin kung paano ito ibubuo:

Una, mula sa talahanayan ng Mga Supplies (papasok), piliin ang mga identifier (id_incoming) ng mga paghahatid na iyon na isinagawa ng supplier na "Print House" (id=2):

Ngayon mula sa talahanayan ng Supply Journal (magazine_incoming) kailangan mong piliin ang mga kalakal (id_product) at ang kanilang mga dami (dami), na isinagawa sa mga paghahatid na makikita sa punto 1. Iyon ay, ang query mula sa punto 1 ay nagiging nested:

Ngayon ay kailangan nating idagdag sa resultang talahanayan ang mga presyo para sa mga nahanap na produkto, na nakaimbak sa talahanayan ng Mga Presyo. Ibig sabihin, kakailanganin nating sumali sa Supply Magazine (magazine_incoming) at mga talahanayan ng Mga Presyo gamit ang column na id_product:

Ang resultang talahanayan ay malinaw na kulang sa Sum column, iyon ay, isang kalkuladong column. Ang kakayahang lumikha ng mga naturang column ay ibinibigay sa MySQL. Upang gawin ito, kailangan mo lamang na tukuyin sa query ang pangalan ng kinakalkula na hanay at kung ano ang dapat nitong kalkulahin. Sa aming halimbawa, ang naturang column ay tatawaging summa, at kakalkulahin nito ang produkto ng mga column ng dami at presyo. Ang pangalan ng bagong column ay pinaghihiwalay ng salitang AS:

Mahusay, ang kailangan lang nating gawin ay dagdagan ang column ng summa at sa wakas ay alamin kung magkano ang dinala sa amin ng supplier na "House of Printing" ng mga kalakal. Ang syntax para sa paggamit ng SUM() function ay ang mga sumusunod:

PUMILI SUM(column_name) MULA sa table_name;

Alam namin ang pangalan ng column - summa, ngunit wala kaming pangalan ng table, dahil ito ay resulta ng isang query. Anong gagawin? Para sa mga ganitong kaso, ang MySQL ay may Views. Ang view ay isang query sa pagpili na binibigyan ng isang natatanging pangalan at maaaring maimbak sa isang database para magamit sa ibang pagkakataon.

Ang syntax para sa paglikha ng isang view ay ang mga sumusunod:

GUMAWA NG VIEW view_name BILANG kahilingan;

I-save natin ang aming kahilingan bilang isang view na pinangalanang report_vendor:

GUMAWA NG TINGNAN ang report_vendor BILANG

PUMILI ng magazine_incoming.id_product, magazine_incoming.quantity, prices.price,

magazine_incoming.quantity*prices.price AS summa

MULA sa magazine_incoming, mga presyo

WHERE magazine_incoming.id_product= prices.id_product AT id_incoming=

Ngayon ay maaari mong gamitin ang panghuling SUM() function:

Kaya't nakamit namin ang resulta, bagama't para dito kailangan naming gumamit ng mga nested na query, pagsali, kalkuladong column at view. Oo, minsan kailangan mong mag-isip para makakuha ng mga resulta, kung wala ito hindi ka makakarating kahit saan. Ngunit hinawakan namin ang dalawang napakahalagang paksa - mga kalkuladong column at view. Pag-usapan natin ang mga ito nang mas detalyado.

Mga kalkuladong field (column)

Gamit ang isang halimbawa, tumingin kami sa isang mathematical na kalkuladong field. Dito nais kong idagdag na maaari mong gamitin hindi lamang ang pagpaparami ng operasyon (*), kundi pati na rin ang pagbabawas (-), karagdagan (+), at paghahati (/). Ang syntax ay ang mga sumusunod:

PUMILI ng column_name_1, column_name_2, column_name_1*column_name_2 BILANG kinakalkula_column_name

MULA sa table_name;

Ang pangalawang nuance ay ang AS keyword, ginamit namin ito upang itakda ang pangalan ng kinakalkula na column. Sa katunayan, ang keyword na ito ay ginagamit upang magtakda ng mga alias para sa anumang mga column. Bakit kailangan ito? Para sa pagbabawas ng code at pagiging madaling mabasa. Halimbawa, maaaring ganito ang hitsura ng aming view:

GUMAWA NG TINGNAN ang report_vendor BILANG

PUMILI A.id_product, A.quantity, B.price, A.quantity*B.price AS summa

MULA sa magazine_incoming AS A, mga presyo AS B

SAAN A.id_product= B.id_product AT id_incoming=

(PUMILI ng id_incoming MULA sa papasok WHERE id_vendor=2);

Sumang-ayon na ito ay mas maikli at mas malinaw.

Representasyon

Tiningnan na namin ang syntax para sa paglikha ng mga view. Kapag nalikha na ang mga view, magagamit ang mga ito sa parehong paraan tulad ng mga talahanayan. Iyon ay, magpatakbo ng mga query laban sa kanila, i-filter at pag-uri-uriin ang data, at pagsamahin ang ilang mga view sa iba. Sa isang banda, ito ay isang napaka-maginhawang paraan upang mag-imbak ng mga madalas na ginagamit na kumplikadong mga query (tulad ng sa aming halimbawa).

Ngunit tandaan na ang mga view ay hindi mga talahanayan, iyon ay, hindi sila nag-iimbak ng data, ngunit kinukuha lamang ito mula sa iba pang mga talahanayan. Kaya, una, kapag nagbago ang data sa mga talahanayan, magbabago rin ang mga resulta ng pagtatanghal. At pangalawa, kapag ang isang kahilingan ay ginawa sa isang view, ang kinakailangang data ay hinahanap, iyon ay, ang pagganap ng DBMS ay nabawasan. Samakatuwid, hindi mo sila dapat abusuhin.

Mga Pag-andar ng Sql String

Ang pangkat ng mga function na ito ay nagbibigay-daan sa iyo upang manipulahin ang teksto. Mayroong maraming mga pag-andar ng string, titingnan natin ang pinakakaraniwan.

CONCAT(str1,str2...)

Ibinabalik ang isang string na nilikha sa pamamagitan ng pagsasama-sama ng mga argumento (ang mga argumento ay tinukoy sa mga panaklong - str1,str2...). Halimbawa, sa aming talahanayan ng mga Vendor ay mayroong column ng Lungsod at column ng Address. Ipagpalagay na gusto namin ang resultang talahanayan na magkaroon ng Address at City sa parehong column, i.e. gusto naming pagsamahin ang data mula sa dalawang column sa isa. Upang gawin ito, gagamitin namin ang CONCAT() string function, at bilang mga argumento ay ipahiwatig namin ang mga pangalan ng mga column na pagsasamahin - lungsod at address:

Pakitandaan na ang pagsasama ay naganap nang walang paghahati, na hindi masyadong nababasa. Ayusin natin ang ating query upang magkaroon ng espasyo sa pagitan ng mga column na sinasali:

Tulad ng nakikita mo, ang isang puwang ay itinuturing din na isang argumento at ipinahiwatig na pinaghihiwalay ng isang kuwit. Kung mayroong higit pang mga column na isasama, kung gayon ang pagtukoy ng mga puwang sa bawat oras ay magiging hindi makatwiran. Sa kasong ito, maaaring gamitin ng isa ang string function na CONCAT_WS(delimiter, str1,str2...), na naglalagay ng delimiter sa pagitan ng mga string na pagsasama-samahin (ang delimiter ay tinukoy bilang ang unang argumento). Ang aming query ay magiging ganito:

PUMILI CONCAT_WS(" ", lungsod, address) MULA sa mga vendor;

Ang resulta ay hindi nagbago sa labas, ngunit kung pagsasamahin namin ang 3 o 4 na mga haligi, ang code ay makabuluhang mababawasan.

INSERT(str, pos, len, new_str)

Ibinabalik ang string str na may substring na nagsisimula sa position pos at may haba ng len character na pinalitan ng substring new_str. Ipagpalagay na nagpasya kaming huwag ipakita ang unang 3 character sa column ng Address (mga abbreviation st., pr., atbp.), pagkatapos ay papalitan namin ang mga ito ng mga puwang:

Iyon ay, tatlong character, simula sa una, ay pinalitan ng tatlong puwang.

LPAD(str, len, dop_str) Ibinabalik ang string str, kaliwang padded na may dop_str sa haba ng len. Ipagpalagay na gusto naming ipakita ang mga lungsod ng supplier sa kanan, at punan ang bakanteng espasyo ng mga tuldok:

RPAD(str, len, dop_str)

Ibinabalik ang string str, right-padded na may dop_str sa haba ng len. Sabihin nating gusto naming ipakita ang mga lungsod ng mga supplier sa kaliwa, at ang bakanteng espasyo ay mapunan ng mga tuldok:

Pakitandaan na nililimitahan ng halaga ng len ang bilang ng mga character na ipinapakita, ibig sabihin. kung ang pangalan ng lungsod ay mas mahaba sa 15 character, ito ay puputulin.

Ibinabalik ang string str na inalis ang lahat ng nangungunang puwang. Ang string function na ito ay maginhawa para sa wastong pagpapakita ng impormasyon sa mga kaso kung saan pinapayagan ang mga random na espasyo kapag naglalagay ng data:

PUMILI LTRIM(lungsod) MULA sa mga vendor;

Ibinabalik ang string str na inalis ang lahat ng trailing space:

PUMILI RTIM(lungsod) MULA sa mga vendor;

Sa aming kaso, walang mga karagdagang espasyo, kaya hindi namin makikita ang resulta sa labas.

Ibinabalik ang string str na inalis ang lahat ng puwang sa unahan at trailing:

PUMILI NG TRIM(lungsod) MULA sa mga vendor;

Ibinabalik ang string str na ang lahat ng character ay na-convert sa lowercase. Hindi ito gumagana nang tama sa mga titik ng Ruso, kaya mas mahusay na huwag gamitin ito. Halimbawa, ilapat natin ang function na ito sa column ng lungsod:

Tingnan kung anong uri ng gobbledygook ito. Ngunit lahat ay maayos sa alpabetong Latin:

Ibinabalik ang string str na ang lahat ng mga character ay na-convert sa uppercase. Mas mainam din na huwag gamitin ito sa mga letrang Ruso. Ngunit lahat ay maayos sa alpabetong Latin:

Ibinabalik ang haba ng string str. Halimbawa, alamin natin kung gaano karaming mga character ang nasa aming mga address ng supplier:

Ibinabalik ang len left character ng string str. Halimbawa, hayaan lamang ang unang tatlong character na ipakita sa mga lungsod ng supplier:

Ibinabalik ang len right-hand na mga character ng string str. Halimbawa, hayaan lamang ang huling tatlong character na ipakita sa mga lungsod ng supplier:

Ibinabalik ang string str n bilang ng beses. Halimbawa:

PALITAN(str, pod_str1, pod_str2)

Ibinabalik ang string str na may lahat ng mga substring ng pod_str1 na pinalitan ng mga substring ng pod_str2. Halimbawa, sabihin natin na sa mga lungsod ng supplier, sa halip na ang mahabang "St Petersburg", ang maikling "SPb" ay ipinapakita:

Ibinabalik ang string str, nakasulat sa reverse order:

LOAD_FILE(file_name)

Binabasa ng function na ito ang file file_name at ibinabalik ang mga nilalaman nito bilang isang string. Halimbawa, lumikha ng isang file na proverka.txt, magsulat ng ilang teksto dito (mas mabuti sa Latin upang maiwasan ang mga problema sa pag-encode), i-save ito sa drive C at gawin ang sumusunod na kahilingan:

Pakitandaan na dapat mong tukuyin ang ganap na landas sa file.

Tulad ng nabanggit na, marami pang string function, ngunit kahit na ang ilan sa mga tinalakay dito ay bihirang ginagamit. Samakatuwid, tapusin natin ang pagsasaalang-alang sa mga ito dito at lumipat sa mas karaniwang ginagamit na mga function ng petsa at oras.

Gawain 3. Mga function ng petsa at oras

Ang mga function na ito ay idinisenyo upang gumana sa mga uri ng data ng kalendaryo. Tingnan natin ang mga pinaka-angkop.

CURDATE(), CURTIME() at NGAYON()

Ang unang function ay nagbabalik ng kasalukuyang petsa, ang pangalawa ay nagbabalik ng kasalukuyang oras, at ang pangatlo ay nagbabalik ng kasalukuyang petsa at oras. Ihambing:

Ang CURDATE() at NOW() function ay kapaki-pakinabang para sa pagdaragdag ng mga tala sa database na gumagamit ng kasalukuyang oras. Sa aming tindahan, lahat ng paghahatid at pagbebenta ay gumagamit ng kasalukuyang oras. Samakatuwid, upang magdagdag ng mga talaan tungkol sa mga paghahatid at pagbebenta, maginhawang gamitin ang CURDATE() function. Halimbawa, sabihin nating dumating ang isang produkto sa aming tindahan, magdagdag tayo ng impormasyon tungkol dito sa talahanayan ng Paghahatid (papasok):

Kung iniimbak namin ang petsa ng paghahatid bilang isang uri ng datatime, ang NOW() function ay magiging mas angkop para sa amin.

ADDDATE(date, INTERVAL value) Ang function ay nagbabalik ng petsa na may value na idinagdag dito. Maaaring negatibo ang halaga ng halaga, pagkatapos ay bababa ang huling petsa. Tingnan natin kung kailan naghatid ng mga kalakal ang ating mga supplier:

Ipagpalagay natin na nagkamali tayo sa paglalagay ng petsa para sa unang supplier, bawasan natin ng isang araw ang petsa nito:

Ang halaga ay maaaring hindi lamang mga araw, kundi pati na rin mga linggo (LINGGO), buwan (BUWAN), quarters (QUARTER) at taon (TAON). Halimbawa, bawasan natin ng 1 linggo ang petsa ng paghahatid para sa pangalawang supplier:

Sa aming talahanayan ng Mga Paghahatid (papasok), ginamit namin ang uri ng petsa para sa column na Petsa ng Paghahatid (petsa_papasok). Ang uri ng data na ito ay idinisenyo upang mag-imbak ng mga petsa lamang. Ngunit kung ginamit namin ang uri ng datatime, ipapakita namin hindi lamang ang petsa, kundi pati na rin ang oras. Pagkatapos ay maaari naming gamitin ang ADDDATE function para sa oras din. Ang halaga sa kasong ito ay maaaring mga segundo (SECOND), minuto (MINUTE), oras (HOUR) at mga kumbinasyon ng mga ito:

minuto at segundo (MINUTE_SECOND),

oras, minuto at segundo (HOUR_SECOND),

oras at minuto (HOUR_MINUTE),

araw, oras, minuto at segundo (DAY_SECOND),

araw, oras at minuto (DAY_MINUTE),

araw at oras (DAY_HOUR),

taon at buwan (YEAR_MONTH).

SUBDATE(petsa, halaga ng INTERVAL)

ang function ay kapareho ng nauna, ngunit nagsasagawa ng operasyon ng pagbabawas sa halip na isang karagdagan.

PERIOD_ADD(panahon, n)

Ang function ay nagdaragdag ng n buwan sa halaga ng petsa ng panahon. Tandaan: ang halaga ng petsa ay dapat nasa format na YYYYMM. Magdagdag tayo ng 2 buwan sa Pebrero 2011 (201102):

TIMESTAMPADD(interval, n, petsa)

ang function ay nagdaragdag ng agwat ng oras n sa petsa ng petsa, ang mga halaga nito ay tinukoy ng parameter ng agwat. Mga posibleng halaga para sa parameter ng pagitan:

FRAC_SECOND - microseconds

PANGALAWA - segundo

MINUTE - minuto

LINGGO - linggo

MONTH - buwan

QUARTER - mga bloke

TIMEDIFF(petsa1, petsa2)

Kinakalkula ang pagkakaiba sa mga oras, minuto at segundo sa pagitan ng dalawang petsa.

DATEDIFF(petsa1, petsa2)

kinakalkula ang pagkakaiba sa mga araw sa pagitan ng dalawang petsa. Halimbawa, gusto naming malaman kung gaano katagal ang nakalipas na ang supplier na si "Williams" (id=1) ay nagbigay sa amin ng mga kalakal:

PERIOD_DIFF(panahon1, yugto2)

Kinakalkula ng function ang pagkakaiba sa mga buwan sa pagitan ng dalawang petsa na kinakatawan sa format na YYYYMM. Alamin natin ang pagkakaiba sa pagitan ng Enero 2010 at Agosto 2011:

TIMESTAMPDIFF(agwat, petsa1, petsa2)

kinakalkula ng function ang pagkakaiba sa pagitan ng mga petsa date2 at date1 sa mga yunit na tinukoy sa parameter ng interval. Mga posibleng halaga para sa parameter ng pagitan:

FRAC_SECOND - microseconds

PANGALAWA - segundo

MINUTE - minuto

LINGGO - linggo

MONTH - buwan

QUARTER - mga bloke

SUBTIME(petsa, oras)

binabawasan ng function ang oras mula sa oras ng petsa:

ibinabalik ang petsa, pinuputol ang oras. Halimbawa:

ibinabalik ang oras, pinuputol ang petsa. Halimbawa:

ang function ay tumatagal ng isang petsa at ibinabalik ang buong bersyon sa oras. Halimbawa:

DAY(petsa) at DAYOFMONTH(petsa)

ibinabalik ng mga synonymous na function ang serial number ng araw ng buwan mula sa petsa:

DAYNAME(petsa), DAYOFWEEK(petsa) at WEEKDAY(petsa)

ibinabalik ng mga function ang araw ng linggo, ang una - ang pangalan nito, ang pangalawa - ang bilang ng araw ng linggo (pagbibilang mula 1 - Linggo hanggang 7 - Sabado), ang pangatlo - ang bilang ng araw ng linggo (pagbibilang mula 0 - Lunes, hanggang 6 - Linggo:

LINGGO(petsa), WEEKOFYEAR(oras ng petsa)

ibinabalik ng parehong function ang bilang ng linggo sa taon, ang una para sa uri ng petsa, at ang pangalawa para sa uri ng datetime, ang una ay may isang linggo simula sa Linggo, ang pangalawa - mula Lunes:

MONTH(petsa) at MONTHNAME(petsa)

ang parehong mga function ay nagbabalik ng mga halaga ng buwan. Ang una ay ang numerical value nito (mula 1 hanggang 12), ang pangalawa ay ang pangalan ng buwan:

ibinabalik ng function ang halaga ng quarter ng taon (mula 1 hanggang 4):

YEAR(date) function ay nagbabalik ng year value (mula 1000 hanggang 9999):

ibinabalik ang serial number ng araw sa taon (mula 1 hanggang 366):

ibinabalik ang halaga ng oras para sa oras (0 hanggang 23):

MINUTE(datetime)

ibinabalik ang halaga ng minuto para sa oras (mula 0 hanggang 59):

SECOND(datetime)

ibinabalik ang halaga ng segundo para sa oras (mula 0 hanggang 59):

EXTRACT(uri MULA sa petsa)

ibinabalik ang bahagi ng petsa na tinukoy ng uri ng parameter:

TO_DAYS(petsa) at FROM_DAYS(n)

reciprocal functions. Kino-convert ng una ang petsa sa bilang ng mga araw mula noong zero ang taon. Ang pangalawa, sa kabaligtaran, ay tumatagal ng bilang ng mga araw na lumipas mula noong zero ang taon at kino-convert ang mga ito sa isang petsa:

UNIX_TIMESTAMP(petsa) at FROM_UNIXTIME(n)

reciprocal functions. Kino-convert ng una ang petsa sa bilang ng mga segundo mula noong Enero 1, 1970. Ang pangalawa, sa kabaligtaran, ay tumatagal ng bilang ng mga segundo mula noong Enero 1, 1970 at kino-convert ang mga ito sa isang petsa:

TIME_TO_SEC(oras) at SEC_TO_TIME(n)

reciprocal functions. Kino-convert ng una ang oras sa bilang ng mga segundo na lumipas mula noong simula ng araw. Ang pangalawa, sa kabaligtaran, ay tumatagal ng bilang ng mga segundo mula sa simula ng araw at kino-convert ang mga ito sa oras:

MAKEDATE(taon, n)

kinukuha ng function ang numero ng taon at araw sa taon at kino-convert ang mga ito sa isang petsa:

Gawain 4. Fmga opsyon sa pag-format ng petsa at oras

Idinisenyo din ang mga function na ito upang gumana sa mga uri ng data ng kalendaryo. Tingnan natin ang mga ito nang mas malapitan.

DATE_FORMAT(petsa, format)

i-format ang petsa ayon sa napiling format. Ang function na ito ay madalas na ginagamit. Halimbawa, sa MySQL ang format ng petsa ay YYYY-MM-DD (year-month-day), habang mas pamilyar tayo sa format na DD-MM-YYYY (date-month-year). Samakatuwid, upang maipakita ang petsa gaya ng dati, kailangan itong i-reformat. Ibigay muna natin ang query, at pagkatapos ay alamin kung paano itakda ang format:

Ngayon parang pamilyar sa amin ang date. Upang tukuyin ang format ng petsa, ginagamit ang mga espesyal na qualifier. Para sa kaginhawahan, inilista namin ang mga ito sa talahanayan.

Paglalarawan

Pinaikling pangalan ng araw ng linggo (Lunes - Lunes, Martes - Martes, Miyerkoles - Miyerkules, Huwebes - Huwebes, Biy - Biyernes, Sab - Sabado, Linggo - Linggo).

Pinaikling pangalan ng mga buwan (Ene - Enero, Peb - Pebrero, Mar - Marso, Abr - Abril, Mayo - Mayo, Hun - Hunyo, Hul - Hulyo, Agosto - Agosto, Set - Setyembre, Okt - Oktubre, Nob - Nobyembre, Disyembre - Disyembre).

Buwan sa numerical form (1 - 12).

Araw ng buwan sa numeric form na may zero (01 - 31).

Araw ng buwan sa English (1st, 2nd...).

Araw ng buwan sa numerical form na walang zero (1 - 31).

Mga oras na may leading zero mula 00 hanggang 23.

Orasan na may leading zero mula 00 hanggang 12.

Mga minuto mula 00 hanggang 59.

Araw ng taon mula 001 hanggang 366.

Orasan na may leading zero mula 0 hanggang 23.

Orasan na walang leading zero mula 1 hanggang 12.

Pangalan ng buwan na walang pagdadaglat.

Buwan sa numeric form na may nangunguna na zero (01 - 12).

AM o PM para sa 12 oras na format.

Oras sa 12-oras na format.

Mga segundo mula 00 hanggang 59.

Oras sa 24 na oras na format.

Linggo (00 - 52), kung saan ang unang araw ng linggo ay Lunes.

Linggo (00 - 52), kung saan ang unang araw ng linggo ay Linggo.

Pangalan ng araw ng linggo nang walang pagdadaglat.

Bilang ng araw ng linggo (0 - Linggo, 6 - Sabado).

Taon, 4 na kategorya.

Taon, 2 kategorya.

STR_TO_DATE(petsa, format)

Ang function ay ang kabaligtaran ng nauna, tinatanggap nito ang petsa sa format at ibinabalik ang petsa sa MySQL format.

.

TIME_FORMAT(oras, format)

Ang function ay katulad ng DATE_FORMAT() function, ngunit ginagamit lamang para sa oras:

GET_FORMAT(petsa, format)

Ang function ay nagbabalik ng isang format na string na naaayon sa isa sa limang mga format ng oras:

EUR - European standard

USA - American standard

JIS - Japanese Industrial Standard

ISO - ISO standard (International Standards Organization)

INTERNAL - internasyonal na pamantayan

Ang function na ito ay mahusay na gamitin kasabay ng nauna -

Tingnan natin ang isang halimbawa:

Gaya ng nakikita mo, ang GET_FORMAT() function mismo ay nagbabalik ng presentation format, at kasama ng DATE_FORMAT() function na ito ay gumagawa ng petsa sa kinakailangang format. Gumawa ng sarili mong mga query sa lahat ng limang pamantayan at makita ang pagkakaiba.

Well, ngayon alam mo na ang halos lahat tungkol sa pagtatrabaho sa mga petsa at oras sa MySQL. Ito ay magiging lubhang kapaki-pakinabang para sa iyo kapag bumubuo ng iba't ibang mga web application. Halimbawa, kung ang isang user ay nagpasok ng isang petsa sa isang form sa isang website sa isang format na pamilyar sa kanya, hindi magiging mahirap para sa iyo na ilapat ang kinakailangang function upang ang petsa ay lumabas sa database sa kinakailangang format.

Gawain 5. Stored procedures

Bilang isang panuntunan, kapag nagtatrabaho sa isang database, ginagamit namin ang parehong mga query, o isang set ng mga sequential query. Binibigyang-daan ka ng mga nakaimbak na pamamaraan na pagsamahin ang isang sequence ng mga query at iimbak ang mga ito sa server. Ito ay isang napaka-maginhawang tool, at ngayon ay makikita mo ito. Magsimula tayo sa syntax:

GUMAWA NG PAMAMARAAN

procedure_name (mga parameter)

mga operator

Ang mga parameter ay ang data na ipapasa namin sa pamamaraan kapag tinawag ito, at ang mga operator ay ang mga mismong kahilingan. Isulat natin ang ating unang pamamaraan at siguraduhing maginhawa ito. Noong nagdagdag kami ng mga bagong tala sa database ng tindahan, gumamit kami ng karaniwang query sa pagdaragdag tulad ng:

INSERT INTO customer (pangalan, email) VALUE ("Ivanov Sergey", " [email protected]");

kasi Gagamit kami ng katulad na kahilingan sa tuwing kailangan naming magdagdag ng bagong customer, kaya angkop na gawing pormal ito sa anyo ng isang pamamaraan:

GUMAWA NG PAMAMARAAN ins_cust(n CHAR(50), at CHAR(50))

ipasok sa mga customer (pangalan, email) halaga (n, e);

Bigyang-pansin kung paano tinukoy ang mga parameter: kailangan mong magbigay ng isang pangalan sa parameter at ipahiwatig ang uri nito, at sa katawan ng pamamaraan ay gumagamit na kami ng mga pangalan ng parameter. Isang caveat. Tulad ng naaalala mo, ang isang semicolon ay nangangahulugan ng pagtatapos ng kahilingan at ipinapadala ito para sa pagpapatupad, na hindi katanggap-tanggap sa kasong ito. Samakatuwid, bago magsulat ng isang pamamaraan, kinakailangan na muling tukuyin ang c separator; sa "//" upang ang kahilingan ay hindi maipadala nang maaga. Ginagawa ito gamit ang DELIMITER // operator:

Kaya, ipinahiwatig namin sa DBMS na ang mga utos ay dapat na ngayong isagawa pagkatapos ng //. Dapat tandaan na ang muling pagtukoy sa separator ay isinasagawa lamang para sa isang session, i.e. sa susunod na magtrabaho ka sa MySql, ang separator ay muling magiging semicolon at, kung kinakailangan, kailangan itong muling tukuyin. Ngayon ay maaari mong ilagay ang pamamaraan:

Kaya, ang pamamaraan ay nilikha. Ngayon, kapag kailangan nating magpasok ng bagong customer, kailangan lang nating tawagan ito, na tinutukoy ang mga kinakailangang parameter. Upang tumawag sa isang naka-imbak na pamamaraan, gamitin ang CALL na pahayag, na sinusundan ng pangalan ng pamamaraan at mga parameter nito. Magdagdag tayo ng bagong customer sa talahanayan ng Mga Customer:

Sumang-ayon na ito ay mas madali kaysa sa pagsulat ng isang buong kahilingan sa bawat oras. Tingnan natin kung gumagana ang pamamaraan sa pamamagitan ng pagtingin upang makita kung may lumitaw na bagong customer sa talahanayan ng Mga Customer:

Lumalabas, gumagana ang procedure, at palaging gagana hanggang sa tanggalin namin ito gamit ang DROP PROCEDURE procedure_name statement.

Tulad ng nabanggit sa simula ng gawain, pinapayagan ka ng mga pamamaraan na pagsamahin ang isang pagkakasunud-sunod ng mga query. Tingnan natin kung paano ito ginawa. Subukan nating alamin kung magkano ang dinala sa atin ng supplier na "House of Printing" ng mga kalakal? Dati, kailangan naming gumamit ng mga subquery, pagsali, kalkuladong column, at view para magawa ito. Paano kung gusto nating malaman kung magkano ang mga kalakal na dinala sa atin ng isa pang supplier? Kakailanganin mong lumikha ng mga bagong query, sumali, atbp. Mas madaling magsulat ng naka-imbak na pamamaraan para sa pagkilos na ito nang isang beses.

Mukhang ang pinakamadaling paraan ay ang kumuha ng nakasulat na view at isang query para dito, pagsamahin ito sa isang nakaimbak na pamamaraan at gawing input parameter ang vendor identifier (id_vendor), tulad nito:

Ngunit ang pamamaraan ay hindi gagana sa ganoong paraan. Ang bagay ay ang mga view ay hindi maaaring gumamit ng mga parameter. Samakatuwid, kakailanganin nating bahagyang baguhin ang pagkakasunud-sunod ng mga kahilingan. Una, gagawa kami ng view na magpapakita ng vendor id (id_vendor), product id (id_product), quantity (quantity), presyo (price) at sum (summa) mula sa tatlong table Supplies (incoming), Magazine (magazine_incoming) , Mga Presyo ( mga presyo):

At pagkatapos ay gagawa kami ng query na magbubuod sa mga halaga ng supply ng supplier na interesado kami, halimbawa, sa id_vendor=2:

PUMILI SUM(summa) MULA sa report_vendor WHERE id_vendor=2;

Ngayon ay maaari na nating pagsamahin ang dalawang query na ito sa isang stored procedure, kung saan ang input parameter ay ang vendor identifier (id_vendor), na papalitan sa pangalawang query, ngunit hindi sa view:

Suriin natin ang pagpapatakbo ng pamamaraan na may iba't ibang mga parameter ng pag-input:

Tulad ng nakikita mo, ang pamamaraan ay tumatakbo nang isang beses at pagkatapos ay naghagis ng isang error, na nagsasabi sa amin na ang report_vendor view ay mayroon na sa database. Ito ay dahil kapag tinawag ang pamamaraan sa unang pagkakataon, lumilikha ito ng view. Kapag na-access sa pangalawang pagkakataon, sinubukan niyang likhain muli ang view, ngunit mayroon na ito, kaya naman lumalabas ang error. Upang maiwasan ito, mayroong dalawang pagpipilian.

Ang una ay alisin ang representasyon sa pamamaraan. Iyon ay, lilikha kami ng view nang isang beses, at maa-access lamang ito ng pamamaraan, ngunit hindi ito lilikha. Huwag kalimutang tanggalin ang nagawa nang pamamaraan at tingnan muna:

Sinusuri ang gawain:

tumawag sa sum_vendor(1)//

tumawag sa sum_vendor(2)//

tumawag sa sum_vendor(3)//

Ang pangalawang opsyon ay direktang magdagdag ng command sa procedure na magtatanggal ng view kung mayroon ito:

Bago gamitin ang opsyong ito, siguraduhing tanggalin ang sum_vendor procedure at pagkatapos ay subukan ang trabaho:

Tulad ng nakikita mo, mas madaling gawing pormal ang mga kumplikadong query o isang pagkakasunud-sunod ng mga ito nang isang beses sa isang naka-imbak na pamamaraan, at pagkatapos ay i-access lang ito, na tinutukoy ang mga kinakailangang parameter. Ito ay makabuluhang binabawasan ang code at ginagawang mas lohikal ang pagtatrabaho sa mga query.

Gawain 6. Stored procedures

Ngayon, alamin natin kung paano natin makikita kung anong mga nakaimbak na pamamaraan ang mayroon tayo sa server at kung ano ang hitsura ng mga ito. Upang gawin ito, kilalanin natin ang dalawang operator:

IPAKITA ANG STATUS NG PAMAMARAAN - nagpapahintulot sa iyo na tingnan ang isang listahan ng mga magagamit na nakaimbak na mga pamamaraan. Totoo, ang pagtingin sa listahang ito ay hindi masyadong maginhawa, dahil... Para sa bawat pamamaraan, ang impormasyon ay ibinibigay tungkol sa pangalan ng database kung saan nabibilang ang pamamaraan, ang uri nito, ang account kung saan nilikha ang pamamaraan, ang petsa na nilikha at binago ang pamamaraan, atbp. Gayunpaman, kung kailangan mong makita kung anong mga pamamaraan ang mayroon ka, dapat mong gamitin ang operator na ito.

IPAKITA ANG PAMAMARAAN PROCEDURE procedure_name - nagbibigay-daan sa iyo na makakuha ng impormasyon tungkol sa isang partikular na pamamaraan, lalo na, tingnan ang code nito. Ang view ay hindi rin masyadong maginhawa, ngunit maaari mong malaman ito.

Subukan ang parehong operator sa pagkilos upang makita kung ano ang hitsura nito. Ngayon tingnan natin ang isang mas maginhawang opsyon para sa pagkuha ng naturang impormasyon. Ang database ng MySQL system ay may table proc, kung saan naka-imbak ang impormasyon tungkol sa mga procedure. Para makagawa tayo ng SELECT query sa table na ito. Bukod dito, kung gagawa kami ng pamilyar na kahilingan:

PUMILI * MULA sa mysql.proc//

Makakakuha kami ng isang bagay na hindi nababasa tulad ng kapag gumagamit ng mga SHOW statement. Samakatuwid, gagawa kami ng mga query na may mga kundisyon. Halimbawa, kung gagawa tayo ng query tulad nito:

PUMILI ng pangalan MULA sa mysql.proc//

Pagkatapos ay makukuha namin ang mga pangalan ng lahat ng mga pamamaraan ng lahat ng mga database na magagamit sa server. Halimbawa, sa ngayon ay interesado lamang kami sa mga pamamaraan ng database ng tindahan, kaya baguhin natin ang query:

PUMILI ng pangalan MULA sa mysql.proc SAAN db="shop"//

Ngayon nakuha namin ang gusto namin:

Kung nais nating tingnan lamang ang katawan ng isang partikular na pamamaraan (i.e. mula simula hanggang katapusan), isusulat natin ang sumusunod na query:

PUMILI ng katawan MULA sa mysql.proc WHERE name="sum_vendor"//

At makikita natin ang isang ganap na nababasang bersyon:

Sa pangkalahatan, upang kunin ang impormasyong kailangan mo mula sa proc table, kailangan mo lamang malaman kung anong mga column ang nilalaman nito, at para dito maaari mong gamitin ang pamilyar na operator na naglalarawan ng table_name, sa aming kaso ay naglalarawan ng mysql.proc. Totoo, ang hitsura nito ay hindi rin masyadong nababasa, kaya ipinakita namin dito ang mga pangalan ng pinakasikat na mga haligi:

db ay ang pangalan ng database kung saan naka-save ang procedure.

pangalan - pangalan ng pamamaraan.

param_list - listahan ng mga parameter ng pamamaraan.

katawan - ang katawan ng pamamaraan.

komento - komento sa nakaimbak na pamamaraan.

Nagamit na namin ang mga column ng db, pangalan at katawan. Bumuo ng query na kukuha ng mga parameter ng sum_vendor procedure sa iyong sarili. Ngunit ngayon ay magsasalita kami nang mas detalyado tungkol sa mga komento sa mga nakaimbak na pamamaraan.

Ang mga komento ay lubhang kailangan, dahil pagkaraan ng ilang panahon ay maaari nating makalimutan kung ano ang ginagawa nito o ang pamamaraang iyon. Siyempre, gamit ang code nito ay maibabalik natin ang ating memorya, ngunit bakit? Mas madaling ipahiwatig kung ano ang ginagawa nito kapag lumilikha ng isang pamamaraan, at pagkatapos, kahit na pagkatapos ng mahabang panahon, lumingon sa mga komento, agad naming maaalala kung bakit nilikha ang pamamaraang ito.

Ang paglikha ng mga komento ay napakadali. Upang gawin ito, kaagad pagkatapos ng listahan ng mga parameter, ngunit kahit na bago ang katawan ng naka-imbak na pamamaraan, ipinapahiwatig namin ang keyword na COMMENT "magkomento dito". Tanggalin natin ang aming sum_vendor procedure at gumawa ng bago na may komento:

Ngayon gumawa tayo ng isang kahilingan sa komento ng pamamaraan:

Sa katunayan, hindi mo kailangang tanggalin ang lumang pamamaraan upang magdagdag ng komento. Maaari mong i-edit ang isang umiiral nang nakaimbak na pamamaraan gamit ang pahayag na ALTER PROCEDURE. Tingnan natin kung paano ito gawin gamit ang ins_cust procedure mula sa nakaraang gawain bilang isang halimbawa. Ang pamamaraang ito ay naglalagay ng impormasyon tungkol sa isang bagong customer sa talahanayan ng Mga Customer. Magdagdag tayo ng komento sa pamamaraang ito:

ALTER PROCEDURE ins_cust COMMENT

Naglalagay ng impormasyon tungkol sa isang bagong customer sa talahanayan ng Mga Mamimili."//

At humiling tayo sa komento upang suriin:

PUMILI ng komento MULA sa mysql.proc WHERE name="ins_cust"//

Mayroon lamang dalawang pamamaraan sa aming database, at ang mga komento sa mga ito ay tila hindi kailangan. Huwag maging tamad, siguraduhing magsulat ng mga komento. Isipin na mayroong dose-dosenang o daan-daang mga pamamaraan sa aming database. Sa paggawa ng kinakailangang kahilingan, madali mong malalaman kung anong mga pamamaraan ang umiiral at kung ano ang kanilang ginagawa at nauunawaan na ang mga komento ay hindi labis na labis, ngunit i-save ang iyong oras sa hinaharap. Sa pamamagitan ng paraan, narito ang kahilingan mismo:

Buweno, ngayon ay maaari naming kunin ang anumang impormasyon tungkol sa aming mga pamamaraan, na magpapahintulot sa amin na huwag kalimutan ang anuman o malito.

Gawain 7. Stored procedures

Ang mga nakaimbak na pamamaraan ay hindi lamang mga lalagyan para sa mga pangkat ng mga query, gaya ng maaaring mukhang. Ang mga nakaimbak na pamamaraan ay maaaring gumamit ng mga operator ng sangay sa kanilang trabaho. Ang mga naturang pahayag ay hindi maaaring gamitin sa labas ng mga nakaimbak na pamamaraan.

Simulan natin ang pag-aaral gamit ang mga IF...THEN...ELSE na mga pahayag. Kung pamilyar ka sa anumang programming language, pamilyar sa iyo ang konstruksiyon na ito. Alalahanin na ang conditional IF statement ay nagpapahintulot sa iyo na ayusin ang pagsasanga ng programa. Sa kaso ng mga nakaimbak na pamamaraan, pinapayagan ka ng operator na ito na magsagawa ng iba't ibang mga query depende sa mga parameter ng input. Gaya ng dati, magiging mas malinaw ito sa isang halimbawa. Ngunit una ang syntax ay:

Ang operating logic ay simple: kung ang kundisyon ay totoo, ang kahilingan 1 ay isasagawa, kung hindi ang kahilingan 2 ay isasagawa.

Sabihin natin na araw-araw ay nag-oorganisa kami ng mga happy hours sa aming tindahan, i.e. Nag-aalok kami ng 10% na diskwento sa lahat ng aklat sa huling oras ng mga oras ng pagbubukas ng tindahan. Upang mapili ang presyo ng isang libro, kailangan nating magkaroon ng dalawang opsyon - may diskwento at walang diskwento. Upang gawin ito, kakailanganin naming lumikha ng isang naka-imbak na pamamaraan sa isang operator ng sangay. Dahil dalawa lang ang pagpipilian namin sa presyo, mas maginhawang magkaroon ng Boolean value bilang input parameter, na, gaya ng naaalala mo, ay maaaring tumagal ng alinman sa 0 - false, o 1 - true. Ang code ng pamamaraan ay maaaring ganito:

Yung. Sa input mayroon kaming isang parameter na maaaring alinman sa 1 (kung mayroong diskwento) o 0 (kung walang diskwento). Sa unang kaso, ang unang kahilingan ay isasagawa, sa pangalawa - ang pangalawa. Tingnan natin kung paano gumagana ang aming pamamaraan sa parehong mga opsyon:

tawag na diskwento(1)//

tawag na diskwento(0)//

Binibigyang-daan ka ng operator ng IF na pumili ng mas malaking bilang ng mga opsyon sa query, kung saan ginagamit ang sumusunod na syntax:

GUMAWA NG PROCEDURE procedure_name (mga parameter)

KUNG(kondisyon) NOON

ELSEIF(kondisyon) pagkatapos

Bukod dito, maaaring mayroong ilang mga bloke ng ELSEIF. Ipagpalagay na nagpasya kaming magbigay ng mga diskwento sa aming mga customer depende sa halaga ng pagbili, walang diskwento hanggang 1000 rubles, mula 1000 hanggang 2000 rubles - isang 10% na diskwento, higit sa 2000 rubles - isang 20% ​​na diskwento. Ang input parameter para sa naturang pamamaraan ay dapat ang halaga ng pagbili. Samakatuwid, kailangan muna nating magsulat ng isang pamamaraan na bibilangin ito. Gawin natin ito sa pamamagitan ng pagkakatulad sa pamamaraan ng sum_vendor na ginawa sa Aralin 15, na kinakalkula ang halaga ng mga kalakal sa pamamagitan ng ID ng supplier.

Ang data na kailangan namin ay nakaimbak sa dalawang talahanayan: Purchase Log (magazine_sales) at Presyo (presyo).

GUMAWA NG PAMAMARAAN sum_sale(IN i INT)

COMMENT "Ibinabalik ang halaga ng binili ayon sa ID nito."

DROP VIEW KUNG MAY sum_sale;

GUMAWA NG VIEW sum_sale BILANG PUMILI ng magazine_sales.id_sale,

magazine_sales.id_product, magazine_sales.quantity,

prices.price, magazine_sales.quantity*prices.price AS summa

MULA sa magazine_sales, mga presyo

WHERE magazine_sales.id_product=prices.id_product;

PUMILI NG SUM(summa) MULA sa sum_sale WHERE id_sale=i;

Dito, bago ang parameter, mayroon kaming bagong keyword na IN. Ang katotohanan ay maaari naming parehong ipasa ang data sa isang pamamaraan at ipasa ang data mula sa isang pamamaraan. Bilang default, i.e. kung aalisin mo ang salitang IN, ang mga parameter ay itinuturing na input (kaya hindi namin ginamit ang salitang ito dati). Dito ay tahasan naming ipinahiwatig na ang i parameter ay isang input. Kung kailangan naming kumuha ng ilang data mula sa isang naka-imbak na pamamaraan, gagamitin namin ang OUT na keyword, ngunit higit pa tungkol doon sa ibang pagkakataon.

Kaya, nagsulat kami ng pamamaraan na lumilikha ng view sa pamamagitan ng pagpili sa purchase ID, product ID, dami, presyo at kinakalkula ang halaga para sa lahat ng row ng resultang talahanayan. Pagkatapos ay mayroong isang kahilingan sa view na ito, kung saan ang kabuuang halaga ng pagbiling ito ay kinakalkula gamit ang input parameter ng purchase identifier.

Ngayon ay kailangan nating magsulat ng isang pamamaraan na muling kalkulahin ang kabuuang halaga na isinasaalang-alang ang ibinigay na diskwento. Dito natin kailangan ang operator ng sangay:

Yung. ipinapasa namin ang dalawang parameter ng input sa pamamaraan: halaga (sm) at identifier ng pagbili (i) at, depende sa kung anong halaga ito, isang kahilingan ang ginawa sa view ng sum_sale upang kalkulahin ang kabuuang halaga ng pagbili na na-multiply sa nais na koepisyent.

Ang natitira na lang ay tiyakin na ang halaga ng pagbili ay awtomatikong ililipat sa pamamaraang ito. Upang gawin ito, makabubuting tawagan ang pamamaraan ng sum_discount nang direkta mula sa pamamaraan ng sum_sale. Magiging ganito ang hitsura nito:

Ang tandang pananong ay inilalagay kapag tumatawag sa pamamaraan ng sum_discount, dahil Hindi malinaw kung paano ipasa ang resulta ng nakaraang kahilingan (i.e. ang kabuuang halaga) sa pamamaraan ng sum_discount. Bilang karagdagan, hindi malinaw kung paano ibabalik ng sum_discount procedure ang resulta ng trabaho nito. Marahil ay nahulaan mo na upang malutas ang pangalawang tanong kailangan lang namin ng isang parameter na may OUT na keyword, i.e. isang parameter na magbabalik ng data mula sa pamamaraan. Ilagay natin ang sumusunod na parameter ss, at dahil ang halaga ay maaari ding isang fractional number, bigyan ito ng DOUBLE type:

Kaya, sa parehong mga pamamaraan ipinakilala namin ang output parameter ss. Tinatawagan ngayon ang pamamaraang TUMAWAG sum_discount(?,i,ss); nangangahulugan na sa pamamagitan ng pagpasa sa unang dalawang parameter, hinihintay namin ang ikatlong parameter na maibalik sa pamamaraan ng sum_sale. Ang natitira na lang ay upang maunawaan kung paano magtalaga ng ilang halaga sa parameter na ito sa loob mismo ng pamamaraan ng sum_discount. Kailangan namin ang resulta ng isa sa mga query na ipapasa sa parameter na ito. At, siyempre, ang MySQL ay nagbibigay ng pagpipiliang ito, gamit ang INTO keyword:

Gamit ang INTO keyword, ipinahiwatig namin na ang resulta ng kahilingan ay dapat ipasa sa ss parameter.

Ngayon, harapin natin ang tandang pananong, o sa halip, alamin kung paano ipasa ang resulta ng mga nakaraang query sa pamamaraan ng sum_discount. Upang gawin ito, makikilala natin ang konsepto ng isang variable.

Binibigyang-daan ka ng mga variable na i-save ang resulta ng kasalukuyang query para magamit sa mga query sa hinaharap. Ang isang variable na deklarasyon ay nagsisimula sa isang dog character (@) na sinusundan ng variable na pangalan. Ang mga ito ay ipinahayag gamit ang SET operator. Halimbawa, magdeklara tayo ng variable na z at bigyan ito ng paunang halaga na 20.

Ang isang variable na may ganitong halaga ay nasa aming database na ngayon, maaari mo itong suriin sa pamamagitan ng paggawa ng naaangkop na kahilingan:

Ang mga variable ay may bisa lamang sa loob ng isang session ng koneksyon sa MySQL server. Iyon ay, pagkatapos ng pag-disconnect, ang variable ay titigil sa pag-iral.

Upang gumamit ng mga variable sa mga pamamaraan, gamitin ang pahayag na DECLARE, na mayroong sumusunod na syntax:

IDECLARE ang uri ng variable_name DEFAULT default_value_if_available

Kaya, magdeklara tayo ng variable s sa ating procedure, kung saan iimbak natin ang halaga ng halaga ng pagbili gamit ang INTO keyword:

Ang variable na ito ang magiging unang parameter ng input para sa sum_discount procedure. Kaya, ang huling bersyon ng aming mga pamamaraan ay ganito ang hitsura:

Kung sakaling nalilito ka, tingnan natin kung paano gumagana ang aming pamamaraan ng sum_sale:

Tinatawag namin ang pamamaraan ng sum_sale, na tumutukoy sa identifier ng pagbili na interesado kami bilang isang parameter ng input, halimbawa id=1, at nagpapahiwatig na ang pangalawang parameter ay isang output variable, na resulta ng pamamaraan ng sum_discount:

tumawag sa sum_sale(1, @sum_discount)//

Lumilikha ang pamamaraan ng sum_sale ng view na nangongolekta ng data tungkol sa lahat ng pagbili, produkto, dami, presyo at halaga ng mga ito para sa bawat linya.

Pagkatapos ay isang kahilingan ang ginawa sa view na ito para sa kabuuang halaga ng pagbili na may kinakailangang identifier, at ang resulta ay isusulat sa s variable.

Ngayon ang sum_discount procedure ay tinatawag, kung saan ang unang parameter ay ang variable s (halaga ng pagbili), ang pangalawa ay ang purchase identifier i, at ang pangatlo ay ang ss parameter, na nagsisilbing output, i.e. ibabalik nito ang resulta ng sum_discount procedure.

Sinusuri ng pamamaraan ng sum_discount kung aling kundisyon ang natutugunan ng input sum at nagsasagawa ng kaukulang query, ang resulta ay isinusulat sa output parameter ss, na ibinalik sa pamamaraan ng sum_sale.

Upang makita ang resulta ng pamamaraan ng sum_sale, kailangan mong humiling:

piliin ang @sum_discount //

Siguraduhin nating gumagana ang ating procedure:

Ang halaga ng pareho ng aming mga pagbili ay mas mababa sa 1000 rubles, kaya walang diskwento. Maaari kang magpasok ng mga pagbili na may iba't ibang halaga sa iyong sarili at makita kung paano gagana ang aming pamamaraan.

Maaaring nakita mong medyo mahirap o nakalilito ang araling ito. Huwag kang magalit. Una, ang lahat ay may karanasan, at pangalawa, in fairness, dapat sabihin na ang parehong mga variable at branching operator ay bihirang ginagamit sa MySQL. Ang kagustuhan ay ibinibigay sa mga wika tulad ng PHP, Perl, atbp., sa tulong ng kung saan ang pagsasanga ay nakaayos, at ang mga simpleng pamamaraan ay ipinadala sa database mismo.

Gawain 8. Stored procedures

Ngayon ay matututunan natin kung paano magtrabaho sa mga cycle, i.e. patakbuhin ang parehong query nang maraming beses. Ginagamit ng MySQL ang WHILE, REPEAT, at LOOP na mga pahayag upang gumana sa mga loop.

WHILE loop statement

Una ang syntax:

HABANG GINAGAWA ang kondisyon

Ang kahilingan ay isasagawa hangga't ang kundisyon ay totoo. Tingnan natin ang isang halimbawa kung paano ito gumagana. Ipagpalagay na gusto nating malaman ang mga pamagat, may-akda, at bilang ng mga aklat na dumating sa iba't ibang mga paghahatid. Ang impormasyong interesado kami ay nakaimbak sa dalawang talahanayan - ang Supplies Magazine (magazine_incoming) at Mga Produkto (mga produkto). Isulat natin ang query na interesado tayo:

Ngunit paano kung kailangan nating ipakita ang resulta hindi sa isang talahanayan, ngunit para sa bawat paghahatid nang hiwalay? Siyempre, maaari kang magsulat ng 3 magkakaibang mga query, na nagdaragdag ng isa pang kundisyon sa bawat isa:

Ngunit magagawa mo ito nang mas maikli gamit ang isang WHILE loop:

Yung. ipinasok namin ang variable na i, na bilang default ay katumbas ng 3, isasagawa ng server ang kahilingan na may delivery id na katumbas ng 3, pagkatapos ay babaan ang i ng isa (SET i=i-1), siguraduhin na ang bagong halaga ng ang variable na i ay positibo (i>0) at isagawa muli ang kahilingan , ngunit may bagong halaga ng delivery id na 2. Mangyayari ito hanggang sa matanggap ng variable na i ang halagang 0, magiging false ang kundisyon, at magtatapos ang loop.

Upang matiyak na gumagana ang loop, gumawa tayo ng nakaimbak na mga aklat ng pamamaraan at ilagay ang loop dito:

Ngayon tawagan natin ang pamamaraan:

Ngayon ay mayroon na kaming 3 magkahiwalay na mesa (para sa bawat paghahatid). Sumang-ayon na ang code na may loop ay mas maikli kaysa sa tatlong magkahiwalay na kahilingan. Ngunit mayroong isang abala sa aming pamamaraan: idineklara namin ang bilang ng mga talahanayan ng output bilang default na halaga (DEFAULT 3), at sa bawat bagong paghahatid ay kailangan naming baguhin ang halagang ito, at samakatuwid ang code ng pamamaraan. Ito ay higit na maginhawa upang gawing input parameter ang numerong ito. Muli nating isulat ang ating pamamaraan sa pamamagitan ng pagdaragdag ng num input parameter, at isinasaalang-alang na hindi ito dapat katumbas ng 0:

Siguraduhin na sa iba pang mga parameter, nakakakuha pa rin kami ng mga talahanayan para sa bawat paghahatid. Ang aming loop ay may isa pang disbentaha - kung hindi namin sinasadyang itakda ang halaga ng input na masyadong malaki, magtatapos kami sa isang pseudo-infinite loop, na maglo-load sa server ng walang silbi na trabaho. Ang mga ganitong sitwasyon ay pinipigilan sa pamamagitan ng paglalagay ng label sa loop at paggamit ng LEAVE statement upang ipahiwatig ang maagang paglabas mula sa loop.

Kaya, ibinigay namin ang aming loop na may wet label sa simula (basa:) at sa dulo, at nagdagdag din ng isa pang kundisyon - kung ang input parameter ay mas malaki kaysa sa 10 (ang numero 10 ay kinuha nang arbitraryo), pagkatapos ay ang loop na may ang basang etiketa ay dapat na tapusin (KUNG (i>10) PAGKATAPOS IWANANG basa). Kaya, kung hindi namin sinasadyang tumawag sa isang pamamaraan na may malaking halaga ng num, ang aming loop ay masira pagkatapos ng 10 pag-ulit (isang pag-ulit ay isang pass ng loop).

Ang mga loop sa MySQL, pati na rin ang mga sumasanga na operator, ay halos hindi ginagamit sa mga web application. Samakatuwid, para sa iba pang dalawang uri ng mga loop ibibigay lamang namin ang syntax at mga pagkakaiba. Hindi malamang na magkakaroon ka ng pagkakataong gamitin ang mga ito, ngunit kailangan mo pa ring malaman ang tungkol sa kanilang pag-iral.

REPEAT loop statement

Ang kondisyon ng loop ay nasuri hindi sa simula, tulad ng sa WHILE loop, ngunit sa dulo, i.e. hindi bababa sa isang beses, ngunit ang loop ay naisakatuparan. Ang loop mismo ay tumatakbo hangga't ang kundisyon ay hindi totoo. Ang syntax ay ang mga sumusunod:

HANGGANG kondisyon

Loop operator LOOP

Ang loop na ito ay walang anumang kundisyon, kaya dapat itong may LEAVE statement. Ang syntax ay ang mga sumusunod:

Ito ay nagtatapos sa aming pag-aaral ng SQL. Siyempre, hindi namin isinasaalang-alang ang lahat ng mga posibilidad ng query language na ito, ngunit sa totoong buhay ay malabong makatagpo ka kahit na kung ano ang alam mo na.

Na-post sa Allbest.ru

...

Mga katulad na dokumento

    Paggamit ng built-in na MS Excel function upang malutas ang mga partikular na problema. Posibilidad ng pag-uuri ng mga column at row, listahan ng mga function at formula. Mga limitasyon ng mga formula at mga paraan upang malampasan ang mga paghihirap. Magsagawa ng mga praktikal na gawain sa paggamit ng mga function.

    gawaing laboratoryo, idinagdag noong 11/16/2008

    Mga tampok ng paggamit ng mga built-in na function ng Microsoft Excel. Paglikha ng mga talahanayan, pagpuno sa kanila ng data, pagbuo ng mga graph. Maglapat ng mga mathematical formula upang magsagawa ng mga query gamit ang mga application package. Mga teknikal na kinakailangan para sa computer.

    course work, idinagdag 04/25/2013

    Layunin at mga bahagi ng mga pormula, mga tuntunin sa pagsulat at pagkopya sa kanila. Paggamit ng mathematical, statistical at logical function, date at time functions sa MS Excel. Mga uri at pagtatala ng mga link ng processor ng spreadsheet, teknolohiya para sa pagpasok at pagkopya sa kanila.

    pagtatanghal, idinagdag noong 12/12/2012

    Pagsasaalang-alang sa mga tampok ng pagdedeklara ng mga function sa wikang SI. Kahulugan ng mga konsepto ng mga argumento ng function at ang kanilang mga variable (lokal, rehistro, panlabas, static). Paglutas ng problema gamit ang pamamaraan ng software: pagguhit ng isang block diagram, na naglalarawan sa pangunahing at sqr function.

    pagtatanghal, idinagdag 07/26/2013

    Mga panuntunan para sa paglikha at algorithm para sa paggamit ng iyong sariling function ng user sa isang karaniwang VBA editor module. Pag-aaral ng istraktura ng function code. Listahan ng mga built-in na mathematical function ng Visual Basic editor. Pagtukoy sa saklaw ng isang variable.

    praktikal na gawain, idinagdag 10/07/2010

    Paglikha ng isang application na mag-plot ng mga function graph gamit ang isang ibinigay na mathematical expression. Pag-unlad ng programa na "Generator ng mga pag-andar sa matematika". Paglikha ng isang function wizard para sa pagpasok ng isang mathematical expression, pagsubok.

    thesis, idinagdag noong 02/16/2016

    Pagsusuri sa dynamics ng gross regional product at pagkalkula ng point forecast nito gamit ang built-in na Excel functions. Paglalapat ng pagsusuri ng ugnayan at regression upang linawin ang kaugnayan sa pagitan ng mga fixed asset at dami ng GRP.

    abstract, idinagdag 05/20/2010

    Mga function na nagbibigay-daan sa iyong magtrabaho kasama ang MySQL database gamit ang PHP. Koneksyon sa server at ang pagdiskonekta nito. Paglikha at pagpili ng isang database. Access sa isang indibidwal na field ng isang record. Pinagsamang paggamit ng mga function ng impormasyon. Mga query na ipinadala sa MySQL server.

    lecture, idinagdag 04/27/2009

    Pagbuo ng isang application na gagawa ng mga function ng pagpapakita ng eksaktong oras at eksaktong petsa. Pagpapasiya ng mga karagdagang pag-andar ng binuo na application. Pagsasaalang-alang sa mga pangunahing yugto ng paglikha ng isang produkto ng software. Mga resulta ng pagsubok sa aplikasyon.

    course work, idinagdag noong 04/14/2019

    Pagkalkula ng software gamit ang mga formula, pagtukoy sa lugar ng isang regular na polygon para sa anumang posibleng paunang data, gamit ang mga stream ng input-output. Ang paggamit ng mga operator kapag kinakalkula ang mga pag-andar ng matematika, mga algorithm para sa pag-iipon ng mga kabuuan.

Ang modernong MySQL database ay hindi kritikal sa bilang ng mga talaan. Madalang na kailangang kontrolin kung ang bilang ng mga hilera ay lumampas sa mga pinapayagang limitasyon.

Samantala, maraming mga gawain kapag ang istraktura ng database mismo ay mahalagang data at ang paggamit ng mga talahanayan ay dapat kontrolin sa bilang ng mga tala sa pangkalahatan at partikular na nilalaman sa partikular.

Syntax ng Function at Halimbawa ng Paggamit

Ang MySQL count function ay direktang ginagamit sa isang query sa database. Ang function ay mayroon lamang dalawang pangunahing paraan ng aplikasyon: lahat ng mga talaan o mga partikular lamang. Mayroon lamang isang mahalagang kadahilanan - ang napiling row mula sa field na kasama sa count() expression ay hindi dapat magkaroon ng value na NULL.

Sa halimbawa sa itaas, ang MySQL count function ay ginagamit nang walang kundisyon. Dapat tandaan na ang paggamit ng count (*) ay isang pag-access sa lahat ng mga talaan ng talahanayan at hindi mahalaga na ang ilang mga talaan ay maaaring may NULL na halaga. Ang isang query na naglalaman ng count(*) ay palaging magbabalik ng buong bilang ng mga tala na nilalaman sa talahanayan.

Maaaring ibigay ng developer ang kahulugan ng expression:

  • bilangin(...) bilang resulta.

Ngunit magkakaroon ito ng higit na visual na kahulugan kaysa sa praktikal.

PHP at MySQL Security: count() - nasa Practice

Maraming pagsisikap ang nakatuon sa mga isyu sa seguridad ng pinaka-kwalipikadong pangkat ng mga developer. Ngunit hanggang ngayon, may mga puwang, nangyayari ang mga pag-atake, at nawawala o nanakaw ang mahalagang impormasyon.

Mayroon lamang dalawang pinaka maaasahan at ligtas na mga hadlang sa sinumang umaatake:

  • kamangmangan;
  • paglihis.

Ang unang hadlang ay ang pinaka-reinforced kongkreto. Maaari kang gumawa ng mga hula tungkol sa anumang bagay, ngunit kung hindi mo alam kung saan, bakit at paano, hindi magkakaroon ng epekto. Palaging may pintong magbubukas, susi na magbubukas, at may magandang dahilan para gawin ito.

Sa konteksto ng pangalawang solusyon, ang MySQL function count(*) at count(...) ay mga halimbawa ng perpektong proteksyon. Ang pinakamahalagang - ang mga function na ito ay walang kondisyon at primitive. Ipapatupad sila sa anumang estado ng mga gawain, ang pangunahing bagay ay ang database mismo ay gumagana at ang isang koneksyon ay naitatag dito.

Sa pamamagitan ng pagbuo ng isang talahanayan ng seguridad sa paraang ang bawat pagpasok/paglabas ng isang empleyado ng kumpanya ay minarkahan ng isang NULL o non-NULL na katayuan, maaari mong kontrolin ang lahat ng mga paglihis na nangyayari sa mga oras ng pagtatrabaho ng araw. Naturally, ang mga katapusan ng linggo, pista opisyal at mga oras na walang pasok ay dapat na i-reset ang lahat ng mga entry sa talahanayan ng seguridad sa NULL.

Kahit na may ganitong primitive na lohika, posible na mapansin at maiwasan ang anumang hindi inaasahang panghihimasok sa pinakasimpleng paraan, nang walang mga espesyal na gastos. Ang mas simple at mas hindi nakikita ang pagtatanggol, mas mahirap na bumuo ng isang pagsalakay.

Mga kundisyon at mga espesyal na kaso

Ang halimbawa sa ibaba ay gumagamit ng kundisyon na hindi lahat ng mga tala sa talahanayan ay kasama sa pagpapatakbo ng pagbilang ng MySQL.

Ang resulta ng pagpapatupad ng lahat ng mga kahilingan ay tumutugma sa kundisyon. Sa kasong ito, gamit ang kahilingan:

  • piliin ang param1 + param2 + param3 mula sa `ex_count` kung saan count(*)

katumbas ng query

  • piliin ang count(*) mula sa `ex_count` kung saan (param1 + param2 + param3) > 0.

Ang MySQL count function ay nagbibigay-daan para sa iba't ibang gamit, kabilang ang mga nested query. Gayunpaman, dapat mong palaging isaalang-alang: ang pagiging simple ay ang susi sa tagumpay. Ang function ng pagbibilang ng bilang ng mga talaan para sa ilang partikular na kundisyon ay masyadong simple, ngunit ang paggamit nito ay hindi dapat gawing masyadong kumplikado.

Mayroong tiyak na susi sa pinakamatibay na depensa - "kaso" - na, na isinalin sa simpleng wika, ay nangangahulugang "pattern". Gayundin, sa kumplikadong paggamit ng mga simpleng operasyon tulad ng pagbilang ng MySQL, ang isa pang mapagtanong na pag-iisip ng developer ay maaaring magdagdag ng pag-andar na, sa isang hindi inaasahang sitwasyon, ay hindi gagana sa lahat ayon sa nilalayon.

mathematical function programming

Ang mga function ay mga pagpapatakbo na nagbibigay-daan sa iyong manipulahin ang data. Mayroong ilang mga grupo ng mga built-in na function sa MySQL:

Mga function ng string. Ginagamit upang manipulahin ang mga string ng text, tulad ng mga halaga ng pag-trim o padding.

Mga function ng numero. Ginagamit upang magsagawa ng mga pagpapatakbo ng matematika sa numerical na data. Kasama sa mga numerical function ang mga function na nagbabalik ng mga absolute value, sine at cosine ng mga anggulo, ang square root ng isang numero, atbp. Ginagamit lamang ang mga ito para sa algebraic, trigonometric at geometric na mga kalkulasyon. Sa pangkalahatan, ang mga ito ay bihirang ginagamit, kaya hindi namin isasaalang-alang ang mga ito. Ngunit dapat mong malaman na mayroon sila at kumunsulta sa dokumentasyon ng MySQL kung kinakailangan.

Mga function ng buod. Ginagamit ang mga ito upang makakuha ng buod ng data mula sa mga talahanayan, halimbawa, kapag kailangan mong ibuod ang ilang data nang hindi ito pinipili.

Mga function ng petsa at oras. Ginagamit upang manipulahin ang mga halaga ng petsa at oras, halimbawa upang ibalik ang pagkakaiba sa pagitan ng mga petsa.

Mga function ng system. Ibalik ang impormasyon ng serbisyo ng DBMS.

Upang tingnan ang mga pangunahing built-in na function, kakailanganin naming lumikha ng bagong database upang maglaman ng mga halaga ng numero at petsa.

Kunin natin ang isang online na tindahan bilang isang halimbawa.

Konseptwal na modelo:

Relational model:


Kaya, tingnan natin ang huling diagram at lumikha ng isang database - shop.

lumikha ng database shop;

Pinipili namin ito para sa trabaho:

At gumawa kami ng 8 table sa loob nito, tulad ng sa diagram: Mga Mamimili (customer), Supplier (vendor), Mga Pagbili (sale), Supplies (papasok), Purchase log (magazine_sales), Delivery log (magazine_incoming), Mga Produkto (mga produkto), Mga presyo (mga presyo). Isang caveat, magbebenta ang aming tindahan ng mga libro, kaya magdaragdag kami ng isa pang column sa talahanayan ng Mga Produkto - May-akda, sa prinsipyo hindi ito kinakailangan, ngunit ito ay mas karaniwan.

Pakitandaan na sa mga talahanayan ng Purchase Journal, Delivery Journal at Prices, ang mga pangunahing susi ay pinagsama-sama, i.e. ang kanilang mga natatanging halaga ay binubuo ng mga pares ng halaga (ang isang talahanayan ay hindi maaaring magkaroon ng dalawang hanay na may parehong mga pares ng halaga). Ang mga pangalan ng column ng mga pares ng halaga na ito ay ipinapahiwatig ng mga kuwit pagkatapos ng PRIMARY KEY na keyword.

Sa isang tunay na online na tindahan, ang data ay ipapasok sa mga talahanayang ito gamit ang mga script sa ilang wika (gaya ng PHP), ngunit sa ngayon ay kailangan nating ipasok ang mga ito nang manu-mano. Maaari kang magpasok ng anumang data, tandaan lamang na ang mga halaga sa mga hanay ng parehong pangalan sa mga nauugnay na talahanayan ay dapat tumugma. O kopyahin ang impormasyon sa ibaba.