English version (when available)
SELECT a.cod FROM articulo a WHERE marca = 'Samsung' AND cod IN (SELECT articulo FROM linped);Solución alternativa:SELECT a.cod FROM articulo a WHERE marca = 'Samsung' AND EXISTS (SELECT 1 FROM linped l WHERE a.cod = l.articulo); -- otra solución SELECT DISTINCT a.cod FROM articulo a, linped l WHERE a.cod = articulo AND marca = 'Samsung';
SELECT nombre FROM camara c, articulo a WHERE c.cod = a.cod and tipo LIKE '%compacta%visor%electrónico%' UNION SELECT nombre FROM tv t,articulo a WHERE t.cod = a.cod and panel LIKE '%televisor%CRT%';Solución alternativa:SELECT nombre FROM camara c JOIN articulo a ON (c.cod = a.cod) WHERE tipo LIKE '%compacta%visor%electrónico%' UNION SELECT nombre FROM tv t JOIN articulo a ON (t.cod = a.cod) WHERE panel LIKE '%televisor%CRT%';
SELECT u.nombre, p.nombre, l.pueblo FROM usuario u, localidad l, provincia p WHERE u.pueblo = l.codm and u.provincia = l.provincia and l.provincia = p.codp and l.pueblo LIKE '%San Vicente%' UNION SELECT u.nombre, p.nombre, l.pueblo FROM usuario u, localidad l, provincia p WHERE u.pueblo = l.codm AND u.provincia = l.provincia and l.provincia = p.codp and p.nombre LIKE '%Valencia%';Solución alternativa:SELECT u.nombre, p.nombre, l.pueblo FROM usuario u JOIN localidad l ON (u.pueblo = l.codm AND u.provincia = l.provincia) JOIN provincia p ON l.provincia = p.codp WHERE l.pueblo LIKE '%San Vicente%' UNION SELECT u.nombre, p.nombre, l.pueblo FROM usuario u JOIN localidad l ON (u.pueblo = l.codm AND u.provincia = l.provincia) JOIN provincia p ON l.provincia = p.codp WHERE p.nombre LIKE '%Valencia%';
SELECT u.nombre, email FROM usuario u, provincia p WHERE u.provincia = codp AND p.nombre = 'Asturias' AND email NOT IN (SELECT email FROM direnvio)Solución alternativa:En realidad habría que comparar también dirección de residencia y dirección de envío de aquellos que sí la tienen pero lo dejamos simplemente en que "no tienen dirección de envío".SELECT u.nombre, email FROM usuario u JOIN provincia p ON (u.provincia = codp) WHERE p.nombre = 'Asturias' AND email NOT IN (SELECT email FROM direnvio);
SELECT a.cod, nombre, marca FROM objetivo o, articulo a WHERE a.cod = o.cod AND (focal = '500 mm' OR focal = '600 mm') AND marca NOT IN (SELECT marca FROM pedido p, linped l, articulo where p.numpedido=l.numpedido and articulo= cod and year(fecha)=2010 and month(fecha)=11)
SELECT a.cod, pvp FROM articulo a WHERE marca = 'Samsung' AND pvp IS NOT NULL AND a.cod NOT IN (select articulo from linped);
SELECT nombre FROM articulo WHERE cod IN (SELECT articulo FROM ptienea);Solución alternativa:SELECT nombre FROM articulo WHERE EXISTS (SELECT 1 FROM ptienea WHERE cod = articulo);
SELECT distinct l.pueblo FROM usuario u1, usuario u2, localidad l WHERE u1.email != u2.email AND u1.pueblo = u2.pueblo AND u1.provincia = u2.provincia AND u1.pueblo=l.codm AND u1.provincia=l.provincia;Solución alternativa:Compáralo con la solución usando group by-having. SELECT l.pueblo FROM localidad l, usuario u WHERE u.pueblo = l.codm AND u.provincia=l.provincia GROUP BY l.codm, l.provincia, l.pueblo HAVING COUNT(*) >= 2;
SELECT DISTINCT s.articulo FROM stock s, cesta c, linped l WHERE s.articulo = c.articulo AND s.articulo = l.articulo;
SELECT p.articulo, a.nombre FROM ptienea p, articulo a WHERE p.articulo = a.cod UNION ALL SELECT c.articulo, a.nombre FROM cesta c, articulo a WHERE c.articulo = a.cod;Solución alternativa:SELECT p.articulo, a.nombre FROM ptienea p JOIN articulo a ON (p.articulo = a.cod) UNION ALL SELECT c.articulo, a.nombre FROM cesta c JOIN articulo a ON (c.articulo = a.cod);
select articulo from cesta union select articulo from linped;Solución alternativa:select cod from articulo where cod in (select articulo from cesta) or cod in (select articulo from linped); select cod from articulo where exists (select 1 from cesta where articulo=cod) or exists (select 1 from linped where articulo=cod);
select email, nombre from usuario where email not in (select usuario from pedido) union select email, nombre from usuario, pedido where email=usuario group by email, nombre having count(*)=1;
select distinct u1.apellidos from usuario u1, usuario u2 where u1.email <> u2.email and u1.apellidos= u2.apellidos;Solución alternativa:Compáralo con la solución usando group by-having. select apellidos from usuario group by apellidos having count(*) > 1;
select p1.nombre, p2.nombre, l1.pueblo from provincia p1, provincia p2, localidad l1, localidad l2 where p1.codp<>p2.codp and p1.codp=l1.provincia and p2.codp=l2.provincia and l1.pueblo=l2.pueblo;Observad lo que tarda en realizar la consulta comparado con otras.
select cod, nombre from articulo where cod in( select articulo from stock where entrega='Descatalogado' union select cod from articulo where cod not in (select articulo from linped))
select email, nombre, apellidos from usuario where email in (select usuario from pedido p, linped l, tv where p.numpedido=l.numpedido and articulo=cod) and email not in (select usuario from pedido p, linped l, camara where p.numpedido=l.numpedido and articulo=cod);
select usuario from linped l, pedido p where l.numpedido=p.numpedido group by p.numpedido, usuario having sum(cantidad*importe)>10000 union select usuario from linped l, pedido p where l.numpedido=p.numpedido group by usuario having count(distinct articulo)>5;
select email, nombre, apellidos, ' GRAN CLIENTE' from usuario, linped l, pedido p where l.numpedido=p.numpedido and p.usuario=email group by email, nombre, apellidos having sum(cantidad*importe)>10000 UNION select email, nombre, apellidos, ' CLIENTE MEDIO' from usuario, linped l, pedido p where l.numpedido=p.numpedido and p.usuario=email group by email, nombre, apellidos having sum(cantidad*importe) between 6000 and 10000 UNION select email, nombre, apellidos, ' COMPRA POCO' from usuario, linped l, pedido p where l.numpedido=p.numpedido and p.usuario=email group by email, nombre, apellidos having sum(cantidad*importe)<6000 UNION select email, nombre, apellidos, ' ** NO HA COMPRADO NUNCA' from usuario where email not in (select usuario from pedido) order by 3;
select exists (select * from marca)
select email, nombre from usuario u where email not in (select usuario from linped l, pedido p, camara c where l.numpedido=p.numpedido and l.articulo = c.cod);Solución alternativa:select email, nombre from usuario u where not exists (select 1 from linped l, pedido p, camara c where email=p.usuario and l.numpedido=p.numpedido and c.cod=l.articulo);
select email, nombre from usuario u where email in (select usuario from pedido) and email not in (select usuario from linped l, pedido p, camara c where l.numpedido=p.numpedido and l.articulo = c.cod);Solución alternativa:Obsérvese el uso de usuario.email en la subconsulta del exists.select email, nombre from usuario u where email in (select usuario from pedido) and not exists (select 1 from linped l, pedido p, camara c where email=p.usuario and l.numpedido=p.numpedido and c.cod=l.articulo);
select cod,nombre from articulo a where not exists (select 1 from pedido p where not exists (select 1 from linped l where l.numpedido=p.numpedido and l.articulo=a.cod))Solución alternativa:"Artículo tal que NO existe pedido que NO lo incluya".select articulo from linped l group by articulo having count(distinct numpedido) = (select count(*) from pedido);
select 'sí' respuesta from dual where exists (select 1 from marca);"Dual" es una tabla ficticia del sistema que sirve precisamente para esto, para consultas que no utilizan ninguna tabla.
select 'no' respuesta from dual where not exists (select 1 from memoria);Solución alternativa:"Dual" es una tabla ficticia del sistema que sirve precisamente para esto, para consultas que no utilizan ninguna tabla. En realidad, se utiliza por compatibilidad con otros motores de BD, en MariaDB/MySQL no es imprescindible (véase la solución alternativa).select 'sí' respuesta where exists (select 1 from marca);
select * from pedido p where numpedido in (select numpedido from linped l, camara c where l.articulo=c.cod) and numpedido in (select numpedido from linped l, tv where l.articulo=tv.cod);Solución alternativa:select * from pedido p where exists (select 1 from linped l where l.numpedido=p.numpedido and articulo in (select cod from tv)) and exists (select 1 from linped l where l.numpedido=p.numpedido and articulo in (select cod from camara));
select * from pedido p where numpedido in (select numpedido from linped l, camara c where l.articulo=c.cod) and numpedido in (select numpedido from linped l, objetivo o where l.articulo=o.cod);Solución alternativa:select * from pedido p where exists (select 1 from linped l where l.numpedido=p.numpedido and articulo in (select cod from camara)) and exists (select 1 from linped l where l.numpedido=p.numpedido and articulo in (select cod from objetivo));
select * from articulo natural join memoria;
select cod,nombre,pvp,marca,tipo from articulo natural join memoria;
select cod,nombre,pvp,marca,tipo from articulo natural join memoria where tipo='Compact Flash';Solución alternativa:select a.cod,a.nombre,a.pvp,a.marca,m.tipo from articulo a, memoria m where a.cod=m.cod and tipo='Compact Flash';
select * from pedido natural join linped order by fecha;Solución alternativa:select * from pedido natural join linped order by fecha;
select * from cesta natural join pack;Solución alternativa:En CESTA se utiliza el nombre de columna "articulo" mientras que en pack se utiliza "cod": no hay columnas comunes.select * from cesta, pack;
select * from usuario natural join direnvio;Entre USUARIO y DIRENVIO hay varias columnas comunes: "email", "calle", "calle2", "codpos", "pueblo" y "provincia".
Más útil sería concatenar únicamente por "email"; si nos empeñamos en utilizar la concatenación natural la única solución es renombrar las columnas:
select *
from usuario
natural join
(select email,calle dcalle,calle2 dcalle2,codpos dcodpos,pueblo dpueblo,provincia dprovincia from direnvio) as d