Jaunu tabulu veidošana no esošajām

Augusts 26, 2008

Īsti vīri, kā zināms, bekapus (latviski gan būtu rezerves kopijas) netaisa. Un šis arī īsti nebūs raksts par rezerves kopijām to klasiskajā izpratnē, bet par to kā ātri, ērti un vienkārši izveidot kopijas tabulai (-lām) līdz ar visiem datiem, kuru datus Jūs taisaties mainīt vai arī gribat patestēt, vai arī jebkādiem citiem nolūkiem. Un te nu mēs nonākam pie situācijas, kad kārtējo reizi katra DBVS dara tā kā pašai patīk (drīzāk gan jau kā tās izstrādātāji nolēmuši) un vismaz trīs zemāk apskatītajās (Oracle, Microsoft SQL Server un MySQL) katrā tas ir savādāk.

Oracle

Lai izveidotu jaunu tabulu Oracle tiek lietots CREATE TABLE DDL teikums. Tas paliek spēkā arī tad, ja tabula tiek veidota balstoties uz esošu vienu vai vairākām tabulām, t.i., apakšvaicājumu. Tātad ļooooooti vienkāršota sintakse ir šāda:

CREATE TABLE <tabulas nosaukums>
[<kolonu definīcijas>]
[<fiziskie atribūti>]
[<tabulas atribūti>]
AS <apakšvaicājums>

CREATE TABLE <tabulas nosaukums>

Atslēgvārdi CREATE TABLE sāk jebkuras tabulas izveides SQL teikumu. Tālāk tiek rakstīts tabulas nosaukums. Šeit jāatceras, ka Oracle noklusēti visus tabulas nosaukumus un vispār identifikatorus pārvērš uz lielajiem burtiem, tātad datu vārdnīcā Jūsu izveidotā tabula tabulas_nosaukums tiks pārveidota kā TABULAS_NOSAUKUMS. Ja nu Jums vien zināmu iemeslu dēļ tā nevēlaties, tad ir iespējams arī saglabāt tabulas nosaukumu precīzi tādu kā ievadījāt, ja to iekļauj pēdiņās. Piemēram, tabula “manas šausmas $%” tieši tā arī tiks saglabāta datubāzē, taču ar to nekādā ziņā nevajadzētu aizrauties, jo pēc tam Jums vienmēr nāksies nosaukumu rakstīt pēdiņās, kā arī tas ir perfekts veids kā rakstīt neuzturamu kodu. Protams nevajadzētu lietot arī rezervētos vārdus, jo tādu nosaukumu tabulas Oracle neļaus izveidot (ja vien atkal nelietosiet pēdiņas).

<kolonu definīcijas>

Šī daļa ir neobligāta. Pamatā šeit var definēt divas lietas – kolonu nosaukumus un ierobežojumus. Tas, protams, nebūt nav viss iespējamais, bet vairumā gadījumu jo sevišķi šai gadījumā ar to pietiek. Jāņem vērā vairākas lietas:

  • kolonu nosaukumiem jāatbilst pieļaujamiem identifikatoru nosaukumiem Oraclē;
  • kolonu skaitam jāsakrīt ar kolonu skaitu apakšvaicājumā;
  • datu tipu definēt šeit nedrīkst, jo to nosaka apakšvaicājuma atgrieztais rezultāts.

<fiziskie atribūti>

Parasti šeit neko norādīt nevajag, jo visas noklusētās vērtības ir gana labas un pieņemamas. Taču iespēja ir un norādīt var tādas lietas kā:

  • tabultelpu (tablespace);
  • atribūtus ar kādiem, tabula fiziski tiks glabāta (pctfree, pctused u.c.);
  • vai tabula tiks kompresēta (compressed);
  • tabulas veidu (heap – parastā tabula, index organized – glabāta kā indeksa struktūra, external – ārējā), katrai no šiem tabulas veidiem vēl ir milzums atribūti;
  • kādā klāsterī tā tiks glabāta;
  • u.c.

<tabulas atribūti>

Līdzīgi kā iepriekšējā klauza, šī parasti ātrai tabulu izveidošanai nav nepieciešama, taču šeit var norādīt tādas lietas, kā:

  • vai tabula tiks particionēta (partitioned);
  • tabulas paralelitātes atribūtus;
  • vai tabulai tiks glabāta noklusēta kolona (rowdependencies) norādot pēdējo sistēmas izmaiņu kārtas numuru (scn, system change number);
  • iespējot/atspējot ierakstu pārvietošanu (row movement);
  • u.c.

Šo un iepriekšējo klauzu es pieminu tikai tāpēc, lai saprastu, ka principā šeit ir iespējams definēt praktiski visas iespējamās lietas, ko Oracle atļauj CREATE TABLE teikumam. Aptuvenai apjoma sapratnei tās ir 73 lapas no dokumentācijas, kurā iespējas ir pamatā tikai uzskaitītas, nevis sīki apstāstīts, ko katra nozīmē ;)

AS <apakšvaicājums>

Šeit grūti ko piebilst – šis var būt jebkurš Select teikums, sākot ar relatīvi vienkāršu Select teikumu, tajā var būt iekļautas kopas operācijas, kā arī nekas nekavē lietot kādu no savienojumu veidiem vai, piemēram, analītiskās funkcijas. Īsumā – visu, ko Jūs spējat Select teikumā sarakstīt, var arī izveidot kā CREATE TABLE AS <apakšveicājums> teikumu. Dažas piezīmes un nelieli triki, kas var kādreiz noderēt:

  • dažkārt ir vēlme izveidot tabulu, kas būtu ar tādām pašām kolonām kā kāda cita (vai citu apvienojums), bet datus tai nepievienot. Savukārt kolonu skaits ir liels un slinkums visas tās pārskaitīt. Tad vienkārši jāpievieno SELECT apakšvaicājumam WHERE klauza, kas visām rindām dod aplamu rezultātu, piemēram, WHERE 1 = 0 (skat. piemēru 2).
  • dažkārt gribas pievienot papildus kolonu ar nedefinētām (NULL) vērtībām, kas SELECT teikumā tieši atlasīta netiek, bet kura tiks vēlāk koriģēta izmantojot UPDATE teikumu. Tādā gadījumā select teikumam vienkārši jāpievieno jauna kolona, kurā atlasam NULL un tipizējam to ar noteiktu funkciju, nodrošinot to, ka kolona ir ar nepieciešamo datu tipu (skat. piemēru 6).

Oracle piemēri

Lasīt pārējo šī ieraksta daļu »


Analītiskās funkcijas

Augusts 21, 2008

In my opinion, analytic functions are the coolest thing to happen to SQL since the SELECT keyword was introduced. Thomas Kyte
(Manuprāt analītiskās funkcijas ir kolosālākais izgudrojums SQLā kopš Select atslēgas vārda)

Vienkāršā SQL Select teikumā katrā konkrētā brīdī ir iespējams vienlaicīgi operēt (“redzēt”) ar vienu ierakstu un tā kolonām.  Var piemēram saskaitīt kolonu A un B saturu, var noskaidrot vai kolona A ir lielāka kā B, var veikt daudz un dažādas citas funkcijas no vienas vai vairākām kolonām. Taču tiklīdz kā rodas vēlme paskatīties uz jebkuru citu ierakstu šī paša vaicājuma rezultātā, tad tas nav iespējams.

Vienkāršs select teikums

Vienkāršs select teikums

Protams, to var izdarīt ar kādu no savienojumu (join) veidiem, bet tas nozīmē krietni sarežģītāku Select vaicājumu, kas var diezgan pamatīgi iespaidot izpildes laiku. Pie tam reizēm to izdarīt ir ļoti sarežģīti. Otra iespēja ir dabūt kaut kādas summārās, vidējās un citas grupēšanas vērtības, taču tādā gadījumā tiek zaudēta informācija par ierakstu, no kurienes informācija nākusi un nav iespējams iegūt pārējās ieraksta kolonas.

Select teikums ar grupēšanu

Select teikums ar grupēšanu

Analītiskās funkcijas dod iespēju iet lielu un pamatīgu soli tālāk – redzēt vērtības no citām rindām un iegūt grupēšanas rezultātus saglabājot arī katra ieraksta specifiskās vērtības. Kā to praktiski panākt – sadaļā Piemēri.

Select teikums ar kolonām no analītiskajām funkcijām

Select teikums ar kolonām no analītiskajām funkcijām

SQL standartā lielākā daļa no tālākajām funkcijām tiek sauktas par logu (window) funkcijām, jo tās rezultāts tiek noskaidrots it kā uzliekot noteiktu logu virsū vaicājumā atgrieztajiem ierakstiem. Taču vienkāršības labad es arī turpmāk tās visas saukšu par analītiskajām funkcijām un attiecīgajos smalkumos vismaz šai rakstā neiedziļināšos.

Sintakse

Vienkāršota analītisko funkciju sintakse ir šāda:

<funkcija> ([<arguments>]) OVER ([PARTITION BY <kolonu saraksts>] ORDER BY <kolonu saraksts> )

Elementu nozīme:

  • <funkcija> – konkrētā izmantojamā analītiskā funkcija. Šeit der lielākā daļa no grupēšanas funkcijām, piemēram, Min, Max, Sum, Avg, kā arī dažas citas jaunas funkcijas, kas parasti nav pieejamas, piemēam, row_number, rank, dense_rank utt.
  • OVER  – atslēgas vārds, kas norāda, ka šī ir analītiskā f-ja, piemēram, atšķirība no parastas grupēšanas funkcijas.
  • PARTITION BY <kolonu saraksts> – nodalījums, kādā tiek sadalīts viss vaicājuma rezultāts. Kā redzams šī klauza ir neobligāta, tādā gadījumā nodalījums ir viens – viss vaicājuma rezultāts. Ja šī klauza eksistē, tad tiklīdz kā kolonu sarakstā minētās kolonas vērtība mainās, tā tas ir nākošais nodalījums – skat. nākošajā attēlā.
  • ORDER BY – kārtība kādā ieraksti tiks sakārtoti katra nodalījuma ietvaros. Sakārtojumam vēlams būt viennozīmīgam, pretējā gadījumā nav garantijas, kurš no ierakstiem būs pirmais, kurš nākošais. Pie tam ļoti svarīgi atcerēties – šis sakārtojums nenozīmē kā rindas būs sakārtotas gala rezultātā, gala rezultāta definētu sakārtojumu nodoršina tikai un vienīgi Select teikuma Order By klauza.
Partition by un Order by klauzu vizualizācija

Partition by un Order by klauzu vizualizācija

Lasīt pārējo šī ieraksta daļu »


SQL Server 2008 oficiāli ir klāt

Augusts 7, 2008

Ir oficiāli iznākusi viena no lielā trijnieka datu bāzu vadības sistēmām – SQL Server jaunā 2008 versija. Sākotnēji tā tika plānota izlaist jau kādu pusgadu iepriekš brīnisķīgā notikuma Heroes Happen Here laikā, taču, kā tomēr tika paziņots, izlaists tikšot tad, kad būs gatavs. Pa vidu bija publiski pieejamas tādas kā betas (community technology preview, CTP), bet nu tagad acīmredzot ir gatavs. Kā jau tas parasts ir kāds bars jaunu lietu, no kurām par vienu – SQL Merge teikumu es jau paguvu uzrakstīt. Šajā versijā gan ir mazāk revolucionāru pārmaiņu kā tas bija SQL Server 2005. Tātad cilvēkiem, kas par to ieintersējās vairāk, papildus info ir šeit:


Oracle Express redakcijas (edition) instalācija

Augusts 1, 2008

Nesen iegādājos jaunu Samsung Q45 un, protams, viens no pirmajiem darbiem ir aprīkot to ar nepieciešamo programmatūru. Kā viens no intereses objektiem ir arī Oracle Express Edition (turpmāk XE) – pati vienkāršākā, mazākā no visām piecām redakcijām, bet toties par velti arī produkcijā. Šī protams nebija pirmā reize, kad to instalēju, bet zināmu interesi izraisīja fakts, ka instalācija notiks uz Windows Vista Home Premium, kas diemžēl ;) nāca līdz portatīvajam. Tātad XE instalācija lejuplādēšanai ir atrodama šeit un “sver” mazliet pāri 200 MB. Ja gribam likt tur iekšā unicodi un daudzvalodību, kas visticamāk Latvijas apstākļos tā arī ir, tad jāņem lielākā paka Oracle Database 10g Express Edition (Universal).

Pēc tam, kad esam datni lejuplādējuši, palaižam instalāciju un atšķirībā no citām Oracle versijām, šeit ir pavisam parasts un pierasts instalācijas logs (bez lieliem javas brīnumiem):

Oracle XE instalācija

Lasīt pārējo šī ieraksta daļu »