Hallo, Habr!
Eg har undervist i SQL i over 3 Är i ulike treningssenter, og ei av mine observasjonar er at studentar meislar og forstÄr SQL betre nÄr dei blir sett oppgÄver, snarare enn berre Ä bli fortalt om moglegheiter og teoretiske grunnlag.
I denne artikkelen vil eg dele med deg mi liste over oppgÄver som eg gir studentar som heimlek og som vi har diverse brainstorming pÄ, noko som fÞrer til djup og klar forstÄing av SQL.

SQL (ËÉsËkjuËÉl; eng. structured query language â «sprĂ„k for strukturerte spĂžrringar») â er eit deklarativt programmeringssprĂ„k som blir brukt for Ă„ lage, endre og administrere data i relasjonsdatabasar, styrt av den aktuelle databasedefinisjonen.
Du kan lese om SQL frÄ fleire .
Denne artikkelen har ikkje som mÄl Ä lÊre deg SQL frÄ grunnen av.
SĂ„ la oss starte.
Vi skal bruke den velkjente i Oracle med dens tabeller ():

Eg vil merke at vi berre vil sjÄ pÄ oppgÄver knytt til SELECT. Det finnes ingen DML og DDL oppgÄver.
Oppgaver
Avgrense og sortere data
Tabell Employees. Hent ei liste med informasjon om alle tilsette
Solution
SELECT * FROM employees
Tabell Employees. Hent ei liste over alle tilsette som heiter âDavidâ
Solution
SELECT *
FROM employees
WHERE first_name = 'David';
Tabell Employees. Hent ei liste over alle tilsette med job_id lik âIT_PROGâ
Solution
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Tabell Employees. Hent ei liste over alle tilsette frÄ avdeling 50 (department_id) med lÞnn (salary) over 4000
Solution
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Tabell Employees. Hent ei liste over alle tilsette frÄ avdeling 20 og avdeling 30 (department_id)
Solution
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Tabell Employees. Hent ei liste over alle tilsette der siste bokstav i namnet er âaâ
Solution
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Tabell Employees. Hent ei liste over alle tilsette frÄ avdeling 50 og avdeling 80 (department_id) som har ein bonus (verdi i kolonnen commission_pct er ikkje tom)
Solution
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Tabell Employees. Hent ei liste over alle tilsette der namnet inneheld minst 2 bokstavar ânâ
Solution
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Tabell Employees. Hent ei liste over alle tilsette der lengda pÄ namnet er meir enn 4 bokstavar
Solution
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Tabell over ansatte. Hent en liste over alle ansatte som har en lĂžnn mellom 8000 og 9000 (inkludert)
Solution
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Tabell over ansatte. Hent en liste over alle ansatte som har et symbol '%' i navnet sitt
Solution
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Tabell over ansatte. Hent en liste over alle ID-er til ledere
Solution
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Tabell over ansatte. Hent en liste over ansatte med deres posisjoner i formatet: Donald(sh_clerk)
Solution
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Bruke enkeltlinjefunksjoner for Ă„ tilpasse utdata
Tabell over ansatte. Hent en liste over alle ansatte hvor lengden pÄ navnet er mer enn 10 bokstaver
Solution
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Tabell over ansatte. Hent en liste over alle ansatte som har bokstaven 'b' i navnet (uavhengig av stor og liten skrift)
Solution
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Tabell over ansatte. Hent en liste over alle ansatte som har minst 2 bokstaver 'a' i navnet
Solution
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Tabell over ansatte. Hent en liste over alle ansatte hvis lĂžnn er delelig med 1000
Solution
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Tabell over ansatte. Hent de fĂžrste 3 sifferne fra ansattes telefonnummer hvis nummeret er i formatet XXX.XXX.XXXX
Solution
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Tabell over avdelinger. Hent det fĂžrste ordet fra avdelingsnavnet for de som har mer enn ett ord i navnet
Solution
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Tabell over ansatte. Hent ansattes navn uten fĂžrste og siste bokstav i navnet
Solution
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Tabell over ansatte. Hent en liste over alle ansatte hvor den siste bokstaven i navnet er 'm' og lengden pÄ navnet er mer enn 5
Solution
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Tabell over Dual. Hent datoen for neste fredag
Solution
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Tabell over ansatte. Hent en liste over alle ansatte som har vÊrt i selskapet i mer enn 17 Är
Solution
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Tabell over ansatte. Hent en liste over alle ansatte hvor den siste sifferen i telefonnummeret er oddetall og bestÄr av 3 siffer delt med punktum
Solution
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Ansatt-tabellen. Hente listen over alle ansatte hvor verdien for job_id etter '_' har minst 3 tegn, men denne verdien etter '_' er ikke lik 'CLERK'
Solution
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Ansatt-tabellen. Hente listen over alle ansatte ved Ă„ erstatte alle '.' i PHONE_NUMBER med '-'
Solution
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Bruke konverteringsfunksjoner og betingede uttrykk
Ansatt-tabellen. Hente listen over alle ansatte som begynte i fÞrste dag i en mÄned (hvilken som helst)
Solution
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Ansatt-tabellen. Hente listen over alle ansatte som begynte i 2008
Solution
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
DUAL-tabellen. Vise i morgen dato i format: Tomorrow is Second day of January
Solution
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Ansatt-tabellen. Hente listen over alle ansatte og ansettelsesdatoen for hver i formatet: 21st of June, 2007
Solution
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Ansatt-tabellen. Hente listen over ansatte med 20 % Ăžkning i lĂžnn. Vise lĂžnnen med dollartegn
Solution
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Ansatt-tabellen. Hente listen over alle ansatte som begynte i februar 2007.
Solution
SELECT *
FROM employees
WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));
SELECT *
FROM employees
WHERE to_char(hire_date,'MM.YYYY') = '02.2007';
DUAL-tabellen. Vise den aktuelle datoen, + sekund, + minutt, + time, + dag, + mÄned, + Är
Solution
SELECT SYSDATE now,
SYSDATE + 1 / (24 * 60 * 60) plus_second,
SYSDATE + 1 / (24 * 60) plus_minute,
SYSDATE + 1 / 24 plus_hour,
SYSDATE + 1 plus_day,
ADD_MONTHS (SYSDATE, 1) plus_month,
ADD_MONTHS (SYSDATE, 12) plus_year
FROM DUAL;
Ansatt-tabellen. Hente listen over alle ansatte med full lĂžnn (salary + commission_pct(%)) i formatet: $24,000.00
Solution
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Ansatt-tabellen. Hente listen over alle ansatte og informasjon om bonusene til lĂžnnen (Ja/Nei)
Solution
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Ansatt-tabellen. Hente lÞnnsnivÄet for hver ansatt: Mindre enn 5000 regnes som Lavt nivÄ, StÞrre eller lik 5000 og mindre enn 10000 regnes som Normalt nivÄ, StÞrre eller lik 10000 regnes som HÞyt nivÄ
Solution
SELECT first_name,
salary,
CASE
WHEN salary = 5000 AND salary < 10000 THEN 'Normal'
ELSE 'HĂžg'
END salary_level
FROM employees;
Tabell Countries. Vis regionen for hvert land: 1-Europa, 2-Amerika, 3-Asia, 4-Afrika (uten Join)
Solution
SELECT country_name country,
DECODE (region_id,
1, 'Europa',
2, 'Amerika',
3, 'Asia',
4, 'Afrika',
'Ukjent')
region
FROM countries;
SELECT country_name
country,
CASE region_id
WHEN 1 THEN 'Europa'
WHEN 2 THEN 'Amerika'
WHEN 3 THEN 'Asia'
WHEN 4 THEN 'Afrika'
ELSE 'Ukjent'
END
region
FROM countries;
Rapportere aggregert data ved hjelp av gruppefunksjoner
Tabell Employees. FĂ„ en rapport for department_id med minimum og maksimum lĂžnn, tidlig og sent ansettelsesdato og antall ansatte. Sorter etter antall ansatte (synkende rekkefĂžlge)
Solution
SELECT department_id,
MIN (salary) min_salary,
MAX (salary) max_salary,
MIN (hire_date) min_hire_date,
MAX (hire_date) max_hire_Date,
COUNT (*) count
FROM employees
GROUP BY department_id
order by count(*) desc;
Tabell Employees. Hvor mange ansatte har navn som begynner med samme bokstav? Sorter etter antall. Vis kun de med antall stĂžrre enn 1
Solution
SELECT SUBSTR (first_name, 1, 1) first_char, COUNT (*)
FROM employees
GROUP BY SUBSTR (first_name, 1, 1)
HAVING COUNT (*) > 1
ORDER BY 2 DESC;
Tabell Employees. Hvor mange ansatte arbeider i samme avdeling og har samme lĂžnn?
Solution
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Tabell Employees. FĂ„ en rapport om hvor mange ansatte som ble ansatt hver ukedag. Sorter etter antall
Solution
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Tabell Employees. FÄ en rapport om hvor mange ansatte som ble ansatt hvert Är. Sorter etter antall
Solution
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Tabell Employees. FĂ„ antall avdelinger som har ansatte
Solution
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Tabell Employees. FĂ„ en liste over department_id der mer enn 30 ansatte jobber
Solution
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Tabell Employees. FĂ„ en liste over department_id og avrundet gjennomsnittlig lĂžnn for ansatte i hver avdeling.
Solution
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Tabell Countries. FĂ„ en liste over region_id med summen av alle bokstaver i country_name der det er mer enn 60
Solution
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Tabell over ansatte. Hent en liste over department_id der arbeidere jobber med flere (>1) job_id
Solution
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Tabell over ansatte. Hent en liste over manager_id der antallet av underordnede er mer enn 5 og summen av alle lĂžnningene til underordnede er mer enn 50000
Solution
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Tabell over ansatte. Hent en liste over manager_id der gjennomsnittlig lÞnn for alle underordnede ligger mellom 6000 og 9000 som ikke fÄr bonuser (commission_pct er tomt)
Solution
SELECT manager_id, AVG (salary) avg_salary
FROM employees
WHERE commission_pct IS NULL
GROUP BY manager_id
HAVING AVG (salary) BETWEEN 6000 AND 9000;
Tabell over ansatte. Hent den hÞyeste lÞnnen blant alle ansatte med job_id som slutter pÄ ordet 'CLERK'
Solution
SELECT MAX (salary) max_salary
FROM employees
WHERE job_id LIKE '%CLERK';
SELECT MAX (salary) max_salary
FROM employees
WHERE SUBSTR (job_id, -5) = 'CLERK';
Tabell over ansatte. Hent den hĂžyeste lĂžnnen blant alle gjennomsnittlige lĂžnninger per avdeling
Solution
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Tabell over ansatte. Hent antall ansatte med samme antall bokstaver i navnet. Vise kun de med navn lengre enn 5 og antall ansatte med det navnet stÞrre enn 20. Sorter etter lengden pÄ navnet
Solution
SELECT LENGTH (first_name), COUNT (*)
FROM employees
GROUP BY LENGTH (first_name)
HAVING LENGTH (first_name) > 5 AND COUNT (*) > 20
ORDER BY LENGTH (first_name);
SELECT LENGTH (first_name), COUNT (*)
FROM employees
WHERE LENGTH (first_name) > 5
GROUP BY LENGTH (first_name)
HAVING COUNT (*) > 20
ORDER BY LENGTH (first_name);
Visning av data fra flere tabeller ved hjelp av joins
Tabell over ansatte, avdelinger, lokasjoner, land, regioner. Hent en liste over regioner og antall ansatte i hver region
Solution
SELECT region_name, COUNT (*)
FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id)
JOIN countries c ON (l.country_id = c.country_id)
JOIN regions r ON (c.region_id = r.region_id)
GROUP BY region_name;
Tabell over ansatte, avdelinger, lokasjoner, land, regioner. Hent detaljert informasjon om hver ansatt:
Fornavn, Etternavn, Avdeling, Jobb, Gate, Land, Region
Solution
SELECT First_name,
Last_name,
Department_name,
Job_id,
street_address,
Country_name,
Region_name
FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id)
JOIN countries c ON (l.country_id = c.country_id)
JOIN regions r ON (c.region_id = r.region_id);
Tabell over ansatte. Vis alle ledere som har mer enn 6 ansatte under seg
Solution
SELECT man.first_name, COUNT (*)
FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
HAVING COUNT (*) > 6;
Tabell over ansatte. Vise alle ansatte som ikke har noen underordnede.
Solution
SELECT emp.first_name
FROM employees emp
LEFT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE man.FIRST_NAME IS NULL;
SELECT first_name
FROM employees
WHERE manager_id IS NULL;
Tabell over ansatte, arbeidshistorikk. I tabellen Ansatte lagres alle ansatte. I tabellen Arbeidshistorikk lagres ansatte som har forlatt selskapet. Hent rapport om alle ansatte og deres status i selskapet (Jobber eller har forlatt selskapet med dato for avgang).
Eksempel:
first_name | status
Jennifer | Forlot selskapet 31. desember 2006
Clara | Jobber for tiden
Solution
SELECT first_name,
NVL2 (
end_date,
TO_CHAR (end_date, 'fm""Forlot selskapet pÄ"" DD ""i"" MÄned, YYYY'),
'Jobber for tiden')
status
FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);
Tabell over ansatte, avdelinger, beliggenheter, land, regioner. Hent liste over ansatte som bor i Europa (region_name).
Solution
SELECT first_name
FROM employees
JOIN departments USING (department_id)
JOIN locations USING (location_id)
JOIN countries USING (country_id)
JOIN regions USING (region_id)
WHERE region_name = 'Europe';
SELECT first_name
FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id)
JOIN countries c ON (l.country_id = c.country_id)
JOIN regions r ON (c.region_id = r.region_id)
WHERE region_name = 'Europe';
Tabell over ansatte, avdelinger. Vise alle avdelinger der mer enn 30 ansatte jobber.
Solution
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Tabell over ansatte, avdelinger. Vise alle ansatte som ikke tilhĂžrer noen avdeling.
Solution
SELECT first_name
FROM employees e
LEFT JOIN departments d ON (e.department_id = d.department_id)
WHERE d.department_name IS NULL;
SELECT first_name
FROM employees
WHERE department_id IS NULL;
Tabell over ansatte, avdelinger. Vise alle avdelinger som ikke har noen ansatte.
Solution
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Tabell over ansatte. Vise alle ansatte som ikke har noen som rapporterer til dem.
Solution
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Tabell over ansatte, jobber, avdelinger. Vise ansatte i formatet: First_name, Job_title, Department_name.
Eksempel:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Solution
SELECT first_name, job_title, department_name
FROM employees e
JOIN jobs j ON (e.job_id = j.job_id)
JOIN departments d ON (d.department_id = e.department_id);
Tabell over ansatte. Hent liste over ansatte hvis ledere begynte i jobben i 2005, men som selv begynte Ă„ jobbe fĂžr 2005.
Solution
SELECT emp.*
FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE TO_CHAR (man.hire_date, 'YYYY') = '2005'
AND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Tabell for ansatt. Hent liste over ansatte hvis ledere startet i januar mÄned i et hvilket som helst Är, og lengden pÄ stillingstittelen til disse ansatte er mer enn 15 tegn.
Solution
SELECT emp.*
FROM employees emp
JOIN employees man ON (emp.manager_id = man.employee_id)
JOIN jobs j ON (emp.job_id = j.job_id)
WHERE TO_CHAR (man.hire_date, 'MM') = '01' AND LENGTH (j.job_title) > 15;
Bruke subspĂžrringer for Ă„ lĂžse spĂžrringer
Tabell for ansatt. Hent liste over ansatte med det lengste navnet.
Solution
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Tabell for ansatt. Hent liste over ansatte med lĂžnn over gjennomsnittlig lĂžnn for alle ansatte.
Solution
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Tabell for ansatte, avdelinger, steder. Hent byen der ansatte totalt tjener minst.
Solution
SELECT city
FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id)
GROUP BY city
HAVING SUM (salary) =
( SELECT MIN (SUM (salary))
FROM employees e
JOIN departments d ON (e.department_id = d.department_id)
JOIN locations l ON (d.location_id = l.location_id)
GROUP BY city);
Tabell for ansatt. Hent liste over ansatte hvis leder tjener mer enn 15000.
Solution
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Tabell over ansatte, avdelinger. Vise alle avdelinger som ikke har noen ansatte.
Solution
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Tabell for ansatt. Vis alle ansatte som ikke er ledere.
Solution
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Tabell over ansatte. Vis alle ledere som har mer enn 6 ansatte under seg
Solution
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Tabell for ansatte, avdelinger. Vis ansatte som jobber i IT-avdelingen.
Solution
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Tabell over ansatte, jobber, avdelinger. Vise ansatte i formatet: First_name, Job_title, Department_name.
Eksempel:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Solution
SELECT first_name,
(SELECT job_title
FROM jobs
WHERE job_id = e.job_id)
job_title,
(SELECT department_name
FROM departments
WHERE department_id = e.department_id)
department_name
FROM employees e;
Tabell over ansatte. Hent liste over ansatte hvis ledere begynte i jobben i 2005, men som selv begynte Ă„ jobbe fĂžr 2005.
Solution
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
AND hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Tabell for ansatt. Hent liste over ansatte hvis ledere startet i januar mÄned i et hvilket som helst Är, og lengden pÄ stillingstittelen til disse ansatte er mer enn 15 tegn.
Solution
SELECT *
FROM employees e
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE TO_CHAR (hire_date, 'MM') = '01')
AND (SELECT LENGTH (job_title)
FROM jobs
WHERE job_id = e.job_id) > 15;
Det er alt for nÄ.
Eg hÄpar oppgÄvene var interessante og spennande.
Eg vil sÄ langt som mogleg oppdatere denne oppgavelista.
Eg set ogsÄ pris pÄ eventuelle merknader og forslag.
P.S.: Om nokon kjem pÄ ei interessant oppgÄve pÄ SELECT, skriv i kommentarfeltet, sÄ legg eg den til lista.
Takk.
Kilde: habr.com
