WikiJuanan: ConsultasCursoSQL

SQLCurso SQLMis Cursos


INSERT INTO tabla_destino (SELECT * FROM tabla_origen WHERE condiciones)

UPDATE table SET columna1=valor1, columna2=valor2 WHERE condiciones

DELETE FROM table WHERE condiciones - Es aconsejable hacer antes un SELECT para ver que registros borramos

DELETE FROM table - Borra la tabla entera!!!

SELECT * FROM table WHERE campo IN (valor1, valor2, valor3)

SELECT * FROM table1 WHERE campo1 IN (SELECT campo2 FROM table2)

SELECT columna1, función_agregada(columna2) FROM table GROUP BY columna1 HAVING funcion_agregada(columna2) condición

Update con funciones de tratamiento de cadenas

Cambiamos el formato y el orden de una cadena

SELECT CONCAT(substring(fechapedido,7,2),'/',substring(fechapedido,5,2),'/',left(fechapedido,4)) FROM `pedido`

UPDATE pedido SET fechapedido=concat(substring(fechapedido,7,2),'/',substring(fechapedido,5,2),'/',left(fechapedido,4))

UPDATE pedido

SET fechaentrega2 = CONCAT(LEFT(fechaentrega,4),'-',

SUBSTRING(fechaentrega,5,2),'-',SUBSTRING(fechaentrega,7,2))

WHERE LENGTH(fechapedido) > 8

Consultas de unión internas

Clientes con pedidos con importe superior a 500 euros

SELECT cliente.nombrecompañía,pedido.cargo FROM cliente INNER JOIN pedido ON cliente.idcliente=pedido.idcliente

WHERE pedido.cargo > 500 ORDER BY pedido.cargo DESC

Los empleados con sus jefes

SELECT concat(empleado.nombre,' ',empleado.apellidos) as 'nombre empleado',

concat(jefe.nombre,' ',jefe.apellidos) as 'nombre jefe'

FROM `empleado` left join empleado as jefe

on empleado.jefe=jefe.idempleado

order by 'nombre jefe'

Resolución de problemas

Nombre de la compañía que ha hecho el cargo más grande

Esta consulta no funciona porque “MAX” es una función agrupada y «nombrecompañía” no está agrupada:

SELECT nombrecompañía, MAX(cargo) FROM cliente,pedido

WHERE cliente.idcliente = pedido.idcliente

Esta sin funciona:

select nombrecompañía,cargo from pedido,cliente

where cliente.idcliente=pedido.idcliente

and cargo in (select max(cargo) from pedido)

Compañías que no han hecho compras en la primera mitad del año 98

SELECT nombrecompañía FROM cliente WHERE idcliente

NOT IN (SELECT idcliente FROM pedido

WHERE fechaentrega2

BETWEEN '1998–01–01' AND '1998–06–31')

Empleados que no han hecho ventas en la primera mitad del año 98

SELECT concat(nombre,' ')

año más alto de cada distribuidora

SELECT max(anio) as maximo,distribuidora.nombre from pelicula

inner join distribuidora on distribuidora.id_distribuidora = pelicula.id_distribuidora

group by distribuidora.nombre order by maximo desc