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 (CONCAT)

3

vergelijkingsoperatoren <, <=, >, >=, <>

4

IS (NOT) NULL, LIKE, (NOT) IN

5

(NOT) BETWEEN

6

NOT

7

AND

8

OR

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