Logische operatoren#
%LOAD ../data/employees.db
Er zijn drie logische operatoren waarmee je voorwaarden kunt stellen aan condities:
AND
OR
NOT
AND#
Met AND moet aan alle voorwaarden worden voldaan om een resultaat te krijgen. Bij numerieke waarden hoef je geen enkele aanhalingstekens te gebruiken (department_id = 50
) maar bij alfanumerieke velden gebruik je enkele aanhalingstekens (job_id = 'ST_CLERK'
).
SELECT last_name, department_id, salary
FROM employees
WHERE department_id = 50 AND job_id = 'ST_CLERK';
last_name | department_id | salary |
---|---|---|
Rajs | 50 | 3500 |
Davies | 50 | 3100 |
Matos | 50 | 2600 |
Vargas | 50 | 2500 |
Nog een voorbeeld met numerieke waarden in de WHERE. Gebruik geen aanhalingstekens.
SELECT last_name, department_id, salary
FROM employees
WHERE department_id > 50 AND salary > 12000;
last_name | department_id | salary |
---|---|---|
King | 90 | 24000 |
Kochhar | 90 | 17000 |
De Haan | 90 | 17000 |
Datums moeten wel tussen enkele aanhalingstekens.
SELECT last_name, hire_date, job_id
FROM employees
WHERE hire_date > '1998-01-01' AND job_id LIKE 'SA%';
last_name | hire_date | job_id |
---|---|---|
Zlotkey | 2000-01-29 | SA_MAN |
Taylor | 1998-03-24 | SA_REP |
Grant | 1999-05-24 | SA_REP |
OR#
Met OR moet aan één van de voorwaarden voldaan worden.
SELECT department_name, manager_id, location_id
FROM departments
WHERE location_id = 2500 OR manager_id = 124;
department_name | manager_id | location_id |
---|---|---|
Shipping | 124 | 1500 |
Sales | 149 | 2500 |
NOT#
Met NOT moet er juist niet aan een voorwaarde worden voldaan.
SELECT department_name, location_id
FROM departments
WHERE location_id NOT IN(1700,1800);
department_name | location_id |
---|---|
Shipping | 1500 |
IT | 1400 |
Sales | 2500 |
Voorrang#
Als query’s ingewikkeld worden, kan het probleem van de volgorde optreden, oftewel de vraag: welke operator heeft precedentie (voorrang) op de onderste regel van de query?
SELECT (last_name || ' ' || salary * 1.05) employee_raise, department_id, first_name
FROM employees
WHERE department_id IN(50,80) AND first_name LIKE 'C%' OR last_name LIKE '%S%';
employee_raise | department_id | first_name |
---|---|---|
0.0 | 60 | Bruce |
0.0 | 50 | Kevin |
0.0 | 50 | Trenna |
0.0 | 50 | Curtis |
0.0 | 50 | Randall |
0.0 | 50 | Peter |
0.0 | 20 | Michael |
0.0 | 110 | Shelley |
AND komt voor OR. Dus eerst worden alle werknemers geselecteerd die werken op afdeling 50 of 80 EN die een voornaam hebben die begint met een C. Dat is alleen maar Curtis.
Daarna komt OR en worden alle werknemers getoond die een letter ‘s’ in hun achternaam hebben.
Volgorde |
Operator |
---|---|
1 |
rekenkundige operatoren zoals |
2 |
concatenatie ( |
3 |
vergelijkingsoperatoren |
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
Stel dat je in de vorige query de OR en de AND omdraait.
SELECT (last_name || ' ' || salary * 1.05) employee_raise, department_id, first_name
FROM employees
WHERE department_id IN(50,80) OR first_name LIKE 'C%' AND last_name LIKE '%S%';
employee_raise | department_id | first_name |
---|---|---|
0.0 | 50 | Kevin |
0.0 | 50 | Trenna |
0.0 | 50 | Curtis |
0.0 | 50 | Randall |
0.0 | 50 | Peter |
0.0 | 80 | Eleni |
0.0 | 80 | Ellen |
0.0 | 80 | Jonathon |
De beste manier om zeker te zijn van je resultaat is het gebruik van haakjes in de WHERE.
SELECT (last_name || ' ' || salary * 1.05) employee_raise, department_id, first_name
FROM employees
WHERE (department_id IN(50,80) OR first_name LIKE 'C%') AND last_name LIKE '%S%';
employee_raise | department_id | first_name |
---|---|---|
0.0 | 50 | Kevin |
0.0 | 50 | Trenna |
0.0 | 50 | Curtis |
0.0 | 50 | Randall |
0.0 | 50 | Peter |