Vienkārši SQL vaicājumi - īsa palīdzība un piemēri. SQL izmantošana internetā. Datu grupēšana pēc diviem vai vairākiem laukiem

Katram tīmekļa izstrādātājam ir jāzina SQL, lai rakstītu datu bāzes vaicājumus. Un, lai gan phpMyAdmin nav atcelts, bieži vien ir jāsasmērē rokas, lai rakstītu zema līmeņa SQL.

Tāpēc esam sagatavojuši īsu SQL pamatu apskatu. Sāksim!

1. Izveidojiet tabulu

Tabulu izveidei tiek izmantots priekšraksts CREATE TABLE. Argumentiem ir jābūt kolonnu nosaukumiem, kā arī to datu tipiem.

Izveidosim vienkāršu tabulu pēc nosaukuma mēnesis. Tas sastāv no 3 kolonnām:

  • id– Mēneša numurs kalendārajā gadā (vesels skaitlis).
  • nosaukums– Mēneša nosaukums (virkne, ne vairāk kā 10 rakstzīmes).
  • dienas– dienu skaits šajā mēnesī (vesels skaitlis).

Lūk, kā izskatītos atbilstošais SQL vaicājums:

CREATE TABLE mēneši (id int, nosaukums varchar(10), dienas int);

Tāpat, veidojot tabulas, vienai no kolonnām vēlams pievienot primāro atslēgu. Tādējādi ieraksti tiks saglabāti unikāli un tiks paātrināti nolasīšanas pieprasījumi. Mūsu gadījumā lai mēneša nosaukums ir unikāls (kolonna nosaukums)

CREATE TABLE mēneši (id int, nosaukums varchar(10), dienas int, PRIMARY KEY (name));

datums un laiks
Datu tipsApraksts
DATUMSDatuma vērtības
DATUMS LAIKSDatuma un laika vērtības ir precīzas līdz minūtei
LAIKSLaika vērtības

2. Rindu ievietošana

Tagad aizpildīsim savu tabulu mēnešus noderīga informācija. Ierakstu pievienošana tabulai tiek veikta, izmantojot INSERT priekšrakstu. Ir divi veidi, kā rakstīt šo instrukciju.

Pirmā metode ir nevis norādīt kolonnu nosaukumus, kurās tiks ievietoti dati, bet gan norādīt tikai vērtības.

Šī ierakstīšanas metode ir vienkārša, taču nedroša, jo nav garantijas, ka, paplašinot projektu un rediģējot tabulu, kolonnas būs tādā pašā secībā kā iepriekš. Drošs (un tajā pašā laikā apgrūtinošāks) veids, kā rakstīt INSERT paziņojumu, prasa norādīt gan vērtības, gan kolonnu secību:

Šeit ir pirmā vērtība sarakstā VĒRTĪBAS atbilst pirmās norādītajam kolonnas nosaukumam utt.

3. Datu iegūšana no tabulām

Paziņojums SELECT ir mūsu labākais draugs, kad vēlamies izgūt datus no datu bāzes. To lieto ļoti bieži, tāpēc pievērsiet īpašu uzmanību šai sadaļai.

Vienkāršākais priekšraksta SELECT lietojums ir vaicājums, kas atgriež visas tabulas kolonnas un rindas (piemēram, tabulas pēc nosaukuma rakstzīmes):

SELECT * FROM "rakstzīmes"

Zvaigznītes (*) simbols nozīmē, ka mēs vēlamies iegūt datus no visām kolonnām. Tā kā SQL datu bāzes parasti sastāv no vairākām tabulām, ir jānorāda atslēgvārds FROM, kam seko tabulas nosaukums, atdalot to ar atstarpi.

Dažreiz mēs nevēlamies iegūt datus no ne visām tabulas kolonnām. Lai to izdarītu, zvaigznītes (*) vietā mums ir jāpieraksta vēlamo kolonnu nosaukumi, atdalot tos ar komatiem.

SELECT id, vārds FROM mēnesis

Turklāt daudzos gadījumos mēs vēlamies, lai iegūtie rezultāti tiktu sakārtoti noteiktā secībā. SQL mēs to darām, izmantojot ORDER BY. Tas var pieņemt izvēles modifikatoru — ASC (noklusējums) kārtošanu augošā secībā vai DESC , kārtošanu dilstošā secībā:

SELECT id, nosaukums NO mēneša PASŪTĪT PĒC nosaukuma DESC

Lietojot ORDER BY, pārliecinieties, vai priekšraksta SELECT tas ir pēdējais. Pretējā gadījumā tiks parādīts kļūdas ziņojums.

4. Datu filtrēšana

Jūs esat iemācījušies atlasīt noteiktas kolonnas no datu bāzes, izmantojot SQL vaicājumu, bet ko darīt, ja mums ir arī jāizgūst noteiktas rindas? Šeit palīgā nāk WHERE klauzula, kas ļauj mums filtrēt datus atkarībā no stāvokļa.

Šajā vaicājumā mēs no tabulas atlasām tikai tos mēnešus mēnesis, kurā ir vairāk nekā 30 dienas, izmantojot operatoru lielāks par (>).

SELECT id, nosaukums FROM mēnesis WHERE dienas > 30

5. Uzlabota datu filtrēšana. UN un VAI operatori

Iepriekš mēs izmantojām datu filtrēšanu, izmantojot vienu kritēriju. Sarežģītākai datu filtrēšanai varat izmantot operatorus UN un OR un salīdzināšanas operatorus (=,<,>,<=,>=,<>).

Šeit ir tabula ar četriem visu laiku vislabāk pārdotajiem albumiem. Izvēlēsimies tos, kas klasificēti kā roks un pārdoti mazāk par 50 miljoniem eksemplāru. To var viegli izdarīt, starp šiem diviem nosacījumiem ievietojot operatoru UN.


SELECT * FROM albums WHERE žanrs = "roks" UN pārdošanas_miljonos<= 50 ORDER BY released

6. In/Starp/Patīk

WHERE atbalsta arī vairākas īpašas komandas, kas ļauj ātri pārbaudīt visbiežāk izmantotos vaicājumus. Šeit tie ir:

  • IN – kalpo, lai norādītu virkni nosacījumu, no kuriem jebkurš var tikt izpildīts
  • BETWEEN – pārbauda, ​​vai vērtība ir norādītajā diapazonā
  • LIKE – meklē konkrētus modeļus

Piemēram, ja vēlamies atlasīt albumus ar pop Un dvēsele mūziku, mēs varam izmantot IN("vērtība1","vērtība2") .

SELECT * FROM albums WHERE žanrs IN ("pop", "soul");

Ja mēs vēlamies iegūt visus albumus, kas izdoti laikā no 1975. līdz 1985. gadam, mums ir jāraksta:

ATLASĪT * NO albumiem, KUR, kas izdoti NO 1975. LĪDZ 1985. GADĀ;

7. Funkcijas

SQL ir pildīta ar funkcijām, kas veic dažādas noderīgas lietas. Šeit ir daži no visbiežāk izmantotajiem:

  • COUNT() – atgriež rindu skaitu
  • SUM() – atgriež ciparu kolonnas kopējo summu
  • AVG() — atgriež vērtību kopas vidējo vērtību
  • MIN() / MAX() — iegūst minimālo/maksimālo vērtību no kolonnas

Lai mūsu tabulā iegūtu pēdējo gadu, mums ir jāieraksta šāds SQL vaicājums:

SELECT MAX(atbrīvots) NO albumiem;

8. Apakšvaicājumi

Iepriekšējā rindkopā mēs uzzinājām, kā veikt vienkāršus aprēķinus ar datiem. Ja mēs vēlamies izmantot šo aprēķinu rezultātu, mēs nevaram iztikt bez ligzdotiem vaicājumiem. Pieņemsim, ka mēs vēlamies izvadīt mākslinieks, albums Un izlaišanas gads vecākajam albumam tabulā.

Mēs zinām, kā iegūt šīs īpašās kolonnas:

SELECT izpildītājs, albums, izdots NO albumiem;

Mēs arī zinām, kā iegūt agrāko gadu:

SELECT MIN(atbrīvots) NO albuma;

Viss, kas tagad ir nepieciešams, ir apvienot divus vaicājumus, izmantojot WHERE:

SELECT izpildītājs,albums,izdots no FROM albumiem WHERE izdots = (SELECT MIN(released) FROM albums);

9. Savienošanas galdi

Sarežģītākās datu bāzēs ir vairākas tabulas, kas ir saistītas viena ar otru. Piemēram, zemāk ir divas tabulas par videospēlēm ( video spēles) un videospēļu izstrādātājiem ( game_developers).


Tabulā video spēles ir izstrādātāju kolonna ( izstrādātāja_id), taču tajā ir vesels skaitlis, nevis izstrādātāja vārds. Šis skaitlis apzīmē identifikatoru ( id) atbilstošā izstrādātāja no spēļu izstrādātāju tabulas ( game_developers), loģiski sasaistot divus sarakstus, ļaujot vienlaikus izmantot abos saglabāto informāciju.

Ja mēs vēlamies izveidot vaicājumu, kas atgriež visu, kas mums jāzina par spēlēm, mēs varam izmantot INNER JOIN, lai saistītu kolonnas no abām tabulām.

IZVĒLĒTIES video_games.name, video_games.genre, game_developers.name, game_developers.country NO video_games IEKŠĒJS PIEVIENOTIES game_developers ON video_games.developer_id = game_developers.id;

Šis ir vienkāršākais un visizplatītākais JOIN veids. Ir vairākas citas iespējas, taču tās attiecas uz retākiem gadījumiem.

10. Pseidonīmi

Ja paskatās uz iepriekšējo piemēru, jūs ievērosiet, ka ir divas kolonnas, kas tiek izsauktas nosaukums. Tas ir mulsinoši, tāpēc iestatīsim aizstājvārdu vienai no atkārtotajām kolonnām, piemēram, šo nosaukums no galda game_developers tiks saukts izstrādātājs.

Mēs varam arī saīsināt vaicājumu, aizstājot tabulu nosaukumus: video spēles piezvanīsim spēles, game_developers - izstrādātāji:

ATLASĪT games.name, games.genre, devs.name AS izstrādātājs, devs.country NO video_games AS games INNER JOIN game_developers AS devs ON games.developer_id = devs.id;

11. Datu atjaunošana

Bieži mums ir jāmaina dati dažās rindās. SQL tas tiek darīts, izmantojot UPDATE priekšrakstu. UPDATE paziņojums sastāv no:

  • Tabula, kurā atrodas aizstāšanas vērtība;
  • Kolonnu nosaukumi un to jaunās vērtības;
  • Izmantojot WHERE atlasītās rindas, kuras vēlamies atjaunināt. Ja tas netiks izdarīts, visas tabulas rindas mainīsies.

Zemāk ir tabula TV sērijas ar seriāliem un to reitingiem. Tomēr tabulā iezagās neliela kļūda: lai gan sērija Troņu spēles un tiek raksturota kā komēdija, tā tiešām nav. Labosim šo!

Tabulas dati tv_series UPDATE tv_series SET genre = "drāma" WHERE id = 2;

12. Datu dzēšana

Tabulas rindas dzēšana, izmantojot SQL, ir ļoti vienkāršs process. Viss, kas jums jādara, ir atlasīt tabulu un rindu, kuru vēlaties dzēst. Izdzēsīsim pēdējo rindu tabulā no iepriekšējā piemēra TV sērijas. Tas tiek darīts, izmantojot >DELETE instrukciju.

DZĒST NO tv_series WHERE id = 4

Esiet piesardzīgs, rakstot DELETE paziņojumu un pārliecinieties, ka ir iekļauts WHERE klauzula, pretējā gadījumā visas tabulas rindas tiks dzēstas!

13. Dzēst tabulu

Ja vēlamies dzēst visas rindas, bet atstāt pašu tabulu, tad izmantojiet komandu TRUNCATE:

TRUNCATE TABLE tabulas_nosaukums;

Gadījumā, ja mēs patiešām vēlamies izdzēst gan datus, gan pašu tabulu, mums noderēs komanda DROP:

DROP TABLE tabulas_nosaukums;

Esiet ļoti uzmanīgs ar šīm komandām. Tos nevar atcelt!/p>

Ar to mūsu SQL apmācība ir beigusies! Mēs vēl neesam aplūkojuši daudzas lietas, taču ar to, ko jau zināt, vajadzētu būt pietiekamam, lai sniegtu praktiskas iemaņas jūsu tīmekļa karjerai.

SQL ir viena no visizplatītākajām programmēšanas valodām datu bāzes izveidošanai un pārvaldīšanai, kā arī dažādu darbību veikšanai ar pašiem datiem.

Kā liecina prakse, to ir diezgan viegli iemācīties, un tas maksimāli izmanto standarta angļu valodas vārdu krājumu. Tāpat kā jebkurai citai programmēšanas valodai, arī SQL ir sava loģika un sintakse, pamata komandu kopums un to lietošanas noteikumi.

SQL komandu klasifikācija

Visus standarta var uzskatīt, pamatojoties uz to mērķi. Par neformālās klasifikācijas pamatu var izmantot šādas kopas:

    Komandas veidošanas vaicājumiem.

    Iebūvēto procedūru un funkciju komandas.

    Komandas trigeriem un sistēmas tabulām.

    Kombināciju komplekti darbam ar datuma un virknes mainīgajiem.

    Komandas darbam ar datiem un tabulām.

Šo klasifikāciju var turpināt bezgalīgi, bet galvenās SQL komandu kopas tiks veidotas tieši uz šo tipu bāzes.

Ņemot vērā valodas klasifikāciju, nevar nepieminēt, ka tā ir universāla, par ko liecina tās lietojuma apjoms. Šī programmēšanas valoda un tās varianti tiek izmantoti ne tikai standarta vidē, bet arī citās programmās, kuras tā vai citādi esat izmantojis.

SQL izmantošanas jomu var aplūkot no biroja programmatūras viedokļa, proti, MicrosoftAccess. Šī valoda jeb precīzāk tās versija – MySQL ļauj administrēt datubāzes internetā. Pat Oracle izstrādes vide savu vaicājumu pamatā izmanto SQL komandas.

SQL izmantošana programmā MicrosoftAccess

Viens no vienkāršākajiem valodas izmantošanas piemēriem datu bāzes programmēšanai ir Microsoft Office programmatūras pakotne. Šī programmatūras produkta apguve ir iekļauta skolas informātikas kursā, bet vienpadsmitajā klasē tiek apspriesta MicrosoftAccess datu bāzes pārvaldības sistēma.

Apgūstot šo lietojumprogrammu, skolēni iepazīst datu bāzes izstrādes valodu un iegūst pamatzināšanas par visu, kas saistīts. Access SQL komandas, protams, ir diezgan primitīvas, ja tās uzskatāt profesionālā līmenī. Šādu komandu izpilde ir ļoti vienkārša, un tās tiek izveidotas pielāgotā koda redaktorā.

Apskatīsim konkrētu piemēru:

IZVĒLIES Pe_Uzvārds

WHERE Pe_Name = "Marija";

Pamatojoties uz komandas sintaksi, jūs varat saprast, ka tā lietotājam atgriezīs personas uzvārdu, šajā gadījumā sievietes vārdā Marija, kas tiek saglabāta datu bāzes tabulā Kontakti.

Lai gan SQL izmantošana programmā Access ir ierobežota, dažreiz šādi vienkārši vaicājumi var ievērojami vienkāršot veicamo uzdevumu.

SQL komandu izmantošana programmā Oracle

Oracle, iespējams, ir vienīgais nopietnais Microsoft SQL Server konkurents. Tieši šī izstrādes un pārvaldības vide pastāvīgi noved pie Microsoft programmatūras produkta funkciju uzlabošanas, jo konkurence ir progresa dzinējspēks. Neskatoties uz pastāvīgo konkurenci, Oracle SQL komandas atkārto SQL. Ir vērts atzīmēt, ka, lai gan Oracle tiek uzskatīts par gandrīz pilnīgu SQL kopiju, šīs sistēmas loģika un valoda kopumā tiek uzskatīta par vienkāršāku.

Oracle sistēmai, izmantojot noteiktu komandu kopu, nav tik sarežģītas struktūras. Ņemot vērā šo datu bāzu izstrādes vidi iespējas, Oracle nav sarežģītas ligzdotas vaicājumu struktūras.

Šī atšķirība ļauj daudzkārt paātrināt darbu ar datiem, bet, gluži pretēji, dažos atsevišķos gadījumos noved pie neracionālas atmiņas izmantošanas. Oracle struktūra galvenokārt ir veidota uz pagaidu galdiem un to izmantošanas. Piemēram: SQL komandas šajā sistēmā ir konstruētas pēc analoģijas ar pašas SQL valodas standartiem, lai gan tās nedaudz atšķiras no tās.

SELECTCONCAT(CONCAT(CONCAT('Darbinieks', vārds), CONCAT(SUBSTR(fname, 0, 1), SUBSTR(otch, 0, 1)), CONCAT('pieņemts', akceptēt)) NO darbiniekiem, KUR akceptētdatums > līdz_datums '01.01.80','dd.mm.gggg');

Šis vaicājums atgriezīs datus par darbiniekiem, kuri tika pieņemti darbā noteiktā laika periodā. Lai gan vaicājuma struktūra ir atšķirīga, SQL komandu izpilde šajās sistēmās ir līdzīga, izņemot nelielas detaļas.

SQL izmantošana internetā

Līdz ar globālā tīmekļa, tas ir, interneta, parādīšanos SQL valodas izmantošanas joma paplašinās. Kā zināms, tīklā tiek glabāts daudz informācijas, taču tā nav nejauši izvietota, bet gan ievietota vietnēs un serveros pēc noteiktiem kritērijiem.

Datu bāzes ir tieši atbildīgas par informācijas glabāšanu internetā, tāpat kā citur, un tīmekļa vietnes ir vadības sistēmas. Parasti tīmekļa vietnes un to programmu kods tiek organizētas dažādās programmēšanas valodās, bet datu bāzes ir balstītas uz vienu no SQL paveidiem, proti, datu bāzes izveides valodu, kas orientēta uz MySQL tīmekļa saskarnēm.

Šīs valodas sintakse un pamata komandu kopa pilnībā kopē pazīstamo SQL, taču ar dažiem papildinājumiem, kas to atšķir no Microsoft tSQL Server.

SQL komandas ir pilnīgi līdzīgas ne tikai sintaksē, bet arī standarta funkciju vārdu komplektā. Vienīgā atšķirība ir pieprasījuma izsaukumā un strukturēšanā. Piemēram, varat apsvērt lūgumu izveidot jaunu tabulu, šī ir pirmā lieta, ko bērniem māca datorzinātņu skolās:

$ saite = mysqli_connect("localhost", "root", "", "testeris");

if (!$link) die("Kļūda");

$query = "izveidot tabulas lietotājus(

pieteikšanās VARCHAR(20),

parole VARCHAR(20)

if (mysqli_query($link, $query)) echo "Tabula ir izveidota.";

elseecho "Tabula nav izveidota: ".mysqli_error();

mysqli_close($saite);

Šāda vaicājuma izpildes rezultātā jūs varat iegūt jaunu tabulu “Lietotāji”, kurā būs divi lauki: pieteikšanās vārds un parole.

Sintakse ir modificēta tīmeklim, bet tā ir balstīta uz MicrosoftSQLServer komandām.

MicrosoftSQLServer vaicājumu veidošana

Izvēle no konkrētas datu kopas tabulām ir viens no galvenajiem SQL uzdevumiem. Šādām darbībām ir paredzēta atlases komanda SQL. Tas ir tas, kas tiks apspriests tālāk.

Komandas izveides noteikumi ir ļoti vienkārši, un pati atlases komanda SQL ir konstruēta šādi. Piemēram, ir tabula, kurā ir dati par darbinieku un kurai, piemēram, ir vārds Persona. Uzstādām uzdevumu, ka no tabulas jāatlasa dati par darbiniekiem, kuru dzimšanas datums ir intervālā no kārtējā gada pirmā janvāra līdz 1. martam ieskaitot. Šādai atlasei ir jāizpilda SQL komanda, kurā būs ne tikai standarta konstrukcija, bet arī atlases nosacījums:

Izvēlieties * no Personas

Kur P_BerthDay >= ‘01/01/2016’ un P_BerthDay<= ‘03/01/2016’

Izpildot šādu komandu, tiks atgriezti visi dati par darbiniekiem, kuru dzimšanas diena ir jūsu norādītajā periodā. Dažreiz uzdevums var būt tikai darbinieka uzvārda, vārda un uzvārda parādīšana. Lai to izdarītu, pieprasījums ir jāveido nedaudz savādāk, piemēram, šādi:

SelectP_Name — nosaukums

P_Uzvārds - uzvārds

P_Patronimic - otrais vārds

Kur P_BerthDay >= ‘01/01/2016’ un P_BerthDay<= ‘03/01/2016’

Tomēr tā ir tikai kaut kā izvēle. Tas pēc būtības neko neietekmē, bet tikai sniedz informāciju. Bet, ja jūs nolemjat nopietni uztvert SQL valodu, jums būs jāiemācās veikt izmaiņas datu bāzēs, jo to izveide bez tā ir vienkārši neiespējama. Kā tas tiek darīts, tiks apspriests tālāk.

Pamata SQL komandas datu mainīšanai

Valodas sintakse ir veidota ne tikai vaicājumu izpildei, bet arī datu apstrādei. Datu bāzes programmētāja galvenais uzdevums ir rakstīt skriptus atlasēm un atskaitēm, bet dažkārt ir nepieciešams veikt izmaiņas tabulās. SQL komandu saraksts šādām darbībām ir mazs un sastāv no trim galvenajām komandām:

    Ielikt (trans. Ievietot).

    Atjaunināt (trans. Atjaunināt).

    Dzēst (tulk. Dzēst).

Šo komandu mērķi ir viegli noteikt; viss, kas jums jādara, ir pārtulkot to nosaukumu. Šīs komandas ir viegli lietojamas un tām ir vienkārša struktūra, taču ir vērts pieminēt, ka dažas no tām, ja tās tiek izmantotas nepareizi, var nodarīt neatgriezenisku kaitējumu datu bāzei.

Parasti pirms šādu MSSQL komandu izmantošanas tas ir jāpārdomā un jāņem vērā visas iespējamās to izpildes sekas.

Apgūstot šīs komandas, jūs varat pilnībā sākt strādāt ar datu bāzes tabulām, tādējādi to modificējot un ieviešot dažus jaunus mainīgos vai dzēšot vecos.

Ievietot komandu

Lai ievietotu datus tabulā, drošākā komanda ir Insert. Nepareizi ievietotos datus vienmēr var izdzēst un atkārtoti ievadīt datu bāzē.

Komanda Insert ir paredzēta jaunu datu ievietošanai tabulā un ļauj pievienot gan pilnu komplektu, gan selektīvi.

Piemēram, apsveriet ievietošanas komandu iepriekš aprakstītajā Personu tabulā. Lai ievadītu datus tabulā, ir jāpalaiž SQL komanda, kas ļaus tabulā ievietot visus datus vai aizpildīt to selektīvi.

Ievietot personā

Atlasiet "Grigorjevs", "Vitālijs", "Petrovičs", "01/01/1988"

Šāda veida komandas automātiski aizpilda visas tabulas šūnas ar norādītajiem datiem. Ir situācijas, kad darbiniekam nav otrā vārda, teiksim, viņš atbraucis strādāt no Vācijas kā apmaiņas students. Šajā gadījumā ir jāizpilda datu ievietošanas komanda, kas tabulā ievadīs tikai nepieciešamo. Šādas komandas sintakse būs šāda:

Ievietot personā (P_Vārds, P_Uzvārds, P_Piestātnes diena)

Vērtības ('David', "Hook", "02/11/1986")

Šāda komanda aizpildīs tikai norādītās šūnas, un visām pārējām būs vērtība null.

Komanda mainīt datus

Lai mainītu gan visas rindas, gan dažu šūnu datus, izmantojiet komandu Update SQL. Šāda komanda ir jāizpilda tikai ar noteiktu nosacījumu, proti, precīzi norādiet, kurā rindā pēc numura jums jāveic izmaiņas.

Komandai Update SQL ir vienkārša sintakse. Pareizai lietošanai jānorāda, kuri dati kurā kolonnā un ierakstā ir jāmaina. Pēc tam izveidojiet skriptu un izpildiet to. Apskatīsim piemēru. Mums ir jāmaina Deivida Huka dzimšanas datums, kurš darbinieku tabulā ir norādīts ar 5. numuru.

Iestatiet P_BerthDay = '02/10/1986', kur P_ID = 5

Nosacījums (šajā skriptā) neļaus mainīt dzimšanas datumu visos tabulas ierakstos, bet gan atjauninās tikai nepieciešamos.

Tieši šo komandu programmētāji izmanto visbiežāk, jo tā ļauj mainīt tabulas datus, neradot būtisku kaitējumu visai informācijai.

Iebūvēto procedūru un funkciju izmantošanas komandas

Izmantojot SQL valodu, jūs varat ne tikai veidot vaicājumus, bet arī izveidot iebūvētus mehānismus darbam ar datiem. Parasti ir reizes, kad ir jāizmanto atlase, kas iepriekš tika ierakstīta viena pieprasījuma pamattekstā.

Ja spriež loģiski, tad vajag nokopēt izlases tekstu un ielīmēt to īstajā vietā, bet var iztikt ar vienkāršāku risinājumu. Apskatīsim piemēru, kad darba saskarnē tiek parādīta poga atskaites drukāšanai, piemēram, programmā Excel. Šī operācija tiks veikta pēc vajadzības. Šādiem nolūkiem tiek izmantotas iebūvētās saglabātās procedūras. Komandas šajā gadījumā ir iekļautas procedūrā un tiek izsauktas, izmantojot komandu SQLExec.

Pieņemsim, ka ir izveidota procedūra darbinieku dzimšanas datuma attēlošanai no iepriekš aprakstītās Personas tabulas. Šajā gadījumā nav jāraksta viss pieprasījums. Lai iegūtu nepieciešamo informāciju, vienkārši izpildiet komandu Exec [procedūras nosaukums] un nododiet izlasei nepieciešamos parametrus. Kā piemēru mēs varam apsvērt šāda veida procedūras izveides mehānismu:

CREATEPROCEDUREPrintPerson

@DB smalldatetime

@DE mazs datums

SELECT * no Personas

NO HumanResources.vEmployeeDepartmentHistory

WHERE P_BerthDay >= @DB un P_BerthDay<= @DE

ANDEndDateISNULL;

Šī procedūra atgriezīs visu informāciju par darbiniekiem, kuru dzimšanas diena būs noteiktā laika periodā.

Datu integritātes organizācija. Trigeri

Dažas MS SQL komandas, varētu pat teikt, konstrukcijas, ļauj ne tikai organizēt manipulācijas ar datiem, bet arī nodrošināt to integritāti. Šādiem nolūkiem valoda satur sistēmas konstrukcijas, kuras ir izveidojis pats programmētājs. Tie ir tā sauktie trigeri, kas var nodrošināt datu kontroli.

Šajā gadījumā nosacījumu pārbaudes organizēšanai tiek izmantotas standarta SQL vaicājuma komandas. Trigeros varat izveidot daudz nosacījumu un ierobežojumu darbam ar datiem, kas palīdzēs kontrolēt ne tikai piekļuvi informācijai, bet arī aizliedz dzēst, mainīt vai ievietot datus.

Nav ierobežojumu attiecībā uz SQL komandu veidiem, ko var izmantot trigerā. Apskatīsim piemēru.

Ja mēs aprakstām trigera izveides mehānismu, SQL komandu veidi šeit ir tādi paši kā, veidojot procedūru. Pats algoritms tiks aprakstīts tālāk.

Pirmkārt, mums jāapraksta pakalpojuma komanda trigeru izveidei:

Mēs norādām, kurai datu operācijai (mūsu gadījumā tā ir datu modifikācijas darbība).

Nākamais solis ir norādīt tabulas un mainīgos:

paziņot @ID int. @Date smalldatetime @nID int. @nDatesmalldatetime

DEdeklarējiet kursoru C1 atlasei P_ID, P_BerthDay no Ievietots

Deklarējiet kursoru C2 atlasei P_ID, P_BerthDay no dzēsta

Mēs iestatām datu atlases soļus. Pēc tam kursoru pamattekstā mēs ierakstām nosacījumu un reakciju uz to:

ja @ID = @nID un @nDate = "01/01/2016"

sMasāžas "Operāciju nevar veikt. Datums nav piemērots"

Ir vērts pieminēt, ka sprūda var ne tikai izveidot, bet arī īslaicīgi atspējot. Šo manipulāciju var veikt tikai programmētājs, izpildot SQL SERVER komandas:

altertablePERSONdisabletriggerall — lai atspējotu visus šai tabulai izveidotos trigerus un attiecīgi altertablePERSONenabletriggerall — lai tos iespējotu.

Šīs pamata SQL komandas tiek izmantotas visbiežāk, taču to kombinācijas var būt dažādas. SQL ir ļoti elastīga programmēšanas valoda un sniedz izstrādātājam maksimālas iespējas.

Secinājums

No visa iepriekš minētā mēs varam izdarīt vienīgo secinājumu: SQL valodas zināšanas ir vienkārši nepieciešamas tiem, kas gatavojas nopietni iesaistīties programmēšanā. Tas ir visu darbību pamatā gan internetā, gan mājas datubāzēs. Tāpēc topošajam programmētājam ir jāzina daudzas šīs valodas komandas, jo tikai ar viņu palīdzību var, tā sakot, sazināties ar datoru.

Protams, ir trūkumi, kā jau visam šajā pasaulē, bet tie ir tik nenozīmīgi, ka vienkārši nobāl priekšrocību priekšā. Starp visām programmēšanas valodām SQL ir praktiski vienīgā šāda veida valoda, jo tā ir universāla, un zināšanas par skriptu un kodu rakstīšanu ir gandrīz visu vietņu pamatā.

Par galveno SQL priekšrocību neapšaubāmi var uzskatīt tās vienkāršību, jo galu galā tā ir iekļauta skolas mācību programmā. Pat iesācējs programmētājs, kurš īsti nesaprot valodas, var tikt galā ar to.

Datu veidiSQL(Kā iekšālpp, kā standartā)

Stīgu veidi

Skaitliskie datu veidi

Valūta, rakstzīme, bināro datu tipi

Būla tips. Pārskaitījumi

Vienkāršu SQL vaicājumu piemēri

Vienkāršākie SELECT vaicājumi

SQL SELECT priekšraksts ir vissvarīgākais un visbiežāk izmantotais priekšraksts. Tas ir paredzēts, lai izgūtu informāciju no datu bāzes tabulām. SELECT priekšraksta vienkāršotā sintakse ir šāda.

ATLASĪT [ ALL | DISTINCT ] select_item_commalist

NO table_reference_commalist

[WHERE nosacījuma_izteiksme]

[GROUP BY column_name_commalist]

[ IR nosacījuma_izteiksme ]

[ ORDER BY order_item_commalist ]

Kvadrātiekavas norāda elementus, kuru pieprasījumā var nebūt.

Atslēgvārds SELECT norāda datubāzei, ka šis paziņojums ir informācijas izgūšanas pieprasījums.

Pēc vārda SELECT tiek uzskaitīti to lauku nosaukumi (atribūtu saraksts), kuru saturs tiek pieprasīts, atdalot tos ar komatiem.

Nepieciešamais atslēgvārds SELECT vaicājuma klauzulā ir vārds FROM. Atslēgvārdam FROM seko ar komatiem atdalīts tabulu nosaukumu saraksts, no kuriem tiek izgūta informācija.

Piemēram, izvēlieties nosaukumu, aprakstu no filmas

Jebkuram SQL vaicājumam ir jābeidzas ar simbolu “;” (semikols). Šī vaicājuma rezultāts būs tabula...

Kolonnu secība šajā tabulā atbilst vaicājumā norādīto lauku secībai

Ja jums ir jāparāda visu tabulas kolonnu vērtības, varat izmantot simbolu “*” (zvaigznīte), nevis norādīt to nosaukumus.

SELECT * FROM filmu;

Šajā gadījumā vaicājuma rezultāts būs visa filmas tabula.

Vēlreiz vērsīsim jūsu uzmanību uz to, ka SQL vaicājuma rezultātā iegūtās tabulas pilnībā neatbilst relāciju attiecību definīcijai. Jo īpaši tajos var būt korteži (rindas) ar vienādām atribūtu vērtībām.

Piemēram, vaicājumu “aktieru vārdu saraksts” var uzrakstīt šādi.

no aktiera atlasa vārdu_vārds;

Tā rezultāts būs tabula, tabulā ir identiskas rindas. Lai izslēgtu ierakstu dublikātus no SELECT vaicājuma rezultāta, izmantojiet atslēgvārdu DISTINCT.

Ja SELECT vaicājums izgūst vairākus laukus, DISTINCT novērš dublētās rindas, kurās visu atlasīto lauku vērtības ir identiskas.

Iepriekšējo vaicājumu var uzrakstīt šādi.

atlasiet atšķirīgu aktiera vārdu;

Rezultātā mēs iegūstam tabulu, kurā tiek izslēgtas dublētās rindas.

Atslēgvārdam ALL ir pretējs DISTINCT, kas nozīmē, ka izvadē tiek iekļautas rindas dublikāti. Atslēgvārda VISI norādītais režīms ir pēc noklusējuma, tāpēc reālos vaicājumos tas šiem mērķiem praktiski netiek izmantots.

Izmantojot WHERE klauzulu priekšrakstā SELECT, varat norādīt nosacījuma izteiksmi (predikātu), kas tiek novērtēta kā patiesa vai nepatiesa tabulas rindas lauku vērtībām, uz kurām atsaucas priekšraksts SELECT. Klauzula WHERE nosaka, kuras norādīto tabulu rindas ir jāatlasa. Vaicājuma rezultātā iegūtā tabula ietver tikai tās rindas, kurām WHERE klauzulā norādītais nosacījums (predikāts) tiek novērtēts kā patiess.

Piemērs: uzrakstiet vaicājumu, kas izgūst visu dalībnieku uzvārdus ar vārdu PENELOPE

atlasiet uzvārdu no aktiera

kur first_name = "PENELOPE";

Nosacījumos, kas norādīti klauzulā WHERE, var izmantot salīdzināšanas darbības, ko nosaka operatori = (vienāds), > (lielāks par),< (меньше), >= (lielāks par vai vienāds ar),<- (меньше или равно), <>(nav vienāds), kā arī loģiskie operatori AND, OR un NOT.

Piemēram, lūgums iegūt nosaukumus un aprakstus īsfilmām (īsākas par 60 minūtēm), kuru noma maksā mazāk nekā 3 USD, izskatīsies šādi:

izvēlieties nosaukumu, aprakstu no filmas

kur garums< 60 and rental_rate < 3

Šī vaicājuma rezultāts izskatās šādi:

īre - noma

inventārs - inventārs, krājumi

veikals - krājums, veikals

SQL valoda tiek izmantota, lai izgūtu datus no datu bāzes. SQL ir programmēšanas valoda, kas ļoti atgādina angļu valodu, bet ir paredzēta datu bāzu pārvaldības programmām. SQL tiek izmantots visos Access vaicājumos.

Izpratne par to, kā darbojas SQL, palīdz izveidot precīzākus vaicājumus un atvieglo to vaicājumu labošanu, kas atgriež nepareizus rezultātus.

Šis ir raksts no rakstu sērijas par Access SQL valodu. Tajā ir aprakstīti SQL lietošanas pamati datu izgūšanai un sniegti SQL sintakses piemēri.

Šajā rakstā

Kas ir SQL?

SQL ir programmēšanas valoda, kas paredzēta darbam ar faktu kopām un attiecībām starp tām. Relāciju datu bāzes pārvaldības programmas, piemēram, Microsoft Office Access, izmanto SQL, lai manipulētu ar datiem. Atšķirībā no daudzām programmēšanas valodām, SQL ir lasāma un saprotama pat iesācējiem. Tāpat kā daudzas programmēšanas valodas, SQL ir starptautisks standarts, ko atzinušas standartu komitejas, piemēram, ISO un ANSI.

Datu kopas ir aprakstītas SQL, lai palīdzētu atbildēt uz jautājumiem. Lietojot SQL, ir jāizmanto pareizā sintakse. Sintakse ir noteikumu kopums, kas ļauj pareizi apvienot valodas elementus. SQL sintakse ir balstīta uz angļu valodas sintakse un koplieto daudzus elementus ar Visual Basic for Applications (VBA) sintaksi.

Piemēram, vienkāršs SQL priekšraksts, kas izgūst uzvārdu sarakstu kontaktpersonām ar nosaukumu Marija, varētu izskatīties šādi:

ATLASĪT Uzvārds
NO Kontaktiem
WHERE First_Name = "Marija";

Piezīme: SQL valoda tiek izmantota ne tikai, lai veiktu darbības ar datiem, bet arī lai izveidotu un mainītu datu bāzes objektu, piemēram, tabulu, struktūru. SQL daļu, kas tiek izmantota datu bāzes objektu izveidei un modificēšanai, sauc par DDL. DDL šajā rakstā nav apskatīts. Papildinformāciju skatiet rakstā tabulu vai indeksu izveide vai modificēšana, izmantojot datu definīcijas vaicājumu.

SELECT paziņojumus

SELECT tiek izmantots, lai aprakstītu datu kopu SQL. Tajā ir pilns datu kopas apraksts, kas jāizgūst no datu bāzes, tostarp:

    tabulas, kas satur datus;

    savienojumi starp datiem no dažādiem avotiem;

    lauki vai aprēķini, pamatojoties uz kuriem tiek atlasīti dati;

    atlases nosacījumi, kuriem jāatbilst vaicājuma rezultātā iekļautajiem datiem;

    šķirošanas nepieciešamība un metode.

SQL priekšraksti

SQL priekšraksts sastāv no vairākām daļām, ko sauc par klauzulām. Katrai klauzulai SQL priekšrakstā ir mērķis. Ir nepieciešami daži piedāvājumi. Tālāk esošajā tabulā ir parādīti visbiežāk izmantotie SQL priekšraksti.

SQL priekšraksts

Apraksts

Obligāts

Definē laukus, kuros ir nepieciešamie dati.

Definē tabulas, kas satur klauzulā SELECT norādītos laukus.

Definē lauka atlases nosacījumus, kas jāatbilst visiem rezultātos iekļautajiem ierakstiem.

Nosaka rezultātu kārtošanas secību.

SQL priekšrakstā, kas satur apkopošanas funkcijas, norāda laukus, kuriem klauzulā SELECT netiek aprēķināta kopsavilkuma vērtība.

Tikai tad, ja ir šādi lauki

SQL priekšraksts, kas satur apkopošanas funkcijas, definē nosacījumus, kas attiecas uz laukiem, kuriem SELECT klauzulā tiek aprēķināta kopsavilkuma vērtība.

SQL termini

Katrs SQL teikums sastāv no terminiem, kurus var salīdzināt ar runas daļām. Tālāk esošajā tabulā ir parādīti SQL terminu veidi.

SQL termins

Salīdzināma runas daļa

Definīcija

Piemērs

identifikators

lietvārds

Nosaukums, ko izmanto, lai identificētu datu bāzes objektu, piemēram, lauka nosaukums.

Klienti.[Tālruņa numurs]

operators

darbības vārds vai apstākļa vārds

Atslēgvārds, kas attēlo vai maina darbību.

nemainīgs

lietvārds

Vērtība, kas nemainās, piemēram, skaitlis vai NULL.

izteiksme

īpašības vārds

Identifikatoru, operatoru, konstantu un funkciju kombinācija, kas paredzēta vienas vērtības aprēķināšanai.

>= Produkti.[Cena]

Pamata SQL klauzulas: SELECT, FROM un WHERE

Vispārējais SQL priekšrakstu formāts ir:

ATLASĪT lauku_1
NO tabulas_1
WHERE kritērijs_1
;

Piezīmes:

    Access neievēro rindiņu pārtraukumus SQL priekšrakstos. Neskatoties uz to, katru teikumu ieteicams sākt jaunā rindiņā, lai SQL priekšraksts būtu viegli lasāms gan tam, kurš to uzrakstījis, gan visiem pārējiem.

    Katrs SELECT priekšraksts beidzas ar semikolu (;). Semikols var parādīties vai nu pēdējā teikuma beigās, vai atsevišķā rindā SQL priekšraksta beigās.

Piemērs programmā Access

Tālāk esošajā piemērā parādīts, kā programmā Access varētu izskatīties SQL priekšraksts vienkāršam atlases vaicājumam.

1. SELECT klauzula

2. NO klauzula

3. WERE klauzula

Apskatīsim piemēru teikumu pa teikumam, lai saprastu, kā darbojas SQL sintakse.

SELECT klauzula

SELECT, uzņēmums

Šī ir SELECT klauzula. Tajā ir (SELECT) priekšraksts, kam seko divi identifikatori ("[E-pasta adrese]" un "Uzņēmums").

Ja identifikatorā ir atstarpes vai speciālās rakstzīmes (piemēram, "E-pasta adrese"), tas jāiekļauj taisnstūrveida iekavās.

SELECT klauzula neprasa norādīt tabulas, kurās ir lauki, un jūs nevarat norādīt atlases nosacījumus, kuriem jāatbilst rezultātos iekļautajiem datiem.

SELECT priekšrakstā klauzula SELECT vienmēr ir pirms klauzulas FROM.

NO klauzulas

NO Kontaktiem

Šī ir klauzula FROM. Tajā ir (FROM) paziņojums, kam seko identifikators (Kontakti).

FROM klauzula nenorāda atlasāmos laukus.

KUR klauzula

KUR Pilsēta = "Sietla"

Šī ir WHERE klauzula. Tajā ir (WHERE) paziņojums, kam seko izteiksme (City="Rostova").

Ir daudzas lietas, ko varat darīt, izmantojot klauzulas SELECT, FROM un WHERE. Lai iegūtu papildinformāciju par šo piedāvājumu izmantošanu, skatiet šos rakstus:

Kārtošanas rezultāti: ORDER BY

Tāpat kā Microsoft Excel, programmā Access varat kārtot vaicājuma rezultātus tabulā. Izmantojot klauzulu ORDER BY, varat arī norādīt, kā rezultāti tiek kārtoti, izpildot vaicājumu. Ja tiek izmantota klauzula ORDER BY, tai ir jāparādās SQL priekšraksta beigās.

Klauzulā ORDER BY ir ietverts kārtojamo lauku saraksts tādā pašā secībā, kādā kārtošana tiks lietota.

Piemēram, pieņemsim, ka vispirms vēlaties kārtot rezultātus pēc lauka Uzņēmums dilstošā secībā un pēc tam, ja ir ieraksti ar vienādu uzņēmuma lauka vērtību, kārtojiet tos pēc lauka E-pasta adrese augošā secībā. ORDER BY klauzula izskatītos šādi:

PASŪTĪJUMS PĒC uzņēmuma DESC,

Piezīme: Pēc noklusējuma Access kārto vērtības augošā secībā (no A līdz Z, no mazākā līdz lielākajam). Lai kārtotu vērtības dilstošā secībā, jānorāda atslēgvārds DESC.

Papildinformāciju par punktu PASŪTĪJUMS skatiet sadaļā ORDER BY.

Darbs ar kopsavilkuma datiem: GROUP BY un HAVING klauzulas

Dažreiz jums ir jāstrādā ar kopsavilkuma datiem, piemēram, mēneša kopējo pārdošanas apjomu vai dārgākajām precēm noliktavā. Lai to izdarītu, klauzula SELECT laukam piemēro apkopošanas funkciju. Piemēram, ja vēlaties izpildīt vaicājumu, lai iegūtu katra uzņēmuma e-pasta adrešu skaitu, klauzula SELECT varētu izskatīties šādi:

Iespēja izmantot noteiktu apkopošanas funkciju ir atkarīga no datu veida laukā un vēlamās izteiksmes. Papildinformāciju par pieejamajām apkopotajām funkcijām skatiet rakstā SQL statistikas funkcijas.

Lauku norādīšana, kas netiek izmantoti apkopošanas funkcijā: klauzula GROUP BY

Izmantojot apkopotās funkcijas, parasti ir jāizveido klauzula GROUP BY. Klauzula GROUP BY norāda visus laukus, uz kuriem neattiecas apkopošanas funkcija. Ja apkopotās funkcijas attiecas uz visiem vaicājuma laukiem, jums nav jāizveido klauzula GROUP BY.

GROUP BY klauzulai nekavējoties jāseko WHERE vai FROM klauzulai, ja nav WHERE klauzulas. Klauzulā GROUP BY ir uzskaitīti lauki tādā pašā secībā kā klauzula SELECT.

Turpināsim iepriekšējo piemēru. SELECT klauzulā, ja apkopošanas funkcija attiecas tikai uz lauku [E-pasta adrese], tad klauzula GROUP BY izskatītos šādi:

GRUPA PĒC uzņēmuma

Lai iegūtu papildinformāciju par klauzulu GROUP BY, skatiet rakstu GROUP BY.

Apkopoto vērtību ierobežošana, izmantojot grupēšanas nosacījumus: klauzula HAVING

Ja jums ir jānorāda nosacījumi, lai ierobežotu rezultātus, bet lauks, kuram vēlaties tos lietot, tiek izmantots apkopošanas funkcijā, jūs nevarat izmantot WHERE klauzulu. Tā vietā ir jāizmanto klauzula HAVING. HAVING klauzula darbojas tāpat kā WHERE klauzula, bet tiek izmantota apkopotiem datiem.

Piemēram, pieņemsim, ka AVG funkcija (kas aprēķina vidējo) tiek piemērota pirmajam laukam klauzulā SELECT:

SELECT COUNT(), Uzņēmums

Ja vēlaties ierobežot vaicājuma rezultātus, pamatojoties uz funkcijas COUNT vērtību, šim klauzulā WHERE nevar piemērot atlases nosacījumu. Tā vietā nosacījums jāievieto klauzulā HAVING. Piemēram, ja vēlaties, lai jūsu vaicājums atgrieztu rindas tikai tad, ja uzņēmumam ir vairākas e-pasta adreses, varat izmantot šādu HAVING klauzulu:

AR SKAITĪŠANU()>1

Piezīme: Vaicājumā var iekļaut gan WHERE klauzulu, gan HAVING klauzulu ar atlases nosacījumiem laukiem, kas netiek izmantoti WHERE klauzulā norādītajās statistikas funkcijās, un nosacījumus laukiem, kas tiek izmantoti statistikas funkcijās klauzulā HAVING.

Papildinformāciju par klauzulu HAVING skatiet rakstā HAVING.

Apvienojot vaicājuma rezultātus: UNION operators

Operatoru UNION izmanto, lai vienlaikus skatītu visus datus, ko atgriezuši vairāki līdzīgi atlases vaicājumi, kā apvienotu kopu.

UNION operators ļauj apvienot divus SELECT priekšrakstus vienā. Apvienojamajiem SELECT priekšrakstiem ir jābūt vienādam izvades lauku skaitam un secībai ar vienādiem vai saderīgiem datu tipiem. Kad vaicājums tiek izpildīts, dati no katras atbilstošo lauku kopas tiek apvienoti vienā izvades laukā, tāpēc vaicājuma izvadei ir tik daudz lauku, cik katram atsevišķam SELECT priekšrakstam.

Piezīme: Savienojuma vaicājumos ciparu un teksta datu tipi ir saderīgi.

Izmantojot operatoru UNION, varat norādīt, vai vaicājuma rezultātos ir jāiekļauj rindu dublikāti, ja tādi ir. Lai to izdarītu, izmantojiet atslēgvārdu VISI.

Vaicājumam divu SELECT priekšrakstu apvienošanai ir šāda pamata sintakse:

ATLASĪT lauku_1
NO tabulas_1
SAVIENĪBA
ATLASĪT lauku_a
NO tabulas_a
;

Piemēram, pieņemsim, ka jums ir divas tabulas ar nosaukumu “Produkti” un “Pakalpojumi”. Abās tabulās ir lauki ar preces vai pakalpojuma nosaukumu, cenu un garantijas informāciju, kā arī lauks, kas norāda piedāvātās preces vai pakalpojuma ekskluzivitāti. Lai gan produktu un pakalpojumu tabulās ir sniegti dažāda veida garantijas, pamatinformācija ir tāda pati (vai atsevišķiem produktiem vai pakalpojumiem ir garantija). Varat izmantot šo savienošanas vaicājumu, lai savienotu četrus laukus no divām tabulām:

ATLASĪT nosaukumu, cenu, garantiju_pieejams, ekskluzīvs_piedāvājums
NO produktiem
SAVIENĪBA VISU
ATLASĪT nosaukumu, cenu, garantiju_pieejams, ekskluzīvs_piedāvājums
NO pakalpojumiem
;

Papildinformāciju par SELECT priekšrakstu apvienošanu, izmantojot operatoru UNION, skatiet

Tabulas izteiksmes tiek saukti par apakšvaicājumiem, kas tiek izmantoti, ja ir sagaidāma tabulas klātbūtne. Ir divu veidu tabulas izteiksmes:

    atvasinātas tabulas;

    vispārinātas tabulas izteiksmes.

Šīs divas tabulas izteiksmju formas ir aplūkotas turpmākajās apakšnodaļās.

Atvasinātās tabulas

Atvasināta tabula ir tabulas izteiksme, kas iekļauta vaicājuma noteikumā FROM. Atvasinātās tabulas var izmantot gadījumos, kad kolonnu aizstājvārdu izmantošana nav iespējama, jo SQL tulkotājs apstrādā citu paziņojumu, pirms ir zināms aizstājvārds. Tālāk esošajā piemērā ir parādīts mēģinājums izmantot kolonnas aizstājvārdu situācijā, kad tiek apstrādāta cita klauzula, pirms ir zināms aizstājvārds:

IZMANTOT SampleDb; SELECT MONTH(EnterDate) kā ievades_mēnesis FROM Works_on GROUP BY ievades_mēnesis;

Mēģinot izpildīt šo vaicājumu, tiks parādīts šāds kļūdas ziņojums:

207. ziņojums, 16. līmenis, 1. stāvoklis, 5. rindiņa. Nederīgs kolonnas nosaukums “enter_month”. (207. ziņojums: 16. līmenis, 1. stāvoklis, 5. rindiņa Nederīgs kolonnas nosaukums ievades_mēnesis)

Kļūdas iemesls ir tāds, ka klauzula GROUP BY tiek apstrādāta, pirms tiek apstrādāts atbilstošs priekšraksta SELECT saraksts, un, apstrādājot grupu, kolonnas enter_month aizstājvārds nav zināms.

Šo problēmu var atrisināt, izmantojot atvasinātu tabulu, kurā ir iepriekšējais vaicājums (bez GROUP BY klauzulas), jo klauzula FROM tiek izpildīta pirms klauzulas GROUP BY:

IZMANTOT SampleDb; SELECT enter_month FROM (SELECT MONTH(EnterDate) kā ievades_mēnesis FROM Works_on) AS m GROUP BY ievades_mēnesis;

Šī pieprasījuma izpildes rezultāts būs šāds:

Parasti tabulas izteiksmi var novietot jebkurā vietā SELECT priekšrakstā, kur var parādīties tabulas nosaukums. (Tabulas izteiksmes rezultāts vienmēr ir tabula vai īpašos gadījumos izteiksme.) Tālāk sniegtajā piemērā parādīta tabulas izteiksmes izmantošana SELECT priekšraksta atlases sarakstā:

Šī vaicājuma rezultāts:

Vispārējas tabulas izteiksmes

Kopējā tabulas izteiksme (OTB) ir nosaukta tabulas izteiksme, ko atbalsta Transact-SQL valoda. Kopējās tabulu izteiksmes tiek izmantotas šādos divu veidu vaicājumos:

    nerekursīvs;

    rekursīvs.

Šie divi pieprasījumu veidi ir apskatīti nākamajās sadaļās.

OTB un nerekursīvie vaicājumi

Nerekursīvo OTB formu var izmantot kā alternatīvu atvasinātajām tabulām un skatiem. Parasti OTB nosaka AR klauzulām un papildu vaicājums, kas atsaucas uz vārdu, kas izmantots klauzulā WITH. Transact-SQL atslēgvārda WITH nozīme ir neskaidra. Lai izvairītos no neskaidrībām, priekšraksts pirms WITH ir jābeidz ar semikolu.

IZMANTOT AdventureWorks2012; SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue > (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = "2005") AND Freight > (SELECT AVG(TotalDue) FROM Sales.OrderHate0) ")/2,5;

Vaicājums šajā piemērā atlasa pasūtījumus, kuru kopējie nodokļi (TotalDue) ir lielāki par visu nodokļu vidējo vērtību un kuru pārvadāšanas izmaksas (Freight) ir lielākas par 40% no vidējiem nodokļiem. Šī vaicājuma galvenā īpašība ir tā garums, jo apakšvaicājums ir jāraksta divas reizes. Viens no iespējamiem veidiem, kā samazināt vaicājuma konstrukcijas lielumu, ir izveidot skatu, kas satur apakšvaicājumu. Bet šis risinājums ir nedaudz sarežģīts, jo tas prasa izveidot skatu un pēc tam dzēst to pēc vaicājuma izpildes. Labāka pieeja būtu izveidot OTB. Tālāk esošajā piemērā ir parādīta nerekursīva OTB izmantošana, kas saīsina iepriekš minēto vaicājuma definīciju:

IZMANTOT AdventureWorks2012; WITH cena_aprēķins(gads_2005) AS (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = "2005") SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue > (SELECT year_ price_cal20c) FROM_cence_cal20c. ) /2,5;

WITH klauzulas sintakse nerekursīvos vaicājumos ir šāda:

Parametrs cte_name apzīmē OTB nosaukumu, kas definē iegūto tabulu, un parametrs column_list apzīmē tabulas izteiksmes kolonnu sarakstu. (Iepriekš esošajā piemērā OTB sauc par price_calc, un tai ir viena kolonna, gads_2005.) Parametrs inner_query ir priekšraksts SELECT, kas norāda atbilstošās tabulas izteiksmes rezultātu kopu. Pēc tam definēto tabulas izteiksmi var izmantot vaicājumā outer_query. (Ārējais vaicājums iepriekš minētajā piemērā izmanto OTB price_calc un tās sleju year_2005, lai vienkāršotu divkārši ligzdoto vaicājumu.)

OTB un rekursīvie vaicājumi

Šajā sadaļā ir parādīts paaugstinātas sarežģītības materiāls. Tāpēc, lasot to pirmo reizi, ieteicams to izlaist un atgriezties vēlāk. OTB var izmantot, lai ieviestu rekursijas, jo OTB var saturēt atsauces uz sevi. Pamata OTB sintakse rekursīvajam vaicājumam izskatās šādi:

Parametriem cte_name un column_list ir tāda pati nozīme kā OTB nerekursīviem vaicājumiem. WITH klauzulas pamattekstu veido divi vaicājumi, ko apvieno operators SAVIENĪBA VISU. Pirmais vaicājums tiek izsaukts tikai vienu reizi, un tas sāk uzkrāt rekursijas rezultātu. Operatora UNION ALL pirmais operands neatsaucas uz OTB. Šo vaicājumu sauc par atsauces vaicājumu vai avotu.

Otrais vaicājums satur atsauci uz OTB un attēlo tā rekursīvo daļu. Šī iemesla dēļ to sauc par rekursīvo dalībnieku. Pirmajā rekursīvās daļas izsaukumā OTB atsauce atspoguļo atsauces vaicājuma rezultātu. Rekursīvais dalībnieks izmanto pirmā vaicājuma izsaukuma rezultātu. Pēc tam sistēma vēlreiz izsauc rekursīvo daļu. Zvans rekursīvajam dalībniekam tiek pārtraukts, kad iepriekšējais zvans tam atgriež tukšu rezultātu kopu.

Operators UNION ALL pievienojas pašlaik uzkrātajām rindām, kā arī papildu rindām, kuras rekursīvajam dalībniekam pievieno pašreizējais izsaukums. (Operatora UNION ALL klātbūtne nozīmē, ka no rezultāta netiks noņemtas dublētās rindas.)

Visbeidzot, parametrs outer_query norāda ārējo vaicājumu, ko OTB izmanto, lai izgūtu visus abu dalībnieku savienojuma zvanus.

Lai parādītu OTB rekursīvo formu, mēs izmantojam tabulu Lidmašīna, kas definēta un aizpildīta ar kodu, kas parādīts tālāk esošajā piemērā:

IZMANTOT SampleDb; CREATE TABLE Lidmašīna(ContainingAssembly VARCHAR(10), ContainedAssembly VARCHAR(10), QuantityContained INT, UnitCost DECIMAL(6,2)); INSERT INTO Airplane VALUES ("Lidmašīna", "Fizelāža", 1, 10); INSERT INTO Airplane VALUES ("Lidmašīna", "Spārni", 1, 11); INSERT INTO Airplane VALUES ("Airplane", "Tail", 1, 12); INSERT INTO Airplane VALUES ("Fizelāža", "Salons", 1, 13); INSERT INTO Airplane VALUES ("Fizelāža", "Kabīne", 1, 14); INSERT INTO Airplane VALUES ("Fizelāža", "Deguns",1, 15); INSERT INTO Airplane VALUES ("Cabin", NULL, 1,13); INSERT INTO Airplane VALUES ("Cockpit", NULL, 1, 14); INSERT INTO Airplane VALUES ("Deguns", NULL, 1, 15); INSERT INTO Airplane VALUES ("Wings", NULL,2, 11); INSERT INTO Airplane VALUES ("Tail", NULL, 1, 12);

Lidmašīnas tabulā ir četras kolonnas. Kolonnā ContainingAssembly ir norādīts mezgls, un kolonnā ContainedAssembly ir norādītas detaļas (pa vienai), kas veido atbilstošo mezglu. Zemāk esošajā attēlā parādīts iespējamā gaisa kuģa tipa un tā sastāvdaļu grafisks attēls:

Lidmašīnu tabula sastāv no šādām 11 rindām:

Nākamajā piemērā tiek izmantota klauzula WITH, lai definētu vaicājumu, kas aprēķina katras būves kopējās izmaksas:

IZMANTOT SampleDb; WITH_detaļu_saraksts(montāža1, daudzums, izmaksas) AS (SELECT ContainingAssembly, QuantityContained, UnitCost FROM Airplane WHERE ContainedAssembly IS NULL UNION ALL SELECT a.ContainingAssembly, a.Quantity Contained, CAST(l.quantity) *DECl. ) NO detaļu_saraksta l, lidmašīna a WHERE l.assembly1 = a.ContainedAssembly) SELECT montāža1 "Daļa", daudzums "Daudzums", izmaksas "Cena" NO detaļu_saraksta;

WITH klauzula definē OTB sarakstu ar nosaukumu list_of_parts, kas sastāv no trim kolonnām: montāža1, daudzums un izmaksas. Pirmais SELECT priekšraksts piemērā tiek izsaukts tikai vienu reizi, lai saglabātu rekursijas procesa pirmā posma rezultātus. Priekšraksts SELECT piemēra pēdējā rindā parāda šādu rezultātu.




Tops