Meer doen met SQL

Door Ger van Steenderen, 6 jaar geleden, 21.362x bekeken

Alles wat je wil weten over joins, subquery's, group by en conditional statements

Gesponsorde koppelingen

Inhoudsopgave

  1. Inleiding
  2. Joins algemeen
  3. Inner en outer join
  4. Cross en natural join
  5. Joins in de praktijk (1)
  6. Subqueries
  7. Joins in de praktijk (2)
  8. Group by
  9. Group by voorbeelden
  10. Conditional staments
  11. Nog meer voorbeelden
  12. Nawoord

 

Er zijn 17 reacties op 'Meer doen met sql'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
Update: hoofdstuk 7 nog wat voorbeelden toegevoegd.
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Dankjewel voor de tutorial Ger! Op sommige punten best ingewikkeld, maar wie weet kan ik er in de toekomst een keer m'n voordeel mee doen.

Offtopic:

Op de "Group by" pagina staat ergens:

FROM scores s
JOIN players p USING (player_id)

Ben je daar niet 2x AS vergeten?

Wouter J
Wouter J
6 jaar geleden
 
0 +1 -0 -1
Nee, AS kun je weglaten
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Oké, thanks WJ.
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
Ozzie, ingewikkeld of onduidelijk?
Als er dingen zijn die niet duidelijk genoeg zijn uitgelegd, graag even vermelden, dan kan ik het eventueel aanpassen.
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Misschien een combinatie van. Het is soms een beetje van de hak op de tak geschreven. Soms is het vrij abstract en zou het fijn zijn als je wat concreter bent, bijv.

tabel_c.c_id
tabel_c.a_id
tabel_c.c_naam
tabel_c.c_iets
tabel_c.c_nogwat

Hier zou ik het prettiger vinden als er zoiets staat:

tabel_c.id
tabel_c.auto_id
tabel_c.merk
tabel_c.kleur
tabel_c.versie

Om maar eens wat te noemen. En het is ook nogal veel allemaal. Hier en daar mag er wel een witregeltje tussen :) Maar misschien ligt het aan mij hoor...
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
Er zaten inderdaad wel wat stukjes bij die die nogal hak op de tak waren, dat komt omdat ik sneller denk dan type (gelukkig).

In de algemene zin heb ik bewust voor het abstracte gekozen, omdat het niet concreet over een bepaalde tabel en/of kolom gaat.

Overigens, zoals jij je kolommen benoemt zal je mij nooit zien doen, ik geef altijd de tabelnaam (of een gedeelte daarvan) mee aan de kolomnaam.
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Het was puur een voorbeeld op basis van jouw eigen kolom. Maar waarom doe je dat... (een gedeelte van) de tabelnaam meegeven? Krijg je toch hele lange namen allemaal?
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
Om te voorkomen dat er in de query's aliassen gebruikt moeten worden als verschillende tabellen kolommen met dezelfde naam hebben.
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Gebruik jij dan nooit aliassen? Zijn aliassen slecht?
Ward van der Put
Ward van der Put
6 jaar geleden
 
0 +1 -0 -1
Een alias gebruik je in de regel alleen als je een expressie uitvoert en je in PHP toch een associatieve array wilt kunnen gebruiken. Bijvoorbeeld:

SELECT COUNT(*) AS pageviews ...

of:

SELECT (foo + IFNULL(bar, 2.5)) / 2 AS average_rating ...
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
@Ozzie,

Er is helemaal niets mis met aliassen gebruiken, dat is vrij normaal voor expressies (zoals Ward al aangeeft) en tabelnamen in query's met een join.

Maar als je nu een query hebt met tabellen waarbij meerdere kolommen dezelfde naam hebben (bv id, name, seo) moet je dit gaan doen:
Code (SQL)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT p.id product_id,
p.name product_name,
p.seo product_seo
FROM ...

Ik persoonlijk vindt dat inefficiënt.
Wouter J
Wouter J
6 jaar geleden
 
0 +1 -0 -1
Even uit interesse, inefficient qua typewerk of snelheid van uitvoering v/d query?
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
Qua typewerk.

En daarnaast heb je als je in teamverband werkt eenduidigheid
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Oké, maar stel je hebt een tabel genaamd "advisors". Dan zou jij als veldnamen dus zeggen "advisors_id" en "advisors_type" enz. Als je dan iets zou selecten, krijg je SELECT advisors_id, advisors_type enz. ...

Als je AS zou gebruiken, krijg je SELECT a.id, a.type enz. Dat is dan toch minder typewerk? En je veldnamen zijn korter.

Als je het vergelijkt met een OOP class, bijv. "User", dan heeft deze de properties:
- id
- age
- first_name
- last_name

Maar wat jij doet is eigenlijk dit:
- user_id
- user_age
- user_first_name
- user_last_name

Uiteraard is het een kwestie van smaak, maar is dat niet een beetje dubbelop?
Ger van Steenderen
Ger van Steenderen
6 jaar geleden
 
0 +1 -0 -1
Maar wat nu als die eigenschappen over meerdere tabellen verdeeld staan.
Neem eens een ander voorbeeld:
- products
- brands
- categories
- subcategories
- materials
- sizes
- colors

Ze hebben allemaal een id en een name, dus dan moet je in een query een alias op de kolommen gaan zetten bij op één na alle tabellen.

Je kunt SQL niet vergelijken met OOP want daar zou de eigenschap kleur ook weer een object zijn, maar zo werkt dat in SQL niet.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Ozzie PHP
Ozzie PHP
6 jaar geleden
 
0 +1 -0 -1
Maar bijv. in het geval van subcategories... hoe noem jij de veldnaam dan?

subcategories_name
subcategory_name
subc_name
???

Om te reageren heb je een account nodig en je moet ingelogd zijn.

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.