Consultas Simples
Estudiar la sentencia SELECT, que permite recuperar datos de una o varias tablas. La sentencia
SELECT es la ms compleja y potente de las sentencias SQL.
Esta sentencia forma parte del DML (lenguaje de manipulacin de datos)
El resultado de la consulta es una tabla lgica, porque no se guarda en el disco sino que est en
memoria y cada vez que ejecutamos la consulta se vuelve a calcular.
Sintaxis de la sentencia SELECT (consultas simples)
Empezaremos por las consultas ms simples basadas en una tabla:
Origen de datos FROM
De la sintaxis anterior el elemento <origen> indica de donde se va a extraer la informacin,
utilizando la clausula FROM, y es la nica clusula obligatoria
Con la clausula FROM indicamos en qu tabla tiene que buscar la informacin. En los
siguientes ejemplos de consultas simples, el resultado se obtiene de una nica tabla. La
sintaxis de la clusula es:
FROM especificacin de tabla
La especificacin de tabla puede ser el nombre de una consulta guardada, o el nombre de una
tabla que a su vez puede tener el siguiente formato:
SELECT ...
FROM tabla1
Sacamos los datos de la tabla tabla1
Opcionalmente podemos definir un nombre de alias.
Un nombre de alias (alias_tabla) es un nombre alternativo que se le da a la tabla dentro de
la consulta.
Si se define un nombre de alias, dentro de la consulta, ser el nombre a utilizar para
referirnos a la tabla, el nombre original de la tabla ya no tendr validez.
Se utilizan los nombres de alias para simplificar los nombres de tablas a veces largos y
tambin cuando queremos combinar una tabla consigo misma; ya volveremos sobre los alias
de tabla cuando veamos consultas multitabla.
La palabra AS no aade ninguna operatividad, est ms por esttica.
SELECT ...
FROM tabla1 t1
Sacamos los datos de la tabla tabla1 y le asignamos un alias de tabla: t1
SELECT ...
FROM tabla1 AS t1 Es equivalente a la sentencia anterior.
La lista de seleccin
En la lista de seleccin <lista_seleccion> indicamos las columnas que se tienen que
visualizar en el resultado de la consulta.
<lista_seleccion> ::=
{ *
| {nombre_tabla|nombre_vista|alias_tabla}.*
| { [{nombre_tabla|nombre_vista|alias_tabla}.]
{nb_columna|$IDENTITY|$ROWGUID}
|<expresion>
}[[AS] alias_columna]
| alias_columna = <expresion>
} [ ,...n ]
Separamos la definicin de cada columna por una coma y las columnas del resultado
aparecern en el mismo orden que en la lista de seleccin.
Para cada columna del resultado su tipo de datos, tamao, precisin y escala son los
mismos que los de la expresin que da origen a esa columna.
Podemos definir las columnas del resultado de varias formas, mediante:
Una expresin simple:
o
una referencia a una funcin.
una variable local
una constante
una columna del origen de datos,
Una subconsulta escalar, que es otra instruccin SELECT que devuelve un nico
valor y se evala para cada fila del origen de datos (esto no lo veremos de
momento).
Una expresin compleja generada al usar operadores en una o ms expresiones
simples.
La palabra clave *.
La asignacin de variables con el formato @variable_local = expresin.
La palabra clave $IDENTITY.
La palabra clave $ROWGUID
Columnas del origen de datos
Cuando queremos indicar en la lista de seleccin una columna del origen de datos,
la especificamos mediante su nombre simple o nombre cualificado. El nombre
cualificado consiste en el nombre de la columna precedido del nombre de la tabla
donde se encuentra la columna.
Si en el origen de datos hemos utilizado una vista o un nombre de alias, deberemos
utilizar ese nombre. Es obligatorio utilizar el nombre cualificado cuando el nombre
de la columna aparece en ms de una tabla del origen de datos.
Ejemplos de consulta simple.
Listar nombres, oficinas, y fechas de contrato de todos los empleados:
SELECT nombre, oficina, contrato
FROM empleados;
El resultado sera:
Antonio Viguer
nombre
12
oficina
contrato
1986-10-20
Alvaro Jaumes
21
1986-12-10
Juan Rovira
12
1987-03-01
Jos Gonzlez
12
1987-05-19
Vicente Pantalla
13
1988-02-12
Luis Antonio
11
1988-06-14
Jorge Gutirrez
22
1988-11-14
Ana Bustamante
21
1989-10-12
Mara Sunta
11
1999-10-12
Juan Victor
NULL
1990-01-13
Listar una tarifa de productos:
SELECT idfab, idproducto, descripcion, productos.precio
FROM productos;
Hemos cualificado la columna precio aunque no es necesario en este caso.
El resultado sera:
Idfab
aci
idproducto
41001
descripcion
arandela
precio
0,58
aci
41002
bisagra
0,80
aci
41003
art t3
1,12
aci
41004
art t4
1,23
aci
4100x
junta
0,26
aci
4100y
extractor
28,88
aci
4100z
mont
26,25
bic
41003
manivela
6,52
bic
41089
rodamiento
2,25
Alias de columna
Por defecto, en el encabezado de cada columna del resultado, aparece el nombre de la
columna origen, pero esto se puede cambiar definiendo un alias de columna, el alias de
columna es un nombre alternativo que se le da a esa columna.
El alias de columna se indica mediante la clusula AS. Se escribe el nuevo texto tal cual
sin comillas siguiendo las reglas de los identificadores.
Ejemplo:
SELECT numclie,nombre AS nombrecliente
FROM clientes;
El resultado ser:
Numclie
nombrecliente
2101
Luis Garca Antn
2102
Alvaro Rodrguez
2103
Jaime Llorens
en vez de:
Numclie
nombre
2101
Luis Garca Antn
2102
Alvaro Rodrguez
2103
Jaime Llorens
La palabra AS es opcional.
SELECT numclie,nombre nombrecliente
FROM clientes;
Sera equivalente a la consulta anterior
Si queremos incluir espacios en blanco en el nombre lo debemos encerrar entre
corchetes.
SELECT numclie,nombre AS [nombre cliente]
FROM clientes;
Nota importante: Este nombre de alias se podr utilizar en la lista de seleccin y en la
clusula ORDER BY pero no en la clusula WHERE
Funciones
Existen funciones que podemos utilizar en la lista de seleccin, e incluso en otras
clusulas que veremos ms adelante, como el WHERE. Las principales funciones son las
siguientes:
Funciones de fecha:
Funcin
GETDATE
Descripcin
Devuelve la fecha actual.
GETUTCDATE
Devuelve la hora UTC.
DATEPART
Devuelve un entero que corresponde a la parte de la fecha solicitada.
DAY
Devuelve el da de la fecha indicada.
MONTH
Devuelve el mes de la fecha indicada.
YEAR
Devuelve el ao de la fecha indicada.
DATENAME
Devuelve una cadena de caracteres que representa el valor de la unidad especificada
de una fecha especificada.
DATEADD
Devuelve un valor datetime nuevo que resulta de sumar un intervalo de tiempo a una
fecha especificada.>
DATEDIFF
Devuelve el n de intervalos que hay entre dos fechas.
@@DATEFIRST
Devuelve el primer da de la semana establecido con SET DATEFIRST.
SET
DATEFIRST
Establece el primer da de la semana en un nmero del 1 al 7.
Funciones de cadena:
Funcin
ASCII
Descripcin
Devuelve el valor de cdigo ASCII del carcter situado ms a la izquierda de una
expresin de caracteres.
CHAR
Devuelve el carcter ASCII del entero indicado.
NCHAR
Devuelve el carcter Unicode del entero indicado.
UNICODE
Devuelve el entero que se corresponde al carcter Unicode indicado.
LEN
Devuelve el total de caracteres de una cadena, excluidos los espacios en blanco finales.
LTRIM
Devuelve una cadena tras quitarle los espacios en blanco iniciales.
RTRIM
Devuelve una cadena tras quitarle los espacios en blanco finales.
LEFT
Devuelve los N ltimos caracteres de una cadena.
RIGHT
Devuelve los N primeros caracteres de una cadena.
SUBSTRING
Devuelve parte de una expresin.
LOWER
Devuelve la cadena convertida a minsculas.
UPPER
Devuelve la cadena convertida a maysculas.
REPLACE
Reemplaza una determinada cadena.
STUFF
Elimina el nmero de caracteres especificado e inserta otro conjunto de caracteres en el
punto de inicio indicado.
QUOTENAME
Devuelve una cadena Unicode con los delimitadores agregados para convertirla en un
identificador delimitado vlido de Microsoft SQL Server 2005.
SPACE
Devuelve una cadena de espacios repetidos.
STR
Devuelve una cadena de caracteres a partir de datos numricos.
REPLICATE
Repite una cadena N veces.
REVERSE
Devuelve una cadena invertida.
CHARINDEX
Devuelve la posicin inicial de la expresin especificada en una cadena de caracteres.
PATINDEX
Devuelve la posicin inicial de la primera repeticin de un patrn en la expresin
especificada, o ceros si el patrn no se encuentra, en todos los tipos de datos de texto y
caracteres.
Otras funciones:
Funcin
ROUND
Descripcin
Redondea un valor a la longitud y precisin indicadas.
CAST y CONVERT
Convierten de un tipo de datos a otro de forma explcita.
CASE
Evala una lista de condiciones.
ISNULL
Reemplaza el valor NULL por otro especificado.
COALESCE
Devuelve la primera expresin distinta de NULL entre sus argumentos.
Columnas calculadas
Adems de las columnas que provienen directamente de la tabla origen, una consulta
SQL puede incluir columnas calculadas cuyos valores se evalan a partir de una
expresin.
La expresin puede contener cualquier operador vlido (+, -, *, /, &), cualquier funcin
vlida, nombres de columnas del origen de datos, nombres de parmetros o constantes y
para combinar varias operaciones se pueden utilizar los parntesis.
Ejemplos de columnas calculadas:
Listar la ciudad, regin y el supervit de cada oficina. Consideraremos el supervit
como el volumen de ventas que se encuentran por encima o por debajo del objetivo de la
oficina.
SELECT ciudad, region, (ventas-objetivo) AS superavit
FROM oficinas;
El resultado ser:
ciudad
Valencia
este
region
superavit
11800,00
Alicante
este
-6500,00
Castellon
este
1800,00
Badajoz
oeste
11100,00
A Corua
oeste
-11400,00
Madrid
centro
NULL
Madrid
centro
-10000,00
Pamplona
norte
NULL
Valencia
este
-90000,00
De cada producto queremos saber el id de fabricante, id de producto, su descripcin y
el valor de sus existencias.
SELECT idfab,idproducto,descripcion,(existencias*precio) AS valoracion
FROM productos;
El resultado sera:
Idfab
idproducto
descripcion
valoracion
aci
41001
arandela
160,66
aci
41002
bisagra
133,60
aci
41003
art t3
231,84
aci
41004
art t4
170,97
aci
4100x
junta
9,62
aci
4100y
extractor
722,00
aci
4100z
mont
735,00
bic
41003
manivela
19,56
bic
41089
rodamiento
175,50
Ejercicio paso a paso
Listar de cada pedido, su nmero, cdigo completo del artculo vendido y precio
unitario al que se ha vendido. No es necesario redondear el precio.
La informacin precio unitario no se encuentra en la tabla, pero s que disponemos del
importe total del pedido y la cantidad, as que podemos calcularlo.
SELECT numpedido, fab, producto, importe/cant AS Precio
FROM pedidos;
Si quisiramos redondear el precio a dos decimales, por ejemplo, podramos englobar
la operacin importe/cant en la funcin ROUND() de la siguiente forma: ROUND(valor,
ndecimales) --> ROUND(importe/cant, 2)
Resultado (sin redondear):
Numpedido
110036
Fab
aci
Producto
Precio
4100z
2,50
110037
rei
2a44l
4,50
112963
aci
41004
0,117
112968
aci
41004
1,17
112975
rei
2a44g
3,50
112979
aci
4100z
25,00
112983
aci
41004
1,17
112987
aci
4100y
25,00
112989
fea
114
2,43
112992
aci
41002
0,76
112993
rei
2a45c
0,79
112997
bic
41003
6,52
113003
imm
779c
18,75
113007
imm
773c
9,75
113012
aci
41003
1,07
113013
bic
41003
6,52
113024
qsa
xk47
3,55
113027
aci
41002
8,3333
113034
rei
2a45c
0,79
113042
rei
2a44r
45,00
113045
rei
2a44r
45,00
113048
imm
779c
18,75
113049
qsa
xk47
3,88
113051
qsa
xk47
3,55
113055
aci
4100x
0,25
113057
aci
4100x
NULL
113058
fea
112
1,48
113062
bic
41003
2,43
113065
qsa
xk47
3,55
113069
imm
773c
14,25
De cada producto queremos saber el id de fabricante, id de producto, su descripcin y
el valor de sus existencias.
El valor de las existencias es un campo calculado, tendremos que multiplicar el nmero
de existencias por su precio para ver en cunto se valora el stock.
SELECT idfab,idproducto,descripcion,(existencias*precio) AS valoracion
FROM productos;
Resultado:
Idfab Idproducto Descripcin Valoracion
aci
41001
arandela
NULL
aci
41002
bisagra
NULL
aci
41003
art t3
NULL
aci
41004
art t4
NULL
aci
4100x
junta
NULL
aci
4100y
extractor
NULL
aci
4100z
mont
NULL
bic
41003
manivela
19,56
bic
41089
rodamiento
175,50
bic
41672
plato
0,00
fea
112
cubo
170,20
fea
114
cubo
36,45
imm
773c
reostato
273,00
imm
775c
reostato 2
71,25
imm
779c
reostato 3
0,00
imm
887h
caja clavos
120,42
imm
887p
perno
6,00
imm
887x
manivela
152,00
qsa
xk47
red
134,90
qsa
xk48
red
272,02
qsa
xk48a
red
54,76
rei
2a44g
pas
49,00
rei
2a44l
bomba l
540,00
rei
2a44r
bomba r
540,00
rei
2a45c
junta
165,90