Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4
1.1 Creacin de una base de datos. ................................................................................ 5
1.1.1 Creacion de tablas. ............................................................................................ 5
1.1.2 Insertar registros en una tabla ........................................................................... 5
1.1.3 Tipos de datos de un campo de una tabla. ........................................................ 6
1.2 Consulta de campos. ................................................................................................ 6
1.2.1 Consultas de registros especficos. ................................................................... 6
1.2.2 Operadores relacionales. ................................................................................... 7
1.3 borrar registros de una tabla..................................................................................... 7
1.4 Modificacin de registros de una tabla. ................................................................... 7
1.5 Clave primaria y clave fornea. ............................................................................... 8
1.6 Campo autoincremento. ........................................................................................... 8
1.7 Modificar la estructura de una tabla......................................................................... 8
1.8 Comando truncate table. .......................................................................................... 9
1.9 Valores null. ............................................................................................................. 9
1.10 Columnas calculadas. ............................................................................................. 10
2 Funciones para el manejo de cadenas. .......................................................................... 11
2.1 Funciones matemticas. ......................................................................................... 13
3 Clusula order by del select. ......................................................................................... 20
4 Operadores Lgicos (and - or - not) .............................................................................. 21
5 Agrupando los resultados .............................................................................................. 23
5.1 Filtrando los datos agrupados ................................................................................ 24
5.2 Filtro distinct. ......................................................................................................... 24
6 Alias. ............................................................................................................................. 27
7 Qu es una subconsulta? .............................................................................................. 28
7.1 Subconsultas que devuelven conjuntos de datos. .................................................. 29
8 Join ................................................................................................................................ 29
8.1 Acercamiento a la necesidad de los JOIN.............................................................. 29
8.2 JOIN cruzados, internos y externos ....................................................................... 33
9 Union ............................................................................................................................. 36
9.1Unin de dos consultas
36
9.2 Imitando un FULL OUTER JOIN ......................................................................... 38
Referencias ........................................................................................................................... 40
INTRODUCCIN
Nos encontramos en un momento decisivo respecto del uso de la tecnologa para extender y
potenciar nuestra capacidad de comunicarnos. La globalizacin de Internet se ha producido
ms rpido de lo que cualquiera hubiera imaginado. El modo en que se producen las
interacciones sociales, comerciales, polticas y personales cambia en forma continua para
estar al da con la evolucin de esta red global. En la prxima etapa de nuestro desarrollo, los
innovadores usarn Internet como punto de inicio para sus esfuerzos, lo que generar nuevos
productos y servicios diseados especficamente para aprovechar las capacidades de la red.
A medida que los programadores impulsen los lmites de lo posible, las capacidades de las
redes interconectadas que crean la Internet jugarn un papel cada vez ms grande en el xito
de estos proyectos.
1 Mysql
MySQL es un interpretador de SQL, es un servidor de base de datos.
MySQL permite crear base de datos y tablas, insertar datos, modificarlos, eliminarlos,
ordenarlos, hacer consultas y realizar muchas operaciones, etc., resumiendo: administrar
bases de datos.
Ejemplo:
select atributo, atributo2, atributo3 from NombreDelaTabla where atributo1 > 20;
Podemos modificar el tipo de datos de un campo con "MODIFY". Por ejemplo, podramos
hacer que el campo "habitantes" no fuera un "decimal" sino un entero largo ("bigint") con:
ALTER TABLE ciudades MODIFY habitantes bigint;
Si queremos cambiar el nombre de un campo, debemos usar "CHANGE" (se debe indicar el
nombre antiguo, el nombre nuevo y el tipo de datos). Por ejemplo, podramos cambiar el
nombre "habitantes" por "numhabitantes":
Recuerda que no debe haber espacios entre un nombre de funcin y los parntesis porque
MySQL puede confundir una llamada a una funcin con una referencia a una tabla o campo
que tenga el mismo nombre de una funcin.
MySQL tiene algunas funciones para trabajar con cadenas de caracteres. estas son algunas:
Los operadores aritmticos son "+","-","*" y "/". Todas las operaciones matemticas retornan
"null" en caso de error. Ejemplo:
select 5/0;
RECUERDE que NO debe haber espacios entre un nombre de funcin y los parntesis porque
MySQL puede confundir una llamada a una funcin con una referencia a una tabla o campo
que tenga el mismo nombre de una funcin.
Los operadores matemticos que podemos emplear son los habituales en cualquier lenguaje
de programacin, ligeramente ampliados: + (suma), - (resta y negacin), * (multiplicacin),
/ (divisin). La divisin calcula el resultado con decimales; si queremos trabajar con nmeros
enteros, tambin tenemos los operadores DIV (divisin entera) y MOD (resto de la divisin):
Tambin podramos utilizar incluso operaciones a nivel de bits, como las del lenguaje C (>>
para desplazar los bits varias posiciones a la derecha, << para desplazar a la izquierda, para
una suma lgica bit a bit, & para un producto lgico bit a bit y ^ para una operacin XOR):
Que dara:
Funciones de agregacin
Tambin podemos aplicar ciertas funciones matemticas a todo un conjunto de
datos de una tabla. Por ejemplo, podemos saber cul es la edad ms baja de
entre las personas que tenemos en nuestra base de datos, haramos:
MySQL tiene algunas funciones para trabajar con fechas y horas. Estas son algunas:
Ejemplos:
Ejemplo:
Ejemplo:
Ejemplo:
dayofmonth(fecha): retorna el da del mes para la fecha dada, dentro del rango 1 a 31.
Ejemplo:
Ejemplo:
dayofyear(fecha): retorna el da del ao para la fecha dada, dentro del rango 1 a 366.
Ejemplo:
Ejemplos:
Los valores para tipo pueden ser: second, minute, hour, day, month, year, minute_second,
hour_minute, day_hour, year_month, hour_second (horas, minutos y segundos),
day_minute (das, horas y minutos), day_second (das a segundos).
hour(hora): retorna la hora para el dato dado, en el rango de 0 a 23.
Ejemplo:
Ejemplo:
Ejemplo:
period_diff(p1, p2): retorna el nmero de meses entre los perodos "p1" y "p2", en el
formato "YYMM" o "YYYYMM". Los argumentos de perodo no son fechas sino un ao y
un mes.
Ejemplo:
period_diff('200608','200602') retorna 6.
Ejemplo:
Ejemplo:
Ejemplo:
Podemos ordenar el resultado de un "select" para que los registros se muestren ordenados
por algn campo, para ello usamos la clusula "order by".
Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el ttulo:
Tambin podemos colocar el nmero de orden del campo por el que queremos que se ordene
en lugar de su nombre. Por ejemplo, queremos el resultado del "select" ordenado por
"precio":
Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (de menor a
mayor). Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave "desc":
Tambin podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido
ascendente y "editorial" en sentido descendente:
Debe aclararse al lado de cada campo, pues estas palabras claves afectan al campo
inmediatamente anterior.
4 Operadores Lgicos (and - or - not)
Podemos establecer ms de una condicin con la clusula "where", para ello aprenderemos
los operadores lgicos.
Son los siguientes:
And: significa "y",
Or: significa "y/o",
Xor: significa "o",
Not: significa "no", invierte el resultado
(): parntesis
Los operadores lgicos se usan para combinar condiciones.
Queremos recuperar todos los registros cuyo autor sea igual a "Borges" y cuyo precio no
supere los 20 pesos, para ello necesitamos 2 condiciones:
select * from libros
where (autor='Borges') and
(precio<=20);
Los registros recuperados en una sentencia que une 2 condiciones con el operador "and",
cumplen con las 2 condiciones.
Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta":
select * from libros
where autor='Borges' or
editorial='Planeta';
En la sentencia anterior usamos el operador "or", indicamos que recupere los libros en los
cuales el valor del campo "autor" sea "Borges" y/o el valor del campo "editorial" sea
"Planeta", es decir, seleccionar los registros que cumplan con la primera condicin, con la
segunda condicin o con ambas condiciones.
Los registros recuperados con una sentencia que une 2 condiciones con el operador "or",
cumplen 1 de las condiciones o ambas.
Queremos ver los libros cuyo autor sea "Borges" o cuya editorial sea "Planeta":
select * from libros
where (autor='Borges') xor
(editorial='Planeta');
En la sentencia anterior usamos el operador "xor", indicamos que recupere los libros en los
cuales el valor del campo "autor" sea "Borges" o el valor del campo "editorial" sea "Planeta",
es decir, seleccionar los registros que cumplan con la primera condicin o con la segunda
condicin, pero no los que cumplan con ambas condiciones. Los registros recuperados con
una sentencia que une 2 condiciones con el operador "xor", cumplen 1 de las condiciones, no
ambas.
Queremos recuperar los libros que no cumplan la condicin dada, por ejemplo, aquellos cuya
editorial NO sea "Planeta":
select * from libros
where not (editorial='Planeta');
El operador "not" invierte el resultado de la condicin a la cual antecede.
Los registros recuperados en una sentencia en la cual aparece el operador "not", no cumplen
con la condicin a la cual afecta el "NO".
Los parntesis se usan para encerrar condiciones, para que se evalen como una sola
expresin.
Cuando explicitamos varias condiciones con diferentes operadores lgicos (combinamos
"and", "or") permite establecer el orden de prioridad de la evaluacin; adems permite
diferenciar las expresiones ms claramente.
Por ejemplo, las siguientes expresiones devuelven un resultado diferente:
select * from libros
where (autor='Borges') or
(editorial='Paidos' and precio<20);
select*from libros
where (autor='Borges' or editorial='Paidos') and
(precio<20);
Si bien los parntesis no son obligatorios en todos los casos, se recomienda utilizarlos para
evitar confusiones.
El orden de prioridad de los operadores lgicos es el siguiente: "not" se aplica antes que "and"
y "and" antes que "or", si no se especifica un orden de evaluacin mediante el uso de
parntesis.
El orden en el que se evalan los operadores con igual nivel de precedencia es indefinido,
por ello se recomienda usar los parntesis.
La forma de obtener subtotales es creando grupos con la orden "GROUP BY", y entonces
pidiendo un valor agrupado (count, sum, avg, ...) para cada uno de esos grupos. Como
limitacin, slo se podrn pedir como resultados los valores agrupados (como la cantidad o
la media) y el criterio de agrupamiento.
Por ejemplo, en nuestra tabla "personas", podramos saber cuntas personas aparecen de cada
edad, con:
SELECT count(*), edad FROM personas GROUP BY edad;
que dara como resultado
+----------+------+
| count(*) | edad |
+----------+------+
| 1 | 22 |
| 1 | 23 |
| 1 | 25 |
+----------+------+
5.1 Filtrando los datos agrupados
Pero podemos llegar ms all: podemos no trabajar con todos los grupos posibles, sino slo
con los que cumplen alguna condicin.
La condicin que se aplica a los grupos no se indica con "where", sino con "having" (que se
podra traducir como "los que tengan..."). Un ejemplo:
SELECT count(*), edad FROM personas GROUP BY edad HAVING edad > 24;
que mostrara
+----------+------+
| count(*) | edad |
+----------+------+
| 1 | 25 |
+----------+------+
Con la clusula "distinct" se especifica que los registros con ciertos datos duplicados sean
omitidos 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 repeticin usamos:
select distinct autor from libros;
Tambin podemos teclear:
select autor from libros group by autor;
Nota que en los tres casos anteriores aparece "null" como un valor para "autor" Si slo
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;
Nota 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 tecleamos:
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';
Tambin puede utilizarse con "group by":
select editorial, count(distinct autor) from libros group by editorial;
Para mostrar los ttulos de los libros sin repetir ttulos, usamos:
select distinct titulo from libros order by titulo;
La clusula "distinct" afecta a todos los campos presentados. Para mostrar los ttulos y
editoriales de los libros sin repetir ttulos ni editoriales, usamos:
select distinct titulo,editorial from libros order by titulo;
Nota que los registros no estn duplicados, aparecen ttulos iguales pero con editorial
diferente, cada registro es diferente.
Un "alias" se usa como nombre de un campo o de una expresin o para referenciar una tabla
cuando se utilizan ms de una tabla (tema que veremos ms adelante).
select count(*)
from libros
where autor like '%Borges%';
la columna en la salida tiene como encabezado "count(*)", para que el resultado sea
ms claro podemos utilizar un alias:
A veces tenemos que realizar operaciones ms complejas con los datos, operaciones en las
que nos interesara ayudarnos de una primera consulta auxiliar que extrajera la informacin
en la que nos queremos basar. Esta consulta auxiliar recibe el nombre de "subconsulta" o
"subquery".
Por ejemplo, si queremos saber qu clientes tenemos en la ciudad que ms habitantes tenga,
la forma "razonable" de conseguirlo sera saber en primer lugar cual es la ciudad que ms
habitantes tenga, y entonces lanzar una segunda consulta para ver qu clientes hay en esa
ciudad.
Como la estructura de nuestra base de datos de ejemplo es muy sencilla, no podemos hacer
grandes cosas, pero un caso parecido al anterior (aunque claramente ms intil) podra ser
saber qu personas tenemos almacenadas que vivan en la ltima ciudad de nuestra lista.
Para ello, la primera consulta (la "subconsulta") sera saber cul es la ltima ciudad de nuestra
lista. Si suponemos que los cdigos numricos son creciente, y lo hacemos tomando la ciudad
que tenga el ltimo cdigo (el mayor de ellos), la consulta podra ser:
SELECT MAX(codigo) FROM ciudades;
Vamos a imaginar que pudiramos hacerlo en dos pasos. Si llamamos "maxCodigo" a ese
cdigo obtenido, la "segunda" consulta podra ser:
SELECT * FROM personas WHERE codciudad= maxCodigo;
Pero estos dos pasos se pueden dar en uno: al final de la "segunda" consulta (la "grande")
incluimos la primera consulta (la "subconsulta"), entre parntesis, as:
SELECT * FROM personas WHERE codciudad= ( SELECT MAX(codigo) FROM
ciudades);
7.1 Subconsultas que devuelven conjuntos de datos.
8 Join
8.1 Acercamiento a la necesidad de los JOIN
Sabemos enlazar varias tablas para mostrar datos que estn relacionados, empleando
"WHERE". Por ejemplo, podramos mostrar nombres de deportistas, junto con los nombres
de los deportes que practican. Pero todava hay un detalle que se nos escapa: cmo hacemos
si queremos mostrar todos los deportes que hay en nuestra base de datos, incluso aunque no
haya deportistas que los practiquen?
Vamos a crear una base de datos sencilla para ver un ejemplo de cual es este problema y de
cmo solucionarlo.
Como se puede observar, hay dos capacidades en nuestra base de datos para las que no
conocemos a ninguna persona; de igual modo, existen dos personas que tienen capacidades
sobre las que no tenemos ningn detalle.
Por eso, si mostramos las personas con sus capacidades de la forma que sabemos, slo
aparecern las parejas de persona y capacidad para las que todo est claro (existe persona y
existe capacidad), es decir:
SELECT * FROM capacidad, persona WHERE persona.codcapac = capacidad.codigo;
+--------+--------------+--------+--------+----------+
| codigo | nombre | codigo | nombre | codcapac |
+--------+--------------+--------+--------+----------+
|c | Progr.C | ju | Juan | c |
| pas | Progr.Pascal | ja | Javier | pas |
+--------+--------------+--------+--------+----------+
Podemos resumir un poco esta consulta, para mostrar slo los nombres, que son los datos que
ms nos interesan:
SELECT persona.nombre, capacidad.nombre FROM persona, capacidad WHERE
persona.codcapac = capacidad.codigo;
+--------+--------------+
| nombre | nombre |
+--------+--------------+
| Juan | Progr.C |
| Javier | Progr.Pascal |
+--------+--------------+
Hay que recordar que la orden "where" es obligatoria: si no indicamos esa condicin, se
mostrara el "producto cartesiano" de las dos tablas: todos los pares (persona, capacidad),
aunque no estn relacionados en nuestra base de datos:
SELECT persona.nombre, capacidad.nombre FROM persona, capacidad;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Javier | Progr.C |
| Jesus | Progr.C |
| Jose | Progr.C |
| Juan | Progr.C |
| Javier | Progr.Java |
| Jesus | Progr.Java |
| Jose | Progr.Java |
| Juan | Progr.Java |
| Javier | Progr.Pascal |
| Jesus | Progr.Pascal |
| Jose | Progr.Pascal |
| Juan | Progr.Pascal |
+--------+-----------------+
8.2 JOIN cruzados, internos y externos
Pues bien, con rdenes "join" podemos afinar cmo queremos enlazar (en ingls, "join", unir)
las tablas. Por ejemplo, si queremos ver todas las personas y todas las capacidades, aunque
no estn relacionadas, como en el ejemplo anterior, algo que no suele tener sentido en la
prctica, lo podramos hacer con un "cross join" (unir de forma cruzada):
SELECT persona.nombre, capacidad.nombre FROM persona CROSS JOIN capacidad;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Javier | Progr.C |
| Jesus | Progr.C |
| Jose | Progr.C |
| Juan | Progr.C |
| Javier | Progr.Java |
| Jesus | Progr.Java |
| Jose | Progr.Java |
| Juan | Progr.Java |
| Javier | Progr.Pascal |
| Jesus | Progr.Pascal |
| Jose | Progr.Pascal |
| Juan | Progr.Pascal |
| Javier | Bases datos SQL |
| Jesus | Bases datos SQL |
| Jose | Bases datos SQL |
| Juan | Bases datos SQL |
+--------+-----------------+
Si slo queremos ver los datos que coinciden en ambas tablas, lo que antes conseguamos
comparando los cdigos con un "where", tambin podemos usar un "inner join" (unin
interior; se puede abreviar simplemente "join"):
SELECT persona.nombre, capacidad.nombre FROM persona INNER JOIN capacidad ON
persona.codcapac = capacidad.codigo;
+--------+--------------+
| nombre | nombre |
+--------+--------------+
| Juan | Progr.C |
| Javier | Progr.Pascal |
+--------+--------------+
Pero aqu llega la novedad: si queremos ver todas las personas y sus capacidades (si existen),
mostrando incluso aquellas personas para las cuales no tenemos constancia de ninguna
capacidad, usaramos un "left join" (unin por la izquierda, tambin se puede escribir "left
outer join", unin exterior por la izquierda, para dejar claro que se van a incluir datos que
estn slo en una de las dos tablas):
SELECT persona.nombre, capacidad.nombre FROM persona LEFT OUTER JOIN
capacidad ON persona.codcapac = capacidad.codigo;
+--------+--------------+
| nombre | nombre |
+--------+--------------+
| Juan | Progr.C |
| Javier | Progr.Pascal |
| Jesus | NULL |
| Jose | NULL |
+--------+--------------+
De igual modo, si queremos ver todas las capacidades, incluso aquellas para las que no hay
detalles sobre personas, podemos escribir el orden de las tablas al revs en la consulta
anterior, o bien usar "right join" (o "right outer join"):
SELECT persona.nombre, capacidad.nombre FROM persona RIGHT OUTER JOIN
capacidad ON persona.codcapac = capacidad.codigo;
+--------+-----------------+
| nombre | nombre |
+--------+-----------------+
| Javier | Progr.Pascal |
| Juan | Progr.C |
| NULL | Progr.Java |
| NULL | Bases datos SQL |
+--------+-----------------+
(Como has podido observar, "Jose" no aparece repetido, porque el operador "UNION"
elimina duplicados).
En este caso, el uso de "UNION" es poco razonable porque se trata de dos consultas casi
idnticas, que se podan haber realizado simplemente con un "OR" y se obtendr el mismo
resultado (quiz en distinto orden, ya que no hemos utilizado "ORDER BY"):
SELECT nombre FROM persona WHERE nombre LIKE '%o%' OR nombre LIKE '%e%';
+--------+
| nombre |
+--------+
| Javier |
| Jesus |
| Jose |
+--------+
La verdadera utilidad de "UNION" aparece cuando se trabaja sobre conjuntos de datos
diferentes, incluso distintas tablas. Por ejemplo, podramos obtener los nombres de todas las
personas y los de todas las capacidades en una misma consulta:
SELECT nombre FROM persona unin SELECT nombre FROM capacidad;
que mostrara:
+-----------------+
| nombre |
+-----------------+
| Javier |
| Jesus |
| Jose |
| Juan |
| Progr.C |
| Progr.Java |
| Progr.Pascal |
| Bases datos SQL |
+-----------------+
(Como puedes ver, al ordenar resultados, los datos nulos aparecen antes de los que s tienen
valor).
Referencias
Atkinson, L. (2002). Core MySQL.
Gallardo, J. D. (2006). MySQL 5.1. ANAYA.
Gilfillan, I. (2003). La Biblia de MySQL / MySQL 4. ANAYA.
Moisset., D. (s.f.). Programacin ya . Obtenido de http://www.programacionya.com
MySQL. (s.f.). MySQL. Obtenido de https://dev.mysql.com/doc/