Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La instrucción SELECT sirve para recuperar datos dentro de una base de datos, en base a
las restricciones que nosotros le especifiquemos.
Sintaxis básica
SELECT [predicado]
{* tabla.*[tabla].campo1[as alias1]
[,[tabla].campo2[as alias][,.]]}
FROM tabla [,tabla]
[WHERE….]
[GROUP BY]
[ORDER BY……] [;]
SELECT *
FROM tabla
La cláusula WHERE sirve para especificar las condiciones que deben reunir los registros
que van a ser seleccionados, utilizando operadores lógicos y de comparación. De este
modo, reducimos el número de registros que devolverá la consulta a aquellos que realmente
necesitemos.
Sintaxis:
Nota: Hay que colocar comillas en los datos de tipo texto y fecha.
Cuando empleamos la cláusula WHERE nos ayudamos de una serie de operadores, que
veremos en más detalle adelante. Por ahora indicar que están disponibles los operadores de
comparación <, >, <>, <=, >= y =, con los que realizaremos los ejemplos y ejercicios hasta
que estudiemos el resto de operadores.
Ejemplo 1:
Seleccionamos todos los campos de la tabla productos donde el nombre sea Killer.
Seleccionamos los campos id, nombre y precio de la tabla productos donde el precio sea
mayor que 15. A la derecha podemos ver una simulación animada que nos muestra cómo
funciona esta consulta.
1._
2._
3._
Alias
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:
Ejemplo 3:
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 4:
En muchas ocasiones, cuando trabajamos con tablas algo más grandes que las que estamos
empleando en el curso, necesitaremos mostrar sólo una parte de los registros para poder
estudiarlo. Para lograrlo se emplea la cláusula LIMIT:
SELECT campos
…
LIMIT inf,regs
Donde inf es el primer registro a mostrar y regs el número de registros a devolver.
Ejemplo 5:
SELECT *
FROM empleados
LIMIT 0,5;
Ejemplo 6:
Ejemplo 7:
Seleccionar apellido de los empleados que ganen mas de 2000 euros, que seguro que si no
son el presidente están cobrando de más.
SELECT apellido
FROM empleados
WHERE salario > 2000
Ejemplo 8:
Obtener todos los datos de los empleados y, además, el salario anual a percibir por cada uno
de ellos en un nuevo campo llamado SalarioAnual
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 9:
Ejemplo 9:
Ejemplo 10:
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:
Ejemplo 11:
Ejemplo 12:
Averiguar todos los números de departamentos en los que trabajan empleados (sin consultar
la tabla departamentos).
Ordenación
Por defecto en una consulta los datos se ordenan de acuerdo al orden en que se especifiquen
las filas de cada tabla, ascendente o descendente. La ordenación con la cláusula GROUP
BY se puede hacer por nombre o por el número del campo.
Admite la ordenación por mas de una columna. El resultado se ordena de acuerdo a los
valores de la primera. Si dos filas tienen idéntico valor en esa columna, estas se ordenan por
la 2ª y así sucesivamente.
Sintaxis:
SELECT campo
FROM tabla
ORDER BY campo [DESC]
Consideraciones:
Ejemplo 13:
Seleccionar los empleados y su salario ordenados por el salario y por el apellido.
Ejemplo 14:
Ver un nuevo campo llamado "pvp de 10 unidades" que recoja los precios de los productos
por 10 Uds y ordenado el resultado por este nuevo campo.
Nota: Si el alias de una nueva columna tiene espacios, este alias se pone entre comillas
dobles o simples.
Ejemplo 15:
Operadores
A lo largo de este capítulo veremos diversos tipos de operadores: lógicos, aritméticos, de
comparación, etc..
Ejemplo 16:
Primero, sin paréntesis. Devuelve 7 porque se evalúa antes la multiplicación que la suma.
SELECT 1+2*3;
Ejemplo 17:
SELECT (1+2)*3;
Nota: MySQL permite emplear consultas SELECT sin FROM, lo que permite evaluar
expresiones como hemos hecho en esta consulta.
Lógicos
NOT sirve para negar la expresión que le sigue. En las consultas indica lo contrario a la
selección que hacemos.
Ejemplo 18:
Seleccionar todos los campos de la tabla productos donde el campo precio no tenga valores
superiores a 15.
SELECT *
FROM productos
WHERE NOT (precio > 15);
AND es el Y lógico. Sirve para unir dos condiciones que tienen que cumplirse. La consulta
devolverá los valores de los campos que cumplan las dos condiciones, condición 1 Y
condición 2.
Ejemplo 19:
Seleccionar todos los campos de la tabla productos donde el campo precio sea igual a 4 y la
categoría sea la 1.
SELECT *
FROM productos
WHERE precio = 4
AND idcategoria = 1;
OR es el O lógico. La consulta devuelve los valores de aquellas tuplas que cumplen una
condición u otra, condición1 O condición2.
Ejemplo 20:
Seleccionar todos los campos de la tabla productos donde el campo precio sea igual a 15 o
a 19.
SELECT *
FROM productos
WHERE precio = 15
OR precio = 19;
Ejemplo 21:
Ejemplo 22:
Seleccionar el apellido de los empleados que sean vendedores y ganen mas de 1500 euros
SELECT apellido
FROM empleados
WHERE trabajo = "Vendedor" AND salario > 1500;
Ejemplo 23:
SELECT apellido
FROM empleados
WHERE trabajo = "Administrativo" OR departamento = 30;
Aritméticos
Operador Significado
+ Suma
- Resta
* Multiplicación
/ División
% Módulo, es decir, el resto de una división
Ejemplo 24:
SELECT *
FROM empleados
WHERE departamento <> 30;
De Comparación
Operador Significado
< Menor que
> Mayor que
<> ó != Distinto de
<= Menor igual que
>= Mayor igual que
= Igual que
Ejemplo 25:
Seleccionar los empleados que hayan entrado en la empresa antes del 1 de Enero de 1982.
SELECT *
FROM empleados
WHERE fechaingreso < '1982/01/01';
LIKE
El operador LIKE sirve para buscar cadenas de caracteres que contengan una porción de
texto determinada, utilizando caracteres comodín. Estos caracteres se emplean como
sustitutos de caracteres reales.
Comodín Significado
% Cualquier N° de caracteres
_ Un carácter solo
El operador LIKE sólo puede ser empleado con datos numéricos y de carácter.
Para realizar una comparación exacta es más rápido emplear un operador de
comparación en lugar de LIKE.
Hay que tener en cuenta los espacios en blanco, ya que estos son significativos.
No distingue entre mayúsculas y minúsculas.
Si deseamos buscar los caracteres de los comodines deberemos ponerles antes el
caracter de escape \. Es decir, deberemos poner \% y \_.
Ejemplo 26:
Buscar los productos que en la descripción indiquen que son obras de Michael Fende.
SELECT *
FROM productos
WHERE descripcion LIKE '%Michael Fende%';
Ejemplo 27:
SELECT *
FROM productos
WHERE descripcion LIKE '%Coca Mola%';
Ejemplo 28:
SELECT *
FROM empleados
WHERE apellido LIKE "a%";
Intervalos (BETWEEN)
El operador BETWEEN sirve para recuperar campos que están dentro de un rango de
valores entre dos límites especificados.
Sintaxis:
Consideraciones:
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 29:
Ejemplo 30:
Seleccionar los datos de los empleados cuyo salario esté entre 2000 y 3000 euros.
SELECT *
FROM empleados
WHERE salario BETWEEN 2000 AND 3000;
SELECT *
FROM empleados
WHERE salario >= 2000 AND salario <= 3000;
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 31:
SELECT *
FROM productos
WHERE id IN (1,2);
Ejemplo 32:
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 33:
De entre los apellidos Sánchez, Almendro y Santos, ver cuales tienen los empleados.
SELECT apellido
FROM empleados
WHERE apellido IN ("Sanchez", "Almendro", "Santos");
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 34:
SELECT *
FROM empleados
WHERE depende IS NULL;
Ejemplo 35:
SELECT *
FROM empleados
WHERE depende IS NOT NULL;
Ejemplo 36:
SELECT *
FROM empleados
WHERE comision IS NOT NULL AND comision <> 0;
Funciones escalares
Las funciones escalares son aquellas que operan sobre un único valor y devuelven, a su vez,
un único valor. Las dividiremos en tres categorías, dependiendo de los datos sobre los que
actúen:
Funciones de fechas
Funciones de cadenas
Funciones matemáticas
Hay que tener en cuenta que estas funciones son las que más cambian entre diferentes
gestores de bases de datos. Posiblemente no puedas emplear las funciones que vamos a
estudiar en otro gestor que no sea MySQL. Además, veremos sólo las más útiles.
Estas funciones trabajan con fechas. Se pueden dividir en dos grandes grupos, dependiendo
de si el valor que devuelven es de tipo fecha, como en las siguientes:
CURDATE()
CURTIME()
NOW()
DATE_ADD()
DATE_SUB()
WEEKDAY()
DAYOFMONTH()
MONTH()
YEAR()
HOUR()
MINUTE()
SECOND()
También existe una función DATE_FORMAT que devuelve una cadena. Vamos ahora a
estudiar la utilidad de cada una de ellas.
Estas funciones sirven para obtener la fecha actual. Esta fecha la obtiene del reloj de
nuestro ordenador, de modo que debemos recordar tenerlo en día y hora si queremos
emplearlas. La diferencia entre ellas está en los datos concretos que devuelven:
Ejemplo 37:
Seleccionar los datos de los empleados que hayan empezado hoy mismo a trabajar.
SELECT *
FROM empleados
WHERE fechaingreso=CURDATE();
Ejemplo 38:
SELECT NOW();
Las funciones DAYOFMONTH, MONTH y YEAR sirven para obtener el día, el mes y el
año de una fecha dada como parámetro. WEEKOFDAY, en cambio, devuelve el día de la
semana (1=lunes, 2=martes, etc.). La sintaxis es:
DAYOFMONTH (fecha)
WEEKDAY (fecha)
MONTH (fecha)
YEAR (fecha)
Ejemplo 39:
Seleccionar los datos de los empleados que hayan empezado a trabajar el día 1 de cualquier
mes.
SELECT *
FROM empleados
WHERE DAYOFMONTH(fechaingreso)=1;
Ejemplo 40:
Seleccionar los datos de los empleados que hayan empezado a trabajar en miércoles.
SELECT *
FROM empleados
WHERE WEEKDAY(fechaingreso)=3;
Ejemplo 41:
Seleccionar los datos de los empleados que hayan empezado a trabajar cualquier día del
mes de febrero.
SELECT *
FROM empleados
WHERE MONTH(fechaingreso)=2;
Ejemplo 42:
Seleccionar los datos de los empleados que hayan empezado a trabajar en 1982.
SELECT *
FROM empleados
WHERE YEAR(fechaingreso)=1982;
Las funciones HOUR, MINUTE y SECOND sirven para obtener la hora, los minutos y los
segundos de una fecha dada como parámetro.
Sintaxis:
HOUR (fecha)
MINUTE (fecha)
SECOND (fecha)
Ejemplo 43:
El intervalo tiene el formato numero tipo donde tipo puede ser YEAR, MONTH, DAY,
HOUR, MINUTE o SECOND.
Ejemplo 44:
Seleccionar los datos del empleado apellidado Fraga añadiendo un campo llamado fecha de
jubilación, que cumplirá a los 25 años de entrar en la empresa.
La función DATE_FORMAT devuelve una cadena con la fecha pasada como parámetro
escrita según el formato descrito por su segundo parámetro. Ese formato está formado de
caracteres normales y una serie de caracteres especiales o especificadores que tienen un
significado especial y cambiarán según la fecha que estemos tratando.
Ejemplo 45:
SELECT
DATE_FORMAT(fechaingreso, "%d/%m/%Y")
AS fecha
FROM empleados;
Especificador Significado
%Y Año, numérico, 4 dígitos
%y Año, numérico, 2 dígitos
%d Día del mes, numérico (00..31)
%e Día del mes, numérico (0..31)
%m Mes, numérico (00..12)
%c Mes, numérico (0..12)
%H Hora (00..23)
%k Hora (0..23)
%h Hora (01..12)
%l Hora (1..12)
%i Minutos, numérico (00..59)
%r Hora completa, 12 horas (hh:mm:ss [AP]M)
%T Hora completa, 24 horas (hh:mm:ss)
%s Segundos (00..59)
%p AM o PM
%% El carácter %
Estas funciones trabajan con cadenas. Normalmente devuelven una cadena tras hacerle
diversas perrerías, como por ejemplo quitarles espacios en blanco:
LTRIM (x) elimina los espacios en blanco a la izquierda del primer carácter que no
sea un espacio.
RTRIM (x) elimina los espacios en blanco al final de la cadena.
TRIM (x) elimina los espacios en blanco tan al principio como al final de la cadena.
Ejemplo 45:
Seleccionar los apellidos de los empleados quitando los espacios de la izquierda, de la
derecha y quitando todos los espacios.
Ejemplo 46:
Ejemplo 47:
Sintaxis:
Averiguar los códigos de la tarjeta de los empleados. Estos códigos se obtienen a partir del
código del empleado seguido de su apellido en mayúsculas.
Ejemplo 48:
Seleccionar en un sólo campo el nombre y la descripción de los productos separados por
una coma.
Ejemplo 49:
Ejemplo 50:
Ejemplo 51:
PI() devuelve el valor del número PI. Muestra por defecto 6 decimales, pero se
guarda internamente como un número real en doble precisión.
RAND([x]) devuelve un número aleatorio situado entre 0 y 1. Si se facilita un
número como parámetro, se emplea éste como semilla.
SQRT(x) devuelve la raíz cuadrada de x
Ejemplo 52:
MySQL dispone de tres funciones que realizan la labor de redondeo de un número real. Son
éstas:
Ejemplo 53:
SELECT TRUNCATE(122,-2);
Ejemplo 54:
Este ejemplo nos permite observar el distinto comportamiento de cada función de redondeo
ante distintos datos, positivos y negativos y cercanos bien al entero más pequeño o al más
grande.
SELECT
ROUND(3.4), TRUNCATE(3.4,0), FLOOR(3.4), CEILING(3.4),
ROUND(-3.4), TRUNCATE(-3.4,0), FLOOR(-3.4), CEILING(-3.4),
ROUND(3.6), TRUNCATE(3.6,0), FLOOR(3.6), CEILING(3.6),
ROUND(-3.6), TRUNCATE(-3.6,0), FLOOR(-3.6), CEILING(-3.6);