Consultas avanzadas
En MySQL, todas las consultas generan tablas, bien sean tabls de varios registros y varios campos, bien de un solo registro, bien de un valor. Además sabe diferenciar cuando se trata de un único valor, cuando de una fila y cuando de una tabla más avanzada.
Es importante tener esto en cuenta para entender que se pueden combinar varias instrucciones distintas. Veamos algunos casos:
Se podría insertar en una tabla, a partir de valores de otra, incluso con operaciones matemáticas y valores literales juntos de la siguiente manera:
INSERT INTO nombre_tabla (columna1, columna2…)
SELECT columna1, columna2…
FROM nombre_tabla2
Resto de cláusulas;
INSERT INTO nombre_tabla
SELECT *
FROM nombre_tabla2
Resto de cláusulas
Veamos un ejemplo:
INSERT INTO ALUMNOS (NOMBRE, DIRECCIÓN, FECHA_NACIMIENTO, SEXO , EXTRANJERO)
VALUES ('PABLO MÉNDEZ', SELECT DIRECCION FROM ALUMNOS WHERE NOMBRE = 'ALFREDO MÉNDEZ', MAX(FECHA_NACIMIENTO), 'HOMBRE', 'NO');
El nombre del alumno es una constante (Pablo Méndez), así como su sexo y si es extranjero
La dirección es la misma que la de Alfredo Méndez
La fecha de nacimiento es la mayor de las fechas de nacimiento que existan en la tabla
EJEMPLO:
La tabla EMPLE30 tiene los mismos datos que EMPLE. Insertarle a la tabla EMPLE30 los empleados del departamento 30.
INSERT INTO EMPLE30 (EMP_NO, NOMBRE, OFICIO, FECHA_ALTA, SALARIO, COMISIÓN, DEPT_NO)
SELECT (EMP_NO, NOMBRE, OFICIO, FECHA_ALTA, SALARIO, COMISIÓN, DEPT_NO)
FROM EMPLE
WHERE DEPT_NO = 30;
o posiblemente más sencillo
INSERT INTO EMPLE30
SELECT * FROM EMPLE WHERE DEPT_NO=30;
De la misma manera que podemos insertar datos con un SELECT también podríamos actualizarlos. Existen 3 posibilidades
UPDATE nombre_tabla
SET columna1=valor1, columna2 = valor2…
WHERE columna3= (SELECT…);
UPDATE nombre_tabla
SET columna1, columna2... = (SELECT col1, col2…)
WHERE condición;
UPDATE nombre_tabla
SET columna1 = (SELECT col1…), columna2= (SELECT col2…)
WHERE condición;
Veamos algunos ejemplos:
En la tabla centros igualar la dirección y el número de plazas del centro 10 a los valores correspondientes del centro 50.
UPDATE CENTROS
SET (DIRECCION, NUM_PLAZAS)=
(SELECT DIRECCION, NUM_PLAZAS
FROM CENTROS
WHERE COD_CENTRO = 50)
WHERE COD_CENTRO=10;
Para todos los empleados de la tabla EMPLE y del departamento de Contabilidad, cambiar su salario al doble del salario de José Gil Pérez y ponemos su apellido en Mayúsculas.
UPDATE EMPLE
SET APELLIDO = UPPER (APELLIDO), SALARIO =
(SELECT SALARIO*2
FROM EMPLE
WHERE NOMBRE=‘José Gil Pérez’)
WHERE DEPT_NO =
(SELECT DEPT_NO
FROM DEPART
WHERE DNOMBRE = ‘CONTABILIDAD’);
- En la tabla EMPLE cambiar el salario a la mitad y la comisión a 0 a aquellos empleados que pertenezcan al departamento con mayor número de empleados.
UPDATE EMPLE
SET SALARIO=SALARIO/2, COMISION=0,
WHERE DEPT_NO =
(SELECT DEPT_NO FROM EMPLE GROUP BY DEPT_NO HAVING COUNT(*) =
(SELECT MAX(COUNT(*)) FROM EMPLE GROUP BY DEPT_NO));
El secreto de todas estas instrucciones no es otro que saber qué se quiere y dónde está. Los valores literales son eso: literales; Los valores que salen de otro registro (de la misma o de distinta tabla) salen de un SELECT; Los valores que incluyen una función (máximo, mínimo, mayúsculas, count...) salen del resultado de esa misma función.
Comentarios
Publícala y veremos si se puede hacer algo.
Saludos
en una bd con referencias cruzadas
Por el momento le falta una comilla después de la fecha
Saludos
estamos elaborando un proyecto por parte de la universidad y mi probelma es que quiero hacer una consulta en mysql esta es mi sentencia que estoy manejando
selext * from modulo_de_impor tacion where fecha >= '2017/03/15 and fecha
Suscripción de noticias RSS para comentarios de esta entrada.