SQL - Entender mejor las clausulas de SELECT

   
Vista:

Entender mejor las clausulas de SELECT

Publicado por Juan (4 intervenciones) el 04/03/2015 17:33:25
Buenas tardes.

Tengo bastantes dudas con las clausulas JOIN, IN, etc...

Alguien sabe de algún buen manual que lo explique paso a paso con ejemplos?

Por ejemplo si yo tengo esta consulta:
1
2
3
4
SELECT c.fecha, c.contador, d.ref, a.familia
FROM cab c, det d, alm a
WHERE c.num=o.num AND d.ref=a.ref AND c.fecha>date(2015,1,1)
ORDER BY d.ref

Se puede hacer con JOIN?

Cómo se hace para conbinar varias tablas?

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Entender mejor las clausulas de SELECT

Publicado por leonardo_josue (877 intervenciones) el 04/03/2015 19:29:48
Hola Juan...

Cualquier libro de SQL para principiantes o la documentación oficial del Motor de Base de Datos que estés utilizando, es un excelente comienzo para resolver las dudas que tienes... tratar de entender una sentencia SQL sin nociones te resultará bastante complicado...

Por ejemplo, la consulta que pones es de las más simples que te puedes encontrar... y si tienes problemas para entenderlas, estás en problemas.

1
Se puede hacer con JOIN?

La respuesta es SI... y no sólo eso, sino que DEBERÍAS hacerlas con JOIN's, ya que los JOIN's tienen mejor desempeño que las uniones implícitas.

1
Cómo se hace para conbinar varias tablas?

Ya estás al tanto de las dos formas en que puedes combinar varias tablas.

1. Listándolas en el FROM y haciendo las uniones implícitas...

1
2
3
4
...
FROM tabla1, tabla2, tabla3
WHERE tabla1.campo1 = tabla2. campo AND tabla2.campo = tabla3.campo...
...

2. Utilizando JOIN's (INNER, RIGTH, LEFT, ETC.)

1
2
3
4
5
...
FROM tabla1
INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
INNER JOIN tabla3 ON tabla2.campo = tabla3.campo
...

Esta es la manera ESTANDAR de hacer los JOIN's, aunque puede variar la sintaxis dependiendo del motor que estés utilizando.

Una de las ventajas de utilizar la segunda opción es que te permite SEPARAR, las condiciones que tienen que ver con las llaves entre las tablas y los criterios para filtrar la información. Si observas, en tu consulta mezclas en el WHERE todas las condiciones, con JOIN's. Esto ocasiona que se puedan omitir condiciones de igualdad, lo que provoca PRODUCTOS CARTESIANOS entre las tablas...

Si tienes dudas, pregúntale a SAN GOOGLE... el por lo general tiene la respuesta a todo.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Entender mejor las clausulas de SELECT

Publicado por Juan (4 intervenciones) el 05/03/2015 08:55:20
Muchas gracias.

Entonces de estas dos sentencias cuál sería la correcta? Con cuál iría más rápido? Qué diferencias hay?

Sentencia 1
1
2
3
4
SELECT c.fecha, c.contador, d.ref, a.familia
FROM cabecera c, detalle d, almacen a
WHERE c.num=c.num and d.ref=a.ref and between(c.fecha,date(2015,1,1),date(2015,12,31))
ORDER BY d.ref

Sentencia 2
1
2
3
4
5
SELECT c.fecha, c.contador, d.ref, a.familia
FROM cabecera c
INNER JOIN detalle d ON d.num=o.num
INNER JOIN almacen a ON a.ref=d.ref and between(o.fecha,date(2015,1,1),date(2015,12,31))
ORDER BY d.ref

Los dos SELECT muestran lo mismo, pero no sé que diferencia hay ni cual es mejor y por qué.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Entender mejor las clausulas de SELECT

Publicado por leonardo_josue (877 intervenciones) el 05/03/2015 15:51:08
Hola de nuevo Juan:

Antes que nada, tus consultas tienen algunos detalles que marcarían error:

1. Estás mencionando una tabla con un alias O (d.num=o.num) pero no tienes ninguna definición de un alias O... tus tablas tienen los alias A, C y D.

2. No es recomendable que en las cláusulas ON pongas criterios para FILTRAR... me explico,

En lugar de tener esto:

1
2
3
...
INNER JOIN almacen a ON a.ref=d.ref and between(o.fecha,date(2015,1,1),date(2015,12,31))
...

lo correcto es dejar en el ON SÓLO LAS CONDICIONES DE IGUALDAD ENTRE TUS TABLAS, y utilizar la cláusula WHERE para filtrar los datos:

1
2
3
4
5
...
INNER JOIN almacen a ON a.ref=d.ref
WHERE
   between(o.fecha,date(2015,1,1),date(2015,12,31))
...


3. Tú preguntas lo siguiente

1
Los dos SELECT muestran lo mismo, pero no sé que diferencia hay ni cual es mejor y por qué.

Y ya te había contestado esta pregunta desde mi post anterior:

1
DEBERÍAS hacerlas con JOIN's, ya que los JOIN's tienen mejor desempeño que las uniones implícitas.

¿Qué quiere decir esto, que la consulta que tienes con JOIN's, puede ser más rápida que la primera donde pones las condiciones en el FROM-WHERE

Cuando hablas de pocos registros en tus tablas, las consultas PUDIERAN PARECER IGUALES, pero en la práctica, los JOIN's están optimizados para hacer las búsquedas, por lo tanto, cuando tienes muchos registros en tus tablas, los JOIN's son más rápidos.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Entender mejor las clausulas de SELECT

Publicado por Juan (4 intervenciones) el 09/03/2015 09:08:00
Perfecto, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar