miércoles, 17 de junio de 2015

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;