Oefenen met SQL

Status
Niet open voor verdere reacties.

Dummie01

Gebruiker
Lid geworden
17 jan 2011
Berichten
7
Hallo mede-users,

Nadat ik de W3-schools cursus over SQL heb gevolgd, heb ik op m'n eigen pc een Oracle database geïnstalleerd met enkele tabellen. Ik ben hier een tijdje mee aan het stoeien geweest en wil nu een volgende stap maken in mijn SQL kennis. Je raad het al, ik loop vast....

Ik heb voor mijzelf de volgende opdracht bedacht:

- selecteer alle medewerkers die aangenomen zijn vóór 01-01-'99
- alle beroepen met een salaris dat ligt tussen 9.000 en 20.000
via een query wil ik het volgende tonen: het salaris, naam (voornaam + achternaam) + departement waar de medewerker aan is gekoppeld.

Dit alles moet getoond worden d.m.v. 1 query!

De tabellen zien er als volgt uit:
(ik heb enkele velden weggelaten die niet relevant zijn voor deze vraag)

JOBS
JOB_ID
JOB_TITLE

DEPARTMENTS
DEPARTMENT_ID
DEPARTMENT_NAME
MANAGER_ID

EMPLOYEES
EMPLOYEE_ID
FIRST_NAME
LAST_NAME
HIRE_DATE
JOB_ID
SALARY
DEPARTMENT_ID


Ik probeer de vraag per onderdeel op te lossen. Helaas loop ik in onderstaande query al vast.

[SQL]SELECT CONCAT(employees.first_name, employees.last_name) AS name, employees.salary, departments.department_name
FROM customers, employees, departments, jobs
WHERE employees.hire_date < '01-01-99'
AND employees.salary BETWEEN 9000 AND 20000[/SQL]

Het resultaat:
NAME SALARY DEPARTMENT_NAME
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
NeenaKochhar 17050 Administration
 
Laatst bewerkt:
Reactie:

Je zult in elk geval in de 'WHERE' de tabellen aan elkaar moeten linken, dus i.p.v.
WHERE employees.hire_date < '01-01-99'
bijvoorbeeld:
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
AND EMPLOYEES.JOB_ID = JOBS.JOB_ID
AND employees.hire_date < '01-01-99'

Hetzelfde met CUSTOMERS.
 
Jagert, bedankt voor je reactie. De uitwerking die je gaf was inderdaad de correct oplossing.

De uitwerking is nu:

[sql]SELECT CONCAT(employees.first_name, employees.last_name) AS name, employees.salary, departments.department_name
FROM employees, departments, jobs
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
AND EMPLOYEES.JOB_ID = JOBS.JOB_ID
AND employees.hire_date < '01-01-99'
AND employees.salary BETWEEN 9000 AND 20000[/sql]

Ik sluit dit topic nog niet aangezien ik verder blijf oefenen op de database. Mogelijke nieuwe vragen plaats ik ook in dit topic.
 
Ik heb nog een probleem in mijn uitwerking. De kolom 'NAME' (samenvoeging van first_name en last_name) heeft geen spatie. Ik heb verschillende opties geprobeerd maar geen enkele werkt

SELECT (employees.first_name + ', ' + employees.last_name) AS Name -> foutmelding
CONCAT(employees.first_name, ' ', employees.last_name) AS name -> foutmelding
SELECT CONCAT('employees.first_name', ' employees.last_name') AS name -> wordt getoond als employees.first_name employees.last_name
CONCAT(employees.first_name||' '||employees.last_name) AS name -> foutmelding

NAME SALARY DEPARTMENT_NAME
NeenaKochhar 17050 Executive
LexDe Haan 17050 Executive
AlexanderHunold 9050 IT
NancyGreenberg 12050 Finance
DanielFaviet 9050 Finance
DenRaphaely 11050 Purchasing
JohnRussell 14050 Sales
KarenPartners 13550 Sales
AlbertoErrazuriz 12050 Sales
PeterTucker 10000 Sales
 
Laatst bewerkt:
SELECT CONCAT(employees.first_name, ' ', employees.last_name) AS name

zou moeten werken als het goed is.
 
Dat was ook mijn verwachting maar helaas.

De volgende foutmelding verschijnt
[sql]ORA-00909: invalid number of arguments[/sql]

Ik voer deze query uit op een Oracle Database (Oracle Database Express Edition)

Google geeft de volgende oplossing:

Error:
ORA-00909: invalid number of arguments

Cause:
You tried to call an Oracle function, but you used the incorrect number of arguments for the function.

Action:
The options to resolve this Oracle error are:

1. This error can be corrected by providing the correct number of arguments when calling the Oracle function.

To view a listing of the Oracle functions and their syntaxes, go to our Oracle functions webpage.
 
Laatst bewerkt:
Het zou kunnen dat concat altijd twee argumenten wil... wel een beetje een faal maarja. Probeer het eens zo:

[sql]
SELECT CONCAT( CONCAT(employees.first_name, ' ' ), employees.last_name) AS name
[/sql]
 
Bedankt voor je oplossing Frats, dit werkt! :thumb:

Omdat ik nog verder ga met oefenen en stuntelen, laat ik het topic open staan.
 
Ik heb een nieuw probleem waar ik niet uit kom, hopelijk weten jullie mij weer te helpen!

De opdracht die ik mijzelf heb gesteld is de volgende:
Alle medewerkers (EMPLOYEES) die vallen onder het kantoor (department.department_id = locations.department_id) in Seattle (CITY) krijgen een salarisverhoging van €500 (SET employees.salary = salary + 500).

Dit zijn de tabellen die ik gebruik:
(niet relevante velden weggelaten)

DEPARTMENTS
DEPARTMENT_ID
DEPARTMENT_NAME

EMPLOYEES
EMPLOYEE_ID
FIRST_NAME
LAST_NAME
SALARY
DEPARTMENT_ID

LOCATIONS
LOCATION_ID
CITY

Eerst heb ik gekeken hoeveel mensen er in Seattle werken d.m.v het volgende script:
[sql]
SELECT CONCAT(CONCAT(employees.first_name, ' '), employees.last_name) AS name, locations.city
FROM employees, departments, locations
WHERE employees.department_id = departments.department_id
AND departments.location_id = locations.location_id
AND CITY = 'Seattle'[/sql]

Bovenstaande script werkt correct. Nu ik weet welke medewerkers een verhoging van €500 krijgen heb ik onderstaande script gemaakt, dit levert de volgende fout op ORA-00933: SQL command not properly ended

[SQL]UPDATE employees
SET employees.salary = employees.salary +500
WHERE (
SELECT locations.city, employees.salary
FROM employees, departments, locations
WHERE employees.department_id = departments.department_id
AND departments.location_id = locations.location_id
AND CITY = 'Seattle')[/SQL]
 
Laatst bewerkt:
Waarom heb je een SELECT statement in je UPDATE statement? Dat lijkt me niet echt de bedoeling.
 
Nieuwe poging met enkele wijzigingen:

[sql]UPDATE employees
SET employees.salary = employees.salary +500
FROM employees, departments, locations
WHERE employees.department_id = departments.department_id
AND departments.location_id = locations.location_id
AND locations.CITY = 'Seattle'[/sql]

de bijbehorende foutmelding: ORA-00933: SQL command not properly ended
 
UPDATE queries hebben geen FROM, je geeft de benodigde tabellen in de UPDATE al aan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan