760 likes | 1.01k Views
MySQL Užklausos. Telekomunikacijų informacinės technologijos (3 dalis). MySQL užklausos: sintaksė, pavyzdžiai. Informacijos u ž klausos. Kai duomenų bazė užpildyta, informacijai iš jos “ištraukti” naudojami specialios formos kreipiniai, vadinami užklausomis ( query ).
E N D
MySQLUžklausos Telekomunikacijų informacinės technologijos (3 dalis)
Informacijos užklausos Kai duomenų bazė užpildyta, informacijai iš jos “ištraukti” naudojami specialios formos kreipiniai, vadinami užklausomis (query). Tam skirta komanda SELECT, kurios minimali sintaksė apibendrintai gali būti pateikta taip: SELECT ką reikia išrinkti FROM lentelės ar lentelių WHERE kokias sąlygas turi tenkinti duomenys
SELECT sintaksė “Tikroji” SELECT komandossintaksė: SELECT [select_options] select_list [INTO OUTFILE file_name export_option] [FROM table_references [WHERE where_definition] [GROUP BY col_name,...] [ORDER BY {col_name | formula} [ASC | DESC] ,...] [LIMIT [offset,] rows ] ] SELECT naudojama eilutėms atrinkti iš vienos ar kelių lentelių.
SELECT sintaksė select_optionsnurodo papildomus išrinkimo apribojimus: • DISTINCT; DISTINCTROW; ALLraktiniai žodžiai nurodo, ar bus pateikiami įrašai su dubliuojančiomis reikšmėmis; pagal nutylėjimą priimama ALL– bus; raktiniai žodžiai DISTINCTir DISTINCTROW– bus pateikiami tik besiskiriantys įrašai • HIGH_PRIORITY nurodo, kad ši komanda bus vykdoma pirmiausia (jei yra laukiančių savo eilės) • STRAIGHT_JOINnurodo, kad lentelės bus apjungiamos ta tvarka, kaip jos išvardytos FROMdalyje (jei nepasitikime MySQL optimizacija)
SELECT: ką išrinkti select_list nurodo, kurių stulpelių informacija turi būti atrinkta. Jei reikia atrinkti visų stulpelių informaciją, rašome žvaigždutės simbolį: mysql>SELECT * FROM nariai; +------------+-------+---------+---------+------------------+ | kliento_id | vardas| pavard | tel | adresas | +------------+-------+---------+---------+------------------+ | 1 | Jonas | Kuzma | 1234567 | Kampo 132-15 | | 2 | Kostas| Kuzma | 8373728 | Daukanto 12 - 10 | | 3 | Ignas | Klimas | 7449373 | Kanto 2 - 10 | | 4 | Santa | Klausas | 9999999 | Siaures polius 1 | +------------+-------+---------+---------+------------------+ 4 rows in set (0.00 sec)
SELECT: ką išrinkti select_list - sąrašas atrenkamų stulpelių vardų, atskirtų kableliais. Stulpelis gali būti nurodytas taip: col_name, tbl_name.col_nameardb_name.tbl_name.col_name. tbl_nameardb_name.tbl_nameprefiksą nurodyti nebūtina, jei nėra nevienareikšmiškumo, t.y., skirtingose lentelėse nėra pasikartojančių stulpelių vardų. Pavyzdžiui, jei dviejose lentelėse nurodoma pavardė, vienoje iš jų stulpelį pavadinkime Pavarde, o kitoje – Pavard.
SELECT: ką išrinkti Jei skirtingose lentelėse (kurias naudojate užklausoje!) panaudojote tą patį stulpelio vardą, privalote nurodyti išsamų stulpelio vardą, sudarytą iš prefikso – lentelės pavadinimo –ir stulpelio vardo:tbl_name.col_name Jei informaciją imtume iš kitos duomenų bazės, reikėtų pridėti dar vieną prefiksą:db_name.tbl_name.col_name.
SELECT komandos parametrai Užklausos rezultatai gali būti išvesti į failą file_name. Nurodyto failo turi nebūti iš anksčiau. Failui nurodyti galioja įprastos Unix taisyklės. export_option apibrėžia duomenų formatą.Apie tai ieškokite informacijos MySQL apraše.
SELECT komandos parametrai Sąraše vietoj kablelių galima naudoti raktinius žodžius JOIN, CROSS JOIN, INNER JOIN, LEFT JOIN. Mūsų tikslams geriau (paprasčiau) naudoti kablelius. Informacijos apie šiuos raktinius žodžius ieškokite MySQL apraše.
SELECT komandos parametrai FROM table_references parodo, iš kurių lentelių turi būti atrinktos eilutės. Lentelių pavadinimai skiriami kableliais. Šioje dalyje gali būti nurodyti lentelių pseudonimai. Jei sąraše nurodyta tik viena lentelė, informacija traukiama iš jos. Jei sąraše nurodytos kelios lentelės, pateikiamos visos galimos jų eilučių kombinacijos (Dekarto sandauga)
Lentelės pseudonimas Lentelė gali būti nurodyta naudojant pseudonimątbl_name [AS] alias_name. mysql>SELECT t1.vardas, t2.atlyg FROM darbuot AS t1, info AS t2 WHERE t1.vardas = t2.vardas; Kaip matome, naudojant pseudonimą sutrumpėja stulpelių nuorodos
Pseudonimai (aliases) Pavyzdžiui, panaudokime “k", “n" ir “f" vietoj “klientai", “nuoma" ir “filmai" (atitinkamai): mysql>SELECT k.vardas, k.pavard, f.filmas FROM klientai k, nuoma n, filmai f WHERE n.kliento_id = k.kliento_id AND n.video_id = f.video_id; +-------+--------+-------------------------------+ | vardas| pavard | filmas | +-------+--------+-------------------------------+ | Kostas| Kuzma | Woman On Top | | Santa | Klausas| ET | | Jonas | Kuzma | Star Wars: The Phantom Menace | | Jonas | Kuzma | ET | | Jonas | Kuzma | Charlie's Angels | +-------+--------+-------------------------------+ 5 rows in set (0.00 sec)
SELECT komandos pavyzdys Jei reikia išrinkti visas lentelėje "nariai" įrašytas pavardes, SELECTkomandaatrodys taip: mysql>SELECT pavard FROM nariai; +---------+ | pavard | +---------+ | Kuzma | | Kuzma | | Klimas | | Klausas | +---------+ 4 rows in set (0.00 sec)
SELECT komandos pavyzdys Jei reikia išrinkti skirtingas lentelėje "nariai" įrašytas pavardes, SELECTkomandoje panaudojame parametrą DISTINCT: mysql>SELECT DISTINCT pavard FROM nariai; +---------+ | pavard | +---------+ | Kuzma | | Klimas | | Klausas | +---------+ 3 rows in set (0.05 sec)
SELECT komanda – WHERE dalis WHEREwhere_definitionnurodoma sąlyga ar sąlygos, kurias turi tenkinti atrenkamos eilutės. Jei informacija atrenkama tik iš vienos lentelės, kurios vardas nurodytas FROMdalyje, problemų su nevienareikšmiškumu neiškyla, prefiksų naudoti nereikia.
SELECT komanda – WHERE dalis Paprasčiausia sąlyga gali būti apibendrintai užrašyta taip: <stulpelio pavad> <santykis> <reikšmė> Santykis gali būti: =,<,>,<=,>=,<> Skaitmeninė reikšmė užrašoma paprastai, tekstinė būtinai įrėminama kabutėmis. WHERE dalies pavyzdžiai: WHERE kliento_id = 2 WHERE vardas = ‘Jonas’
SELECT komanda – WHERE dalis WHERE dalyje gali būti apjungtos kelios sąlygos, apjungimui naudojant operatorius AND, OR : WHERE kliento_id = 2 OR kliento_id = 3 WHERE vardas = ‘Jonas’ AND pavard = ‘Kuzma’
LIKE panaudojimas LIKE padeda atrinkti pagal “pavyzdį”; tarkime, mus domina asmenys, kurių varduose yra raidė “o”: mysql>SELECT * FROM filmai WHERE vardas LIKE '%o%'; +------------+-------+---------+---------+------------------+ | kliento_id | vardas| pavard | tel | adresas | +------------+-------+---------+---------+------------------+ | 1 | Jonas | Kuzma | 1234567 | Kampo 132-15 | | 2 | Kostas| Kuzma | 8373728 | Daukanto 12 - 10 | +------------+-------+---------+---------+------------------+ 2 rows in set (0.16 sec)
LIKE panaudojimas Arba mus domina filmai, kurių pavadinimuose yra skiemuo “man”: mysql>SELECT filmas, autorius FROM filmai WHERE filmas LIKE '%man%'; +--------------+----------------+ | filmas | autorius | +--------------+----------------+ | Hollow Man | Paul Verhoeven | | Woman On Top | Fina Torres | +--------------+----------------+ 2 rows in set (0.05 sec)
SELECT komanda 1 lentelei Jei reikia išrinkti tuos lentelės "nariai" įrašus, kuriuose kliento pavardė “Kuzma” , SELECTkomandaatrodys taip: mysql>SELECT * FROM nariai WHERE pavard= ‘Kuzma’; +------------+-------+-------+---------+------------------+ | kliento_id | vardas| pavard| tel | adresas | +------------+-------+-------+---------+------------------+ | 1 | Jonas | Kuzma | 1234567 | Kampo 132-15 | | 2 | Kostas| Kuzma | 8373728 | Daukanto 12 - 10 | +------------+-------+-------+---------+------------------+ 2 rows in set (0.00 sec)
SELECT komanda 1 lentelei Jei norime sužinoti Kosto Kuzmos adresą, SELECTrašykime taip: mysql>SELECT adresas FROM nariai WHERE vardas= ‘Kostas’; +------------------+ | adresas | +------------------+ | Daukanto 12 - 10 | +------------------+ 1 row in set (0.06 sec)
SELECT komanda 1 lentelei Jei norime sužinoti visus Georgo Lucas filmus, SELECTrašykime taip: mysql>SELECT filmas, autorius FROM videos WHERE autorius = ‘George Lucas’; +------------+--------------+ | filmas | autorius | +------------+--------------+ | Star Wars | George Lucas | +------------+--------------+ 1 row in set (0.06 sec)
SELECT komanda – WHERE dalis Jei informacija atrenkama iš kelių lentelių, kurių vardai nurodyti FROMdalyje, gali iškilti problemos dėl nevienareikšmiškumo; tokiu atveju tenka naudoti prefiksus. Svarbiausias dalykas – teisingai formuluoti sąlygas, apjungiant lenteles. Priešingu atveju galime gauti rezultatą pagal Dekarto sandaugos (A TIMES C) operacijos taisykles.
SELECT komanda – Dekarto sandauga Tarkime, mus domina, kokį filmą turi Jonas. Jeigu užklausą formuluosime taip: SELECT vardas, pavard, filmas FROM nariai, filmai WHERE vardas='Jonas'; Gausime tokį atsakymą: +--------+--------+------------------+ | vardas | pavard | filmas | +--------+--------+------------------+ | Jonas | Kuzma | Star Wars | | Jonas | Kuzma | ET | | Jonas | Kuzma | Charlie's Angels | | Jonas | Kuzma | Any Given Sunday | | Jonas | Kuzma | Hollow Man | | Jonas | Kuzma | Woman On Top | +--------+--------+------------------+ 6 rows in set (0.00 sec) Gavome rezultatą pagal Dekarto sandaugostaisykles: 1 irašas iš lentelės klientai 6 irašai iš lentelės filmai
2 lentelių apjungimo pavyzdys Tarkime, norime atrinkti visą informaciją apie išnuomotus filmus. Tam naudojamas dviejų lentelių apjungimas: mysql>SELECT * FROM nuoma, klientai WHERE nuoma.kliento_id = klientai.kliento_id; +-----------+---------+-----------+-------+-------+---------+---------------+ |kliento_id |video_id |kliento_id | vardas| pavard| tel | adresas | +-----------+---------+-----------+-------+-------+---------+---------------+ | 1 | 1 | 1 | Jonas | Kuzma | 1234567 |Daukanto 1 - 1 | | 1 | 2 | 1 | Jonas | Kuzma | 1234567 |Daukanto 1 - 1 | | 1 | 3 | 1 | Jonas | Kuzma | 1234567 |Daukanto 1 - 1 | | 2 | 6 | 2 | Kostas| Kuzma | 8373728 |Daukanto 12-10 | | 4 | 2 | 4 | Santa | Klausas|9999999 |Siaures polius 1 +-----------+---------+-----------+-------+-------+---------+---------------+ 5 rows in set (0.00 sec)
2 lentelių apjungimo pavyzdys Atrinkdami informaciją apie išnuomotus filmus, galime nuro- dyti, kurie stulpeliai turi būti suformuotoje lentelėje: mysql>SELECT vardas, pavard, video_id FROM klientai, nuoma WHERE klientai.kliento_id = nuoma.kliento_id; +-------+--------+----------+ | vardas| pavard | video_id | +-------+--------+----------+ | Kostas| Kuzma | 6 | | Santa | Klausas| 2 | | Jonas | Kuzma | 1 | | Jonas | Kuzma | 2 | | Jonas | Kuzma | 3 | +-------+--------+----------+ 5 rows in set (0.16 sec)
3 lentelių sąryšis Lentelė nariai +------------+--------+---------+--------+------------------+ | kliento_id | vardas | pavard | tel | adresas | +------------+--------+---------+--------+------------------+ | 1 | Jonas | Kuzma | 234567 | Daukanto 1 - 1 | | 2 | Kostas | Kuzma | 373728 | Daukanto 12 - 10 | | 3 | Ignas | Klimas | 449373 | Kanto 2 - 10 | | 4 | Antanas| Klusas | 790033 | Siaures 1-12 | +------------+--------+---------+--------+------------------+ Lentelė filmai +----------+-------------------+------------------+ | video_id | filmas | autorius | +----------+-------------------+------------------+ | 1 | Star Wars | George Lucas | | 2 | ET | Ignas Spielberg | | 3 | Charlie's Angels | McG | | 4 | Any Given Sunday | Oliver Stone | | 5 | Hollow Man | Paul Verhoeven | | 6 | Woman On Top | Fina Torres | +----------+-------------------+------------------+ Lentelė nuoma +------------+----------+ | kliento_id | video_id | +------------+----------+ | 2 | 6 | | 4 | 2 | | 1 | 1 | | 1 | 2 | | 1 | 3 | +------------+----------+
SELECT komanda – 3 lentelėms Pataisykime užklausą, susiedami lenteles. Paveiksle buvo parodytas jų ryšys, kurį išreikšime taip: SELECT vardas, pavard, filmas FROM nariai, filmai, nuoma WHERE vardas='Jonas‘ and klientai.kliento_id=nuoma.kliento_idand nuoma.video_id=filmai.video_id; Gausime tokį atsakymą: +--------+--------+------------------+ | vardas | pavard | filmas | +--------+--------+------------------+ | Jonas | Kuzma | Star Wars | | Jonas | Kuzma | ET | | Jonas | Kuzma | Charlie's Angels | +--------+--------+------------------+ 3 rows in set (0.00 sec)
Nevienareikšmiškumas apjungiant lenteles Dabar pažiūrėkime, kas atsitiks, jei nenaudosime prefiksų: mysql>SELECT vardas, pavard, filmas FROM klientai, filmai, nuoma WHERE kliento_id = kliento_id AND video_id = video_id; ERROR 1052: Column: 'kliento_id' in where clause is ambiguous Tai reiškia, kad vardas kliento_idyra nevienareikšmiškas – jis sutinkamas dviejose lentelėse.
SELECT: rikiavimas Parametras ORDER BY užklausoje nurodo, kaip turi būti rikiuojami pateikti rezultatai. Pagal nutylėjimą rikiuojama didėjimo tvarka; ir tai aiškiai galima nurodyti raktu ASC. Jei reikia išrikiuoti atvirkščia tvarka, prie stulpelio pavadinimo pridėkite raktą DESC (descending). mysql>SELECT vardas, pavard, video_id FROM klientai, nuoma WHERE klientai.kliento_id = nuoma.kliento_id ORDER BY pavard;
SELECT: rikiavimas Išvedimui atrinkti stulpeliaiORDER BYirGROUPBYgali būti nurodomi naudojant stulpelių pavadinimus, stulpelių pseudonimus arba stulpelių pozicijas. Šios numeruojamos nuo 1: mysql>SELECT mokykla, rajonas, grupė FROM turnyras ORDER BY region, seed; mysql>SELECT mokykla, rajonas AS r, grupė AS g FROM turnyras ORDER BY r, g; mysql>SELECT mokykla, rajonas, grupė FROM turnyras ORDER BY 2, 3;
Rikiavimas SQL užklausose galima nurodyti, kad išrinkti įrašai būtų surikiuoti. Tam skirtas ORDER BY: mysql>SELECT * FROM klientai ORDER BY kliento_id; +------------+-------+---------+---------+------------------+ | kliento_id | vardas| pavard | tel | adresas | +------------+-------+---------+---------+------------------+ | 1 | Jonas | Kuzma | 1234567 | Kampo 132-15 | | 2 | Kostas| Kuzma | 8373728 | Daukanto 12 - 10 | | 3 | Ignas | Klimas | 7449373 | Kanto 2 - 10 | | 4 | Santa | Klausas | 9999999 | Siaures polius 1 | +------------+-------+---------+---------+------------------+ 4 rows in set (0.06 sec)
Rikiavimas Jei reikia, kad išrinkti įrašai būtų surikiuoti arvirkščia tvarka, pridėkite DESC: mysql>SELECT * FROM klientai ORDER BY kliento_id DESC; +------------+-------+---------+---------+------------------+ | kliento_id | vardas| pavard | tel | adresas | +------------+-------+---------+---------+------------------+ | 4 | Santa | Klausas | 9999999 | Siaures polius 1 | | 3 | Ignas | Klimas | 7449373 | Kanto 2 - 10 | | 2 | Kostas| Kuzma | 8373728 | Daukanto 12 - 10 | | 1 | Jonas | Kuzma | 1234567 | Kampo 132-15 | +------------+-------+---------+---------+------------------+ 4 rows in set (0.00 sec)
SELECT: ribojimas LIMITdali galima naudoti norint apribotiSELECTsakiniu pateikiamų eilučių skaičių. LIMITnaudoja vieną ar du skaitinius argumentus. Jei nurodyti du argumentai, pirmasis nurodo pirmosios pateikiamos eilutes “poslinkį” (offset), o antrasis –maksimalų pateikiamų eilučių skaičių. Pradinės eilutės “poslinkis” yra 0 (ne 1). mysql>SELECT vardas, pavard, video_id FROM klientai, nuoma WHERE klientai.kliento_id = nuoma.kliento_id LIMIT 3; # gausime pirmąsias tris eilutes
Išrenkamų įrašų skaičiaus ribojimas SQL užklausose galima apriboti išrinktų įrašų skaičių: mysql>SELECT * FROM filmai LIMIT 2,2; +----------+------------------+--------------+ | video_id | filmas | autorius | +----------+------------------+--------------+ | 3 | Charlie's Angels | McG | | 4 | Any Given Sunday | Oliver Stone | +----------+------------------+--------------+ 2 rows in set (0.00 sec) nors tinkamų įrašų skaičius yra didesnis. Čia pirmasis parametras nurodo pirmosios pateikiamos eilutės “poslinkį” (offset), o antrasis – pateikiamų įrašų skaičių.
Išrenkamų įrašų rikiavimas + ribojimas SQL užklausose galima kartu naudoti išrinktų įrašų skaičiaus ribojimą ir rikiavimą naujausiems įrašams atrinkti: mysql>SELECT * FROM filmai ORDER BY video_id DESC LIMIT 0, 4; +----------+------------------+----------------+ | video_id | filmas | autorius | +----------+------------------+----------------+ | 6 | Woman On Top | Fina Torres | | 5 | Hollow Man | Paul Verhoeven | | 4 | Any Given Sunday | Oliver Stone | | 3 | Charlie's Angels | McG | +----------+------------------+----------------+ 4 rows in set (0.00 sec)
Įrašų skaičiavimas Galima sužinoti įrašų skaičių: mysql>SELECT COUNT(*) FROM filmai; +----------+ | COUNT(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
Dviguba užklausa Tarkime, norime sužinoti, kas pasiskolino filmą apie žvaigždžių karus (jo id=1) šį savaitgalį: mysql>SELECT vardas, pavard FROM klientai WHERE kliento_id=(select kliento_id FROM nuoma WHERE video_id=1); Tuomet SQL pirmiau vykdys vidinę užklausą SELECT kliento_id FROM nuoma WHERE video_id=1; +------------+ | kliento_id | +------------+ | 1 | +------------+
Dviguba užklausa Po to gautas reikšmes SQL perduos išorinei užklausai, kuri pateiks ieškomą rezultatą: mysql>SELECT vardas, pavard FROM klientai WHERE kliento_id=1; +-------+-------+ | vardas| pavard| +-------+-------+ | Jonas | Kuzma | +-------+-------+ 1 row in set (0.00 sec) Ankstesnė MySQL versija dvigubų užklausų nepa-laikė. Ar jas palaiko šiMySQL versija - nepatikrinau
SELECT - skaičiavimui SELECTgalima naudoti ir informacijai gauti nesikreipiant į lentelę, pavyzdžiui: mysql>SELECT 1 + 1; -> 2
Santykio ir loginiai operatoriai SQL užklausose galima naudoti santykio ir loginius operatorius. SQL turi 6 santykio operatorius : = lygu != nelygu > daugiau < mažiau >= daugiau arba lygu <= mažiau arba lygu Be to, SQL turi 3 loginius operatorius - AND, OR, NOT.
Santykio ir loginiai operatoriai užklausose Turime tokią lentelę pazymiai: # pazymiai +-------+-----+--------+----------+ | vardas| mat | fizika | literat | +-------+-----+--------+----------+ | Jonas | 8 | 7 | 9 | | Aidas | 6 | 9 | 9 | | Tomas | 5 | 10 | 5 | | Linas | 9 | 5 | 8 | +-------+-----+--------+----------+
Santykio ir loginiai operatoriai užklausose Tarkime, norime sužinoti, kurie mokiniai moka matematiką pažymiu 8 ar daugiau: mysql>SELECT * FROM pazymiai WHERE mat > 7; +-------+-----+--------+----------+ | vardas| mat | fizika | literat | +-------+-----+--------+----------+ | Jonas | 8 | 7 | 9 | | Linas | 9 | 5 | 8 | +-------+-----+--------+----------+ 2 rows in set (0.00 sec)
Santykio ir loginiai operatoriai užklausose Tarkime, norime sužinoti, kurie mokiniai moka matematiką pažymiu 8 ar daugiau, o fiziką - pažymiu 7 ar daugiau : mysql>SELECT vardas FROM pazymiai WHERE mat > 7 AND fizika > 6 AND literat > 8; +-------+ | vardas| +-------+ | Jonas | +-------+ 1 row in set (0.00 sec)
Santykio ir loginiai operatoriai užklausose Tarkime, norime sužinoti, kurie mokiniai silpnai moka bent vieną iš šių dalykų (pažymiu 5 ar mažiau): mysql>SELECT * FROM pazymiai WHERE mat <= 5 OR fizika <= 5 OR literat <= 5; +-------+-----+--------+----------+ | vardas| mat | fizika | literat | +-------+-----+--------+----------+ | Tomas | 5 | 10 | 5 | | Linas | 9 | 5 | 8 | +-------+-----+--------+----------+ 2 rows in set (0.00 sec)
Santykio ir loginiai operatoriai užklausose SQL užklausose galima naudoti ir pagrindinius aritmetinius operatorius. Pavyzdžiui, susumuoti pažymius: mysql>SELECT name, mat+fizika+literat FROM pazymiai; +-------+--------------------+ | vardas| mat+fizika+literat | +-------+--------------------+ | Jonas | 24 | | Aidas | 24 | | Tomas | 20 | | Linas | 22 | +-------+--------------------+ 4 rows in set (0.05 sec)
Funkcijų panaudojimo pavyzdžiai Vidurkio paskaičiavimas: mysql>SELECT AVG(mat), AVG(fizika), AVG(literat) FROM pazymiai; +-----------+-------------+--------------+ | AVG(mat) | AVG(fizika) | AVG(literat) | +-----------+-------------+--------------+ | 7.0000 | 7.7500 | 7.7500 | +-----------+-------------+--------------+ 1 row in set (0.00 sec)
Funkcijų panaudojimo pavyzdžiai Minimalios reikšmės išrinkimas: mysql>SELECT MIN(mat) FROM pazymiai; +----------+ | MIN(mat) | +----------+ | 5 | +----------+ 1 row in set (0.00 sec)