Você está na página 1de 15

SQL

SELECT / FROM
SELECT * FROM oficinas

SELECT oficinas.* FROM oficinas

SELECT idfab, idproducto, descripcion, precio


FROM productos

Alias de columna - AS
SELECT idfab AS fabricante, idproducto, descripcion
FROM productos

Ordenacin de las filas - ORDER BY


SELECT nombre, numemp, oficinarep
FROM empleados
ORDER BY nombre

SELECT nombre, numemp, cuota


FROM empleados
ORDER BY cuota
SELECT nombre, numemp, cuota
FROM empleados
ORDER BY cuota DESC

SELECT nombre, numemp, contrato


FROM empleados
ORDER BY contrato
SELECT nombre, numemp, contrato
FROM empleados
ORDER BY contrato DESC

SELECT nombre, oficina, contrato


FROM empleados
ORDER BY oficina

SELECT nombre, oficina, contrato


FROM empleados
ORDER BY 2

SELECT region, ciudad, ventas


FROM oficinas
ORDER BY region, ciudad

SELECT region, ciudad, ventas


FROM oficinas
ORDER BY region, ciudad DESC

SELECT region, ciudad, ventas


FROM oficinas
ORDER BY region, 2 DESC

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

SELECT idfab, idproducto, descripcion, (existencias *


precio) AS [Valor Inventario]
FROM productos
ORDER BY 4 DESC

SELECT idfab, idproducto, descripcion, (existencias * precio)


AS [Valor Inventario]
FROM productos
ORDER BY (existencias * precio) DESC

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).

SELECT nombre, DATE() - contrato AS DiasTrabajados, YEAR(DATE()) - edad AS AoNacimiento


FROM empleados

Listar toda la informacin de los pedidos de marzo


SELECT *
FROM pedidos
WHERE MONTH(fechapedido) = 3

Las clusulas DISTINCT / ALL


Al incluir la clusula DISTINCT en la SELECT, se eliminan del resultado las repeticiones de filas. Si por el contrario
queremos que aparezcan todas las filas incluidas las duplicadas, podemos incluir la clusula ALL o nada, ya que ALL es
el valor que SQL asume por defecto.
Aparecen los registros repetidos
SELECT Director FROM oficinas

SELECT ALL Director FROM oficinas

Aparece cada valor una sola vez


SELECT DISTINCT dir FROM oficinas

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

20% de los empleados, ordenados por antigedad


SELECT TOP 20 PERCENT 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:


SELECT nombre
FROM empleados
WHERE oficina = 12

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

Test de comparacin (= <

= <

> <= >= <>


BETWEEN
IN
IS NULL
LIKE

> <= >= <>)

SELECT numemp, nombre


FROM empleados
WHERE ventas > cuota

SELECT numemp, nombre


FROM empleados
WHERE contrato < #01/01/1988#

SELECT numemp, nombre, edad


FROM empleados
WHERE YEAR(contrato) <= 1988
ORDER BY edad DESC

Oficinas cuyas ventas estn por debajo del 80% de su objetivo:


SELECT IdOficina, ciudad
FROM oficinas
WHERE ventas < objetivo * 0.8
SELECT IdOficina, Ciudad, Objetivo, Ventas, (Ventas-Objetivo) AS
Superavit
FROM Oficinas
WHERE director = 108
ORDER BY 5 DESC

SELECT IdOficina, Ciudad, (Ventas-Objetivo) AS Superavit


FROM Oficinas
WHERE Director <>108 AND Director<>106
ORDER BY 3 DESC

Test de rango (BETWEEN)

SELECT numemp, nombre


FROM empleados
WHERE ventas BETWEEN 100000 AND 500000

SELECT numemp, nombre


FROM empleados
WHERE (ventas >= 100000) AND (ventas <= 500000)

SELECT Ventas
FROM TOficinas
WHERE Ventas NOT BETWEEN 200000 AND 400000;

Test de pertenencia a un conjunto (IN)


Examina si el valor de la expresin es uno de los valores incluidos en la lista de valores.

SELECT numemp, nombre, oficina


FROM empleados
WHERE oficina IN (12,14,16)

SELECT numemp, nombre


FROM empleados
WHERE (oficina = 12) OR (oficina = 14) OR (oficina = 16)

Test de valor nulo (IS NULL)


Oficinas que no tienen director:
SELECT IdOficina, Ciudad
FROM TOficinas
WHERE Director IS NULL
Empleados asignados a alguna oficina:
SELECT numemp, nombre
FROM empleados
WHERE oficina IS NOT NULL
Test de correspondencia con patrn (LIKE)
Se utiliza cuando queremos utilizar caracteres comodines para formar el valor con el que comparar.
Los comodines ms usados son los siguientes:
?
*
#

representa un carcter cualquiera


representa cero o ms caracteres
representa un dgito cualquiera (0-9)

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 *'

DIFERENCIAL ENTRE FECHAS


DifFecha (en Access) o DateDiff (en SQL)

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:

Das transcurridos: DateDiff("d";[Fecha_Pedido];[Fecha_Entrega])

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))

Significa: Si es nulo el salario actual, entonces no muestre


nada, si no, muestre el clculo del salario actual por el 10%,
convertido en moneda.

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

***** PERO ESTA NO ES LA MEJOR FORMA, PUEDE SER MUY DEMORADO


PARA BASES DE DATOS GRANDES *******

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 TPedidos.*, TClientes.*


FROM TClientes INNER JOIN TPedidos ON TClientes.numclie = TPedidos.numclie;

SELECT TPedidos.numpedido, TPedidos.fechapedido, TClientes.nombre


FROM TClientes INNER JOIN TPedidos ON TClientes.numclie = TPedidos.numclie;

SELECT TEmpleados.nombre, TEmpleados.Idoficina, TOficinas.Ciudad


FROM TOficinas INNER JOIN TEmpleados ON TOficinas.IdOficina = TEmpleados.Idoficina;

Con una composicin interna (como el producto cartesiano y el INNER JOIN)


slo se obtienen las filas que tienen datos coincidentes en las dos tablas. Por
ejemplo, en el caso anterior, si un empleado no tiene registrada la oficina a la
que pertenece (o sea el campo Idoficina est vaco o nulo), la consulta resultante
no mostrar a ese empleado.

El LEFT JOIN y RIGHT JOIN


El LEFT JOIN y RIGHT JOIN son otro tipo de composicin de tablas, tambin denominada
composicin externa. Son una extensin del INNER JOIN.
Las composiciones vistas hasta ahora (el producto cartesiano y el INNER JOIN) son composiciones
internas ya que todos los valores de las filas del resultado son valores que estn en las tablas que se
combinan.
En los casos en que queremos que tambin aparezcan las filas que no tienen una fila coincidente
en la otra tabla, utilizaremos el LEFT o RIGHT JOIN.
Ejemplos:

SELECT *
FROM TEmpleados LEFT JOIN TOficinas ON TEmpleados.Idoficina = TOficinas.IdOficina

Esta consulta mostrar todas las filas (o registros) de la tabla de la izquierda


(TEmpleados) as no tengan ningn dato en el campo Idoficina.
En otras palabras, esta operacin consiste en aadir al resultado del INNER JOIN las
filas de la tabla de la izquierda que no tienen correspondencia en la otra tabla.

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;

SELECT TProductos.Descripcion, STProdPedidos.cant, STProdPedidos.importe,


TFabricantes.NombreFab
FROM (TFabricantes INNER JOIN TProductos ON TFabricantes.Idfab =
TProductos.Idfab) INNER JOIN STProdPedidos ON TProductos.Idproducto =
STProdPedidos.Idproducto;

Se pueden combinar ms de dos tablas a travs de ms de un campo.


En este caso se pueden definir varias condiciones de emparejamiento unidas por
los operadores AND y OR poniendo cada condicin entre parntesis. Ejemplo:
SELECT *
FROM STProdPedidos INNER JOIN TProductos ON (TProductos.Idproducto =
STProdPedidos.Idproducto) AND (STProdPedidos.Idfab = TProductos.Idfab);

Las consultas de resumen


En SQL de Microsoft Jet 4.x y de la mayora de los motores de bases de datos
relacionales, podemos definir un tipo de consultas cuyas filas resultantes son
un resumen de las filas de la tabla origen, por eso las denominamos
consultas de resumen, tambin se conocen como consultas sumarias.
En el ejemplo que viene a continuacin tienes un ejemplo de consulta normal
en la que se visualizan las filas de la tabla oficinas ordenadas por region, en este
caso cada fila del resultado se corresponde con una sola fila de la tabla oficinas,
mientras que la segunda consulta es una consulta resumen, cada fila del
resultado se corresponde con una o varias filas de la tabla oficinas.

Las consultas de resumen introducen dos nuevas clusulas a la sentencia


SELECT, la clusula GROUP BY y la clusula HAVING, son clusulas que slo
se pueden utilizar en una consulta de resumen, se tienen que escribir entre la
clusula WHERE y la clusula ORDER BY y tienen la siguiente sintaxis:

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:

El argumento de la funcin indica con qu valores se tiene que operar, por


eso expresin suele ser un nombre de columna, columna que contiene los
valores a resumir, pero tambin puede ser cualquier expresin vlida que
devuelva una lista de valores.
La funcin SUM() calcula la suma de los valores indicados en el argumento. Los
datos que se suman deben ser de tipo numrico (entero, decimal, coma flotante
o monetario...). El resultado ser del mismo tipo aunque puede tener una
precisin mayor.

Ejemplo:
SELECT SUM(ventas)
FROM oficinas

Obtiene una sola fila con el resultado de sumar


todos los valores de la columna ventas de la
tabla 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.

Las funciones MIN() y MAX() determinan los valores menores y mayores


respectivamente. Los valores de la columna pueden ser de tipo numrico, texto
o fecha. El resultado de la funcin tendr el mismo tipo de dato que la columna.
Si la columna es de tipo numrico MIN() devuelve el valor menor contenido en
la columna, si la columna es de tipo texto MIN() devuelve el primer valor en
orden alfabtico, y si la columna es de tipo fecha, MIN() devuelve la fecha ms
antigua y MAX() la fecha ms reciente.
La funcin COUNT(nb columna) cuenta el nmero de valores que hay en
la columna, los datos de la columna pueden ser de cualquier tipo, y la funcin
siempre devuelve un nmero entero. Si la columna contiene valores nulos esos
valores no se cuentan, si en la columna aparece un valor repetido, lo cuenta
varias veces.
COUNT(*) permite contar filas en vez de valores. Si la columna no contiene
ningn valor nulo, COUNT(nbcolumna) y COUNT(*) devuelven el mismo

resultado, mientras que si hay valores nulos en la columna, COUNT(*) cuenta


tambin esos valores mientras que COUNT(nb columna) no los cuenta.
Ejemplo:
Cuntos empleados tenemos?

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.

Se pueden combinar varias funciones de columna en una expresin pero no se


pueden anidar funciones de columna, es decir:
SELECT (AVG(ventas) * 3) +
SUM(cuota)
FROM ...
es correcto

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

Hasta ahora las consultas de resumen que hemos visto utilizan


todas las filas de la tabla y producen una nica fila resultado.

Se pueden obtener subtotales con la clusula GROUP BY.


Una consulta con una clusula GROUP BY se denomina
consulta agrupada ya que agrupa los datos de la tabla origen y
produce una nica fila resumen por cada grupo formado. Las
columnas indicadas en el GROUP BY se llaman columnas de
agrupacin.

Ejemplo:
SELECT
SUM(ventas)
FROM
repventas

Obtiene la suma de las ventas de todos los


empleados.

SELECT
SUM(ventas)
FROM
repventas
GROUP BY
oficina

Se forma un grupo para cada oficina, con las


filas de la oficina, y la suma se calcula sobre
las filas de cada grupo. El ejemplo anterior
obtiene una lista con la suma de las ventas
de los empleados de cada oficina.

La consulta quedara mejor incluyendo en la lista de seleccin


la oficina para saber a qu oficina corresponde la suma de
ventas:
SELECT oficina,SUM(ventas)
FROM repventas
GROUP BY oficina

Un columna de agrupacin no puede ser de tipo memo u


OLE.
La columna de agrupacin se puede indicar mediante un
nombre de columna o cualquier expresin vlida basada en una
columna pero no se pueden utilizar los alias de campo.
Ejemplo:
SELECT importe/cant ,
SUM(importe)
FROM pedidos
GROUP BY importe/cant

Est permitido, equivaldra a


agrupar las lneas de pedido
por precio unitario y sacar de
cada precio unitario el importe
total vendido.

SELECT importe/cant AS
precio, SUM(importe)
FROM pedidos
GROUP BY precio

No est permitido, no se
puede utilizar un alias campo.

En la lista 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.
SELECT
SUM(importe),rep*10
FROM pedidos
GROUP BY rep*10
Est permitido

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.

Se pueden agrupar las filas por varias columnas, en este


caso se indican las columnas separadas por una coma y en el
orden de mayor a menor agrupacin. Se permite incluir en la

lista de agrupacin hasta 10 columnas.


Ejemplo:
SELECT SUM(ventas)
FROM oficinas
GROUP BY region,ciudad
Se agrupa primero por regin, y dentro de cada regin por
ciudad.

Todas las filas que tienen valor nulo en el campo de


agrupacin, pasan a formar un nico grupo. Es decir, considera
el valor nulo como un valor cualquiera a efectos de agrupacin.
Ejemplo:
SELECT oficina,SUM(ventas) AS ventas_totales
FROM repventas
GROUP BY oficina
En el resultado aparece una fila con el campo oficina sin valor y a
continuacin una cantidad en el campo ventas_totales, esta
cantidad corresponde a la suma de las ventas de los empleados
que no tienen oficina asignada (campo oficina igual a nulo).

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.

Você também pode gostar