Escolar Documentos
Profissional Documentos
Cultura Documentos
SELECT / FROM
SELECT * FROM oficinas
Alias de columna - AS
SELECT idfab AS fabricante, idproducto, descripcion
FROM productos
Columnas calculadas
SELECT region, ciudad, (ventas - objetivo) AS superavit
FROM oficinas
ORDER BY region, 3 DESC
SELECT nombre, MONTH(contrato), YEAR(contrato), DAY(contrato)
FROM empleados
Concatenar campos
SELECTIdOficina, Ciudad & " (" & Region & ")" AS Zona
FROM TOficinas;
Listar de cada empleado su nombre, n de das que lleva trabajando en la empresa y su ao de nacimiento
(suponiendo que este ao ya ha cumplido aos).
La clusula TOP
Los dos empleados ms antiguos de la empresa (si hay empleados con fechas de contrato iguales, salen ms de 2
empleados, pues se est evaluando es las dos fechas ms antiguas)
SELECT TOP 2 numemp, nombre
FROM empleado
ORDER BY contrato
La clusula WHERE
Selecciona nicamente las filas que cumplan la condicin de seleccin especificada.
La condicin de seleccin puede ser cualquier condicin vlida o combinacin de condiciones utilizando los operadores
NOT (no) AND (y) y OR ().
Lista el nombre de los empleados de la oficina 12 que tengan ms de 30 aos. (oficina igual a 12 y edad mayor que
30) :
SELECT nombre
FROM empleados
WHERE oficina = 12 AND edad > 30
Condiciones de Seleccin
Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula WHERE.
En SQL tenemos cinco condiciones bsicas:
1.
2.
3.
4.
5.
test de comparacin
test de rango
test de pertenencia a un conjunto
test de valor nulo
test de correspondencia con patrn
= <
SELECT Ventas
FROM TOficinas
WHERE Ventas NOT BETWEEN 200000 AND 400000;
Empleados cuyo nombre empiece por Luis (Luis seguido de cero o ms caracteres):
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE Luis*
Empleados cuyo nombre contiene Luis, en este caso tambin saldra los empleados Jos Luis (cero o ms caracteres
seguidos de LUIS y seguido de cero o ms caracteres).
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE *Luis*
Empleados cuyo nombre contenga una a como tercera letra (dos caracteres, la letra a, y cero o ms caracteres):
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE ??a*
Los empleados cuyo nombre empiece por Julia (ojo con el espacio antes del *)
SELECT *
FROM empleados
WHERE nombre LIKE 'Julia *'
Sintaxis:
DateDiff (intervalo;[fecha 1];[fecha 2])
El intervalo es el primer argumento de la funcin, hemos de escribirlo entre comillas, pudiendo disponer de los
siguientes intervalos:
d das
w da de la semana (por ejemplo mircoles transcurridos entre las dos fechas)
ww semanas
m meses
q trimestres
y das del ao (transcurridos entre dos fechas, es lo mismo que especificar d)
yyyy aos
h horas
n minutos
s segundos
Fecha 1 y Fecha 2 son las fechas entre las cuales queremos calcular el intervalo.
Fecha 1 es menor que fecha 2
Por ejemplo, tenemos una tabla de pedidos, y queremos saber cuntos das han transcurrido entre la fecha
de pedido y la fecha de entrega. Creamos una consulta en la que utilizamos la funcin DifFecha con la
siguiente expresin:
FUNCIONES VARIAS
En
SQL
En
Accces
CCUR
CMoneda
ROUND
Redondear
Se utiliza
para
Convertir un
nmero en
moneda
Redondear a un
nmero de
decimales
Ejemplo en SQL
Observaciones
CCur(TEmpleados.Salario*0.1)
Round(TEmpleados.Salario/15,1)
Redondea a 1 decimal la divisin del salario entre 15
IIf(IsNull(TEmpleados.SalarioActual),Null,CCur(TEmpleados.
SalarioActual*0.1))
IIF
SiInm
Funcin
condicional
similar al SI de
Excel
ISNULL
EsNulo
Evaluar si un
campo est
vaco
IIf(IsNull(TEmpleados.SalarioActual),Null,CCur(TEmpleados.
SalarioActual*0.1))
NULL
Nulo
Muestra un
valor vaco
IIf(IsNull(TEmpleados.SalarioActual),Null,CCur(TEmpleados.
SalarioActual*0.1))
En Access se
cambia el
separador de
listas por ; y
los decimales
por ,
CONSULTAS MULTITABLA
El producto cartesiano
Hay que tener en cuenta que el producto cartesiano obtiene todas las posibles combinaciones de filas
por lo tanto si tenemos dos tablas de 100 registros cada una, el resultado tendr 100x100 filas, si el
producto lo hacemos de estas dos tablas con una tercera de 20 filas, el resultado tendr 200.000 filas
(100x100x20) y estamos hablando de tablas pequeas. Se ve claramente que el producto cartesiano es
una operacin costosa sobre todo si operamos con ms de dos tablas o con tablas voluminosas.
SELECT *
FROM TPedidos,TClientes
En el siguiente caso, combinamos todos los pedidos con todos los clientes pero luego seleccionamos los
que cumplan que el cdigo de cliente de la tabla de pedidos sea igual al cdigo de cliente de la tabla de
clientes, por lo tanto nos quedamos con los pedidos combinados con los datos del cliente
correspondiente.
Las columnas que aparecen en la clusula WHERE de esta consulta se denominan columnas de
emparejamiento ya que permiten emparejar las filas de las dos tablas. Las columnas de emparejamiento
no tienen por qu estar incluidas en la lista de seleccin.
SELECT *
FROM TPedidos,TClientes
WHERE TPedidos.numclie=TClientes.numclie
Normalmente emparejamos tablas que estn relacionadas entre s y una de las columnas de
emparejamiento es clave principal, en este caso es ms eficiente utilizar otro tipo de composicin,
el INNER JOIN.
El INNER JOIN
El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de distintas tablas de forma
ms eficiente que con el producto cartesiano cuando una de las columnas de emparejamiento est
indexada (o sea es Clave principal). Se utiliza en la lnea del FROM.
SELECT *
FROM TPedidos INNER JOIN TClientes ON TPedidos.numclie = TClientes.numclie
SELECT *
FROM TEmpleados LEFT JOIN TOficinas ON TEmpleados.Idoficina = TOficinas.IdOficina
SELECT *
FROM TEmpleados RIGHT JOIN TOficinas ON TEmpleados.Idoficina = TOficinas.IdOficina
Esta consulta mostrar todas las filas (o registros) de la tabla de la derecha (TOficinas). La lista
mostrar los empleados con los datos de su oficina, y adems aparecer una fila por cada oficina
que no est asignada a ningn empleado con los datos del empleado nulos.
Se pueden combinar ms de dos tablas En este caso hay que sustituir en la sintaxis una
tabla por un INNER JOIN completo.
SELECT *
FROM TEmpleados INNER JOIN (TClientes INNER JOIN TPedidos ON
TClientes.numclie = TPedidos.numclie) ON TEmpleados.numemp = TClientes.repclie;
Funciones de columna
En la lista de seleccin de una consulta de resumen aparecen funciones de
columna tambin denominadas funciones de dominio agregadas. Una funcin de
columna se aplica a una columna y obtiene un valor que resume el contenido
de la columna.
Tenemos las siguientes funciones de columna:
Ejemplo:
SELECT SUM(ventas)
FROM oficinas
La funcin AVG() calcula el promedio (la media arimtica) de los valores indicados
en el argumento, tambin se aplica a datos numricos, y en este caso el tipo de
dato del resultado puede cambiar segn las necesidades del sistema para
representar el valor del resultado.
StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una
muestra de la poblacin representada por los valores contenidos en la columna
indicada en el argumento. Si la consulta base (el origen) tiene menos de dos
registros, el resultado es nulo.
Es interesante destacar que el valor nulo no equivale al valor 0, las funciones de
columna no consideran los valores nulos mientras que consideran el valor 0 como
un valor, por lo tanto en las funciones AVG(), STDEV(), STDEVP() los resultados no
sern los mismos con valores 0 que con valores nulos.
SELECT COUNT(numemp)
FROM empleados
o bien
SELECT COUNT(*)
FROM empleados
En este caso las dos sentencias devuelven el mismo resultado ya que la columna
numemp no contiene valores nulos (es la clave principal de la tabla empleados).
Cuntos empleados tienen una oficina asignada?
SELECT COUNT(oficina)
FROM empleados
Esta sentencia por el contrario, nos devuelve el nmero de valores no nulos que se
encuentran en la columna oficina de la tabla empleados, por lo tanto nos dice cuntos
empleados tienen una oficina asignada.
SELECT AVG(SUM(ventas))
FROM ...
NO es correcto, no se puede incluir
una funcin de columna dentro de una
funcin de columna
La clusula GROUP BY
Ejemplo:
SELECT
SUM(ventas)
FROM
repventas
SELECT
SUM(ventas)
FROM
repventas
GROUP BY
oficina
SELECT importe/cant AS
precio, SUM(importe)
FROM pedidos
GROUP BY precio
No est permitido, no se
puede utilizar un alias campo.
SELECT SUM(importe),rep
FROM pedidos
GROUP BY rep*10
No est permitido, rep es una columna
simple que no est encerrrada en una
funcin de columna, ni est en la lista
de columnas de agrupacin.
La clusula HAVING
La clusula HAVING nos permite seleccionar filas de la tabla resultante de una consulta de
resumen.
Para la condicin de seleccin se pueden utilizar los mismos tests de comparacin descritos en la
clusula WHERE, tambin se pueden escribir condiciones compuestas (unidas por los operadores OR,
AND, NOT), pero existe una restriccin.
En la condicin de seleccin slo pueden aparecer :
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
o cualquier expresin basada en las anteriores.
Ejemplo: Queremos saber las oficinas con un promedio de ventas de sus empleados mayor que
500.000 ptas.
SELECT oficina
FROM empleados
GROUP BY oficina
HAVING AVG(ventas) > 500000
NOTA: Para obtener lo que se pide hay que calcular el promedio de ventas de los empleados de cada
oficina, por lo que hay que utilizar la tabla empleados.Tenemos que agrupar los empleados por oficina y
calcular el promedio para cada oficina, por ltimo nos queda seleccionar del resultado las filas que tengan
un promedio superior a 500.000 ptas.