Hallo Habr!
Vir meer as 3 jaar gee ek SQL aan in verskeie opleidingsentrums, en een van my waarnemings is dat studente SQL beter bemeester en verstaan as hulle 'n taak kry, en nie net oor die moontlikhede en teoretiese grondslae praat nie.
In hierdie artikel sal ek my lys take wat ek studente as huiswerk gee en waarop ons verskillende soorte dinkskrums doen, met jou deel, wat lei tot 'n diep en duidelike begrip van SQL.
SQL (ˈɛsˈkjuˈɛl; eng. gestruktureerde navraagtaal) is 'n verklarende programmeertaal wat gebruik word om data te skep, te wysig en te bestuur in 'n relasionele databasis wat deur 'n toepaslike databasisbestuurstelsel bestuur word.
Jy kan lees oor SQL van verskillende
Hierdie artikel is nie bedoel om jou SQL van nuuts af te leer nie.
Dus, kom ons gaan.
Ons sal die bekende gebruik
Ek neem kennis dat ons slegs take op SELECT sal oorweeg. Daar is geen take op DML en DDL nie.
take
Beperk en sorteer data
Werknemers tafel. Kry 'n lys met inligting oor alle werknemers
besluit
SELECT * FROM employees
Werknemers tafel. Kry 'n lys van alle werknemers genaamd 'David'
besluit
SELECT *
FROM employees
WHERE first_name = 'David';
Werknemers tafel. Kry 'n lys van alle werknemers met job_id gelykstaande aan 'IT_PROG'
besluit
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Werknemers tafel. Kry 'n lys van alle werknemers van die 50ste departement (departement_id) met 'n salaris (salaris) groter as 4000
besluit
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Werknemers tafel. Kry 'n lys van alle werknemers van die 20ste en van die 30ste departement (department_id)
besluit
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Werknemers tafel. Kry 'n lys van alle werknemers wie se laaste letter in hul naam 'a' is
besluit
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Werknemers tafel. Kry 'n lys van alle werknemers van die 50ste en van die 80ste departement (departement_id) wat 'n bonus het (die waarde in die commission_pct kolom is nie leeg nie)
besluit
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Werknemers tafel. Kry 'n lys van alle werknemers wie se naam ten minste 2 letters 'n' bevat
besluit
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Werknemers tafel. Kry 'n lys van alle werknemers wie se naam langer as 4 letters is
besluit
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Werknemers tafel. Kry 'n lys van alle werknemers wie se salaris tussen 8000 en 9000 is (insluitend)
besluit
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Werknemers tafel. Kry 'n lys van alle werknemers wie se naam die simbool '%' bevat
besluit
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Werknemers tafel. Kry 'n lys van alle bestuurder-ID's
besluit
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Werknemers tafel. Kry 'n lys van werknemers met hul posisies in die formaat: Donald(sh_clerk)
besluit
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Gebruik enkelry-funksies om uitset aan te pas
Werknemers tafel. Kry 'n lys van alle werknemers wie se naam langer as 10 letters is
besluit
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Werknemers tafel. Kry 'n lys van alle werknemers wat die letter 'b' in hul naam het (hoofletter-onsensitief)
besluit
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Werknemers tafel. Kry 'n lys van alle werknemers wie se naam ten minste 2 letters 'a' bevat
besluit
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Werknemers tafel. Kry 'n lys van alle werknemers wie se salaris 'n veelvoud van 1000 is
besluit
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Werknemers tafel. Kry die eerste 3-syfernommer van die werknemer se telefoonnommer as sy nommer in die formaat ХХХ.ХХХ.ХХХХ is
besluit
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Afdelings tabel. Kry die eerste woord van die departement se naam vir diegene met meer as een woord in die naam
besluit
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Werknemers tafel. Kry werknemersname sonder die eerste en laaste letter in die naam
besluit
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Werknemers tafel. Kry 'n lys van alle werknemers wie se laaste letter in die naam gelyk is aan 'm' en die lengte van die naam groter as 5 is
besluit
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Dubbele tafel. Kry die datum van volgende Vrydag
besluit
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Werknemers tafel. Kry 'n lys van alle werknemers wat al meer as 17 jaar by die maatskappy is
besluit
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Werknemers tafel. Kry 'n lys van alle werknemers wie se laaste syfer van die telefoonnommer vreemd is en bestaan uit 3 nommers geskei deur 'n kolletjie
besluit
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Werknemers tafel. Kry 'n lys van alle werknemers wie se job_id-waarde na die '_'-teken ten minste 3 karakters het, maar hierdie waarde na die '_' is nie gelyk aan 'CLERK'
besluit
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Werknemers tafel. Kry 'n lys van alle werknemers deur alle '.' in die PHONE_NUMBER-waarde te vervang op '-'
besluit
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Gebruik omskakelingsfunksies en voorwaardelike uitdrukkings
Werknemers tafel. Kry 'n lys van alle werknemers wat op die eerste dag van die maand kom werk het (enige)
besluit
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Werknemers tafel. Kry 'n lys van alle werknemers wat in 2008 kom werk het
besluit
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
DUBBELE tafel. Wys môre se datum in die formaat: Môre is Tweede dag van Januarie
besluit
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Werknemers tafel. Kry 'n lys van alle werknemers en hul begindatum in die formaat: 21 Junie 2007
besluit
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Werknemers tafel. Kry 'n lys van werknemers met verhoogde salarisse met 20%. Wys salaris met dollarteken
besluit
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Werknemers tafel. Kry 'n lys van alle werknemers wat in Februarie 2007 kom werk het.
besluit
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';
DUBBELE tafel. Voer huidige datum, + sekonde, + minuut, + uur, + dag, + maand, + jaar uit
besluit
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;
Werknemers tafel. Kry 'n lys van alle werknemers met volle salarisse (salaris + kommissie_pct(%)) in die formaat: $24,000.00
besluit
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Werknemers tafel. Kry 'n lys van alle werknemers en inligting oor die beskikbaarheid van salarisbonusse (Ja/Nee)
besluit
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Werknemers tafel. Kry die salarisvlak van elke werknemer: Minder as 5000 word beskou as Lae vlak, Groter as of gelyk aan 5000 en minder as 10000 word as normale vlak beskou, Groter as of gelyk aan 10000 word as hoë vlak beskou
besluit
SELECT first_name,
salary,
CASE
WHEN salary < 5000 THEN 'Low'
WHEN salary >= 5000 AND salary < 10000 THEN 'Normal'
ELSE 'High'
END salary_level
FROM employees;
Lande tabel. Vir elke land, wys die streek waarin dit geleë is: 1-Europa, 2-Amerika, 3-Asië, 4-Afrika (sonder aansluiting)
besluit
SELECT country_name country,
DECODE (region_id,
1, 'Europe',
2, 'America',
3, 'Asia',
4, 'Africa',
'Unknown')
region
FROM countries;
SELECT country_name
country,
CASE region_id
WHEN 1 THEN 'Europe'
WHEN 2 THEN 'America'
WHEN 3 THEN 'Asia'
WHEN 4 THEN 'Africa'
ELSE 'Unknown'
END
region
FROM countries;
Rapporteer saamgevoegde data deur die groepfunksies te gebruik
Werknemers tafel. Kry 'n verslag deur department_id met minimum en maksimum salaris, vroeë en laat aankomsdatums en aantal werknemers. Sorteer volgens aantal werknemers (beskrywing)
besluit
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;
Werknemers tafel. Hoeveel werknemers wie se name met dieselfde letter begin? Sorteer volgens hoeveelheid. Wys slegs dié waar die getal groter as 1 is
besluit
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;
Werknemers tafel. Hoeveel werknemers werk in dieselfde departement en ontvang dieselfde salaris?
besluit
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Werknemers tafel. Kry 'n verslag van hoeveel werknemers op elke dag van die week aangestel is. Sorteer volgens hoeveelheid
besluit
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Werknemers tafel. Kry 'n verslag oor hoeveel werknemers per jaar aangestel is. Sorteer volgens hoeveelheid
besluit
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Werknemers tafel. Kry die aantal departemente wat werknemers het
besluit
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Werknemers tafel. Kry lys van department_id met meer as 30 werknemers
besluit
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Werknemers tafel. Kry 'n lys van department_ids en die afgeronde gemiddelde salaris van werknemers in elke departement.
besluit
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Lande tabel. Kry 'n lys van streek_id som van alle letters van alle landname waarin meer as 60
besluit
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Werknemers tafel. Kry 'n lys van department_id waarin werknemers van verskeie (>1) job_id werk
besluit
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Werknemers tafel. Kry 'n lys van bestuurder_id wie se aantal ondergeskiktes meer as 5 is en die som van alle salarisse van sy ondergeskiktes groter as 50000 XNUMX is
besluit
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Werknemers tafel. Kry 'n lys van bestuurder_id wie se gemiddelde salaris van al sy ondergeskiktes tussen 6000 en 9000 is wat nie bonusse ontvang nie (commission_pct is leeg)
besluit
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;
Werknemers tafel. Kry die maksimum salaris van alle werknemers job_id wat eindig met die woord 'KLERK'
besluit
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';
Werknemers tafel. Kry die maksimum salaris onder al die gemiddelde salarisse vir die departement
besluit
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Werknemers tafel. Kry die aantal werknemers met dieselfde aantal letters in hul naam. Wys terselfdertyd net diegene wie se naam langer as 5 is en die aantal werknemers met dieselfde naam meer as 20 is. Sorteer volgens naamlengte
besluit
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);
Vertoon data van veelvuldige tabelle deur verbindings te gebruik
Tabel werknemers, departemente, liggings, lande, streke. Kry 'n lys van streke en die aantal werknemers in elke streek
besluit
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;
Tabel werknemers, departemente, liggings, lande, streke. Kry gedetailleerde inligting oor elke werknemer:
Voornaam, Van, Departement, Werk, Straat, Land, Streek
besluit
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);
Werknemers tafel. Wys alle bestuurders wat meer as 6 werknemers het
besluit
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;
Werknemers tafel. Wys alle werknemers wat aan niemand rapporteer nie
besluit
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;
Werknemerstabel, Job_history. Die Werknemerstabel stoor alle werknemers. Die Job_history-tabel stoor werknemers wat die maatskappy verlaat het. Kry 'n verslag oor alle werknemers en hul status in die maatskappy (In diens of die maatskappy verlaat met die datum van vertrek)
Voorbeeld:
voornaam | status
jennifer | Het die maatskappy op 31 Desember 2006 verlaat
Clara | Werk tans
besluit
SELECT first_name,
NVL2 (
end_date,
TO_CHAR (end_date, 'fm""Left the company at"" DD ""of"" Month, YYYY'),
'Currently Working')
status
FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);
Tabel werknemers, departemente, liggings, lande, streke. Kry 'n lys van werknemers wat in Europa woon (streeknaam)
besluit
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';
Tafelwerknemers, Departemente. Wys alle departemente met meer as 30 werknemers
besluit
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Tafelwerknemers, Departemente. Wys alle werknemers wat nie in enige afdeling is nie
besluit
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;
Tafelwerknemers, Departemente. Wys alle departemente met geen werknemers nie
besluit
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Werknemers tafel. Wys alle werknemers wat geen ondergeskiktes het nie
besluit
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Tafel Werknemers, Poste, Departemente. Wys werknemers in die formaat: First_name, Job_title, Department_name.
Voorbeeld:
voornaam | postitel | Departement_naam
Donald | gestuur | Klerk Versending
besluit
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);
Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders in 2005 werk gekry het, maar terselfdertyd het hierdie werkers self voor 2005 werk gekry
besluit
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');
Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders 'n werk gekry het in die maand Januarie van enige jaar en die lengte van die postitel van hierdie werknemers is meer as 15 karakters
besluit
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;
Gebruik subnavrae om navrae op te los
Werknemers tafel. Kry 'n lys van werknemers met die langste naam.
besluit
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Werknemers tafel. Kry 'n lys van werknemers met 'n salaris groter as die gemiddelde salaris van alle werknemers.
besluit
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Tafelwerknemers, departemente, liggings. Kry die stad waarin werknemers altesaam die minste verdien.
besluit
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);
Werknemers tafel. Kry 'n lys van werknemers wie se bestuurder 'n salaris van meer as 15000 XNUMX ontvang.
besluit
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Tafelwerknemers, Departemente. Wys alle departemente met geen werknemers nie
besluit
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Werknemers tafel. Wys alle werknemers wat nie bestuurders is nie
besluit
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Werknemers tafel. Wys alle bestuurders wat meer as 6 werknemers het
besluit
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Tafelwerknemers, Departemente. Wys werknemers wat in die IT-afdeling werk
besluit
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Tafel Werknemers, Poste, Departemente. Wys werknemers in die formaat: First_name, Job_title, Department_name.
Voorbeeld:
voornaam | postitel | Departement_naam
Donald | gestuur | Klerk Versending
besluit
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;
Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders in 2005 werk gekry het, maar terselfdertyd het hierdie werkers self voor 2005 werk gekry
besluit
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');
Werknemers tafel. Kry 'n lys van werknemers wie se bestuurders 'n werk gekry het in die maand Januarie van enige jaar en die lengte van die postitel van hierdie werknemers is meer as 15 karakters
besluit
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;
Dit is al vir nou.
Ek hoop die take was interessant en opwindend.
Ek sal soveel as moontlik by hierdie lys voeg.
Ek sal ook bly wees vir enige kommentaar en voorstelle.
NS: As iemand met 'n interessante taak op SELECT vorendag kom, skryf in die kommentaar, ek sal dit by die lys voeg.
Dankie.
Bron: will.com