Nuestra primera base de datos
Sumario
Teoría: 30 min
Ejercicios: 60 minPreguntas
¿Cómo creo una base de datos desde cero?
Objetivos
¿Cómo creo las tablas? ¿Se puede automatizar?
¿Cómo puedo ejecutar un script de SQL?
Guardar los resultados en un fichero.
Anteriormente, trabajamos con survey.db, una base de datos que ya os dimos. En este caso vamos a crear una desde cero, crearemos alguna tabla, insertaremos algunos datos de ejemplo y a lo largo de esta lección iremos aumentando la complejidad. Haremos consultas sencillas, crearemos tablas desde un script y acabaramoes haciendo consultas complicadas. Más tarde usaremos transacciones (una unidad única de trabajo) como un modo de trabajo seguro.Si una transacción tiene éxito, todas las modificaciones de los datos realizadas durante la transacción se confirman y se convierten en una parte permanente de la base de datos. Si una transacción encuentra errores y debe cancelarse o revertirse, se borran todas las modificaciones de los datos.)
0. Creación de una base de datos
Antes de crearla, vamos a cerciorarmos de que estamos en nuestro directorio de trabajo. Y después crearemos una base de datos llamada test:
$ cd $HOME/SQL/ $ sqlite3 test.db sqlite> .exit
De esta forma, hemos usado SQLite para crear una base de datos llamada test.db. Al no crear ninguna tabla ni nada en su interior, será una base de datos vacía. Con lo cual ocupará 0 bites:
$ cd $HOME/SQL/ $ ls | grep test.db
0 test.db
Volvamos a entrar en la base de datos y crearemos una tabla sencilla en la cual insertaremos un par de registros.
$ sqlite3 test.db sqlite> CREATE TABLE agenda (id text, name text, surname text); sqlite> .tables sqlite> .schema
Hemos creado una tabla llamada agenda para guardar el DNI, nombre y apellido de un conjunto de personas. Ahora insertaremos dos registros.
sqlite> INSERT INTO agenda VALUES ("3452346Z", "Juan", "Fernández"); sqlite> INSERT INTO agenda VALUES ("1537436A", "Pedro", "Rodríguez");
Como vimos en la lección anterior, podemos recuperar los registros usando
SELECT
sqlite> .mode column sqlite> .header on sqlite> SELECT * FROM agenda; sqlite> SELECT id AS DNI FROM agenda;
Como resultado de la última query, tendréis:
DNI ---------- 3452346Z 1537436A
Ahora por ejemplo vamos a guardar un número de teléfono en otra tabla:
sqlite> CREATE TABLE telefonos (id text, tlf int) STRICT; sqlite> INSERT INTO telefonos VALUES ("1537436A", 678654453);
Como veis hemos introducido la palabra “STRICT”, que hace que sqlite sea un poco mas restrictivo … por ello si intentamos insertar un conjunto de caracteres en el campo tlf, que acepta enteros, nos dará un error.
sqlite> sqlite> INSERT INTO telefonos VALUES ("1537436A", "holaquetal");
Nos aparece el siguiente error:
Runtime error: cannot store TEXT value in INT column telefonos.tlf (19)
1. Ejecutar un script
Ya sabemos crear una base de datos, crear una tabla e introducir registros, todo de forma manual. Podemos hacer esto de una forma más automatizada ? La respuesta es si. A lo largo de las lecciones veremos varias formas de automatizar la inserccion de datos, por ahora empezaremos por la ópcion más sencilla: Escribir nuestro código SQL en un fichero de texto plano y hacer que SQLite las lea y ejecute.
Para empezar, teneis que usar un editor de ficheros (el que normalmente utilicéis: vi, gedit, nedit, sublime …). Crearemos un fichero en blanco con extension sql, por ejemplo simple.sql y pondremos lo siguiente:
CREATE TABLE phone (id text, number integer); INSERT INTO phone VALUES ("3452346Z", 656784123); INSERT INTO phone VALUES ("3452346Z", 666782375); INSERT INTO phone VALUES ("1537436A", 631546098); SELECT * FROM phone; SELECT * FROM agenda; SELECT * FROM agenda WHERE name="Juan"; SELECT * FROM phone, agenda WHERE phone.id=agenda.id AND agenda.name="Pedro";
Ahora que tenemos este fichero SQL que crea una tabla, inserta tres registros y ahce varias consultas, vamos a ejecutarlo desde la shell de SQLite:
$ sqlite3 test.db sqlite> .mode colum sqlite> .header on sqlite> .read simple.sql 3452346Z|656784123 3452346Z|666782375 1537436A|631546098 3452346Z|Juan|Fernández 1537436A|Pedro|Rodríguez 3452346Z|Juan|Fernández 1537436A|631546098|1537436A|Pedro|Rodríguez sqlite>
2. Guardar los resultados en un fichero de resultados
Aunque apenas tengamos un par de registros, es interesante ver como podemos extraer estos datos de la base de datos a un Excel (por ejemplo). SQLite tiene varias funciones para realizar esta función, de hecho ya la hemos usado y puede que os suene.
sqlite> .tables sqlite> SELECT * FROM agenda;
El output obtenido es:
id name surname ---------- ---------- ---------- 3452346Z Juan Fernández 1537436A Pedro Rodríguez
Ahora vamos a ver, en que formatos podemos guardo:
sqlite> .help mode .mode MODE ?TABLE? Set output mode MODE is one of: ascii Columns/rows delimited by 0x1F and 0x1E csv Comma-separated values column Left-aligned columns. (See .width) html HTML <table> code insert SQL insert statements for TABLE line One value per line list Values delimited by "|" quote Escape answers as for SQL tabs Tab-separated values tcl TCL list elements sqlite>
Veremos como crea el código HTML y crearemos un fichero csv:
sqlite> .mode html sqlite> SELECT * FROM agenda; sqlite> .mode csv sqlite> .output resultado.csv sqlite> SELECT * FROM agenda; sqlite> .exit
Vuestros resultados deberian parecerse mucho a este fichero csv , que podeis abrir con Excel.
Comprendiendo las declaraciones INSERT
¿Como insertarías datos en la tabla phone ?
Solución
sqlite> .mode insert phone sqlite> select * from phone;
INSERT INTO phone(id,number) VALUES('3452346Z',656784123); INSERT INTO phone(id,number) VALUES('3452346Z',666782375); INSERT INTO phone(id,number) VALUES('1537436A',631546098);
Del resultado obtenido, vemos como son las instrucciones que se usaron para insertar los datos que ahora contiene la tabla.
Seleccionar apellidos
Escriba una consulta que seleccione solo la columna
surname
de la tablaagenda
.Solución
SELECT surname FROM agenda;
surname Fernández Rodríguez
No olvidar
La creación de una base de datos desde SQLite se puede hacer desde la terminal poniendo un nombre de
fichero.db
.Podemos automatizar la creación de tablas y la inserción de registros a través de scripts de SQL.
SQLite permite modos de salida para guardar resultados en ficheros en distintos formatos, como HTML y csv.