Consultas de selección

Las consultas de selección se utilizan para indicar al motor de datos que devuelva información de las bases de datos, esta información es devuelta en forma de conjunto de registros que se pueden almacenar en un objeto recordset.
Este conjunto de registros puede ser modificable.

Consultas básicas

La sintaxis básica de una consulta de selección es la siguiente:

SELECT
   Campos
FROM
   Tabla

En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo:

SELECT
   Nombre, Teléfono
FROM
   Clientes

Esta sentencia devuelve un conjunto de resultados con el campo nombre y teléfono de la tabla clientes.

Devolver Literales

En determinadas ocasiones nos puede interesar incluir una columna con un texto fijo en una consulta de selección, por ejemplo, supongamos que tenemos una tabla de empleados y deseamos recuperar las tarifas semanales de los electricistas, podríamos realizar la siguiente consulta:

SELECT
   Empleados.Nombre, 'Tarifa semanal: ', Empleados.TarifaHora * 40
FROM
   Empleados
WHERE
   Empleados.Cargo = 'Electricista'

Ordenar los registros

Adicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la cláusula ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar. Ejemplo:

SELECT
   CodigoPostal, Nombre, Telefono
FROM
   Clientes
ORDER BY
   Nombre

Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes ordenados por el campo Nombre.

Se pueden ordenar los registros por mas de un campo, como por ejemplo:

SELECT
   CodigoPostal, Nombre, Telefono
FROM
   Clientes
ORDER BY
   CodigoPostal, Nombre

Incluso se puede especificar el orden de los registros: ascendente mediante la cláusula (ASC - se toma este valor por defecto) ó descendente (DESC)

SELECT
   CodigoPostal, Nombre, Telefono
FROM
   Clientes
ORDER BY
   CodigoPostal DESC , Nombre ASC

Uso de Indices de las tablas

Si deseamos que la sentencia SQL utilice un índice para mostrar los resultados se puede utilizar la palabra reservada INDEX de la siguiente forma:

SELECT ... FROM Tabla (INDEX=Indice) ...

Normalmente los motores de las bases de datos deciden que índice se debe utilizar para la consulta, para ello utilizan criterios de rendimiento y sobre todo los campos de búsqueda especificados en la cláusula WHERE. Si se desea forzar a no utilizar ningún índice utilizaremos la siguiente sintaxis:

SELECT ... FROM Tabla (INDEX=0) ...

Consultas con Predicado

El predicado se incluye entre la cláusula y el primer nombre del campo a recuperar, los posibles predicados son:

Predicado Descripción
ALL Devuelve todos los campos de la tabla
TOP Devuelve un determinado número de registros de la tabla
DISTINCT Omite los registros cuyos campos seleccionados coincidan totalmente
DISTINCTOW Omite los registros duplicados basándose en la totalidad del registro y no sólo en los campos seleccionados.

ALL

Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de datos selecciona todos los registros que cumplen las condiciones de la instrucción SQL y devuelve todos y cada uno de sus campos. No es conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene, es mucho más rápido indicar el listado de campos deseados.

SELECT ALL
FROM
   Empleados

SELECT *
FROM
   Empleados

TOP

Devuelve un cierto número de registros que entran entre al principio o al final de un rango especificado por una cláusula ORDER BY. Supongamos que queremos recuperar los nombres de los 25 primeros estudiantes del curso 1994:

SELECT TOP 25
   Nombre, Apellido
FROM
   Estudiantes
ORDER BY
   Nota DESC

Si no se incluye la cláusula ORDER BY, la consulta devolverá un conjunto arbitrario de 25 registros de la tabla de Estudiantes. El predicado TOP no elige entre valores iguales. En el ejemplo anterior, si la nota media número 25 y la 26 son iguales, la consulta devolverá 26 registros. Se puede utilizar la palabra reservada PERCENT para devolver un cierto porcentaje de registros que caen al principio o al final de un rango especificado por la cláusula ORDER BY. Supongamos que en lugar de los 25 primeros estudiantes deseamos el 10 por ciento del curso:

SELECT TOP 10 PERCENT
   Nombre, Apellido
FROM
   Estudiantes
ORDER BY
   Nota DESC

El valor que va a continuación de TOP debe ser un entero sin signo. TOP no afecta a la posible actualización de la consulta.

DISTINCT

Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instrucción SELECT se incluyan en la consulta deben ser únicos. Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si dos registros contienen López en el campo Apellido, la siguiente instrucción SQL devuelve un único registro:

SELECT DISTINCT
   Apellido
FROM
   Empleados

Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la cláusula SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros usuarios.

DISTINCTROW

Este predicado no es compatible con ANSI. Que yo sepa a día de hoy sólo funciona con ACCESS.

Devuelve los registros diferentes de una tabla; a diferencia del predicado anterior que sólo se fijaba en el contenido de los campos seleccionados, éste lo hace en el contenido del registro completo independientemente de los campos indicados en la cláusula SELECT.

SELECT DISTINCTROW
   Apellido
FROM Empleados

Si la tabla empleados contiene dos registros: Antonio López y Marta López el ejemplo del predicado DISTINCT devuelve un único registro con el valor López en el campo Apellido ya que busca no duplicados en dicho campo. Este último ejemplo devuelve dos registros con el valor López en el apellido ya que se buscan no duplicados en el registro completo.

ALIAS

En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por simple capricho o porque estamos recuperando datos de diferentes tablas y resultan tener un campo con igual nombre. Para resolver todas ellas tenemos la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Tomado como referencia el ejemplo anterior podemos hacer que la columna devuelta por la consulta, en lugar de llamarse apellido (igual que el campo devuelto) se llame Empleado. En este caso procederíamos de la siguiente forma:

SELECT DISTINCTROW
   Apellido AS Empleado
FROM Empleados

AS no es una palabra reservada de ANSI, existen diferentes sistemas de asignar los alias en función del motor de bases de datos. En ORACLE para asignar un alias a un campo hay que hacerlo de la siguiente forma:

SELECT
   Apellido AS "Empleado"
FROM Empleados

También podemos asignar alias a las tablas dentro de la consulta de selección, en esta caso hay que tener en cuenta que en todas las referencias que deseemos hacer a dicha tabla se ha de utilizar el alias en lugar del nombre. Esta técnica será de gran utilidad más adelante cuando se estudien las vinculaciones entre tablas. Por ejemplo:

SELECT
   Apellido AS Empleado
FROM
   Empleados AS Trabajadores

Para asignar alias a las tablas en ORACLE y SQL-SERVER los alias se asignan escribiendo el nombre de la tabla, dejando un espacio en blanco y escribiendo el Alias (se asignan dentro de la cláusula FROM).

SELECT
   Trabajadores.Apellido (1) AS Empleado
FROM
   Empleados Trabajadores

(1)Esta nomenclatura [Tabla].[Campo] se debe utilizar cuando se está recuperando un campo cuyo nombre se repite en varias de las tablas que se utilizan en la sentencia. No obstante cuando en la sentencia se emplean varias tablas es aconsejable utilizar esta nomenclatura para evitar el trabajo que supone al motor de datos averiguar en que tabla está cada uno de los campos indicados en la cláusula SELECT.

Recuperar Información de una base de Datos Externa

Para concluir este capítulo se debe hacer referencia a la recuperación de registros de bases de datos externas. Es ocasiones es necesario la recuperación de información que se encuentra contenida en una tabla que no se encuentra en la base de datos que ejecutará la consulta o que en ese momento no se encuentra abierta, esta situación la podemos salvar con la palabra reservada IN de la siguiente forma:

SELECT
   Apellido AS Empleado
FROM
   Empleados IN'c: databasesgestion.mdb'

En donde c: databasesgestion.mdb es la base de datos que contiene la tabla Empleados. Esta técnica es muy sencilla y común en bases de datos de tipo ACCESS en otros sistemas como SQL-SERVER u ORACLE, la cosa es más complicada la tener que existir relaciones de confianza entre los servidores o al ser necesaria la vinculación entre las bases de datos. Este ejemplo recupera la información de una base de datos de SQL-SERVER ubicada en otro servidor (se da por supuesto que los servidores están lincados):

SELECT
   Apellido
FROM
   Servidor1.BaseDatos1.dbo.Empleados

Autor

Claudio

Compartir

Comentarios

Richard

21/11/2005
Tutorial muy completo, personalmente uno de los mejores documentos de SQL publicados en la WEB, mis felicitaciones!!!

Pablo Camps

08/2/2006
No existe la funcion TOP en Oracle, si existe en SQL server

Javi

15/6/2009
varias condiciones
¿¿Alguien me podría indicar que tendría que poner en una consulta con doble condición??

El ejercicio es este:

SELECT PROVINCIA, [COMUNIDAD AUTONOMA],
FROM PROVINCIAS
WHERE [COMUNIDAD AUTONOMA] like "C*"

Pero aparte tengo que sacar la densidad lo cual la saco así ---> POBLACION * SUPERFICIE AS DENSIDAD, pero no sé que hacer para que se me indique a la hora de ejecutarlo :S, por cierto la densidad que tengo que sacar debe de ser mayor a 80hb./km2. Gracias!! por favor ayudadme!! utilizo Access

luis

31/7/2009
tuto SQL
TUTORIAL SQL BASICO-> SELECT

ERIKA

20/10/2009
OBTENER EL NOMBRE DE UNA TABLA
HOLA!!! KISIERA SABER COMO PODER OBTENER EL NOMBRE DE UNA TABLA POR ME DIO DE UNA CONSULTA!!! ..........ESPERO Y ME PUEDAS AYUDAR, GRACIAS!!!

JCastillo

13/3/2010
Consulta
Buenas tarde he leido bastante aqui y me ha ayudado mucho.. pero ahora estoy pegado en algo.. soy estudiante y no se mucho.... Necesito hacer una pantalla donde pueda borrar un registro que esta en una tabla "invoice" y que antes de borrar el registro una ventana emergente diga esta seguro.
Les agrdezco su ayuda de antemano

Los registros a borrar son no_invoice, co, letra, qty, estilo.

Y la pantalla emergente es porque al borrar esos registros los cambios afectan a una tabla llamada "export" con los mismos campos

silena

26/11/2010
no se los codigosss....
hola quisera saber la estructura de codigos de consultas sql aplicados a visual basic.. gracias.

Mayte

20/1/2011
Como realizar una consulta
Necesito saber la sintaxis para seleccionar el elemento k mas se repite, por ejemplo:
de una tabla autos seleccionar la marca k mas se repite

yhernandez24

28/2/2011
felicitaciones
extremadamente bueno.

neko

29/3/2011
orale
ORALEEE!!!!!!!
:) XD

Jimmy

26/1/2012
Gracias
e un articulo muy sencillo de entender de verdad me fue de mucha ayuda para mi tarea ....
gracias

arianna

20/6/2012
tengo problema para imprimir nombre del municipio
<?php require_once('Connections/censo.php');
session_start();
$municipio=$_SESSION['municipio'];
$parroquia=$_SESSION['parroquia'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sp" lang="sp" dir="ltr">
<head>
<title></title>
<style media="all" type="text/css">
@import "menu_style.css";.mayus {
font-weight: bold;
}
.mayus {
font-weight: bold;
}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=latin1" />
<style type="text/css">
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:hover {
text-decoration: none;
}
a:active {
text-decoration: none;
}
.Arr {color: #FFF;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
font-weight: bold;
}
.bl {color: #FFF;
}
.go {font-weight: bold;
}
.pie {font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
}
</style>
</head>
<body onLoad="Javascript: document.buscar.criterio.focus();">
<form id="form1" method="get" action="consultar.php">
<table width="200" border="1" align="center" bordercolor="#FF0000">
<tr>
<td><table width="200" border="0">
<tr>
<td height="130" colspan="8"><img src="IMA/top.png" alt="" width="1000" height="100" />
<hr /></td>
</tr>
<tr>


<td width="78" height="40"></td></tr>

</table></td>
</tr>

<tr>
<td colspan="10"><hr />
<table width="800" height="231" border="0" align="center">
<tr>
<td height="21" colspan="3" align="center"><fieldset>
<table width="820" height="231" border="0" align="center">
<tr>
<td height="21" colspan="3" align="center"><strong>Datos de los Militantes
</strong></td>
</tr>
<tr>
<td height="21" colspan="3" align="center"><strong>

<?php
//inicializo el criterio y recibo cualquier cadena que se desee buscaralerta


echo "<div align='center'>";

//echo "ordenados por <b>".$orden."</b>";
if(isset($txt_criterio)){
echo "<br>Valor Buscado: <b>".$txt_criterio."</b>";
}
echo "</font></div>";
echo "<table align='center' width='100%' border='0' cellspacing='1' cellpadding='0'>";
echo "<tr><td colspan='8'><hr noshade></td></tr>";
echo "<th bgcolor='#CCCCCC'>Cedula</th>";
echo "<th bgcolor='#CCCCCC'>Nombre</th>";
echo "<th bgcolor='#CCCCCC' align='center'>Seleccionar</th>";
$coneccion = $censo;

$bd=mysql_select_db("censo",$coneccion);
$_pagi_sql = "SELECT * FROM `militantes_aragua_400` where militantes_aragua_400.DES_MUNICIPIO like '%" . $municipio . "%' and militantes_aragua_400.DES_PARROQUIA like '%" . $parroquia . "%' and estatus is null";
//echo $_pagi_sql;
//echo $municipio;
echo "Municipio asignado: ".$municipio ;
echo mysql_error();
//cantidad de resultados por página (opcional, por defecto 20)
$_pagi_cuantos = 15;//Elegí un número pequeño para que se generen varias páginas

//cantidad de enlaces que se mostrarán como máximo en la barra de navegación
$_pagi_nav_num_enlaces = 3;//Elegí un número pequeño para que se note el resultado

//Decidimos si queremos que se muesten los errores de mysql
$_pagi_mostrar_errores = false;//recomendado true sólo en tiempo de desarrollo.

//Si tenemos una consulta compleja que hace que el Paginator no funcione correctamente,
//realizamos el conteo alternativo.
$_pagi_conteo_alternativo = true;//recomendado false.

//Supongamos que sólo nos interesa propagar estas dos variables
$_pagi_propagar = array("id","termino");//No importa si son POST o GET

//Definimos qué estilo CSS se utilizará para los enlaces de paginación.
//El estilo debe estar definido previamente
$_pagi_nav_estilo = "paginacion";

//definimos qué irá en el enlace a la página anterior
$_pagi_nav_anterior = "&lt;";// podría ir un tag <img> o lo que sea

//definimos qué irá en el enlace a la página siguiente
$_pagi_nav_siguiente = "&gt;";// podría ir un tag <img> o lo que sea

//Incluimos el script de paginación. Éste ya ejecuta la consulta automáticamente
include("paginator.inc.php");

//Leemos y escribimos los registros de la página actual
while($registro = mysql_fetch_array($_pagi_result)){

?>
<!-- tabla de resultados -->
</strong></td>
</tr>
<tr onmouseover="this.style.backgroundColor='#EEEEEE';this.style.cursor='hand';" onmouseout="this.style.backgroundColor='#FFFFFF'"o="o""];">

<?php

$cedula=$registro["Cedula"]; ?>
<td align="left" style="border:1px solid #C6D3DE;"><?php echo $registro["Cedula"]; ?></td>
<td align="left" style="border:1px solid #C6D3DE;"><?php echo $registro["Nombre"]; ?></td>
<td align="center" style="border:1px solid #C6D3DE;" ><a href="filtro.php?recordID=<?php echo $cedula; ?>"><img src="imagenes/document-preview.png" alt="" width="30" height="30" border="0" /></a></td>


</tr>
<!-- fin tabla resultados -->
<?php
}
//Incluimos la información de la página actual
//Incluimos la barra de navegación

?>
<?php


?>
</table>
</fieldset></td>
</tr>
</table>
<?php
echo"<p>".$_pagi_navegacion."</p>";
?></td>
</tr>
<tr>
<td colspan="10" align="center" bgcolor="#EAEAEA"><span class="pie">Copyright &copy; 2011 <span class="go">Gobierno Bolivariano de Aragua</span> Reservados todos los derechos.</span></td>
</tr>
</table></td>
</tr>
</table>
</form>
</body>
</html>

mary

24/9/2012
resolucion
necesito crear un procedimiento almacenado que reciba el ombre de un pais y devuelva un resultado donde se muestre el nombre y cuantos de partamentos tiene