Mysql – Registros duplicados (distinct)

Con la cláusula «distinct» se especifica que los registros con ciertos datos duplicados sean obviadas en el resultado. Por ejemplo, queremos conocer todos los autores de los cuales tenemos libros, si utilizamos esta sentencia:

select autor from libros;

Aparecen repetidos. Para obtener la lista de autores sin repetición usamos:

select distinct autor from libros;

También podemos tipear:

select autor from libros
group by autor;

Note que en los tres casos anteriores aparece «null» como un valor para «autor»· Si sólo queremos la lista de autores conocidos, es decir, no queremos incluir «null» en la lista, podemos utilizar la sentencia siguiente:

select distinct autor from libros
where autor is not null;

Para contar los distintos autores, sin considerar el valor «null» usamos:

select count(distinct autor)
from libros;

Note que si contamos los autores sin «distinct», no incluirá los valores «null» pero si los repetidos:

select count(autor)
from libros;

Esta sentencia cuenta los registros que tienen autor.

Para obtener los nombres de las editoriales usamos:

select editoriales from libros;

Para una consulta en la cual los nombres no se repitan tipeamos:

select distinct editorial from libros;

Podemos saber la cantidad de editoriales distintas usamos:

select count(distinct editoriales) from libros;

Podemos combinarla con «where». Por ejemplo, queremos conocer los distintos autores de la editorial «Planeta»:

select distinct autor from libros
where editorial=’Planeta’;

También puede utilizarse con «group by»:

select editorial, count(distinct autor)
from libros
group by editorial;

Para mostrar los títulos de los libros sin repetir títulos, usamos:

select distinct titulo from libros
order by titulo;

La cláusula «distinct» afecta a todos los campos presentados. Para mostrar los títulos y editoriales de los libros sin repetir títulos ni editoriales, usamos:

select distinct titulo,editorial
from libros
order by titulo;

Note que los registros no están duplicados, aparecen títulos iguales pero con editorial diferente, cada registro es diferente.

Problema Resuelto:

Trabajamos con la tabla «libros» de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla:

create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
primary key (codigo)
);

Ingresamos algunos registros:

insert into libros (titulo,autor,editorial,precio)
values(‘El aleph’,’Borges’,’Planeta’,15);
insert into libros (titulo,autor,editorial,precio)
values(‘Martin Fierro’,’Jose Hernandez’,’Emece’,22.20);
insert into libros (titulo,autor,editorial,precio)
values(‘Martin Fierro’,’Jose Hernandez’,’Planeta’,42.20);
insert into libros (titulo,autor,editorial,precio)
values(‘Antologia poetica’,’Borges’,’Planeta’,40);
insert into libros (titulo,autor,editorial,precio)
values(‘Aprenda PHP’,’Mario Molina’,’Emece’,18.20);
insert into libros (titulo,autor,editorial,precio)
values(‘Cervantes y el quijote’,’Bioy Casares- Borges’,’Paidos’,36.40);
insert into libros (titulo,autor,editorial,precio)
values(‘Manual de PHP’, null, ‘Paidos’,30.80);
insert into libros (titulo,autor,editorial,precio)
values(‘Harry Potter y la piedra filosofal’,’J.K. Rowling’,’Planeta’,45.00);
insert into libros (titulo,autor,editorial,precio)
values(‘Harry Potter y la camara secreta’,’J.K. Rowling’,’Planeta’,46.00);
insert into libros (titulo,autor,editorial,precio)
values(‘Alicia en el pais de las maravillas’,’Lewis Carroll’,’Paidos’,null);
insert into libros (titulo,autor,editorial,precio)
values(‘Alicia en el pais de las maravillas’,’Lewis Carroll’,’Emece’,12.10);

Para obtener la lista de autores sin repetición usamos «distinct»:

select distinct autor
from libros;

Si sólo queremos la lista de autores conocidos, es decir, no queremos incluir «null» en la lista, utilizamos la sentencia siguiente:

select distinct autor
from libros
where autor is not null;

Para contar los distintos autores, sin considerar el valor «null» usamos:

select count(distinct autor)
from libros;

Note que si contamos los autores sin «distinct», no incluirá los valores «null» pero si los repetidos:

select count(autor)
from libros;

Esta sentencia cuenta los registros que tienen autor.

Para obtener los nombres de las editoriales usamos:

select editorial
from libros;

Para una consulta en la cual los nombres no se repitan tipeamos:

select distinct editorial
from libros;

Podemos saber la cantidad de editoriales distintas usamos:

select count(distinct editorial)
from libros;

Queremos conocer los distintos autores de la editorial «Planeta»:

select distinct autor from libros
where editorial=’Planeta’;

Para contar la cantidad de autores distintos de cada editorial podemos usar «distinct» y «group by»:

select editorial,count(distinct autor)
from libros
group by editorial;

Para mostrar los títulos y editoriales de los libros sin repetir títulos ni editoriales, usamos:

select distinct titulo,editorial
from libros
order by titulo;

La consulta nos devuelve registros con títulos iguales pero con editorial diferente, cada registro es distinto.

Problema Propuesto:

Una academia de enseñanza dicta distintos cursos de informática. Los cursos se
dictan por la mañana o por la tarde, todos los días de lunes a viernes.
La academia guarda los datos de los cursos en una tabla llamada «cursos»
en la cual almacena el código del curso, el tema, los días de la semana
que se dicta, el horario, por la mañana (AM) o por la tarde (PM), la cantidad
de clases que incluye cada curso (clases), la fecha de inicio y el costo del curso.

1- Elimine la tabla «cursos», si existe.

2- Cree la tabla «cursos» con la siguiente estructura:

create table cursos(
codigo tinyint unsigned auto_increment,
tema varchar(20) not null,
horario char(2) not null,
clases tinyint unsigned default 10,
fechainicio date,
costo decimal(5,2) unsigned,
primary key(codigo)
);

3- Ingrese los siguientes registros:

insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘PHP básico’,’AM’,10,’2006-08-07′,200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘PHP básico’,’PM’,default,’2006-08-14′,200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘PHP básico’,’AM’,default,’2006-08-05′,200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘PHP avanzado’,’AM’,20,’2006-08-01′,350);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘JavaScript básico’,’PM’,15,’2006-09-11′,150);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘Paginas web’,’PM’,15,’2006-08-08′,200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘Paginas web’,’AM’,15,’2006-08-12′,200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘Paginas web’,’AM’,15,’2006-08-21′,200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘HTML avanzado’,’AM’,20,’2006-09-18′,180);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘HTML avanzado’,’PM’,20,’2006-09-25′,180);
insert into cursos (tema,horario,clases,fechainicio,costo)
values(‘JavaScript avanzado’,’PM’,25,’2006-09-18′,150);

4- Obtenga la lista de temas de los cursos sin repetición:

5- Seleccione los cursos donde el tema incluya «PHP», sin repetir horario
ni tema:

6- Cuente la cantidad de cursos DISTINTOS agrupados por horario:

Otros problemas:
A) Una empresa tiene registrados sus clientes en una tabla llamada «clientes».

1- Elimine la tabla «clientes», si existe.

2- Créela con la siguiente estructura:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11),
primary key(codigo)
);

3- Ingrese algunos registros:

insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Lopez Marcos’, ‘Colon 111’, ‘Córdoba’,’Cordoba’,’null’);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Perez Ana’, ‘San Martin 222’, ‘Cruz del Eje’,’Cordoba’,’4578585′);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Garcia Juan’, ‘Rivadavia 333’, ‘Villa Maria’,’Cordoba’,’4578445′);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Perez Luis’, ‘Sarmiento 444’, ‘Rosario’,’Santa Fe’,null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Pereyra Lucas’, ‘San Martin 555’, ‘Cruz del Eje’,’Cordoba’,’4253685′);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Gomez Ines’, ‘San Martin 666’, ‘Santa Fe’,’Santa Fe’,’0345252525′);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Torres Fabiola’, ‘Alem 777’, ‘Villa del Rosario’,’Cordoba’,’4554455′);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Lopez Carlos’, ‘Irigoyen 888’, ‘Cruz del Eje’,’Cordoba’,null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Ramos Betina’, ‘San Martin 999’, ‘Cordoba’,’Cordoba’,’4223366′);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values (‘Lopez Lucas’, ‘San Martin 1010’, ‘Posadas’,’Misiones’,’0457858745′);

4- Muestre las distintas provincias y ciudades en las cuales la empresa tiene
clientes:

5- Obtenga la cantidad de ciudades distintas, por provincia en las cuales
hay clientes:

B) En una página web se solicitan los siguientes datos para guardar información
de sus visitas.

1- Elimine la tabla «visitas», si existe.

2- Créela con la siguiente estructura:

create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha date,
primary key(numero)
);

3- Ingrese algunos registros:

insert into visitas (nombre,mail,fecha)
values (‘Ana Maria Lopez’,’[email protected]’,’2006-10-10′);
insert into visitas (nombre,mail,fecha)
values (‘Gustavo Gonzalez’,’[email protected]’,’2006-10-10′);
insert into visitas (nombre,mail,fecha)
values (‘Juancito’,’[email protected]’,’2006-10-11′);
insert into visitas (nombre,mail,fecha)
values (‘Fabiola Martinez’,’[email protected]’,’2006-10-12′);
insert into visitas (nombre,mail,fecha)
values (‘Fabiola Martinez’,’[email protected]’,’2006-09-12′);
insert into visitas (nombre,mail,fecha)
values (‘Juancito’,’[email protected]’,’2006-09-12′);
insert into visitas (nombre,mail,fecha)
values (‘Juancito’,’[email protected]’,’2006-09-15′);
insert into visitas (nombre,mail,fecha)
values (‘Juancito’,’[email protected]’,’2006-09-15′);

4- Obtenga los distintos nombres de quienes visitaron la página:

5- Muestre la cantidad de veces que cada persona ingresó a la página:

6- Muestre la cantidad de veces que cada persona ingresó a la página en
distintas fechas:

Note que las dos últimas sentencias tienen una salida diferente. Una persona
ingresó 2 veces en el mismo día, en el punto Nº6 se cuenta, en el punto Nº 7
no se cuenta porque solicitamos fechas diferentes.

C) Una concesionaria de autos vende autos usados y almacena la información
en una tabla llamada «autos».

1- Elimine la tabla «autos» si existe.

2- Cree la tabla con la siguiente estructura:
create table autos(
patente char(6),
marca varchar(20),
modelo year,
precio decimal(8,2) unsigned,
primary key(patente)
);

3- Ingrese los siguientes registros:

insert into autos values(‘ACD123′,’Fiat 128′,’1970’,15000);
insert into autos values(‘ACG234′,’Renault 11′,’1990’,40000);
insert into autos values(‘BCD333′,’Peugeot 505′,’1990’,80000);
insert into autos values(‘GCD123′,’Renault 11′,’1990’,70000);
insert into autos values(‘BCC333′,’Renault Megane’,’1998′,95000);
insert into autos values(‘BVF543′,’Fiat 128′,’1975’,20000);
insert into autos values(‘FCD123′,’Renault 11′,’1995’,70000);
insert into autos values(‘HCC333′,’Renault Megane’,’1995′,95000);
insert into autos values(‘IVF543′,’Fiat 128′,’1970’,20000);

4- Muestre las distintas marcas de autos disponibles:

5- Muestre la cantidad de autos por marca, de diferentes modelos:

6- Muestre los distintos modelos de autps disponibles:

D) Un consultorio médico en el cual trabajan varios médicos registra
las consultas de los pacientes en una tabla llamada «consultas».

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:

create table consultas(
fechayhora datetime not null,
medico varchar(30) not null,
documento char(8) not null,
paciente varchar(30),
obrasocial varchar(30)
);

4- Ingrese los siguientes registros:

insert into consultas values(‘2006-08-10 8:00′,’Perez’,’22333444′,’Juana Garcia’,’PAMI’);
insert into consultas values(‘2006-08-10 10:00′,’Lopez’,’22333444′,’Juana Garcia’,’PAMI’);
insert into consultas values(‘2006-08-10 8:30′,’Perez’,’23333444′,’Adela Gomez’,’PAMI’);
insert into consultas values(‘2006-08-10 9:00′,’Perez’,’24333444′,’Juan Lopez’,’IPAM’);
insert into consultas values(‘2006-08-10 10:00′,’Perez’,’25333444′,’Hector Juarez’,’OSDOP’);
insert into consultas values(‘2006-08-10 8:30′,’Garcia’,’25333444′,’Ana Molina’,’PAMI’);
insert into consultas values(‘2006-09-10 8:30′,’Garcia’,’25333444′,’Ana Molina’,’PAMI’);

5- Muestre las distintas obras sociales:

6- Muestre los nombres de los distintos pacientes:

7- Muestre la cantidad de distintas obras sociales:

8- Cuente la cantidad de médicos (SIN REPETIR) que tienen consultas agrupado
por mes y día:

E) Un club dicta clases de distintos deportes. En una tabla llamada «inscriptos»
almacena la información necesaria.

1- Elimine la tabla «inscriptos» si existe.

2- Cree la tabla:

create table inscriptos(
documento char(8) not null,
nombre varchar(30),
deporte varchar(15) not null,
año year,
matricula char(1) default ‘N’
);

3- Ingrese los siguientes registros:

insert into inscriptos values(‘35333444′,’Juan Lopez’,’tenis’,’1990′,’S’);
insert into inscriptos values(‘35333444′,’Juan Lopez’,’basquet’,’1990′,’S’);
insert into inscriptos values(‘35333444′,’Juan Lopez’,’natación’,’1990′,’S’);
insert into inscriptos values(‘36333444′,’Ana Juarez’,’tenis’,’1990′,’S’);
insert into inscriptos values(‘36333444′,’Ana Juarez’,’natación’,’1990′,’S’);
insert into inscriptos values(‘35333444′,’Juan Lopez’,’voley’,’1991′,’S’);
insert into inscriptos values(‘35333444′,’Juan Lopez’,’voley’,’1992′,’S’);
insert into inscriptos values(‘35333444′,’Juan Lopez’,’tenis’,’1992′,’S’);
insert into inscriptos values(‘36333444′,’Ana Juarez’,’tenis’,’1991′,’S’);
insert into inscriptos values(‘37333444′,’Luis Duarte’,’tenis’,’1990′,’S’);
insert into inscriptos values(‘37333444′,’Luis Duarte’,’tenis’,’1991′,’S’);

4- Muestre los nombres de los inscriptos sin repetir:

5- Muestre los nombres de los deportes sin repetir:

6- Muestre la cantidad de alumnos DISTINTOS inscriptos en cada deporte:

7- Muestre la cantidad de inscriptos por año, sin considerar los alumnos que
se inscribieron en más de un deporte.

 

Fuente: http://jjmojicamysql.blogspot.com.ar/2012/05/37-registros-duplicados-distinct.html

Comentarios