SQL Intermedios Firebird

SQL PARA INTEMEDIOS Teoría y Práctica sobre Firebird Obteniendo las semana pasada ventas realizadas la 6 febrero 20

Views 74 Downloads 0 File size 483KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

SQL PARA INTEMEDIOS Teoría y Práctica sobre Firebird

Obteniendo las semana pasada

ventas

realizadas

la

6 febrero 2016 wrov Ejemplos de SELECTs para principiantes Deja un comentario

Supongamos que tienes una tabla de ventas y deseas conocer ¿cuáles fueron las ventas realizadas la semana pasada? Puedes obtener la respuesta con un SELECT similar al siguiente: Listado 1:

1 2 3 4 5 6 7 8 9

SELECT * FROM MiTabla WHERE MiColumnaFecha BETWEEN CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE) 6 AND CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE) ORDER BY MiColumnaFecha

En el Listado 1. se supone que las semanas empiezan los días Lunes, si necesitas que empiecen los días Domingo entonces a la primera fecha del BETWEEN deberías restarle 7 (y no 6) y a la segunda fecha deberías restarle 1. Artículos relacionados: El índice del blog Firebird21 El foro del blog Firebird21

Ejemplo Nº 052 – Comparando strings 20 enero 2014

wrov Ejemplos de SELECTs para principiantes =, comparación, condición, LIKE,string Deja un comentario

Cuando comparamos strings el resultado puede no ser el que esperábamos si es que no lo hacemos bien. Ejemplo:

1 2 3 4 5 6

SELECT 1 FROM RDB$DATABASE WHERE 'A' = 'A

'

Este SELECT devolverá 1 aunque los strings son diferentes. ¿Es eso correcto o incorrecto? Pues es lo correcto según el estándar SQL el cual dice lo siguiente: “cuando se comparan strings de distinta longitud, la comparación debe ser hecha como si al string más corto se le agregaran espacios en blanco hasta la longitud del string más largo”. ¿Y si queremos que la condición no se cumpla cuándo las longitudes son diferentes? En ese caso deberemos utilizar LIKE, como vemos a continuación:

1 2 3 4 5 6

SELECT 1 FROM RDB$DATABASE WHERE 'A' LIKE 'A

'

Aquí el resultado de la consulta será un conjunto vacío porque la condición no se cumple. Conclusión: Si quieres que la comparación entre dos strings sea estricta (o sea que sean idénticos y que tengan la misma longitud) debes usar el operador LIKE, no el símbolo = Artículo relacionado: El índice del blog Firebird21

Ejemplo Nº 051 – ¿Cómo saber si una tabla tiene registros? 10 agosto 2013

wrov Ejemplos de SELECTs para principiantes cantidad, COUNT(), filas, registros4 comentarios

A veces queremos saber si una tabla tiene registros (filas). No nos interesa saber cuantas filas tiene sino si tiene alguna. Hay varias formas de obtener esa información: Ejemplo 1:

1 2 3 4

SELECT COUNT(*) FROM MiTabla

Esto funciona pero si la tabla tiene muchos millones de registros será muy lento porque el Firebird contará cuantas filas hay en la tabla y nos devolverá el resultado y esto tomará un buen tiempo. Pero no queremos saber cuantas filas hay en la tabla, solamente queremos saber si tiene filas o no y con este método estamos perdiendo mucho tiempo innecesariamente. Ejemplo 2:

1 2 3 4

SELECT MIN(MiColumna) FROM MiTabla

Si la tabla tiene un índice ascendente sobre la columna “MiColumna” entonces hallar el mínimo de esa columna será muy rápido. Este método es mucho más eficiente que el del Ejemplo 1, el resultado se obtiene mucho más rápido. Ejemplo 3:

1 2 3 4 5 6 7 8

SELECT MiColumna FROM MiTabla WHERE MiColumna > 0 ROWS 1 TO 1

Y este método es el más eficiente de los tres ya que el Firebird ni siquiera necesita llamar a una función sino simplemente verifica si la primera fila tiene un valor mayor que cero y si ese es el caso ya devuelve el resultado porque ROWS 1 TO 1 le dice que devuelva una fila. Desde luego que “MiColumna” debería ser de tipo numérico y todos sus valores mayores que cero. Si ese no es el caso entonces habría que poner una condición que se cumpla siempre, en el 100% de los casos, para que este método sea el más rápido. En general lo conveniente es que “MiColumna” sea laPrimary Key, que es una columna autoincremental y por lo tanto siempre tiene valores mayores que cero. Artículos relacionados:

El índice del blog Firebird21 El foro del blog Firebird21

Ejemplo Nº de DISTINCT

050



Más

sobre

el

uso

4 mayo 2013 wrov Ejemplos de SELECTs para principiantes 1 comentario

En el ejemplo Nº 049 que puedes leer aquí: https://firebird21.wordpress.com/2013/05/03/ejemplo-no-049-usando-distinct/ hemos visto una forma de usar la cláusula DISTINCT, aquí tenemos otra:

1 2 3 4

SELECT COUNT(DISTINCT PRD_UNIMED) FROM PRODUCTOS

Mediante este SELECT podemos conocer la cantidad de unidades de medida distintas que están registradas en la tabla de PRODUCTOS. Por ejemplo, si en dicha tabla tenemos las unidades de medida: KLG, LTS, MTS, UNI, (kilogramos, litros, metros, unidades) entonces el resultado que obtendremos será 4. Si en nuestra tabla de PRODUCTOS tenemos una columna llamada PRD_PROCED donde se registran los países de procedencia de nuestros productos entonces escribiendo:

1 2 3 4

SELECT COUNT(DISTINCT PRD_PROCED) FROM PRODUCTOS

podremos saber de cuantos países distintos proceden los productos de nuestro stock. No solamente podemos escribir DISTINCT dentro de la función COUNT(), también podemos escribirlo dentro de cualquiera de las otras funciones agregadas: AVG(), MAX(), MIN(), SUM() También es posible escribir una función dentro de otra función, como en este ejemplo.

1 2 3 4

SELECT COUNT(DISTINCT Left(PRD_NOMBRE,3)) FROM PRODUCTOS

Ejemplo Nº 049 – Usando DISTINCT 3 mayo 2013 wrov Ejemplos de SELECTs para principiantes 9 comentarios

Cuando escribes un SELECT tienes la posibilidad de decirle que deseas que te devuelva todos los resultados o solamente aquellos que son distintos a los demás. Por ejemplo, supongamos que deseamos conocer todas las unidades de medida utilizadas por nuestros productos. La columna donde se guarda ese dato se llama PRD_UNIMED.

1 2 3 4 5

SELECT DISTINCT PRD_UNIMED FROM PRODUCTOS

La cláusula DISTINCT le obliga al Firebird a mostrarnos solamente una vez a cada unidad de medida. Eso quiere decir que aunque haya 240 productos cuya unidad de medida sea KLG (kilogramos) la palabra KLG aparecerá una sola vez en el resultado. ¿Por qué? porque escribimos la cláusula DISTINCT. En la tabla VENTASCAB guardamos los datos de cabecera de cada venta realizada (sucursal, fecha, identificador del cliente, etc.), ¿cuáles son los años que tenemos registrados en esa tabla? ¿se encuentran allí las ventas que hicimos en el año 2006?. Lo podremos saber fácilmente con este SELECT:

1 2 3 4 5

SELECT DISTINCT EXTRACT(YEAR FROM VTC_FECHAX) FROM VENTASCAB

cada uno de los años de las ventas registradas aparecerá una vez y solamente una vez. Por ejemplo, podríamos obtener: 2008 2009 2010 2011 2012 2013 entonces, aunque la tabla VENTASCAB tenga miles y miles de filas solamente veríamos 6 filas, las que corresponden a cada uno de los años en que se registraron ventas.

Ejemplo Nº 048 – Usando funciones (3) 24 marzo 2013 wrov Ejemplos de SELECTs para principiantes 1 comentario

En este ejemplo veremos como usar las funciones: 

MAX() MIN()



1 2 3 4 5 6 7 8

SELECT PRD_PROCED, MAX(PRD_PREVTA), MIN(PRD_PREVTA) FROM PRODUCTOS GROUP BY PRD_PROCED

En este ejemplo, por cada país de procedencia de los productos, vemos cual es el mayor precio de venta y cual es el menor precio de venta. Como estamos agrupando por país de procedencia de los productos, las funciones MAX() y MIN() nos devolverán el mayor y el menor precio de venta de los productos de cada país. .

Ejemplo Nº 047 – Usando funciones (2) 24 marzo 2013 wrov Ejemplos de SELECTs para principiantes 2 comentarios

En este ejemplo veremos como usar la función: 

1 2 3 4

LIST() La función LIST() devuelve una cadena de caracteres consistiendo de todos los valores que no sean NULL en ese grupo. Esos valores pueden estar separados por una coma (por defecto) o por cualquier otro carácter que el programador especifique. Si todos los valores del grupo son NULL o el grupo está vacío, la función LIST() devuelve NULL. SELECT PRD_PROCED, LIST(PRD_NOMBRE) FROM PRODUCTOS GROUP BY

5 6 7

PRD_PROCED

Este SELECT nos mostrará todos los productos provenientes de cada uno de los países de procedencia. La columna LIST(PRD_NOMBRE) puede ser muy larga ya que en ella se encontrarán todos los productos que provienen de un país.