0% encontró este documento útil (0 votos)
4 vistas

Consultas basicas SQL en MYSQL

La Unidad 4 se centra en los fundamentos de SQL, explicando su uso, componentes y tipos de sentencias, incluyendo DDL, DML y DCL. Se detalla la historia de SQL y su evolución desde su creación en 1970, así como las normas de escritura y sintaxis. Además, se introduce la práctica con SQL utilizando MySQL como sistema gestor de bases de datos relacional.

Cargado por

dlnatalia20sep
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas

Consultas basicas SQL en MYSQL

La Unidad 4 se centra en los fundamentos de SQL, explicando su uso, componentes y tipos de sentencias, incluyendo DDL, DML y DCL. Se detalla la historia de SQL y su evolución desde su creación en 1970, así como las normas de escritura y sintaxis. Además, se introduce la práctica con SQL utilizando MySQL como sistema gestor de bases de datos relacional.

Cargado por

dlnatalia20sep
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 31

Unidad 4. Fundamentos de SQL.

Consultas
1. El lenguaje SQL
2. ¿Cómo se usa SQL?
3. Componentes del lenguaje SQL
3.1. Tipos de sentencias
3.2. Normas de escritura y sintaxis
3.3. Proceso de sentencias SQL por el SGBDR
4. Practicando con SQL
4.1. El SGBD relacional MySQL Server
5. Un ejemplo para las prácticas
5.1. Creación de la base de datos para las prácticas
6. Tipos de Datos
6.1. Tipos de datos en MySQL
7. Operadores y Funciones de agregación
8. Funciones SQL
9. La Sentencia SELECT.
9.1. Consultas sobre las filas de una tabla
9.2. Cláusula WHERE
9.3. Cláusula DISTINCT
9.4. Cláusula ORDER BY
9.5. Cláusula GROUP BY y funciones de agregación
9.6. Cláusula HAVING
9.7. Cláusula LIMIT
9.8. Subconsultas
9.9. Consultas combinadas a varias tablas (JOIN)

1. El lenguaje SQL
En las unidades didácticas anteriores has aprendido que mediante el
modelo Entidad-Relación se pueden modelizar situaciones del mundo
real, de manera que disponemos de una herramienta gráfica para
trasladar los elementos de un sistema de información y sus relaciones,
a un esquema manejable que puede ser fácilmente interpretado por
cualquiera que conozca las reglas por las que se rige. Posteriormente
has comprobado cómo se puede trasladar ese modelo Entidad-Relación
a otro esquema de información más orientado a su tratamiento, como
es el modelo relacional.

Pero, ¿de qué manera podemos almacenar y tratar la información esquematizada en los
modelos E-R y relacional por medio de un Sistema Gestor de Bases de Datos? La respuesta a
estas preguntas se llama SQL.

 SQL es un lenguaje que nos permite interactuar con los SGBD Relacionales para
especificar las operaciones que deseamos realizar sobre los datos y su estructura.
 SQL son las siglas de Structured Query Language (Lenguaje de Consulta Estructurado).
 Es un lenguaje declarativo, basado en el Álgebra y Cálculo Relacional, lo cual quiere
decir que en él se especifica al Sistema Gestor de Base de Datos qué queremos obtener
y no la manera de cómo conseguirlo.
 Se puede utilizar en modo interactivo (vía consola o interfaz gráfico), o bien embebido
en programas.
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

 SQL, un poco de historia.

El origen de SQL está íntimamente ligado al de las bases de datos relacionales. En 1970 Codd
propuso el modelo relacional que ya has estudiado en unidades anteriores.
Basándose en esta idea en los laboratorios de IBM se definió el lenguaje
SEQUEL (Structured English QUEry Language) que posteriormente sería
implementado por el SGBD System R. Más tarde otros fabricantes de SGBD
lo adoptarían, de forma que se acabó convirtiendo en un estándar de la
industria informática.

En 1986 el ANSI (Instituto


Americano de estándares) publicó la primera versión
estándar del lenguaje, hoy conocido como SQL-86. Al
año siguiente este estándar es adoptado por la ISO
(Organismo Internacional de Estandarización), y a partir de entonces se han sucedido nuevas
versiones que ampliaban en capacidad a las anteriores:

En 1989 el estándar ISO (y ANSI) fue objeto de una revisión y ampliación dando lugar al lenguaje
que se conoce con el nombre SQL89 o SQL1. En 1992 el estándar es revisado y ampliado
considerablemente para cubrir carencias de la versión anterior, apareciendo así la nueva versión
estándar de SQL (a día de hoy sigue siendo la más conocida) llamada SQL92 o SQL2. En 1999 se
aprueba un nuevo SQL estándar, conoce como SQL99 o SQL3, que incorpora mejoras que
incluyen triggers, procedimientos, funciones, y otras características de las bases de datos
objeto-relacionales. Otras revisiones son SQL:2003 (introduce algunas características de
XML y cambios en columnas autonuméricas), SQL:2006 (permite el uso de SQL
conjuntamente con XML y SQuery) y SQL:2008 (incluye disparadores del tipo INSTEAD OF,
añade sentencia TRUNCATE, entre otras).

SQL es un lenguaje con cierta antigüedad que ha tenido que evolucionar para adaptarse a
nuevas características y requerimientos. Hoy día SQL es el lenguaje de consulta y
manipulación de datos más extendido y utilizado por todos los desarrolladores,
administradores y fabricantes de SGBDR.

Es importante resaltar que SQL no es propiedad de ningún fabricante, sino que es una norma
a seguir, desgraciadamente los fabricantes de software no suelen implementar SQL puro en sus
productos, sino que a menudo incorporan pequeñas variaciones para conseguir funcionalidades
concretas en sus desarrollos. Esto hace que lo que debería ser un estándar no lo sea
completamente en la realidad.

 SQL, un ejemplo.

El modelo relacional tiene como estructura de almacenamiento de los datos las relaciones o
tablas. La intensión o esquema de una relación consiste en el nombre que hemos dado a la
relación y un conjunto de atributos. La extensión de una relación es un conjunto de tuplas. Al
trabajar con SQL, esta nomenclatura cambia, como podemos apreciar en la siguiente figura

2
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

 Hablaremos de tablas en lugar de relaciones.


 Hablaremos de columnas en lugar de atributos.
 Hablaremos de filas en lugar de tuplas.

Sin embargo, a pesar de que la nomenclatura utilizada sea diferente, los conceptos son los
mismos.

 Con el lenguaje SQL se puede definir, manipular y controlar una base de datos relacional.

A continuación veremos, aunque sólo en un nivel introductorio, cómo se pueden realizar estas
acciones:

1) Crear una tabla que contuviese por ejemplo los datos de los productos de
nuestra empresa:

3
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

2) Insertar un producto en la tabla creada anteriormente:

3) Consultar qué productos de nuestra empresa son sillas:

4) Dejar acceder a uno de nuestros vendedores a la información de la tabla productos:

Y muchas más cosas que iremos viendo punto por punto en los siguientes apartados.

Fijémonos en la estructura de todo lo que hemos hecho hasta ahora con SQL.
Las operaciones de SQL reciben el nombre de sentencias y están formadas por diferentes partes
que denominamos cláusulas, tal y como podemos apreciar en el siguiente ejemplo:

Esta consulta muestra el código, el nombre y el tipo de los productos que cuestan más de 1.000
euros.

4
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

2. ¿Cómo se usa SQL?


 Posibles modos de ejecución SQL.

Los Sistemas Gestores de Bases de Datos Relacionales (SGBDR) permiten dos modos de acceso a
las bases de datos:

1. Modo interactivo o directo, destinado principalmente a los usuarios avanzados


en el que las diversas sentencias SQL se introducen a través de un cliente en modo
texto utilizando un intérprete de comandos que está directamente conectado al
servidor de BD, por lo que las instrucciones se traducen sin intermediarios y los
resultados se muestran en el cliente. Normalmente es un modo de trabajo incómodo,
pero permite tener acceso a todas las capacidades del lenguaje SQL de la base de datos a
la que estamos conectados.
También existen clientes gráficos. Se trata de software que permite conectar y
manejar de forma gráfica la base de datos, de manera que las acciones realizadas son
traducidas a SQL y enviadas al servidor. Los resultados recibidos vuelven a ser traducidos
de forma gráfica para un manejo más cómodo.

2. Modo embebido o incrustado, destinado al uso por parte de los programadores.


En este caso las sentencias SQL se introducen en lenguajes de programación, llamados
lenguajes anfitrión (por ejemplo Java, lenguajes de la plataforma .NET de Microsoft,
PHP, C++, etc.), de manera que el resultado es una mezcla de ambos. En este caso el
lenguaje anfitrión aporta lo que le falta a SQL, es decir la programación. Al compilar
el código se utiliza un precompilador de la propia base de datos para traducir el SQL y
conectar la aplicación resultado con la base de datos a través de un software adaptador
(driver) como JDBC u ODBC por ejemplo. Aunque éste es el modo habitual en el que se
utiliza SQL cuando se desarrollan aplicaciones, su estudio de esta forma requiere el
estudio simultáneo del lenguaje anfitrión.

3. Componentes del lenguaje SQL


3.1 Tipos de sentencias SQL
El lenguaje SQL está compuesto por sentencias. Esas sentencias se pueden clasificar en tres
grupos:

 Sentencias DDL (Lenguaje de Definición de Datos): Sirven para crear, modificar y


borrar elementos estructurales en los SGBDR (bases de datos o esquemas, tablas,
índices, vistas) y establecer restricciones de integridad. Las principales sentencias
DDL son:

▫ CREATE -- creación de BD, tablas, vistas, índices


▫ ALTER -- modificación
▫ DROP -- eliminación

Las definiciones de esos objetos quedan almacenadas en el diccionario de datos del


sistema.

5
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

 Sentencias DML (Lenguaje de Manipulación de Datos): Permiten realizar diferentes


operaciones con los datos almacenados en las estructuras de la base de datos, como
por ejemplo: insertar, modificar y eliminar datos, y generar consultas. Las sentencias
DML que permiten realizar estas operaciones son:

▫ INSERT -- insertar o añadir datos


▫ UPDATE -- modificar o actualizar datos
▫ DELETE -- eliminar datos
▫ SELECT -- consultar datos

Debido a la importancia de la realización de consultas o búsqueda de datos en una BD, se habla a


veces del lenguaje de consultas DQL (Data Query Languaje) para referirse a la SELECT y de DML
para referirse al resto de operaciones de manipulación de datos (insert, update y delete).

 Sentencias DCL (Lenguaje de Control): Es un conjunto de sentencias orientado a


gestionar usuarios y sus permisos, también permiten controlar transacciones. Las
sentencias DCL que permiten realizar estas operaciones son:

▫ GRANT y REVOKE –- conceder y suprimir privilegios


▫ COMMIT y ROLLBACK -- control de transacciones

Con el tiempo han surgido nuevas necesidades en los SGBDR que han obligado a incorporar
nuevas sentencias que no se pueden clasificar en los tres grupos clásicos anteriores, cómo son
bloqueo, replicación, etc.

Las sentencias SQL a su vez se construyen a partir de:

 Cláusulas: Que modifican el comportamiento de las sentencias. Constan de palabras


reservadas y alguno de los siguientes elementos.
 Operadores lógicos y de comparación: Sirven para ligar operandos y producir un
resultado booleano (verdadero o falso).
 Funciones de agregación: Para realizar operaciones sobre un grupo de filas de una tabla.
 Funciones: Para realizar cálculos y operaciones de transformación sobre los datos.
 Expresiones: Construidas a partir de la combinación de operadores, funciones, literales y
nombres de columna.

A lo largo de esta unidad estudiaremos y practicaremos gran parte de las sentencias SQL, y por
supuesto las más importantes y utilizadas. Aunque su estudio completo no sería posible aquí, por
su elevadísimo número y casuística de cada una, y para completar tu formación te remitimos a
los buenos manuales que sobre SQL circulan en la red y en las librerías. En especial te
recomendamos la documentación del SGBDR que vas a utilizar, MySQL. Puedes obtenerla de la
misma web desde donde has descargado la aplicación.

3.2 Normas de escritura y sintaxis


 En SQL no se distingue entre mayúsculas y minúsculas. Da lo mismo como se
escriba.
 El final de una instrucción lo indica el signo del punto y coma
 Los comentarios en el código SQL comienzan por /* y terminan por */
Los comandos SQL (SELECT, INSERT,...) no pueden ser partidos por espacios o saltos de
línea antes de finalizar la instrucción
 Se pueden tabular líneas para facilitar la lectura si fuera necesario

6
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Formato o sintaxis de las sentencias


Para indicar la sintaxis de un comando se usan símbolos especiales. Los símbolos que
utilizaremos (de acuerdo con la sintaxis que se utiliza normalmente en cualquier documentación
de este tipo) son:

1. PALABRA Cuando en la sintaxis se utiliza una palabra en negrita, significa que es una
palabra que hay que escribir literalmente (aunque sin importar si en mayúsculas o
minúsculas).
2. texto. El texto que aparece en color normal sirve para indicar que no hay que escribirlo
literalmente, sino que se refiere a un tipo de elemento que se puede utilizar en el
comando.

EJEMPLO:

SELECT columna FROM tabla;

El texto columna hay que cambiarlo por un nombre concreto de columna (nombre,
apellidos,...), al igual que tabla se refiere a un nombre de tabla concreto.

3. [ ] (corchetes). Los corchetes sirven para encerrar texto que no es obligatorio en el


comando, es decir para indicar una parte opcional.
4. | (barra vertical). Este símbolo (|), la barra vertical, indica opción. Las palabras
separadas con este signo indican que se debe elegir una de entre todas las palabras.
5. (puntos suspensivos) Indica que se puede repetir el texto anterior en el comando
continuamente (significaría, y así sucesivamente)
6. {} (llaves) Las llaves sirven para indicar opciones mutuamente exclusivas pero
obligatorias. Es decir, opciones de las que sólo se puede elegir una opción, pero de las
que es obligado elegir una.

EJEMPLO:

SELECT { * | columna | expresión } FROM tabla;

El ejemplo anterior indicaría que se debe elegir obligatoriamente el asterisco o un nombre de


columna o una expresión. Si las llaves del ejemplo fueran corchetes, entonces indicarían que
incluso podría no aparecer ninguna opción.

3.3 Proceso de sentencias SQL por el SGBDR

1. Análisis de la sentencia desde el punto de vista sintáctico. Errores sintácticos.


2. Valida la sentencia. Comprueba que existan las tablas, columnas referenciadas,
privilegios del usuario.
3. Optimiza la sentencia, intentando consumir los mínimos recursos
4. Genera un plan de aplicación para la sentencia. Genera código ejecutable.
5. Ejecuta el plan de aplicación y se muestran los resultados.

7
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

4. Practicando con SQL


A través de SQL podemos interactuar con un SGBDR que a su vez gestiona una o más bases
de datos relacionales. Por lo tanto lo primero que debemos hacer para empezar a aprender y
practicar SQL es disponer de un SGBDR en nuestro ordenador de prácticas.

Se nos presenta aquí la primera decisión que adoptar ¿Qué SGBDR utilizar? La respuesta es al
mismo tiempo sencilla y complicada, veamos:
▫ Es sencilla porque nos vale cualquier SGBDR que
implemente al menos SQL-92 o SQL-99.
▫ Es complicada porque existen bastantes productos en el
mercado que cumplen ese requisito.

Utilizaremos como SGBD de pruebas para esta unidad MySQL.

4.1 El SGBD relacional MySQL Server


MySQL es uno de los Sistemas Gestores de Bases de Datos relacional más populares desarrollado
bajo la filosofía de código abierto. Su obtención es fácil, se puede descargar gratuitamente de
la web y existe mucha documentación accesible sobre él.

Es una base de datos muy rápida, robusta, segura y fácil de usar. Fue desarrollada inicialmente
para manejar grandes bases de datos mucho más rápidamente que las soluciones existentes y ha
sido usada con éxito en ambientes de producción de alta demanda. Su desarrollo es constante,
lo que hace que ofrezca una rica variedad de funciones. Su conectividad, velocidad y
seguridad hacen a MySQL altamente satisfactorio para acceder a través de Internet.
Actualmente existen versiones para la mayoría de los Sistemas Operativos.

Para comenzar a trabajar y practicar con SQL necesitaremos tener instalado el Servidor de
MySQL. También es conveniente que instalemos algún cliente gráfico para acceder al servidor y
ejecutar sentencias SQL, como por ejemplo SQL Development (anteriormente denominado
Query Browser), que viene incluido en el paquete de herramientas MySQL Workbench.

Por tanto instalaremos el siguiente software:


 Servidor MySQL. El SGBDR en sí.
 MySQL Workbench GUI Tools. Una aplicación que incluye:
o SQL Development. Un intérprete de sentencias SQL en modo gráfico, que permite
ejecutar scripts SQL, editar datos y manipular en modo gráfico los objetos de la
BD. Lo utilizaremos intensamente en esta unidad.
o Data Modeling. Aplicación para el desarrollo visual de modelos de datos, con
ingeniería directa e inversa entre otras opciones.
o Server Administration. Aplicación para administrar MySQL de forma gráfica
(anteriormente denominado Administrator).

Desde la web oficial de MySQL podrás descargar estas aplicaciones MySQL.


http://dev.mysql.com/downloads/

Consulta el documento que encontrarás en la plataforma en Recursos UD3 con el nombre


UD4_MySQL_guia_rapida_ _Instalación_conexion_servidor.pdf

En este documento puedes ver los pasos a seguir para la instalación del Servidor MySQL, su
puesta en marcha y como interactuar con el SGBDR MySQL mediante:
 Un cliente en modo texto, consola o la Línea de comandos de MySQ (Monitor MySQL)
 Un cliente gráfico como SQL Development
8
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

5. Un ejemplo para las prácticas


En esta unidad didáctica estudiaremos cómo SQL permite crear bases de datos y también
manipularlas. Y para hacer de hilo conductor vamos a plantear un ejemplo que nos permitirá
probar todos los conceptos que vayamos introduciendo. De esta forma el ejemplo se irá
enriqueciendo conforme avances en el estudio de los contenidos de esta unidad y su
comprensión y asimilación desde el principio te permitirá concentrarte en los aspectos propios
de SQL y no en los del caso concreto que se quiere modelizar.

Hemos escogido un ejemplo que es bastante conocido y que se ha utilizado ampliamente en


los libros dedicados al tema de bases de datos relacionales. Si buscas por Internet
comprobarás que muchas páginas y documentos dedicados al estudio de los modelos de datos lo
utilizan.

Como ya has aprendido en unidades anteriores la


implementación en un SGBD de una base de
datos es la culminación de un proceso que
pretende modelizar una situación del mundo
real para poder sistematizarla y tratarla por
medios informáticos. Ya sabes que los pasos que
se siguen para diseñar una base de datos
relacional son:

 Estudio una situación del mundo real


que se pretende modelizar.
 Diseño de un modelo conceptual de la
situación. Diagrama Entidad-Relación.
 Traslado del diseño conceptual a un
diseño lógico. Modelo relacional.
 Implementación del modelo relacional en el SGBDR que se vaya a utilizar (SQL).

 Planteamiento de la situación que queremos modelizar.

Piensa en la siguiente situación del mundo real:

 Una empresa pretende desarrollar una base de datos de empleados y proyectos.


 La empresa está estructurada en departamentos, en cada uno de los cuales se están
desarrollando uno o varios proyectos, de forma que un proyecto sólo depende de un
departamento.
 Por otro lado, cada departamento consta de uno o varios empleados que trabajan de
forma exclusiva para ese departamento, pero pueden trabajar simultáneamente en varios
proyectos.
 Cada empleado tiene un jefe encargado de supervisar su trabajo, pudiendo cada jefe
supervisar el trabajo de varios empleados.
 Tanto los empleados, como los departamentos y los proyectos se identifican por un
código que es único para cada uno de ellos.
 De cada empleado se quiere guardar su nombre y su fecha de ingreso en la empresa, así
mismo todos los departamentos y los proyectos tienen un nombre descriptivo.
 Por último, se quiere guardar en la base de datos cuántas horas ha trabajado cada
empleado en los proyectos en los que está involucrado.

Hasta aquí el enunciado de nuestro caso práctico, veamos a continuación el diseño conceptual
de este supuesto.

9
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

 Diagrama E-R de nuestro caso práctico.

 Modelo relacional de nuestro caso práctico.

Aplicando lo aprendido en las unidades anteriores no tendrás problemas en comprobar que el


diseño lógico (esquema relacional) correspondiente al diagrama E-R anterior es el siguiente.

El esquema anterior está en 3FN (tercera forma normal) y consta de cuatro tablas. A partir de
ahora y en lo que resta de esta unidad didáctica utilizaremos este esquema relacional para
ejemplificar los contenidos teóricos relativos al lenguaje SQL. No olvides que el vehículo para
realizar las prácticas será el gestor de base de datos MySQL, que debes tener instalado y en
funcionamiento. También debes tener a mano la documentación de MySQL que se instaló junto
con la aplicación, o en línea a través de la página web oficial del producto.

10
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

5.1 Creación de la base de datos para prácticas.


Se puede crear una base de datos y sus tablas, básicamente de la siguientes formas:
 Redactando las correspondientes sentencias SQL (DDL) a través de un cliente en modo
texto o gráfico.
 A través de un cliente gráfico editando sus tablas por medio de ventanas de formulario.
 Mediante una herramienta CASE, utilizando Ingeniería Directa (Forward Enginner)
 Ejecutando un script sql con las sentencias SQL (DDL) correspondientes.

En nuestro caso, lo haremos ejecutando un script sql.

Un script SQL es una agrupación de sentencias SQL que pueden ser editadas, almacenadas y
recuperadas para hacer más productivo nuestro trabajo.

 Generar el script. El script se puede generar básicamente de dos formas: escribiendo


directamente las sentencias SQL, o bien, obteniéndolo a partir del esquema relacional
creado con alguna herramienta de diseño de BD, como por ejemplo MySQL Workbench.

 Ejecutar el script. El script se puede ejecutar desde un cliente en modo texto o un


cliente gráfico.
(Desde un cliente en modo texto, el monitor de MySQL, sería:
mysql> source c:\directorio\fichero.sql)

En nuestro caso, cargaremos o ejecutaremos el script que crea la BD y el que la llena con datos
(podrían ir todas las sentencias en un solo script) desde un cliente gráfico como SQL
Development de Workbench

1) Desde Workbench, opción File/Open SQL Script cargamos el script de creación de la BD


crea_bd_gestionproyectos.sql, que encontrarás en la plataforma educativa

Ejecutar script
– Rayo

11
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Una vez cargado el script, se ejecuta y ya tendremos creada la BD y sus tablas.

2) Poner en uso la base de datos creada. Doble click en BD o seleccionar según el cliente
gráfico que estés utilizando.

Una vez ejecutado el script, puede ser necesario refrescar o reconectar al servidor para
poder visualizar la nueva BD. La seleccionamos como BD por defecto (Base de datos en uso).

3) Desde la opción File/Open SQL Script cargamos el script de inserción de datos en la BD


creada anteriormente. (Debe estar en uso la base de datos ‘gestionproyectos’).
insert_bd_gestionproyectos.sql, que encontrarás en la plataforma educativa, y como antes
los ejecutamos.

Ya tendremos la BD gestionproyectos con todas sus tablas y sus datos.

A partir de ahora, puedes probar todas las sentencias SQL de los ejemplos de la UD4, desde este
cliente gráfico abriendo una nueva ventana de script:

File/New Query Tab


Ejecutar sentencia SQL

Situar cursor en punto de ejecución

Para saber más:

Desde el siguiente enlace puedes acceder a un manual sobre el SGBD MySQL en español.
 http://dev.mysql.com/doc/refman/5.0/es/index.html

También te será muy útil el siguiente enlace de MySQL con clase


 http://mysql.conclase.net/curso/index.php

12
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

6. Tipos de datos
Un dominio es un conjunto del cual toma sus valores una columna de una tabla. Según este
concepto, los tipos de datos predefinidos son dominios.

Cada SGBDR incorpora los tipos predefinidos según el estándar SQL, y otros tipos propios
que es conveniente conocer según el sistema que se vaya a utilizar.

6.1 Tipos de datos en MySQL


MySQL cuenta con un rico conjunto de tipos de datos para las columnas. Los tipos de datos
se pueden clasificar en tres grupos:
 Numéricos.
 Cadenas de caracteres
 Fechas y horas
El valor null es un caso especial de dato, ya que al significar ausencia de valor se aplica a todos
los tipos de columna.

Estudiaremos con más detalle los principales tipos de datos de MySQL en apartados posteriores.
De momento te indicamos de manera general cuales son estos tipos:

 Tipos de datos numéricos

1) Números Enteros.
Son números sin parte fraccionaria o decimal.

[ ]: opcionalidad
M: ancho de columna

Ejemplo:
INT ----- valor entero (4 bytes)
INT(5) ---- valor entero (4 bytes). Su representación será en un ancho de columna de 5
caracteres.

2) Números Reales.
Son números que tienen una parte fraccionaria o decimal. No se utiliza este tipo solo para
números con parte decimal, sino que también podemos utilizar este tipo para números enteros
que son tan grandes que no se pueden representar con el tipo BIGINT.

13
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

El tipo DECIMAL se almacena como una cadena de caracteres y no en formato binario.

Si se omite M, M=10 por defecto

Ejemplo:
FLOAT(6,2) ---- un número real (4 bytes). Se representará con 6 dígitos totales, 4 antes del
punto decimal y 2 después del punto.

 Cadenas de caracteres

M: ancho de columna
L : longitud o tamaño real de una cadena

Si observamos la tabla, vemos que el único tipo de dato que siempre utiliza el tamaño
especificado por M es el tipo char. Por este motivo, se ofrece el tipo varchar que ocupa sólo el
espacio requerido por el valor de la columna.

Los tipos text y blob son equivalentes, pero BLOB respeta las mayúsculas, minúsculas y
caracteres acentuados en la ordenación.

El tipo enum (‘v1’, ‘v2’, ..) indica que el campo tomará uno de los valores especificados en la
lista, mientras que set(‘v1’, ‘v2’,…) permite que el campo no tome ninguno de los valores o
bien uno o varios de los valores especificados en la lista.

Ejemplo:
Enum(‘1’,’2’,’3’)  una columna: null, o ‘1’ o ‘2’ o ’3’ o ‘ ‘
Set(‘1’,’2’,’3’)  una columna: ‘1’ o ‘1,2’ o ‘1,2,3’ o ‘ ‘ o null

14
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

 Fechas y horas

Timestamp es una secuencia de caracteres, que denotan la hora y fecha (o alguna de ellas) en la
cual ocurrió un determinado evento

7. Operadores y funciones de agregación


Para definir las condiciones en la cláusula WHERE de la sentencia SELECT, podemos utilizar
alguno de los operadores de los que dispone el estándar SQL, y que son los siguientes

Para expresar otras condiciones o criterios de selección se pueden utilizar otros


predicados:
Otros predicados
Para expresar una condición que quiere encontrar un valor entre unos
BETWEEN
límites concretos.
Para comprobar si un valor coincide con los elementos de una lista o
IN conjunto
Para comprobar si una columna de tipo carácter cumple alguna propiedad
LIKE determinada ( _ para cada carácter individual, % para expresar una
secuencia de caracteres)

IS [NOT] NULL Para comprobar si un valor es (o no) nulo


Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus
ALL/ANY/SOME filas (ANY/SOME) satisfagan una condición
EXISTS Para comprobar si una subconsulta produce alguna fila de resultados

15
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los
datos de una base de datos

8. Funciones SQL
SQL también dispone de una extensa gama de funciones que pueden ser
utilizadas en las expresiones. Típicamente las expresiones constan de un
nombre y aceptan unos parámetros entre paréntesis para devolver un valor.

<nombre_función>(<parámetro1>,<parámetro2>,…)

Los grupos fundamentales son:


o Funciones de control de flujo
o Funciones de caracteres.
o Funciones numéricas.
o Funciones de fecha y hora.
o Funciones de conversión.

A continuación trataremos las más importantes y utilizadas. Se debe consultar la documentación


del SGBD que se esté utilizando:

 Funciones de control de flujo.


o IF(<expresión1>,<expresión2>,<expresión3>) : Devuelve <expresión2> o <expresión3>
en función de si <expresión1> es VERDAD o FALSO respectivamente.
Ejemplo: SELECT IF(3>5, 'verdad','falso') Devuelve ‘falso’.

o IFNULL(<expresión1>,<expresión2>) : Devuelve <expresión1> si <expresión1> es distinto


de NULL, en otro caso devuelve <expresión2>.
Ejemplo: SELECT IFNULL(cddep,'Desconocido') FROM empleado. Devuelve 'Desconocido'
para los cddep que sean NULL, en los demás quedan como están. Es muy útil en consultas
que devuelven valores nulos para cambiarlos por un valor descriptivo.

 Funciones de caracteres
o CHAR_LENGTH(<cadena>): Devuelve un entero que es la longitud de la cadena de
caracteres.
Ejemplo: SELECT CHAR_LENGTH('Hola')Devuelve 4.

o CONCAT(<cadena1>,<cadena2>,...) : Concatena las cadenas de caracteres.


Ejemplo: SELECT CONCAT('H','o','l','a') Devuelve ‘Hola’.

16
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

o INSTR(<cadena>,<subcadena>): Devuelve la posición de la primera ocurrencia de la


subcadena dentro de la cadena.
Ejemplo: SELECT INSTR('Hola', 'ol') Devuelve 2.

o LOWER(<cadena>) : Pasa la cadena a minúsculas.


Ejemplo: SELECT LOWER('HOLA') Devuelve “hola”

o UPPER(<cadena>) : Pasa la cadena a mayúsculas.


Ejemplo: SELECT UPPER('hola') Devuelve “HOLA”.

o RTRIM(<cadena>) y LTRIM(<cadena>) : Devuelve la cadena sin espacios en blanco a la


derecha (RTRIM) o izquierda (LTRIM).
Ejemplo SELECT LTRIM(RTRIM(' Hola ')) Devuelve 'Hola'.

o SUBSTR(<cadena>,<posición>,<longitud>) : Devuelve la subacadena de longitud


<longitud> a partir de la posición <posición> de la cadena <cadena>.
Ejemplo: SELECT SUBSTR('Hola',2,2) Devuelve “ol”.

 Funciones numéricas
o ABS(<número>) : Devuelve el valor absoluto de un número.
Ejemplo: SELECT ABS(-21) Devuelve 21.

o CEIL(<número>): Devuelve el entero más pequeño no menor que número.


Ejemplo: SELECT CEIL(21.9) Devuelve 22.

o MOD(<numero1>,<número2>) : Devuelve el resto de la división entera entre <numero1>


y <numero2>.
Ejemplo: SELECT MOD(18,7) Devuelve 4.

o ROUND(<número>) : Devuelve el redondeo al entero más cercano.


Ejemplos: SELECT ROUND(20.7) Devuelve 21. SELECT ROUND(20.3) Devuelve 20.

o TRUNCATE(<número>,<Posiciones_decimales>): Devuelve el número con las posiciones


decimales dadas sin redondeo.
Ejemplo: SELECT TRUNCATE(68.99999,2) Devuelve 68.99.

 Funciones de fecha y hora


o ADDDATE(<fecha>,<numero_dias>) : Devuelve la fecha proporcionada, incrementada en
el número de días indicado.
o Ejemplo: SELECT ADDDATE('2005-04-19',15) Devuelve '2005-05-04'.

o CURDATE() : Devuelve la fecha actual del sistema.

o CURTIME() : Devuelve la hora actual del sistema.

o DATEDIFF(<fecha1>,<fecha2>): Devuelve el número de días entre las dos fechas.


Ejemplo: SELECT DATEDIFF('2005-04-19','2005-04-2') Devuelve 17.

o DATE_FORMAT(<fecha>,<formato>) : Devuelve la fecha formateada según el formato


especificado.
Ejemplo: SELECT DATE_FORMAT('2005-04-19', '%d %m %Y') Devuelve '19 04 2005' (Consultar
la documentación de MySQL para ver los formatos posibles).

o DAY(<fecha>) : Devuelve el día del mes de una fecha.


Ejemplo: SELECT DAY('2005-04-19'). Devuelve 19.

17
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

o MONTH(<fecha>) : Devuelve el mes de un fecha.


Ejemplo: SELECT MONTH('2005-04-19'). Devuelve 4.

o NOW() : Devuelve la fecha y hora del sistema.

o YEAR(<fecha>): Devuelve el año de un fecha.


Ejemplo: : SELECT YEAR('2005-04-19'). Devuelve 2005.

 Funciones de conversión:
o CONVERT(<expresion>,<tipo_dato>): Devuelve la expresión convertida al tipo de dato
suministrado.
Ejemplo: SELECT CONVERT(21,DECIMAL) Devuelve 21.00.

o CAST(<expresión> AS <tipo_dato>) : Análoga a la anterior.

9. La sentencia SELECT
9.1 Consultas sobre las filas de una tabla.
Veremos cómo podemos realizar consultas sobre los datos almacenados, de forma que
podamos obtener información de los datos existentes.

Las consultas en SQL son la operación más común y se hacen con la sentencia SELECT. Una
sentencia SELECT tiene como sintaxis más básica y sencilla la compuesta por las cláusulas
SELECT y FROM.

SELECT <lista_de_expresiones>
FROM <tabla>

Siendo <lista_de_expresiones> una lista de expresiones a evaluar por cada fila afectada de la
tabla, (normalmente serán nombres de columnas). Por ejemplo, para obtener los nombres de
todos los departamentos y las ciudades donde se encuentran, se teclea en SQL:

SELECT nombre,ciudad
FROM departamento

Si queremos obtener todas las columnas de una tabla se puede utilizar cómo
<lista_de_expresiones> el carácter “*”. Por ejemplo, para obtener todos los datos de todos los
empleados podemos utilizar la siguiente sentencia SELECT:

SELECT *
FROM empleado
Se pueden utilizar expresiones que realicen algún cálculo u operación. Por ejemplo, si
suponemos que cada hora de trabajo se paga a 40 euros. Una lista de lo que hay que pagar a
cada empleado que trabaja en un proyecto se haría de la siguiente manera:

SELECT cdemp, nhoras*40


FROM trabaja

18
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Podemos utilizar el cliente gráfico para pasar sentencias al SGBDR y obtener los resultados.

La sentencia SELECT admite otras cláusulas que la hacen más potente y versátil. Estas son las
siguientes:
 WHERE
 ORDER BY
 GROUP BY
 HAVING
 LIMIT

19
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Su formato es:

SELECT [ALL | DISTINCT]


[colum1, ..column | * | expr]
FROM tabla1, .., tablan
[WHERE condicion]
[GROUP BY {columna | expr | posicion}
[HAVING where_definición]
[ORDER BY {columna | expr | posición}
[ASC | DESC] , ...]
[LIMIT {<desplazamiento>,<número de filas> }];

9.2 Cláusula WHERE


Hasta ahora hemos utilizado sentencias de consulta SELECT que no discriminaban las filas de
la tabla sobre la que se realizaba la consulta. En la práctica se utiliza mucho esa discriminación
y se consigue con la cláusula WHERE. Esta cláusula va seguida de una condición lógica o criterio
que se evaluará para cada fila de la tabla, y sólo se listarán las filas que cumplan dicha
condición. WHERE aparecerá después de la cláusula FROM.

SELECT <lista_de_expresiones>
FROM <tabla>
WHERE <criterio>

Por ejemplo, si queremos obtener los nombres de los empleados del departamento “02”
podemos ejecutar la sentencia:
SELECT nombre
FROM empleado
WHERE cddep='02'

Para construir el criterio disponemos de una gran variedad de operadores lógicos, a continuación
los veremos y practicaremos.

 Operadores de comparación: <, <=, =, >=, >, <>. Con el significado habitual.

Por ejemplo, empleados que han trabajado 30 o más horas:


SELECT cdemp
FROM trabaja
WHERE nhoras >=30

 Operador de rango: BETWEEN … AND. Expresa un rango de valores en el formato desde-


hasta.

Por ejemplo, empleados que entraron en la empresa en el año 1998:


SELECT *
FROM empleado
WHERE fecha_ingreso BETWEEN '1998-01-01' AND '1998-12-31'

20
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

 Operador de pertenencia a un conjunto: <expresión> IN (<conjunto>). Seleccionará las


filas donde la expresión se evalúe como un valor perteneciente al conjunto expresado.

Por ejemplo, departamentos que están situados en “Almería” o “Málaga”:


SELECT *
FROM departamento
WHERE ciudad IN ('Almería','Málaga')

 Operador de correspondencia con un patrón: <expresión> LIKE <patrón>. Seleccionará


las filas donde la expresión coincida con las reglas establecidas por el patrón. Para construir
el patrón se utilizan caracteres comodín, los más usados son: “%” que se sustituye por
cualquier secuencia de 0 o más caracteres, y “_” que se sustituye por un único carácter.

Por ejemplo, empleados cuyo nombre contiene el apellido “Verde”:


SELECT *
FROM empleado
WHERE nombre LIKE '%Verde%'

 Condición de valor nulo o no nulo: <expresión> IS NULL y <expresión> IS NOT NULL


respectivamente. Se verán afectadas las filas cuyo valor de expresión sea NULL o no,
respectivamente.

Por ejemplo, empleados que no tienen jefe asignado:


SELECT *
FROM empleado
WHERE cdjefe IS NULL

 Operadores lógicos para enlazar más de un criterio: AND y OR. Sirven para obtener un
resultado lógico combinando el resultado de dos criterios. Tienen el habitual significado del
Y y el O lógicos.

Por ejemplo, empleados del departamento “02” o del departamento “04”:


SELECT *
FROM empleado
WHERE cddep='02' OR cddep='04'

 Operador de negación lógico: NOT. Niega el criterio que sigue a continuación.

Por ejemplo, empleados que no son del departamento “02”:


SELECT *
FROM empleado
WHERE NOT cddep='02'

Las expresiones lógicas pueden agruparse con paréntesis para indicar el orden de evaluación
o aclarar las expresiones complicadas.

Por ejemplo, las expresiones cdpro='DAG' OR (cdpro='GRE' AND nhoras>=15) y (cdpro='DAG' OR


cdpro='GRE') AND nhoras>=15 , no producen el mismo resultado. Prueba a lanzar las sentencias
SQL correspondientes y compruébalo.

21
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

9.3 Cláusula DISTINCT


En muchas ocasiones las consultas arrojan resultados repetidos. Por ejemplo, si utilizamos la
sentencia SELECT siguiente para ver los departamentos donde trabaja algún empleado:

SELECT cddep FROM empleado

Obtendremos departamentos repetidos tantas veces como empleados existan en cada


departamento.

La cláusula DISTINCT suprime los resultados repetidos de la consulta, de forma que se


muestren sólo los resultados distintos, es decir, cada resultado aparecerá en la consulta una
sola vez.

Por tanto, para la consulta anterior se pueden conseguir resultados más correctos utilizando
DISTINCT:

SELECT DISTINCT cddep


FROM empleado

DISTINCT se aplica a la fila completa. Si escribimos:

SELECT DISTINCT cddep, cdjefe


FROM empleado

Se obtienen las combinaciones únicas de empleado y jefe.

9.4 Cláusula ORDER BY


Una de las características intrínsecas a los SGBDR y SQL
es que el orden de aparición de las filas en una consulta
no es predecible. Esto quiere decir que en momentos
diferentes la misma consulta puede producir el mismo
conjunto de filas pero con ordenaciones diferentes.
Esto es así porque el motor de base de datos toma
decisiones en función del momento, en aras de la mayor
optimización y rendimiento de las operaciones.

Para conseguir un orden de filas dado en función del


criterio que deseemos imponer se utiliza la cláusula
ORDER BY. En ella se pueden disponer una serie de
criterios separados por comas para ordenar los resultados de una consulta. Normalmente esos
criterios serán nombres de columna, aunque es posible utilizar expresiones.

Por ejemplo, para listar los nombres de los empleados en orden alfabético podemos emplear la
siguiente sentencia SELECT:

SELECT nombre
FROM empleado
ORDER BY nombre

Para obtener los nombres de empleado ordenados por el departamento donde trabajan, y a
igualdad de éste, usar como segundo criterio de ordenación el orden alfabético de nombre, se
emplearía:

22
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

SELECT cddep, nombre


FROM empleado
ORDER BY cddep, nombre

También es posible ordenar referenciando la posición de la columna deseada de la cláusula


SELECT:

SELECT cddep, nombre


FROM empleado
ORDER BY 1, 2

Se puede decidir si el orden será ascendente (ASC) o descendente (DESC). Si queremos la lista
de departamentos ordenada por orden alfabético descendente de la ciudad de localización
podemos usar:

SELECT *
FROM departamento
ORDER BY ciudad DESC

El sentido de la ordenación por defecto es ascendente. Se pueden combinar criterios


ascendentes y descendentes. Por ejemplo, si queremos la lista de departamento por orden
ascendente de ciudad y descendente de nombre, se puede emplear.
SELECT *
FROM departamento
ORDER BY ciudad ASC, nombre DESC

Por supuesto se puede combinar la cláusula ORDER BY con la cláusula WHERE. En este caso
ORDER BY debe aparecer después de WHERE.

Por ejemplo, la lista de empleados por orden alfabético del departamento “02” se obtendría
con:
SELECT *
FROM empleado
WHERE cddep='02'
ORDER BY nombre

9.5 Cláusula GROUP BY y funciones de agregación

En muchos casos se necesita obtener resultados


resumen de los datos contenidos en las filas de una
tabla. Por ejemplo calcular la suma de las horas
trabajadas por todos los empleados de la empresa, u
obtener el número de departamentos de los que consta
la empresa.

En estos casos se utilizan las funciones de agregación.


Son funciones que realizan cálculos sobre expresiones
basadas en los datos de la tabla y resumen en un solo
dato (numérico) el resultado. Las funciones de
agregación son:

o Suma SUM(<expresión>) : Calcula la suma de los valores de expresión de cada fila.

23
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Por ejemplo, para calcular la suma de horas trabajadas por todos los empleados se utilizaría:

SELECT SUM(nhoras)
FROM trabaja

o Media aritmética AVG(<expresión>) : AVG es la abreviatura de “Average”, que significa


media. Como te imaginarás, calcula la media aritmética de los valores de expresión.

Por ejemplo, la media de horas trabajadas por cada empleado se calcula como:

SELECT AVG(nhoras)
FROM trabaja

o Valor mínimo MIN(<expresión>) : Produce como resultado el mínimo de los valores del
conjunto de expresiones evaluadas.

Por ejemplo, el mínimo valor de “horas trabajadas” (correspondiente al trabajador que menos
ha horas ha trabajado):

SELECT MIN(nhoras)
FROM trabaja
o Valor máximo MAX(<expresión>) : Obtiene el máximo del conjunto de expresiones.

Por ejemplo, fecha de ingreso en la empresa más reciente, es decir, la fecha en la que ingresó
el último trabajador contratado por la empresa. (Evidentemente se entiende que las fechas más
recientes son mayores que las más antiguas):

SELECT MAX(fecha_ingreso)
FROM empleado

o Cuenta del número de filas de una consulta COUNT(*) : Cuenta el número de filas que se
obtienen en una consulta.

Por ejemplo para saber el número de empleados de la empresa:

SELECT COUNT(*)
FROM empleado

o Cuenta del número de filas que no producen el valor NULL COUNT(<expresión>): Produce
como resultado un número que indica cuántas filas de la consulta no producen NULL al
evaluar la expresión.

Por ejemplo para calcular el número de empleados que están asignados a un departamento:

SELECT COUNT(cddep)
FROM empleado

o Cuenta del número de filas distintas de una consulta COUNT(DISTINCT <expresión>) :


Análogo al anterior pero sin contar las filas repetidas.

Por ejemplo, si queremos saber en cuántas ciudades diferentes existen departamentos de la


empresa:

SELECT COUNT(DISTINCT ciudad)


FROM departamento

24
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Observaciones al utilizar funciones de agregación:


 No se pueden combinar funciones de agregación con otro tipo de expresiones,
esto provocaría un error de SQL. Aunque sí se puede combinar varias funciones de
agrupamiento en la misma consulta. Si se quiere saber la fecha de ingreso más
antigua y más reciente:

SELECT MIN(feha_ingreso), MAX(fecha_ingreso)


FROM empleado

 Es muy útil combinar estas funciones de agregación con la cláusula GROUP BY,
de esta forma se pueden calcular subtotales de grupos de filas con alguna
característica en común. Por ejemplo, si quisiéramos saber cuál es el número de
horas trabajadas en cada proyecto se podría emplear:

SELECT cdpro, SUM(nhoras)


FROM trabaja
GROUP BY cdpro

 En caso de utilizar GROUP BY sí es posible mezclar expresiones simples con


funciones de agregación, siempre que las expresiones simples formen parte de la
cláusula GROUP BY (tal y como hemos visto en el ejemplo anterior).

 También es posible establecer varios niveles de agrupamiento. Por ejemplo,


lista del número de empleados por cada departamento y jefe:

SELECT cddep, cdjefe, COUNT(nombre)


FROM empleado
GROUP BY cddep,cdjefe

9.6 Cláusula HAVING


Al igual que la cláusula WHERE se utiliza para seleccionar
filas individuales del resultado de una consulta, la cláusula
HAVING puede ser utilizada para seleccionar grupos de
filas. El formato de la cláusula HAVING es análogo al de la
cláusula WHERE, consistiendo en la palabra clave HAVING
seguida del criterio lógico de selección.

Por ejemplo, si se quisiera obtener un listado de proyectos


con número total de horas trabajadas, salvo aquellos en los
que no se haya trabajado ninguna hora, se podría escribir en
SQL:

SELECT cdpro, SUM(nhoras)


FROM trabaja
GROUP BY cdpro
HAVING SUM(nhoras)>0

Es fácil confundir WHERE y HAVING. ¿Cuándo utilizar uno y otro? Recuerda:


 WHERE para seleccionar filas individuales de la cláusula FROM,
 HAVING para seleccionar filas de agrupamiento de la cláusula GROUP BY.

25
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Veamos un ejemplo combinado. Si se desea seleccionar a los empleados cuyo jefe es el


empleado “A11”, agruparlos por departamento, y obtener la lista de aquellos departamentos en
los que haya más de un empleado, se puede escribir:

SELECT cddep, COUNT(nombre)


FROM empleado
WHERE cdjefe='A11'
GROUP BY cddep
HAVING COUNT(nombre)>1

Por supuesto se puede combinar lo anterior con la ordenación por medio de la cláusula ORDER
BY.

SELECT cddep, COUNT(nombre)


FROM empleado
WHERE cdjefe='A11'
GROUP BY cddep
HAVING COUNT(nombre)>1
ORDER BY cddep
9.7 Cláusula LIMIT
En ocasiones resulta muy necesario poder limitar el
número de filas que devuelve una consulta. Esto se
consigue con la cláusula LIMIT. La sintaxis de esta cláusula es
la siguiente:

LIMIT <desplazamiento>,<número de filas>

Limita la sentencia SELECT a las primeras <número de filas>


contadas a partir de la fila <desplazamiento>.

Por ejemplo, para listar los tres empleados más antiguos de la empresa:

SELECT nombre,fecha_ingreso
FROM empleado
ORDER BY fecha_ingreso ASC
LIMIT 3

Otro ejemplo puede ser conocer los dos empleados que más horas han trabajado en proyectos:
SELECT cdemp,SUM(nhoras)
FROM trabaja
GROUP BY cdemp
ORDER BY SUM(nhoras) DESC
LIMIT 2

26
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

9.8 Subconsultas
En muchas ocasiones el criterio lógico para seleccionar las
filas de una consulta en la cláusula WHERE viene dado por
los resultados de otra consulta previa. A esta consulta
previa se la denomina subconsulta o consulta anidada. Es
una característica muy importante del lenguaje SQL,
hasta el punto de que muchas consultas no podrían ser
realizadas sin el uso de esta capacidad.

o Una sentencia SQL con una subconsulta es


frecuentemente el modo más natural de expresar una
consulta, ya que se asemeja mucho a la descripción de
la consulta en lenguaje natural.
o Las subconsultas hacen más fácil la escritura de
sentencias SELECT, ya que permiten “descomponer una
consulta en partes” (la consulta y sus subconsultas) y luego recomponerlas.

Una subconsultas puede aparecer además de en la cláusula WHERE, en HAVING, FROM o


SELECT de otra sentencia SQL, también aparecen asociadas a INSERT, DELETE y UPDATE.

Nos centraremos en subconsultas que aparecen tras WHERE y HAVING. Por ejemplo, si
analizamos el enunciado “lista de empleados que han trabajado más horas de la media de horas
trabajadas de todos los empleados en proyectos”, nos daremos cuenta que en realidad hay dos
consultas en el enunciado, en una de ellas hay que calcular la media de horas trabajadas, y en la
otra hay que listar los empleados que superan esa media. En SQL quedaría así:
SELECT cdemp,nhoras
FROM trabaja
WHERE nhoras > (SELECT AVG(nhoras)FROM trabaja);
En la cláusula HAVING las subconsultas sirven para seleccionar los grupos de filas del
resultado. Por ejemplo, lista de empleados que han trabajado más horas en proyectos que las
horas dedicadas al proyecto “AEE”:

SELECT cdemp, SUM(nhoras)


FROM trabaja
GROUP BY cdemp
HAVING SUM(nhoras) > (SELECT SUM(nhoras) FROM trabaja WHERE cdpro='AEE')

Es necesario hacer una serie de consideraciones relativas a las subconsultas tras WHERE O
HAVING:
o Una subconsulta debe producir una única columna de datos como resultado. Esto significa
que una subconsulta siempre tiene un único elemento de selección de la cláusula SELECT.
o La cláusula ORDER BY no tiene sentido en una subconsulta. Los resultados de la
subconsulta se utilizan internamente por parte de la consulta principal y nunca son visibles al
exterior, por lo que carece de sentido ordenarlos.
o Es posible referirse a nombres de columnas de la consulta principal desde dentro de la
subconsulta.

Existe una gama muy rica de operadores para relacionar la consulta principal y la subconsulta.
Vamos a verlos a continuación.

o Operadores de comparación: <, <=, =, >=, >, <>: Se compara el valor de la expresión WHERE
utilizada en la consulta principal con un único valor proporcionado por la subconsulta. Por
ejemplo, lista de los departamentos que están en la misma ciudad que el departamento
“01”:

27
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

SELECT cddep
FROM departamento
WHERE ciudad = (SELECT ciudad FROM departamento WHERE cddep='01')

o Operador de pertenencia a un conjunto <expresión> IN (<subconsulta): Se seleccionan las


filas en las que la evaluación de la expresión sea alguno de los valores del conjunto de
valores producido por la subconsulta. Por ejemplo, lista de empleados que tienen como jefe
un empleado del departamento “04”:

SELECT nombre, cddep, cdjefe


FROM empleado
WHERE cdjefe IN ( SELECT cdemp FROM empleado WHERE cddep='04')

o Operador de existencia EXISTS(<subconsulta>) : Este operador comprueba si la subconsulta


siguiente devuelve alguna fila o no, evaluándose a VERDADERO o FALSO respectivamente.
Hay que hacer notar que en la subconsulta debe aparecer alguna columna de la consulta
principal. Para ello se puede utilizar la notación <tabla>.<columna>, de manera que no se
produzcan ambigüedades. Por ejemplo, si quisiéramos obtener los nombres de los empleados
que trabajan en departamentos situados en Almería, podríamos escribir:

SELECT nombre
FROM empleado
WHERE EXISTS (SELECT * FROM departamento WHERE ciudad='Almería' AND
empleado.cddep=departamento.cddep)

Observa cómo hemos incluido una condición en la cláusula WHERE de la subconsulta que la
relaciona con la consulta principal empleado.cddep=departamento.cddep.
o También es posible utilizar alias para los nombres de tabla en el caso de que la tabla de
la consulta principal y de la subconsulta sean la misma, un alias es como un sobrenombre
dado a una tabla. Se pueden definir los alias en la cláusula FROM, a continuación del nombre
la tabla referenciada. Por ejemplo, si quisiéramos obtener la lista de los empleados que son
jefes de algún empleado, deberíamos comprobar para cada empleado de la tabla empleado
“sí existe” (EXISTS) algún otro empleado de la tabla empleado que tiene como cdjefe el
cdemp del empleado que estamos comprobando. Quedaría así:

SELECT nombre
FROM empleado a
WHERE EXISTS (SELECT * FROM empleado b WHERE a.cdemp=b.cdjefe)

o Operadores de comparación cuantificada <operador de comparación>[SOME|ALL] :


Combinan el uso de los operadores de comparación (<,>,<=,>=,=,<>) con la cuantificación
“alguno” (SOME) o “todos” (ALL). Veamos un ejemplo de cada caso.

Lista de los empleados que tienen una antigüedad superior a alguno del departamento “03”:

SELECT nombre,fecha_ingreso,cdemp
FROM empleado
WHERE fecha_ingreso < SOME(SELECT fecha_ingreso FROM empleado WHERE cddep='03')

Lista de empleados y horas trabajadas de los empleados que han trabajado más horas que todos
los empleados del proyecto “GRE”:

SELECT cdemp,nhoras
FROM trabaja
WHERE nhoras > ALL (SELECT nhoras FROM trabaja WHERE cdpro='GRE')

28
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

9.9 Consultas combinadas a varias tablas (JOIN)


Hasta ahora hemos estado viendo sentencias y cláusulas de SQL que nos permitían obtener
información de una sola tabla. Pero seguramente sabes que una base de datos puede contener
muchas tablas, y que muchas veces la información de tablas distintas está relacionada.

¿Qué podemos hacer para consultar una información que se encuentre repartida por varias
tablas?

Es muy habitual que los datos que queremos obtener por medio de una consulta se
encuentren en tablas diferentes. En estos casos hay que combinar las tablas necesarias para
construir una única consulta. Existen dos tipos de combinaciones de tablas, la unión (UNION) y la
composición (JOIN). Vamos a ver a continuación en qué consiste cada una.

 Unión de tablas.
La unión de tablas en una consulta produce como
resultado la unión, en el sentido algebraico de la teoría
de conjuntos, de las filas de ambas tablas, es decir,
produce una nueva tabla que tiene todas las filas de la
primera tabla y a continuación también todas las filas de la
segunda tabla.

Por supuesto las filas de ambas tablas deben tener el mismo


número de columnas y del mismo tipo. También es posible
utilizar la unión de consultas SELECT.
Por ejemplo, si queremos tener una lista de los empleados
que pertenecen al departamento “04”, unidos a aquellos cuyo jefe es el empleado “A11”:

(SELECT * FROM empleado WHERE cddep='04')


UNION
(SELECT * FROM empleado WHERE cdjefe='A11')

 Composición de tablas.
En este tipo de combinación de tablas se realiza el
producto cartesiano entre las tablas, pero obteniendo
sólo las filas o registros que estén relacionados. A esto
se le llama JOIN o composición de tablas.

Vamos a explicarlo con un ejemplo. Si quisiéramos listar


los nombres de los empleados, junto con el nombre del
departamento donde trabajan, deberíamos obtener datos
de la tabla empleado (nombre del empleado) y de la tabla
departamento (nombre de departamento). En SQL
quedaría así:

SELECT empleado.nombre,departamento.nombre
FROM empleado, departamento
WHERE empleado.cddep=departamento.cddep

29
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Veamos algunas consideraciones sobre la composición de tablas apoyándonos en el ejemplo


anterior:
o Las consultas combinadas suelen relacionar tablas por medio de una columna común que
es clave primaria en una tabla y ajena en la otra. En el ejemplo, la columna cddep es
clave primaria en la tabla departamento y es clave ajena en la tabla empleado.
o Siempre que exista ambigüedad será necesario utilizar la notación <tabla>.<columna> , y
en general es una buena costumbre utilizarla en cualquier caso. En el ejemplo anterior
existen las columnas nombre y cddep en ambas tablas de combinación, por lo que es
necesario indicar a cuál nos referimos exactamente.
o Se pueden componer filas de una tabla con filas de esa misma tabla. En este caso
deberemos emplear alias de tabla para no cometer ambigüedades.

Lo anterior es un ejemplo del tipo de composición más sencillo, el producto cartesiano.


Consiste en combinar todas las filas de una tabla con todas las filas de la otra, y luego
seleccionar sólo las filas en las que coincide el campo clave común, que se usa para hacer la
composición, y dejar una sola vez esa columna común. Esto es el producto cartesiano en
términos de teoría de conjuntos si las filas de cada tabla fuesen los elementos de dos conjuntos,
que se complementa con una condición WHERE que selecciona qué filas del producto cartesiano
formarán el resultado final de la composición.

Piensa que en vez de tablas de bases de datos estuvieras manejando esas mismas tablas pero
impresas en papel, cada una en una hoja. La forma de encontrar la información que se pide,
¿cuál sería?
 Pues empezaríamos con la primera fila de la primera tabla empleado,
 nos fijaríamos en el nombre del primer empleado, y en el código del departamento en el
que trabaja, para a continuación empezar a comparar ese código de departamento con
el de todas las filas de la tabla departamentos en la segunda hoja, hasta que
encontráramos una coincidencia.
 Entonces nos fijaríamos en el nombre de ese departamento y lo anotaríamos junto al
nombre del empleado.
 Y volveríamos a repetir el proceso con todas las filas de la tabla empleado.
 Pues bien, más o menos es lo mismo que hace automáticamente la composición (JOIN)

Existen otros tipos de composición ligeramente diferentes al anterior. Los veremos a


continuación.

o Composición interna INNER JOIN: Básicamente funciona igual que el producto


cartesiano sólo que utiliza índices para agilizar el tiempo en obtener el resultado.
Empareja las filas de una tabla buscando directamente en las filas de la otra tabla las filas
que cumplen la condición, esto lo consigue usando el índice. La sintaxis es la siguiente:

SELECT <lista_de_expresiones>
FROM <tabla1> INNER JOIN <tabla2> ON
<expresión_composición>

En donde <expresión_composición> es la combinación por medio de un operador de


comparación (<, >, <=, >= ,=, <>) de dos columnas procedentes de cada tabla.

Por ejemplo, si queremos resolver de forma más eficiente el ejemplo propuesto cuando
tratamos la composición por producto cartesiano, listado de nombres de los empleados junto
con el nombre del departamento donde trabajan. Podemos escribir:

SELECT e.nombre, d.nombre


FROM empleado e INNER JOIN departamento d ON e.cddep=d.cddep

30
UD4- Fundamentos de SQL. Consultas 1 º DAM - Bases de Datos

Observa además el uso de alias de tablas, aunque no es necesario en este caso nos ahorra
escribir repetidamente el nombre de las tablas.

o Composiciones externas LEFT JOIN y RIGHT JOIN: En el caso de las


composiciones producto cartesiano e INNER JOIN se concatenan filas de dos tablas que
constan de una columna y valores comunes. Pero si alguna de las filas de las tablas a
componer tienen valores nulos (NULL) en alguna de sus filas, o el valor que contienen no
coincide con ninguno de los de la otra tabla, se pierden esas filas en la composición
resultado, lo cual puede hacer aparecer resultados erróneos.

Para corregir este comportamiento se utilizan las composiciones LEFT JOIN y RIGHT JOIN.
En ambos casos las filas con valores nulos en las columnas de composición, o con valores
no coincidentes en ambas tablas de composición son tenidos en cuenta.

LEFT JOIN añade al resultado del INNER JOIN las filas de la tabla izquierda que no tienen
correspondencia en la tabla de la derecha.

RIGHT JOIN hace lo propio con las filas de la tabla derecha.

Veamos un par de ejemplos:

SELECT e.nombre, d.nombre


FROM empleado e LEFT JOIN departamento d ON e.cddep=d.cddep

El resultado es el INNER JOIN de ambas tablas, más los empleados que no están asignados a
ningún departamento.

El mismo ejemplo anterior, pero mediante RIGHT JOIN sería:

SELECT e.nombre, d.nombre


FROM departamento d RIGHT JOIN empleado e ON e.cddep=d.cddep

Otro ejemplo:

SELECT e.nombre, d.nombre


FROM empleado e RIGHT JOIN departamento d ON e.cddep=d.cddep

El resultado es el INNER JOIN de ambas tablas más los departamentos donde no hay
empleados en este momento.

El mismo ejemplo anterior, pero mediante LEFT JOIN sería:

SELECT e.nombre, d.nombre


FROM departamento d LEFT JOIN empleado e ON e.cddep=d.cddep

REFERENCIAS
Bases de datos: UOC software libre
Fundamentos de Sistemas de bases de datos (5ª Edición) – PEARSON Addison Wesley
Aprende SQL (2ª Edición) – Anaya Multimedia O’REALLY
http://es.wikipedia.org/
http://www.jorgesanchez.net/bd/index.html
http://mysql.conclase.net/curso/index.php

31

También podría gustarte