Consultar datos en Transact SQL

La sentencia SELECT

    La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos.

    El formato de la sentencia select es:


SELECT [ALL | DISTINCT ][ TOP expression [ PERCENT ] [ WITH TIES ] ] 
             <nombre_campos>
FROM <nombre_tabla>
[ INNER | LEFT [OUTER]| RIGHT [OUTER] | CROSS]
[JOIN ] <nombre_tabla> ON <condicion_join>[ AND|OR <condicion>]
[WHERE <condicion> [ AND|OR <condicion>]]
[GROUP BY <nombre_campos>]
[HAVING <condicion>[ AND|OR <condicion>]]
[ORDER BY <nombre_campo> [ASC | DESC]

    El siguiente ejemplo muestra una consulta sencilla que obtiene el código y la "familia" de una tabla llamada familias (representaría familias de productos por ejemplo).


SELECT CO_FAMILIA, FAMILIA

FROM FAMILIAS


    El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla.


SELECT
*

FROM FAMILIAS

    Ahora vamos a realizar una consulta obteniendo además de los datos de familias, los datos de las categorias y los productos.


SELECT
*
FROM
FAMILIAS

INNER JOIN CATEGORIAS

ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA

INNER JOIN PRODUCTOS

ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA

    La combinación se realiza a través de la clausula INNER JOIN, que es una clasula exclusiva, es decir las familias que no tengan categorias y productos asociados no se devolveran.

    Si queremos realizar la consulta para que no sea exclusiva, tenemos que utilizar LEFT JOIN. El uso de la palabra reservada OUTER es opcional.


SELECT
*

FROM FAMILIAS

LEFT OUTER JOIN CATEGORIAS

ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA

LEFT OUTER JOIN PRODUCTOS

ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA

    Los registros que no tengan datos relacionados en una consulta LEFT JOIN devolveran en valor null en los campos que correspondan a las tablas en las que no tienen dato.

    También podemos forzar un producto cartesiano (todos con todos) a través de CROSS JOIN.


SELECT
* FROM FAMILIAS

CROSS JOIN CATEGORIAS

La cláusula WHERE

    La cláusula WHERE es la instrucción que nos permite filtrar el resultado de una sentencia SELECT.


SELECT
CO_FAMILIA, FAMILIA

FROM FAMILIAS

WHERE CO_FAMILIA = 1

    Por supuesto, podemos especificar varias condiciones para el WHERE:


SELECT
*

FROM FAMILIAS

WHERE CO_FAMILIA = 1

OR CO_FAMILIA = 2

    Podemos agrupar varias valores para una condicion en la clausula IN:


SELECT
*

FROM FAMILIAS

WHERE CO_FAMILIA IN ( 1 , 2)

    La clausula WHERE se puede utilizar conjuntamente con INNER JOIN, LEFT JOIN ...


SELECT
FAMILIAS.CO_FAMILIA,

FAMILIAS.FAMILIA

FROM FAMILIAS

INNER JOIN CATEGORIAS

ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA

WHERE FAMILIAS.CO_FAMILIA > 1

    Siempre que incluyamos un valor alfanumerico para un campo en la condición WHERE este debe ir entre comillas simples:


SELECT
*

FROM FAMILIAS

WHERE FAMILIA = 'FAMILIA 1'

    Para consultar campos alfanumericos, es decir, campos de texto podemos utilizar el operador LIKE conjuntamente con comodines.


SELECT
*

FROM FAMILIAS

WHERE FAMILIA LIKE 'FAM%'

    Los comodines que podemos utilizar en son los siguientes:

  • % , representa cualquier cadena de texto de cero o más caracteres de cualquier longitud.
  • _ , representa un caracter.
  • [a-d], representa cualquier caracter del intervalo a-d.
  • [abcd], representa cualquier caracter del grupo abcd.
  • [^a-d], representa cualquier caracter diferente del intervalo a-d.
  • [^abcd], representa cualquier caracter distinto del grupo abcd.

    También podemos obtener los valores distintos utilizando DISTINCT.


SELECT
DISTINCT FAMILIA -- Devuelve los distintos valores de FAMILIA

FROM FAMILIAS

    Podemos limitar el número de registros que devuelve la consulta a través de la clausula TOP. La clausula TOP admite como parámetros un valor numérico entero o un porcentaje (sólo a partir de la version 2005)


SELECT
TOP 10 * -- Devuelve 10 registros

FROM FAMILIAS


SELECT
TOP 50 PERCENT * -- Devuelve el 50% de los registros

FROM FAMILIAS

    La clausula TOP se puede combinar con WITH TIES en consultas agregadas.

La cláusula ORDER BY

    Podemos especificar el orden en el que serán devueltos los datos a través de la cláusula ORDER BY.


SELECT
CO_FAMILIA, FAMILIA

FROM FAMILIAS

ORDER BY FAMILIA DESC

    También podemos indicar el índice del campo en la lista de selección en lugar de su nombre :

 

SELECT CO_FAMILIA, FAMILIA

FROM FAMILIAS

ORDER BY 2 DESC -- Ordena por FAMILIA

Pedro  Herrarte  Sánchez
Consultar datos en Transact SQL
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:05/07/2007
Última actualizacion:05/07/2007
Visitas totales:80686
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com