miércoles, 17 de junio de 2015

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;