Consulta Select y Subconsultas Hoja a4

9
Base de Datos en MySQL Ing. Henry Juárez Vargas Página | 1 CONSULTA SELECT La consulta SELECT es quizá la sentencia SQL más importante. Esta es la sentencia que nosotros usamos para seleccionas las filas de una o más tablas de la base de datos. El comando SELECT recupera los registros de una tabla. Por ejemplo si quisiéramos recuperar los registros de la tabla alumnos pero solo nos interesa recuperar los campos apellidos y nombres, escribiríamos la siguiente consulta SQL. SELECT apellidos, nombres FROM alumnos; Luego del comando SELECT se indican los nombres de los campos que se quiere recuperar, y luego del FROM el nombre de la tabla de donde se sacarán los registros. SINTAXIS: SELECT columns FROM tables [WHERE conditions] [GROUP BY group [HAVING group_conditions]] [ORDER BY sort_columns] [LIMIT limits]; Seleccionando todos los campos Un ejemplo simple. SELECT * FROM alumnos; Si después del SELECT escribimos un asterisco ( * ) la consulta nos recuperará todos los campos de la tabla, como se muestra en la figura de la derecha. Seleccionando algunos campos En ocasiones no nos interesará recuperar todos los campos, si fuese ese el caso entonces debemos de escribir los nombres de los campos de la tabla luego de la instrucción SELECT. SELECT apellidos FROM alumnos; La consulta mostrará solo los apellidos, ya que luego del SELECT se está especificando dicho campo a recuperarse de la tabla alumnos. Especificando Tablas Absolutas Existe una notación especial que es posible escribir en una consulta SQL, esta notación especifica el campo indicándole de que tabla esperamos recuperar los datos. SELECT alumnos.nombres FROM alumnos;

Transcript of Consulta Select y Subconsultas Hoja a4

Page 1: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 1

CONSULTA SELECT

La consulta SELECT es quizá la sentencia SQL más importante. Esta es la sentencia que nosotros usamos para seleccionas las filas de una o más tablas de la base de datos.

El comando SELECT recupera los registros de una tabla. Por ejemplo si quisiéramos recuperar los registros de la tabla alumnos pero solo nos interesa recuperar los campos apellidos y nombres, escribiríamos la siguiente consulta SQL.

SELECT apellidos, nombres FROM alumnos;

Luego del comando SELECT se indican los nombres de los campos que se quiere recuperar, y luego del FROM el nombre de la tabla de donde se sacarán los registros.

SINTAXIS:

SELECT columns FROM tables [WHERE conditions] [GROUP BY group [HAVING group_conditions]] [ORDER BY sort_columns] [LIMIT limits];

Seleccionando todos los campos

Un ejemplo simple.

SELECT * FROM alumnos;

Si después del SELECT escribimos un asterisco ( * ) la consulta nos recuperará todos los campos de la tabla, como se muestra en la figura de la derecha.

Seleccionando algunos campos

En ocasiones no nos interesará recuperar todos los campos, si fuese ese el caso entonces debemos de escribir los nombres de los campos de la tabla luego de la instrucción SELECT.

SELECT apellidos FROM alumnos;

La consulta mostrará solo los apellidos, ya que luego del SELECT se está especificando dicho campo a recuperarse de la tabla alumnos.

Especificando Tablas Absolutas

Existe una notación especial que es posible escribir en una consulta SQL, esta notación especifica el campo indicándole de que tabla esperamos recuperar los datos.

SELECT alumnos.nombres FROM alumnos;

Page 2: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 2

Dicha consulta indica que el campo nombres pertenece a la tabla alumnos, este tipo de notación es importante conocer para que al trabajar con más de una tabla no tengamos problemas con ambigüedades en los nombres de los campos de más de una tabla.

Alias

SQL tiene la habilidad de renombrar las columnas o las expresiones en una sentencia SELECT, y el nuevo nombre será el que es mostrado en el resultado de la consulta.

SELECT apellidos AS Aps FROM alumnos;

Lo que hace dicha consulta es cambiar el nombre de apellidos por el de Aps, este nuevo nombre solo se mostrará en el resultado, tal como se muestra en la figura de la izquierda.

Los alias se pueden crear utilizando la palabra clave AS, aunque este es opcional, por lo que si se omite obtenemos el mismo resultado.

La siguiente consulta sin el AS nos da el mismo resultado anterior.

SELECT apellidos Aps FROM alumnos;

Los alias también son útiles para cambiarle el nombre de la tabla, esto será muy útil al realizar consultas con más de una tabla.

Por ejemplo si quisiéramos renombrar la tabla alumnos por el nombre “a”, y utilizar la forma absoluta para mostrar el campo apellidos, escribiríamos:

SELECT a.apellidos FROM alumnos AS a;

Ó sino

SELECT a.apellidos FROM alumnos a;

La clausula WHERE

La clausula Where permite recuperar determinados registros de acuerdo a un criterio de búsqueda. El uso es muy similar al visto en las sentencias UPDATE y DELETE.

SELECT id, pellidos, nombres FROM alumnos WHERE id = 34;

La consulta nos recupera solo al alumno que tiene el id igual a 34.

Si deseamos recuperar los alumnos que tienen los apellidos iniciando en MA, es posible utilizar el operador LIKE.

SELECT apellidos, nombres FROM alumnos WHERE apellidos LIKE 'MA%';

Page 3: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 3

Observe que se utiliza el comodín % (porcentaje) con lo que se indica que los apellidos empiecen con MA y luego puede tener cualquier caracter.

Si deseamos recuperar los estudiantes con códigos comprendidos entre el 10 y el 13, podemos utilizar el operador BETWEEN.

SELECT id, nombres FROM alumnos WHERE id BETWEEN 10 AND 13;

Con el operador "IN" averiguamos si el valor del campo está incluido en una lista, con "NOT" antecediendo la condición, invertimos el resultado.

select * from libros where autor in ('Borges','Paenza');

Lo que realize la consulta anterior, es devolver los libros donde el autor sea Borges o Paenza.

La Clausula ORDER BY

Esta clausula permite ORDENAR el resultado de un SELECT, la ordenación puede ser ascendente ASC o descendente DESC.

SELECT apellidos FROM alumnos ORDER BY apellidos ASC;

La consulta anterior mostrará los apellidos de la tabla alumnos ordenados por sus apellidos en forma ascendente (ASC), tal como se muestra en la imagen de la derecha.

Ojo que la consulta anterior solo ordena por apellidos, si hubiese hermanos deberíamos ordenar no solo por los apellidos sino también por los nombres, esto se logra así:

SELECT * FROM alumnos ORDER BY apellidos, nombres ASC;

Hasta este punto, fíjese que la consulta SELECT es muy versátil, es posible mezclar diferentes clausulas pero siempre siguiendo el orden mostrada en la sintaxis.

Una consulta que muestra parte de lo aprendido hasta el momento sería la siguiente.

SELECT a.id AS Codigo, a.apellidos Apellidos, a.nombres Nombres FROM alumnos a WHERE a.id IN (3,5,7,34) ORDER BY apellidos DESC, nombres DESC;

Page 4: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 4

SELECT CON MULTIPLES TABLAS

Las consultas vistas hasta este momento solo recuperan los datos de una sola tabla. Pero en la vida real las base de datos se componen de tablas relacionadas, normalizadas en las cuales los datos son guardados en multiples tablas para evitar la repetición de datos y ocupar menos espacio en el disco. Cuando la información es seleccionada desde multiples tablas, estas relaciones son llamadas JOINs

Tablas Relacionadas

Para trabajar con consultas entre dos o más tablas debemos de conocer bien las tablas, saber en que campos se encuentran relacionados ya que dicha forma se nos hará más sencillo el trabajo.

El diseño de la izquierda muestra dos tablas relacionadas de uno a muchos ( 1 a N ), la tabla ocupacion tiene los siguientes datos:

Mientras que la tabla personas esta conformado por los siguientes registros:

Observe que el campo por el cual ambas tablas se relacionan es el de idocupacion, en la tabla personas se tiene almacenado idocupacion de acuerdo a los datos almacenados en la tabla ocupación, de tal modo que la persona de nombre Gerardo se puede deducir que es un Docente ya que en su idocupacion tiene el valor 1. Y la persona Edgar se puede observar que es un Estudiante ya que su idocupacion tiene el valor de 2, y en la tabla ocupación están las ocupaciones de acuerdo a los IDs utilizados en la otra tabla, es notoria la relación entre ambas tablas.

Obteniendo Datos Relacionados de Dos Tablas

Para realizar una consulta que muestre datos relacionados de dos tablas debemos utilizar la palabra INNER JOIN en la consulta SELECT.

Page 5: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Ejemplo:

SELECT * FROM ocupacion INNER JOIN personas ON ocupacion.idocupacion = personas.idocupacion;

Observe luego del FROM se escribe el nombre de una de las tablas luego se escribe el INNER JOIN más el nombre de la segunda tabla que está relacionada a la primera tabla.

Enseguida debemos escribir la palabra ON seguido de los dos campos (de cada tabla) que se encuentran relacionados utilizando el operador igual (=).

En ocasiones para no estar escribiendo el nombre de la tabla a la que pertenecen los campos es aconsejable utilizar los alias, quedando por ejemplo así:

SELECT * FROM ocupacion o INNER JOIN personas p ON o.idocupacion = p.idocupacion;

Dicha consulta nos recuperará la asociación de las dos tablas, observe que ahora se puede saber si Edgar es un Alumno y si Elber es un Docente, ya que los datos que estaban relacionados aparecen correctamente al costado de los registros.

Alternativa al INNER JOIN

Existe una forma mucho más cómoda de realizar consultas con más de una tabla, y es de la siguiente manera:

SELECT * FROM ocupacion, personas WHERE ocupacion.idocupacion = personas.idocupacion;

Observe que después del FROM es posible agregar más de una tabla separados por comas (,) y es necesario indicar en el WHERE los campos que están relacionados entre ambas tablas, siempre utilizando el operador igual (=), esto indica que por ejemplo en la tabla ocupación en su campo idocupacion (ocupación.idocupacion) esta relacionado o sea son los mismos valores (por eso se pone el operador igual.) que los almacenados en la tabla personas en su campo idocupacion (personas.idocupacion).

El resultado de dicha consulta es el mismo al realizado utilizando el INNER JOIN:

Datos recuperados de la tabla ocupacion

Datos recuperados de la tabla personas. Observe que los registros se asocian entre ambas tablas.

Page 6: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 6

Recuperando Algunos Campos

Al igual que se vio anteriormente, para seleccionar ciertos campos es necesario indicarlo después del SELECT, pero es aconsejable utilizar la forma absoluta de campo y mejor si se utiliza alias de tablas, por ejemplo:

SELECT p.nombres AS Nombres, p.apellidos AS Apellidos, o.nombre AS Ocupacion FROM ocupacion o, personas p WHERE o.idocupacion = p.idocupacion;

Es posible realizar consultas utilizando todo lo aprendido hasta el momento en forma conjunta, ya que todas estas consultas corresponden a la instrucción SELECT.

Por ejemplo:

SELECT c.nombre, a.nombre, a.semestre, a.horas FROM asignaturas a, carreras c WHERE a.idcarrera = c.idcarrera AND c.nombre LIKE 'C%' AND a.horas IN (4, 8) ORDER BY a.nombre ASC, a.horas ASC;

La consulta recupera el nombre de la carrera profesional, el nombre de la asignaturas, el semestre y la cantidad de horas, de las tablas asignaturas y carreras, pero solo de las carreras que empiecen sus nombre con la letra C y que las horas de las asignaturas sean de 4 o 8 horas, y los ordenas en forma ascendente de acuerdo al nombre de la asignaturas y la cantidad de horas.

Selección sin Repeticiones

Con la cláusula "DISTINCT" especifica que los registros con ciertos datos duplicados sean obviadas en el resultado.

Page 7: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 7

Por ejemplo si escribimos la consulta:

SELECT nombre FROM asignaturas;

Nos mostrará los nombres de las asignaturas de dicha tabla, observe que se repite la asignatura Informática.

Si no queremos dicho resultado, y nuestro propósito es obtener los nombres pero sin duplicados solo es necesario poner la clausula DISTINCT después del SELECT.

SELECT DISTINCT nombre FROM asignaturas;

El resultado será sin duplicados:

EJERCICIOS:

§ Escriba la consulta para mostrar el campo nombre de la asignatura y la carrera profesional en la que se dicta la asignatura.

Page 8: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 8

§ Escriba una consulta para mostrar las asignaturas impartidas por el docente Elber Fedver.

§ Escriba una consulta para mostrar la relación de estudiantes del VI semestre de la carrera de computación e informática.

SUBCONSULTAS

Una subconsulta es una consulta dentro de una consulta – esto es, una consulta en la cual nosotros reutilizamos el resultado en otra consulta. Las subconsultas facilitan el trabajo, haciendo más ágil la selección de registros.

Ejemplo 1:

SELECT producto, cantidad, pre_unitario FROM detalle_factura WHERE cantidad = (select min(cantidad) from detalle_factura );

En el ejemplo se observa que una consulta va dentro de otra, la subconsulta lo que obtiene es la cantidad minima y la consulta principal evalua en el where para mostrar los productos que tienen la minima cantidad comprada.

Page 9: Consulta Select y Subconsultas Hoja a4

Base de Datos en MySQL Ing. Henry Juárez Vargas

Página | 9

Ejemplo 2:

Realizar una consulta que muestre los nombres y apellidos de los docentes que imparten asignaturas en el 6 semestre.

SELECT nombres, apellidos FROM personas WHERE idpersona IN (SELECT iddocente FROM asignaturas WHERE semestre = 6);

Inserción con Subconsultas

Gracias a las subconsultas es posible insertar registros en una tabla con la salida devuelta por una subconsulta; para ello escribimos la consulta y le anteponemos "insert into", el nombre de la tabla en la cual ingresaremos los registros y los campos que se cargarán.

Si los campos presentados entre paréntesis son menos (o más) que las columnas devueltas por la consulta, aparece un mensaje de error y la sentencia no se ejecuta.

Ejemplo:

Si queremos guardar solo los nombres de los productos de la tabla detalle_factura a una nueva tabla de nombre bienes.

Creamos la Tabla bienes

CREATE TABLE bienes ( id INT(10) NOT NULL AUTO_INCREMENT, nombre VARCHAR(50) NULL DEFAULT '0', PRIMARY KEY (id) );

Enseguida para almacenar los nombres de productos de la tabla detalle_factura a la tabla bienes, sin duplicados escribimos la consulta:

INSERT INTO bienes (nombre) SELECT DISTINCT producto FROM detalle_factura;

La consulta llenará la nueva tabla con los nombres de los productos, pero sin duplicados: