Vous êtes sur la page 1sur 19

Unidad 3.

Consultas simples (I)


3.1. Introduccin
Vamos a empezar por la instruccin que ms se utiliza en SQL, la sentencia SELECT. La sentencia SELECT es, con diferencia, la ms compleja y potente de las sentencias SQL, con ella podemos recuperar datos de una o ms tablas, seleccionar ciertos registros e incluso obtener resmenes de los datos almacenados en la base de datos. Es tan compleja que la estudiaremos a lo largo de varias unidades didcticas incorporando poco a poco nuevas funcionalidades. El resultado de una SELECT es una tabla lgica que alberga las filas resultantes de la ejecucin de la sentencia. La sintaxis completa es la siguiente: SELECT sentencia::=[WITH <expresion_tabla_comun> [,...n]] <expresion_consulta> [ORDER BY {expression_columna|posicion_columna [ASC|DESC] } [ ,...n ]] [COMPUTE {{AVG|COUNT|MAX|MIN|SUM} (expression)}[ ,...n ] [BY expression[ ,...n ]] ] [<FOR clausula_for>] [OPTION (<query_hint>[ ,...n ])] <expresion_consulta> ::= {<especificacion_consulta> | ( < expresion_consulta > ) } [ {UNION [ALL]|EXCEPT|INTERSECT} <especificacion_consulta> | (<expresion_consulta>) [...n ] ] <especificacion_consulta> ::= SELECT [ALL|DISTINCT] [TOP expresion [PERCENT] [WITH TIES] ] <lista_seleccion> [INTO nueva_tabla] [FROM { <origen> } [ ,...n ] ] [WHERE <condicion_busqueda> ] [GROUP BY [ ALL ] expresion_agrupacion [ ,...n ]

[WITH { CUBE | ROLLUP } ] ] [HAVING < condicion_busqueda > ] Debido a la complejidad de la sentencia (en la sintaxis anterior no se han detallado algunos elementos), la iremos viendo poco a poco, empezaremos por ver consultas bsicas para luego ir aadiendo ms clusulas. Empezaremos por ver las consultas ms simples, basadas en una sola tabla y nos limitaremos a la siguiente sintaxis: SELECT [ALL|DISTINCT] [TOP expresion [PERCENT] [WITH TIES]] <lista_seleccion> FROM <origen> [WHERE <condicion_busqueda> ] [ORDER BY {expression_columna|posicion_columna [ASC|DESC]} [ ,...n ]]

3.2. Origen de datos FROM


De la sintaxis anterior, el elemento <origen> indica de dnde se va a extraer la informacin y se indica en la clusula FROM, es la nica clusula obligatoria. En este tema veremos un origen de datos basado en una sola tabla. La sintaxis ser la siguiente: <origen>::= nb_tabla | nb_vista [[ AS ] alias_tabla ] nb_tabla representa un nombre de tabla. nb_vista un nombre de vista. Tanto para las tablas como para las vistas, podemos hacer referencia a tablas que estn en otras bases de datos (siempre que tengamos los permisos adecuados), en este caso tenemos que cualificar el nombre de la tabla, indicando delante el nombre de la base de datos (Lgica) y el nombre del esquema al que pertenece la tabla dentro de la base de datos. Por ejemplo: MiBase.dbo.MiTabla se refiere a la tabla MiTabla que se encuentra en el esquema dbo de la base de datos MiBase. Cuando no se definen esquemas, SQL-Server crea uno por defecto en cada base de datos denominado dbo.

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. Podemos escribir: SELECT ... FROM tabla1 SELECT ... FROM tabla1 t1 SELECT ... FROM tabla1 AS t1 Es equivalente a la sentencia anterior. Si la tabla o la vista estn en otra base de datos del mismo equipo que est ejecutando la instancia de SQL Server, se utiliza el nombre cualificado con el formato nbBaseDatos.nbEsquema.nbTabla. Si la tabla o la vista estn fuera del servidor local en un servidor vinculado, se utiliza un nombre de cuatro partes con el formato nbservidor.catalogo.nbEsquema.nbTabla. Volveremos ms adelante sobre las conexiones remotas. Sacamos los datos de la tabla tabla1 y le asignamos un alias de tabla: t1 Sacamos los datos de la tabla tabla1

3.3. 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 o o 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.

3.4. 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: Nombre Antonio Viguer Alvaro Jaumes Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor 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 aci aci aci aci aci aci bic bic idproducto 41001 41002 41003 41004 4100x 4100y 4100z 41003 41089 descripcion arandela bisagra art t3 art t4 junta extractor mont manivela rodamiento precio 0,58 0,80 1,12 1,23 0,26 28,88 26,25 6,52 2,25 12 21 12 12 13 11 22 21 11 NULL oficina contrato 1986-10-20 1986-12-10 1987-03-01 1987-05-19 1988-02-12 1988-06-14 1988-11-14 1989-10-12 1999-10-12 1990-01-13

3.5. 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 2101 2102 2103 Nombrecliente Luis Garca Antn Alvaro Rodrguez Jaime Llorens

en vez de: Numclie 2101 2102 2103 Nombre Luis Garca Antn Alvaro Rodrguez 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.

3.6. 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 GETUTCDATE DATEPART DAY MONTH YEAR DATENAME Devuelve la fecha actual. Devuelve la hora UTC. Devuelve un entero que corresponde a la parte de la fecha solicitada. Devuelve el da de la fecha indicada. Devuelve el mes de la fecha indicada. Devuelve el ao de la fecha indicada. Devuelve una cadena de caracteres que representa el valor de la unidad especificada de una fecha especificada. Devuelve un valor datetime nuevo que resulta de sumar un intervalo de tiempo a una fecha especificada.> Devuelve el n de intervalos que hay entre dos fechas. Devuelve el primer da de la semana establecido con SET DATEFIRST. Descripcin

DATEADD DATEDIFF @@DATEFIRST

SET DATEFIRST

Establece el primer da de la semana en un nmero del 1 al 7.

Funciones de cadena: Funcin ASCII CHAR NCHAR UNICODE LEN LTRIM RTRIM LEFT RIGHT SUBSTRING Descripcin Devuelve el valor de cdigo ASCII del carcter situado ms a la izquierda de una expresin de caracteres. Devuelve el carcter ASCII del entero indicado. Devuelve el carcter Unicode del entero indicado. Devuelve el entero que se corresponde al carcter Unicode indicado. Devuelve el total de caracteres de una cadena, excluidos los espacios en blanco finales. Devuelve una cadena tras quitarle los espacios en blanco iniciales. Devuelve una cadena tras quitarle los espacios en blanco finales. Devuelve los N ltimos caracteres de una cadena. Devuelve los N primeros caracteres de una cadena. Devuelve parte de una expresin.

LOWER UPPER REPLACE STUFF QUOTENAME SPACE STR REPLICATE REVERSE CHARINDEX PATINDEX

Devuelve la cadena convertida a minsculas. Devuelve la cadena convertida a maysculas. Reemplaza una determinada cadena. Elimina el nmero de caracteres especificados e inserta otro conjunto de caracteres en el punto de inicio indicado. Devuelve una cadena Unicode con los delimitadores agregados para convertirla en un identificador delimitado vlido de Microsoft SQL Server 2005. Devuelve una cadena de espacios repetidos. Devuelve una cadena de caracteres a partir de datos numricos. Repite una cadena N veces. Devuelve una cadena invertida. Devuelve la posicin inicial de la expresin especificada en una cadena de caracteres. 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 CAST y CONVERT CASE ISNULL COALESCE Descripcin Redondea un valor a la longitud y precisin indicadas. Convierten de un tipo de datos a otro de forma explcita. Evala una lista de condiciones. Reemplaza el valor NULL por otro especificado. Devuelve la primera expresin distinta de NULL entre sus argumentos.

3.7. 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 Alicante Castellon Badajoz A Corua Madrid Madrid Pamplona Valencia este este este oeste oeste

region

superavit 11800,00 -6500,00 1800,00 11100,00 -11400,00 NULL -10000,00 NULL -90000,00

centro centro norte este

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 aci aci aci aci aci aci aci idproducto 41001 41002 41003 41004 4100x 4100y 4100z descripcion arandela bisagra art t3 art t4 junta extractor mont valoracion 160,66 133,60 231,84 170,97 9,62 722,00 735,00

bic bic

41003 41089

manivela rodamiento

19,56 175,50

Para practicar puedes realizar este Ejercicio Columna calculada. Nota: Para realizar los ejercicios tienes que abrir una nueva consulta sobre la base de datos GestionSimples. En el Explorador de objetos selecciona la base de datos y elige Nueva Consulta. En la carpeta Ejercicios del curso tienes el PDF Tablas_Gestion para consultar en qu tablas est cada campo.

Objetivo
Mostrar una columna que sea el resultado de un clculo aritmtico.

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 110037 112963 112968 112975 112979 Fab aci rei aci aci rei aci Producto 4100z 2a44l 41004 41004 2a44g 4100z Precio 2,50 4,50 0,117 1,17 3,50 25,00

112983 112987 112989 112992 112993 112997 113003 113007 113012 113013 113024 113027 113034 113042 113045 113048 113049 113051 113055 113057 113058 113062 113065

aci aci fea aci rei bic imm imm aci bic qsa aci rei rei rei imm qsa qsa aci aci fea bic qsa

41004 4100y 114 41002 2a45c 41003 779c 773c 41003 41003 xk47 41002 2a45c 2a44r 2a44r 779c xk47 xk47 4100x 4100x 112 41003 xk47

1,17 25,00 2,43 0,76 0,79 6,52 18,75 9,75 1,07 6,52 3,55 8,3333 0,79 45,00 45,00 18,75 3,88 3,55 0,25 NULL 1,48 2,43 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 aci aci aci aci aci aci bic bic bic fea fea imm imm imm 41001 41002 41003 41004 4100x 4100y 4100z 41003 41089 41672 112 114 773c 775c 779c arandela bisagra art t3 art t4 junta extractor mont manivela rodamiento plato cubo cubo reostato reostato 2 reostato 3 NULL NULL NULL NULL NULL NULL NULL 19,56 175,50 0,00 170,20 36,45 273,00 71,25 0,00

imm imm imm qsa qsa qsa rei rei rei rei

887h 887p 887x xk47 xk48 xk48a 2a44g 2a44l 2a44r 2a45c

caja clavos perno manivela red red red pas bomba l bomba r junta

120,42 6,00 152,00 134,90 272,02 54,76 49,00 540,00 540,00 165,90

Listar el nombre, mes y ao del contrato de cada vendedor. SELECT nombre, MONTH(contrato) AS [Mes de contrato], YEAR(contrato) AS [Ao de contrato] FROM empleados; El resultado ser: Nombre Antonio Viguer Alvaro Jaumes Juan Rovira 10 12 3 Mes de contrato Ao de contrato 1986 1986 1987

Para practicar puedes realizar este Ejercicio Funciones en la lista de seleccin. Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas simples con funciones en la lista de seleccin.

Ejercicio paso a paso


Listar de cada empleado su cdigo, nombre, oficina, y fecha de contrato (fecha corta).

La nica dificultad es convertir la fecha de contrato completa en una fecha corta. Para eso utilizamos la funcin CONVERT() de la siguiente forma: SELECT numemp, nombre, oficina, CONVERT (CHAR(8),contrato,3) AS [Fecha contrato] FROM empleados; Adems, le hemos incluido un alias para que el ttulo de la columna sea ms descriptivo. Resultado: Numemp 101 102 103 104 105 106 107 108 109 110 111 112 113 Nombre Antonio Viguer Alvaro Jaumes Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris Oficina Fecha Contrato 12 21 12 12 13 11 22 21 NULL NULL NULL NULL NULL 20/10/86 10/12/86 01/03/87 19/05/87 12/02/88 14/06/88 14/11/88 12/10/89 12/10/99 13/01/90 01/05/05 01/05/06 01/01/07

Listar los empleados indicando cdigo, nombre y da de la semana en que fue contratado. En este caso, la funcin DATENAME() es la que calcula automticamente el da de la semana para la fecha indicada. Tendremos que pasarle los parmetros de formato: dw (day week) y de datos: contrato. SELECT numemp, nombre, DATENAME(dw,contrato) AS [Da de contrato]

FROM empleados; Resultado: Numemp 101 102 103 104 105 106 107 108 109 110 111 112 113 Nombre Antonio Viguer Alvaro Jaumes Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris Da de contrato Lunes Mircoles Domingo Martes Viernes Martes Lunes Jueves Martes Sbado Domingo Lunes Lunes

Listar de cada empleado su cdigo, nombre y ttulo (sustituir la abreviatura dir por la palabra completa Director). En esta ocasin utilizaremos la funcin REPLACE() en que indicaremos la columna sobre la que actuar la funcin, el valor a modificar y el valor que lo va a substituir. SELECT numemp, nombre, REPLACE(titulo, 'Dir ', 'Director ') AS Cargo FROM empleados; Fjate que hemos remplazado el valor con un espacio al final de la palabra. Esto se debe a que, en la tabla, no aparece la palabra Dir simplemente, sino que a continuacin indica el tipo de director (dir ventas). Si no insertramos el espacio veramos como resultado Directorventas, Directorgeneral, etc.

Resultado: Numemp 101 102 103 104 105 106 107 108 109 110 111 112 113 Nombre Antonio Viguer Alvaro Jaumes Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris Cargo representante representante representante Director ventas representante director general representante Director ventas representante representante representante representante representante

Listar las ventas en cada oficina con el formato: 22 tiene ventas de 186,042.00 SELECT oficina, 'tiene ventas de ' AS [ ], ventas FROM oficinas; El resultado sera: oficina 11 12 13 21 tiene ventas de tiene ventas de tiene ventas de tiene ventas de ventas 69300,00 73500,00 36800,00 83600,00

22 23 24 26 28

tiene ventas de tiene ventas de tiene ventas de tiene ventas de tiene ventas de

18600,00 NULL 15000,00 NULL 0,00

El incluir una constante como columna en la lista de seleccin puede parecer intil (se repetir el mismo valor en todas las filas) pero veremos ms adelante que tiene utilidad en ciertos casos. Tambin podemos utilizar la sintaxis: alias_columna = <expresion> Ejemplo: SELECT oficina, superavit = ventas-objetivo Esto tiene el mismo efecto que SELECT oficina, ventas-objetivo AS superavit

3.8. Utilizacin del asterisco *


Si queremos visualizar todas las columnas del origen de datos, en lugar de indicar todas las columnas una a una se puede utilizar el carcter de sustitucin *. Mostrar todos los datos de la tabla oficinas. SELECT * FROM oficinas; Obtener todos los datos y el supervit de cada oficina. SELECT *, (ventas-objetivo) AS superavit FROM oficinas; Tambin podemos cualificar el * con un nombre de tabla, de vista o un alias de tabla: SELECT oficinas.* FROM oficinas;

oficinas.* se interpreta como: todas las columnas de la tabla oficinas . Esta forma se utiliza normalmente cuando el origen est basado en varias tablas y queremos indicar todas las columnas no del origen completo sino de una tabla concreta. Para practicar puedes realizar este Ejercicio La palabra clave *. Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas simples utilizando la palabra clave *.

Ejercicio paso a paso


Obtener los datos de los empleados. El signo * muestra todos los campos de la tabla: SELECT * FROM empleados; Resultado: Numemp 101 Nombre Antonio Viguer Alvaro Jaumes Juan Rovira Edad Oficina 45 12 Titulo representante Contrato 1986-10-20 00:00:00.000 1986-12-10 00:00:00.000 1987-03-01 00:00:00.000 1987-05-19 00:00:00.000 1988-02-12 00:00:00.000 1988-06-14 00:00:00.000 1988-11-14 00:00:00.000 Jefe 104 Cuota 30000,00 ventas 30500,00

102

48

21

representante

108

35000,00

47400,00

103

29

12

representante

104

27500,00

28600,00

104

Jos Gonzlez Vicente Pantalla Luis Antonio Jorge Gutirrez

33

12

dir ventas

106

20000,00

14300,00

105

37

13

representante

104

35000,00

36800,00

106

52

11

director general representante

NULL

27500,00

29900,00

107

49

22

108

30000,00

18600,00

108

Ana Bustamante Mara Sunta

62

21

dir ventas

1989-10-12 00:00:00.000 1999-10-12 00:00:00.000 1990-01-13 00:00:00.000 2005-05-01 00:00:00.000 2006-05-01 00:00:00.000 2007-01-01 00:00:00.000

106

35000,00

36100,00

109

31

NULL

representante

106

3000,00

39200,00

110

Juan Victor

41

NULL

representante

104

NULL

7600,00

111

Juan Gris

50

NULL

representante

NULL

10000,00

60000,00

112

Julin Martorell Juan Gris

50

NULL

representante

NULL

10000,00

91000,00

113

18

NULL

representante

NULL

10000,00

0,00