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 articulo WHERE cod IN ( SELECT cod FROM camara WHERE tipo LIKE '%compacta%visor%electrónico%' UNION SELECT cod FROM tv WHERE panel LIKE '%televisor%CRT%');Solución alternativa:SELECT nombre FROM articulo a WHERE EXISTS ( SELECT 1 FROM camara c WHERE c.cod = a.cod AND c.tipo LIKE '%compacta%visor%electrónico%' ) OR EXISTS ( SELECT 1 FROM tv t WHERE t.cod = a.cod AND t.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%' OR 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 join articulo a on a.cod = o.cod WHERE (focal = '500 mm' or focal = '600 mm') AND marca NOT IN ( SELECT a2.marca FROM pedido p join linped l on p.numpedido=l.numpedido JOIN articulo a2 ON l.articulo= a2.cod WHERE fecha>='2010-11-01' and p.fecha<='2010-11-30' AND a2.marca is not NULL );Solución alternativa:Recordemos que IN es sensible a los nulos, y en este caso podría darse el caso de un artículo con marca igual a null. SELECT a.cod, nombre, marca FROM objetivo o join articulo a on a.cod = o.cod WHERE (focal = '500 mm' or focal = '600 mm') AND NOT exists ( SELECT 1 FROM pedido p join linped l on p.numpedido=l.numpedido JOIN articulo a2 ON l.articulo= a2.cod WHERE fecha>='2010-11-01' and p.fecha<='2010-11-30' AND a2.marca=a2.marca );
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 nombre FROM articulo a,ptienea p where a.cod=p.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 u.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 u.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