miércoles, 17 de junio de 2015

Si queremos saber la cantidad de libros agrupados por editorial usamos la siguiente instrucción ya aprendida:
 
select editorial, count(*)
from libros
group by editorial;

Si queremos saber la cantidad de libros agrupados por editorial pero considerando sólo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instrucción:
 
select editorial, count(*) from libros
group by editorial
having count(*)>2;

Se utiliza "having", seguido de la condición de búsqueda, para seleccionar ciertas filas retornadas por la cláusula "group by".

Veamos otros ejemplos. Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos:

select editorial, avg(precio) from libros
group by editorial
having avg(precio)>25;

En algunos casos es posible confundir las cláusulas "where" y "having". Queremos contar los registros agrupados por editorial sin tener en cuenta a la editorial "Planeta".
Analicemos las siguientes sentencias:


select editorial, count(*) from libros
where editorial<>'Planeta'
select editorial, count(*) from libros
group by editorial;
group by editorial
having editorial<>'Planeta';

Ambas devuelven el mismo resultado, pero son diferentes. La primera, selecciona todos los registros rechazando los de editorial "Planeta" y luego los agrupa para contarlos. La segunda, selecciona todos los registros, los agrupa para contarlos y finalmente rechaza fila con la cuenta correspondiente a la editorial "Planeta".

No debemos confundir la cláusula "where" con la cláusula "having"; la primera establece condiciones para la selección de registros de un "select"; la segunda establece condiciones para la selección de registros de una salida "group by".

Veamos otros ejemplos combinando "where" y "having". Queremos la cantidad de libros, sin considerar los que tienen precio nulo, agrupados por editorial, sin considerar la editorial "Planeta":

select editorial, count(*) from libros
where precio is not null
having editorial<>'Planeta';
group by editorial

Aquí, selecciona los registros rechazando los que no cumplan con la condición dada en "where", luego los agrupa por "editorial" y finalmente rechaza los grupos que no cumplan con la condición dada en el "having".
Se emplea la cláusula "having" con funciones de agrupamiento, esto no puede hacerlo la cláusula "where". Por ejemplo queremos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen más de 2 libros:

select editorial, avg(precio) from libros
group by editorial
having count(*) > 2;

En una cláusula "having" puede haber hasta 128 condiciones. Cuando utilice varias condiciones, tiene que combinarlas con operadores lógicos (and, or, not).
Podemos encontrar el mayor valor de los libros agrupados y ordenados por editorial y seleccionar las filas que tengan un valor menor a 100 y mayor a 30:

select editorial, max(precio) as 'mayor'
from libros
group by editorial
min(precio)>30
having min(precio)<100 and
order by editorial;

Entonces, usamos la claúsula "having" para restringir las filas que devuelve una salida "group by". Va siempre después de la cláusula "group by" y antes de la cláusula "order by" si la hubiere.

Agrupar filas con GROUP BY

La cláusula GROUP BY se usa para generar valores de agregado para cada fila del conjunto de resultados. Cuando se usan sin una cláusula GROUP BY, las funciones de agregado sólo devuelven un valor de agregado para una instrucción SELECT.

Los elementos que se pueden especificar en la lista de selección cuando una instrucción SELECT contiene una cláusula GROUP BY están restringidos. Los elementos permitidos en la lista de selección son los siguientes:
  • Las columnas de agrupación.
  • Expresiones que devuelven un solo valor por cada valor de las columnas de agrupación, por ejemplo, las funciones de agregado que tienen un nombre de columna como uno de sus parámetros. Se conocen como agregados vectoriales.
Por ejemplo, TableX contiene lo siguiente:

ColumnAColumnBColumnC
-------
-------
-------
1
abc
5
1
def
4
1
ghi
9
2
jkl
8
2
mno
3
Si ColumnA es la columna de agrupación, habrá dos filas en el conjunto de resultados, una que resume la información del valor 1 y otra que resume la del valor 2.
Cuando ColumnA es la columna de agrupación, la única forma en la que se puede hacer referencia a ColumnB o ColumnC es en el caso de que sean parámetros de una función de agregado que pueda devolver un valor único para cada valor de ColumnA. La lista de selección puede incluir expresiones como MAX(ColumnB), SUM(ColumnC) o AVG(ColumnC):
SELECT ColumnA,
       MAX(ColumnB) AS MaxB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA
Esta selección devuelve dos filas, una por cada valor único de ColumnA:
ColumnA     MaxB SumC        
----------- ---- ----------- 
1           ghi  18          
2           mno  11          

(2 row(s) affected)
Sin embargo, no se permite tener sólo la expresión ColumnB en la lista de selección:
SELECT ColumnA,
       ColumnB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA
Puesto que GROUP BY sólo puede devolver una fila con el valor 1 de ColumnA, no hay forma de devolver los tres valores de ColumnB (abc, def y ghi) asociados al valor 1 deColumnA.

Valores Desconocidos (IS NULL)

Al crear una base de datos, a veces, se dejan campos vacíos dejando el valor nulo. Con el operador IS NULL seleccionaremos estos registros, donde el valor del campo seleccionado es nulo.

Consideraciones:
  • Al crear las tablas de las bases de datos es conveniente considerar si los campos van a aceptar valores nulos
  • Los valores nulos crean problemas a la hora de hacer comparaciones.
  • El operador IS NOT NULL hará lo contrario; es decir, recuperará los campos cuyos valores no son nulos.
Ejemplo 1:
Selecciona los empleados con jefe.
SELECT *
FROM empleados
WHERE depende IS NULL;
Ejemplo 2:
Selecciona los empleados sin jefe.
SELECT *
FROM empleados
WHERE depende IS NOT NULL;
Ejemplo 3:
Seleccionar los datos de los empleados que tienen comisión y no es 0
SELECT *
FROM empleados
WHERE comision IS NOT NULL AND comision <> 0;

Listas de Comparación (IN)

El operador IN sirve para ver si el valor de un campo esta dentro de una lista.

Consideraciones:
  • No deje valores NULL en la lista ya que al hacer comparaciones nos puede dar resultados incorrectos.
  • A veces son más rápidas las consultas que utilizan los operadores = y OR para realizar las comparaciones.
  • Si al operador IN se le incluye la palabra reservada NOT (NOT IN) hará lo contrario, seleccionando los campos que no están dentro de la lista.
Ejemplo 1:
Ver los productos que tengan identificador 1 o 2.
SELECT *
FROM productos
WHERE id IN (1,2);
Ejemplo 2:
Seleccionar los empleados que no se apelliden King ni Turner, porque nos gustan los apellidos españoles.
SELECT *
FROM empleados
WHERE apellido NOT IN ('King', 'Turner');
Ejemplo 3:
De entre los apellidos Sánchez, Almendro y Santos, ver cuales tienen los empleados.
SELECT apellido
FROM empleados
WHERE apellido IN ("Sanchez", "Almendro", "Santos");

Intervalos (BETWEEN)


El operador BETWEEN sirve para recuperar campos que están dentro de un rango de valores entre dos límites especificados.

Sintaxis:

BETWEEN limite1 AND limite2

Consideraciones:
  • Utiliza el operador BETWEEN con la palabra reservada NOT (NOT BETWEEN) para recuperar campos que no están dentro del intervalo.
  • Utiliza el operador BETWEEN en vez de un predicado con un operador lógico AND con dos operadores de comparación
En realidad, BETWEEN no hace nada que no se puede hacer igual con operadores de comparación, pero resulta más corto y legible.
Ejemplo 1:
Ver los productos que tengan un precio entre 5 y 10 euros.
SELECT * FROM productos
WHERE precio BETWEEN 5 AND 10;
Ejemplo 2:
Seleccionar los datos de los empleados cuyo salario esté entre 2000 y 3000 euros.
SELECT *
FROM empleados
WHERE salario BETWEEN 2000 AND 3000;
Tambien se puede hacer de esta otra forma:
SELECT *
FROM empleados
WHERE salario >= 2000 AND salario <= 3000;

Aritméticos

Sirven para efectuar operaciones entre campos o campos con variables.

OperadorSignificado
+Suma
-Resta
*Multiplicación
/División
%Módulo, es decir, el resto de una división
Ejemplo 1:
Seleccionar aquellos empleados que no trabajen en el departamento 30 sin emplear NOT.
SELECT *
FROM empleados
WHERE departamento <> 30;

De Comparación

Sirven para comparar campos con otros campos o con variables.
OperadorSignificado
<Menor que
>Mayor que
<> ó !=Distinto de
<=Menor igual que
>=Mayor igual que
=Igual que
Ejemplo 2:
Seleccionar los empleados que hayan entrado en la empresa antes del 1 de Enero de 1982.
SELECT *
FROM empleados
WHERE fechaingreso < '1982/01/01';

Obtener datos de varias tablas


Se nos puede dar un caso muy habitual en el que tengamos que obtener campos de distintas tablas para operar con ellos. Para este caso debemos hacer mención a las distintas tablas de donde se van a sacar los datos. En el caso de que algun campo se llame igual en ambas, utilizamos el nombre de la tabla seguido de un punto y el nombre del campo. Por ejemplo: empleados.departamento.
Sintaxis

SELECT tabla1.campo, tabla2.campo
FROM tabla1, tabla2
WHERE tabla1.campo1 = tabla2.campo2;

Más adelante veremos otra forma de obtención de datos de varias tablas mediante la cláusula JOIN.

Nota: Al unir dos tablas hay que relacionarlas con un campo común, que en estos ejemplos es departamento. Normalmente suelen ser claves extranjeras.

Ejemplo 1:
Obtener el apellido, trabajo, departamento y localidad de todos los empleados de la empresa.
SELECT apellido, trabajo, e.departamento, nombre, localidad
FROM empleados AS e, departamentos AS d
WHERE e.departamento = d.departamento;

Ejemplo 2:
Seleccionar el nombre, trabajo, departamento, localidad y salario de los empleados que tengan un salario superior a 2000 Euros.
SELECT apellido, trabajo, d.departamento, localidad, salario
FROM empleados AS e, departamentos AS d
WHERE salario > 2000 AND d.departamento = e.departamento;

Ejemplo 3:
Recuperar el nombre, descripción, precio y nombre de la categoría a la que pertenecen los productos.
SELECT p.nombre, p.descripcion, p.precio, c.nombre
FROM productos AS p, categorias AS c
WHERE p.idcategoria = c.id;

Alias utilizando AS

De columna
Por defecto cada columna de una consulta se etiqueta para los resultados de acuerdo al nombre del campo, se pueden reemplazar estos por otros para conseguir que los resultados de las consultas sean más legibles. Esto se consigue utilizando un alias.
Sintaxis:
SELECT campo AS alias de columna
FROM tabla;
Ejemplo 1:
Se seleccionan los salarios de todos los empleados pero denominandolos "sueldo".
SELECT salario AS sueldo
FROM empleados;
De tabla
En ocasiones los nombres de las tablas son muy largos o tenemos varias tablas en la misma consulta, por esto nos es muy cómodo dar a una tabla otro nombre. Este Alias o nuevo nombre no es permanente, sino que sólo es valido para un comando.
Sintaxis:
SELECT campos
FROM tabla AS alias
WHERE condición


Ejemplo 2:
Hacemos una consulta bautizando a la tabla empleados "e".
SELECT apellido, salario
FROM empleados AS e
WHERE e.departamento =10;

Consulta de dos tablas ver sus datos de las dos

mysql> INSERT INTO personas2 (nombre, fecha) VALUES
    -> ("Fulanito", "1956-12-14"),
    -> ("Menganito", "1975-10-15"),
    -> ("Tulanita", "1985-03-17"),
    -> ("Fusganita", "1976-08-25");
Query OK, 4 rows affected (0.09 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM personas2;
+----+-----------+------------+
| id | nombre    | fecha      |
+----+-----------+------------+
|  1 | Fulanito  | 1956-12-14 |
|  2 | Menganito | 1975-10-15 |
|  3 | Tulanita  | 1985-03-17 |
|  4 | Fusganita | 1976-08-25 |
+----+-----------+------------+
4 rows in set (0.00 sec)

mysql>
Ahora insertaremos datos en la tabla de telefonos2:
mysql> INSERT INTO telefonos2 (id, numero) VALUES
    -> (1, "123456789"),
    -> (1, "145654854"),
    -> (1, "152452545"),
    -> (2, "254254254"),
    -> (4, "456545654"),
    -> (4, "441415414");
Query OK, 6 rows affected (0.06 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM telefonos2;
+-----------+---------+
| numero    | persona |
+-----------+---------+
| 123456789 |       1 |
| 145654854 |       1 |
| 152452545 |       1 |
| 254254254 |       2 |
| 456545654 |       4 |
| 441415414 |       4 |
+-----------+---------+
6 rows in set (0.00 sec)

mysql>
El producto cartesiano de dos tablas son todas las combinaciones de todas las filas de las dos tablas. Usando una sentencia SELECT se hace proyectando todos los atributos de ambas tablas. Los nombres de las tablas se indican en la cláusula FROM separados con comas:
mysql> SELECT * FROM personas2,telefonos2;
+----+-----------+------------+-----------+----+
| id | nombre    | fecha      | numero    | id |
+----+-----------+------------+-----------+----+
|  1 | Fulanito  | 1956-12-14 | 123456789 |  1 |
|  2 | Menganito | 1975-10-15 | 123456789 |  1 |
|  3 | Tulanita  | 1985-03-17 | 123456789 |  1 |
|  4 | Fusganita | 1976-08-25 | 123456789 |  1 |
|  1 | Fulanito  | 1956-12-14 | 145654854 |  1 |
|  2 | Menganito | 1975-10-15 | 145654854 |  1 |
|  3 | Tulanita  | 1985-03-17 | 145654854 |  1 |
|  4 | Fusganita | 1976-08-25 | 145654854 |  1 |
|  1 | Fulanito  | 1956-12-14 | 152452545 |  1 |
|  2 | Menganito | 1975-10-15 | 152452545 |  1 |
|  3 | Tulanita  | 1985-03-17 | 152452545 |  1 |
|  4 | Fusganita | 1976-08-25 | 152452545 |  1 |
|  1 | Fulanito  | 1956-12-14 | 254254254 |  2 |
|  2 | Menganito | 1975-10-15 | 254254254 |  2 |
|  3 | Tulanita  | 1985-03-17 | 254254254 |  2 |
|  4 | Fusganita | 1976-08-25 | 254254254 |  2 |
|  1 | Fulanito  | 1956-12-14 | 456545654 |  4 |
|  2 | Menganito | 1975-10-15 | 456545654 |  4 |
|  3 | Tulanita  | 1985-03-17 | 456545654 |  4 |
|  4 | Fusganita | 1976-08-25 | 456545654 |  4 |
|  1 | Fulanito  | 1956-12-14 | 441415414 |  4 |
|  2 | Menganito | 1975-10-15 | 441415414 |  4 |
|  3 | Tulanita  | 1985-03-17 | 441415414 |  4 |
|  4 | Fusganita | 1976-08-25 | 441415414 |  4 |
+----+-----------+------------+-----------+----+
24 rows in set (0.73 sec)

Predicado DISTINCT

Si en nuestra tabla puede haber algún dato que se repita, como la dirección, podemos pedir un listado sin duplicados, usando la palabra "distinct":

SELECT DISTINCT direccion FROM personas;

Predicado DISTINCT

Los predicados se situan entre la cláusula y los campos. El único predicado en MySQL que afecta a los resultados es DISTINCT. Se utiliza para eliminar todos los registros que contienen datos duplicados en los campos seleccionados. Si la cláusula SELECT contiene mas de un campo, la combinación de valores de todos los campos para un registro concreto tiene que ser única.
Sintaxis:
SELECT DISTINCT campos FROM tabla WHERE condición
Consideraciones:
  • DISTINCT ordena los resultados de forma impredecible.
  • Si se utiliza el predicado DISTINCT, solo se podrán meter en la cláusula ORDER BY (que veremos en breve) los campos listados.
  • Los campos que no tengan duplicados serán representados en la consulta.
Ejemplo 1:
Selecciona todos los trabajos de los empleados.
SELECT DISTINCT trabajo FROM empleados;
Ejemplo 2:
Averiguar todos los números de departamentos en los que trabajan empleados (sin consultar la tabla departamentos).
SELECT DISTINCT departamento FROM empleados;

lunes, 30 de marzo de 2015

insertar dats tabla






Antes ue nada crean la tabla de masotas

mysql> CREATE TABLE mascotas( 
    -> nombre VARCHAR(20), propietario VARCHAR(20),
    -> especie VARCHAR(20), sexo CHAR(1), nacimiento DATE,
    -> fallecimento DATE);

mysql> INSERT INTO mascotas
    -> VALUES('Pelusa','Diana','Hamster','f','2000-03-30',NULL);
 
 
 

Nombre Propietario Especie Sexo Nacimiento Fallecimento
Fluffy Arnoldo Gato f 1999-02-04
Mau Juan Gato m 1998-03-17  
Buffy Arnoldo Perro f 1999-05-13  
FanFan Benito Perro m 2000-08-27  
Kaiser Diana Perro m 1998-08-31 1997-07-29
Chispa Omar Ave f 1998-09-11  
Wicho Tomás Ave 2000-02-09
Skim Benito Serpiente m 2001-04-29