Taulukoiden sisäinen haku
ANY-, sisältö- ja päällekkäisyysoperaattorit.
Taulukoiden sisäinen haku on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Taulukot tallentavat useita arvoja
PostgreSQL:ssä taulukkosarake sisältää useita arvoja yhdessä solussa. Ennen kuin voitte hakea tietoja taulukoista, on hyödyllistä tarkastella, miltä ne näyttävät.
Alla oleva kysely luo taulukon, jossa jokainen tuote voi kuulua useisiin luokkiin, jotka tallennetaan tekstitaulukkona.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[]
);
INSERT INTO products (name, tags) VALUES
('Laptop', ARRAY['electronics', 'computers', 'sale']),
('T-Shirt', ARRAY['clothing', 'summer', 'sale']),
('Coffee Mug', ARRAY['kitchen', 'gifts']),
('Headphones', ARRAY['electronics', 'audio']),
('Notebook', ARRAY['stationery', 'office']);Jäsenyyden tarkistaminen ANY-operaattorilla
ANY-operaattorilla voitte tarkistaa, esiintyykö arvo jossakin taulukon kohdassa. Syntaksi on: value = ANY(array_column).
Tämä kysely löytää kaikki tuotteet, joiden tunnisteena on elektroniikka.
SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);ANY ei koske vain tekstiä
ANY toimii minkä tahansa yhtäsuuruutta tukevan tietotyypin kanssa. Tässä on pistemääristä koostuva taulukko, jonka alkiot ovat kokonaislukuja. Kysely hakee opiskelijat, jotka ovat saaneet täydet 100 pistettä vähintään yhdessä kokeessa.
CREATE TABLE students (
student TEXT,
scores INT[]
);
INSERT INTO students VALUES
('Alice', ARRAY[88, 95, 100]),
('Bob', ARRAY[70, 80, 90]),
('Carol', ARRAY[100, 100, 99]);
SELECT student, scores
FROM students
WHERE 100 = ANY(scores);Rivien poissulkeminen NOT + ANY -yhdistelmällä
Kun haluatte löytää rivit, joissa arvo ei esiinny taulukossa, yhdistäkää NOT ja ANY. Huomioikaa, että value <> ANY(arr) tarkoittaa eri asiaa — se palauttaa tosiarvon, jos jokin alkio poikkeaa arvosta, mikä pitää lähes aina paikkansa.
Käyttäkää luotettavaan poissulkutarkistukseen rakennetta NOT (value = ANY(arr)).
-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));Contains-operaattori @>
@>-operaattori tarkistaa, sisältääkö yksi taulukko toisen kaikki alkiot. Ajatelkaa sitä näin: sisältääkö vasen taulukko kaikki oikealla luetellut alkiot?
Tämä löytää tuotteet, joilla on sekä tunniste elektroniikka että tunniste alennus.
SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];Contained-by-operaattori <@
<@-operaattori on operaattorin @> käänteisoperaatio. Se tarkistaa, sisältyykö vasen taulukko kokonaan oikeaan taulukkoon.
Tämä kysely löytää tuotteet, joiden koko tunnisteluettelo on joukon elektroniikka, tietokoneet, alennus osajoukko.
SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];Overlap-operaattori &&
&&-operaattori palauttaa tosiarvon, kun kahdella taulukolla on vähintään yksi yhteinen alkio. Se vastaa taulukoilla kysymistä: onko näillä kahdella luettelolla jotakin yhteistä?
Alla oleva kysely löytää tuotteet, joilla on vähintään yksi yhteinen tunniste annetun ostosluettelon kanssa.
SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];Overlap ja contains — keskeinen ero
Rakenteet @> ja && on helppo sekoittaa keskenään. Tässä on selkeä vertailu:
tags @> ARRAY['a','b']— rivillä on oltava sekä 'a' että 'b'.tags && ARRAY['a','b']— rivillä on oltava vähintään toinen arvoista 'a' tai 'b'.
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];
-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];Suodattaminen koon perusteella array_length-funktiolla
Joskus haluatte löytää rivit, joiden taulukossa on tietty määrä alkioita. array_length(arr, 1) palauttaa ensimmäisen ulottuvuuden alkioiden määrän.
Tämä kysely löytää tuotteet, joissa on täsmälleen kolme tunnistetta.
SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;Taulukkohakujen yhdistäminen muihin ehtoihin
Taulukko-operaattorit toimivat tavallisten SQL-ehtojen rinnalla. Voitte yhdistää ne AND- ja OR-operaattoreihin sekä muihin WHERE-lauseen predikaatteihin täsmällisten suodattimien muodostamiseksi.
-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
AND name < 'N'
ORDER BY name;Taulukoiden indeksointi suorituskyvyn parantamiseksi
Suurissa taulukoissa haut voivat olla hitaita ilman indeksiä. PostgreSQL:n GIN-indeksi (Generalized Inverted Index) on suunniteltu taulukkosarakkeille, ja se tukee operaattoreita @>, <@ ja && tehokkaasti.
ANY ei käytä GIN-indeksiä suoraan, mutta overlap- ja contains-operaattorit käyttävät sitä.
-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);
-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];Pikatesti: taulukko-operaattorit
Testatkaa ymmärrystänne PostgreSQL:n taulukkohakuoperaattoreista.
Oppitunnin kertaus
Tässä oppitunnissa opitte kolme keskeistä tapaa hakea tietoja PostgreSQL:n taulukoista:
- = ANY(arr) — tarkistaa, esiintyykö yksittäinen arvo jossakin taulukon kohdassa.
- @> (contains) — tarkistaa, sisältääkö taulukko kaikki määritetyt alkiot.
- && (overlap) — tarkistaa, onko taulukolla toisen taulukon kanssa vähintään yksi yhteinen alkio.
Opitte myös käänteisen sisältymistarkistuksen tekevän operaattorin <@, kokoon perustuvaan suodatukseen käytettävän array_length-funktion sekä GIN-indeksin, joka nopeuttaa taulukkohakuja suurissa tietojoukoissa. Näiden operaattoreiden yhdistäminen tavallisiin WHERE-ehtoihin antaa tarkan ja ilmaisuvoimaisen tavan käsitellä moniarvoista tietoa.
Opi SQL tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 46
- Oppitunnit
- 183
Usein kysytyt kysymykset
Onko oppitunti ”Taulukoiden sisäinen haku” ilmainen?
Kyllä – oppitunnin ”Taulukoiden sisäinen haku” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Taulukoiden sisäinen haku”?
ANY-, sisältö- ja päällekkäisyysoperaattorit. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Taulukoiden sisäinen haku”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?
Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Taulukosarakkeiden perusteet
- Taulukoiden sisäinen haku
- UNNEST ja koostaminen
- Taulukot vastaan normalisoidut taulut