SQL - script - clase 1
From Ibbddunq
Line 1: | Line 1: | ||
= Clase 1 = | = Clase 1 = | ||
- | == | + | == Intro == |
- | Hoy vamos a ver el lenguaje con el que vamos a hablar con una instancia de BD | + | Hoy vamos a ver el lenguaje con el que vamos a hablar con una instancia de BD relacional que maneja un SGBD. |
Ese lenguaje se llama SQL, y cubre todas las operaciones que uno puede tener ganas de hacer con una base. | Ese lenguaje se llama SQL, y cubre todas las operaciones que uno puede tener ganas de hacer con una base. | ||
¿Qué operaciones? Eso lo vamos a ir viendo. | ¿Qué operaciones? Eso lo vamos a ir viendo. | ||
Line 11: | Line 11: | ||
- | == | + | == Meternos en el entorno de interacción con una BD relacional == |
Ahora vamos a trabajar con una BD relacional, les vamos a dar una instancia a c/u para jugar, y un programa para accederla. | Ahora vamos a trabajar con una BD relacional, les vamos a dar una instancia a c/u para jugar, y un programa para accederla. | ||
Line 32: | Line 32: | ||
Entonces, paso 1: crear las tablas. | Entonces, paso 1: crear las tablas. | ||
- | Ejemplo: creamos las tablas funcion / acto / formaParte / ciudad. | + | Ejemplo: creamos las tablas funcion / acto / formaParte / ciudad / textoActo. |
- | == | + | == Repaso de INSERT / UPDATE / DELETE == |
OK, tengo las tablas creadas cada una con el esquema que dijimos, pero ¿cómo están? | OK, tengo las tablas creadas cada una con el esquema que dijimos, pero ¿cómo están? | ||
Line 56: | Line 56: | ||
- | == | + | == Introducción al SELECT == |
Una vez que hicimos unos cuantos INSERT, tenemos una base con tablas que tienen filas, que no están vacías. | Una vez que hicimos unos cuantos INSERT, tenemos una base con tablas que tienen filas, que no están vacías. | ||
Line 62: | Line 62: | ||
Ahora queremos obtener información haciendo búsquedas sobre esta instancia de BD. | Ahora queremos obtener información haciendo búsquedas sobre esta instancia de BD. | ||
Ya sabemos una forma de expresar qué queremos: AR. | Ya sabemos una forma de expresar qué queremos: AR. | ||
+ | |||
+ | El concepto análogo al álgebra relacional en SQL es una operación que se llama SELECT, que tiene un montón de opciones que cubren la mayor parte del AR y más cosas. | ||
+ | Una cosa importante es que al igual que en el AR, todo SELECT de SQL devuelve una tabla, y vamos a pensar al igual que con AR qué atributos tiene (a nivel de esquema) y qué filas tiene (a nivel de instancia) el resultado de un SELECT. | ||
+ | |||
+ | |||
+ | Vamos a empezar con algo sencillo: proyección y selección sobre una tabla. | ||
+ | |||
+ | La sintaxis básica del SELECT es | ||
+ | SELECT atr1,...,atrn | ||
+ | FROM tabla | ||
+ | WHERE condicion | ||
+ | ORDER BY criterio de ordenamiento | ||
+ | |||
+ | La parte SELECT ... FROM ... WHERE ... la podemos escribir en AR así | ||
+ | P<atr1,...,atrn>(S<cond> tabla) | ||
+ | |||
+ | Con el ORDER BY vemos una característica de los SGBD distinta a la teoría del modelo relacional: las tablas están ordenadas, una tabla es una secuencia de filas, no un conjunto de filas. | ||
+ | Las tablas que forman la instancia de BD se ordenan (en ppio) con un criterio físico que no viene al caso. | ||
+ | Lo que sí puedo hacer es ordenar el resultado de una consulta, para eso el ORDER BY. | ||
+ | |||
+ | Veamos ejemplos ... | ||
+ | |||
+ | |||
+ | |||
+ | == Joins == | ||
+ | |||
+ | Volvemos a la sintaxis básica | ||
+ | SELECT atr1,...,atrn | ||
+ | FROM tabla | ||
+ | WHERE condicion | ||
+ | ORDER BY criterio de ordenamiento | ||
+ | |||
+ | ahora quiero joinear dos tablas; ponele, quiero día, hora, ciudad y provincia de cada función de abril, entonces (que lo digan ellos) tengo que joinear ciudad con funcion mediante natural join. | ||
+ | |||
+ | ¿En qué lugar de la sentencia SELECT pondrían el join ...? Usen su intuición (los que no saben SQL, claro) | ||
+ | |||
+ | Bien, va dentro del FROM, la <code>tabla</code> del FROM puede ser el resultado de una operación (¿de un SELECT también? pero claro que sí, eso lo vamos a ver en detalle la clase que viene). | ||
+ | |||
+ | Para joinear dos tablas mediante join natural ... tabla 1 NATURAL JOIN tabla2. | ||
+ | Por costumbre se escribe así | ||
+ | SELECT atr1,...,atrn | ||
+ | FROM tabla1 | ||
+ | NATURAL JOIN tabla2 | ||
+ | WHERE condicion | ||
+ | ORDER BY criterio de ordenamiento | ||
+ | |||
+ | ¿Y si quiero joinear varias? Ponele la descripción en inglés de los actos que van a formar parte de una función. En AR (que lo piensen) tengo que hacer | ||
+ | formaParte * acto * S<idioma='ingles'>textoActo | ||
+ | que es lo mismo que | ||
+ | S<idioma='ingles'>(formaParte * acto * textoActo) | ||
+ | en SQL lo vamos a escribir en principio de esta forma, entonces nos queda | ||
+ | SELECT atr1,...,atrn | ||
+ | FROM tabla1 | ||
+ | NATURAL JOIN tabla2 | ||
+ | NATURAL JOIN tabla3 | ||
+ | WHERE condicion | ||
+ | ORDER BY criterio de ordenamiento | ||
+ | |||
+ | También puedo hacer las otras versiones de JOIN | ||
+ | |||
+ | Para join con condición ("moñito") | ||
+ | FROM tabla1 | ||
+ | JOIN tabla2 ON condicion | ||
+ | |||
+ | Para producto cartesiano | ||
+ | FROM tabla1 | ||
+ | JOIN tabla2 |
Revision as of 20:14, 19 September 2008
Contents |
Clase 1
Intro
Hoy vamos a ver el lenguaje con el que vamos a hablar con una instancia de BD relacional que maneja un SGBD. Ese lenguaje se llama SQL, y cubre todas las operaciones que uno puede tener ganas de hacer con una base. ¿Qué operaciones? Eso lo vamos a ir viendo.
En particular, una operación muy importante es la consulta, nosotros ya sabemos expresar consultas a una BD relacional, lo hacemos con las operaciones del álgebra relacional. El SQL tiene la misma idea del AR, vamos a ver cómo. A lo que vamos a dedicar más tiempo es a aprender a hacer consultas en SQL.
Meternos en el entorno de interacción con una BD relacional
Ahora vamos a trabajar con una BD relacional, les vamos a dar una instancia a c/u para jugar, y un programa para accederla. Vamos a empezar practicando con un modelo relacional del circo.
Imaginarnos cómo va a ser: yo me conecto a la instancia, que es nuevita para mí.
¿Qué es lo primero que tenemos que hacer? Claro, crear las tablas. Eso lo vamos a hacer con un formulario que nos presenta, ahí indicamos el esquema, el nombre, y nos crea en la instancia donde estemos trabajando una nueva tabla cuyo esquema es el que le dijimos.
¿Qué datos necesitamos decir? (esto interactivo, así van despertando).
- El nombre de la tabla nueva.
- Atributos, para cada uno dominio.
- Cuál/es de los atributos conforman la PK.
- Qué FKs a otras tablas hay.
- Otras restricciones, p.ej. not null.
Tambíén podemos crear tablas con SQL (i.e. expresar en el lenguaje la creación de una tabla, indicando todos los datos que dijimos), en las máquinas vamos a ver cómo.
Entonces, paso 1: crear las tablas.
Ejemplo: creamos las tablas funcion / acto / formaParte / ciudad / textoActo.
Repaso de INSERT / UPDATE / DELETE
OK, tengo las tablas creadas cada una con el esquema que dijimos, pero ¿cómo están? Claro, vacías.
Ya vimos (sí lo vimos en la clase de modelo relacional) la sintaxis de INSERT / UPDATE / DELETE, repasémosla.
(sí, que la lean de su carpeta)
INSERT INTO tabla(atr1,...,atrn) VALUES (val1,...,valn) UPDATE tabla SET atr=val, atr=val, ... WHERE condicion DELETE FROM tabla WHERE condicion
Esto lo vamos a practicar el lunes (hoy sólo contarlo rápido)
Hacemos en pizarrón un par de INSERT sobre ciudad y uno sobre funcion para cerrar la idea.
Pregunta, ¿qué pasa si hago un INSERT sobre función poniendo una ciudad que no existe, o para la misma fecha-hora que una que ya está? Claro, salta la restricción de integridad correspondiente. Eso lo podemos probar el lunes.
Introducción al SELECT
Una vez que hicimos unos cuantos INSERT, tenemos una base con tablas que tienen filas, que no están vacías.
Ahora queremos obtener información haciendo búsquedas sobre esta instancia de BD. Ya sabemos una forma de expresar qué queremos: AR.
El concepto análogo al álgebra relacional en SQL es una operación que se llama SELECT, que tiene un montón de opciones que cubren la mayor parte del AR y más cosas. Una cosa importante es que al igual que en el AR, todo SELECT de SQL devuelve una tabla, y vamos a pensar al igual que con AR qué atributos tiene (a nivel de esquema) y qué filas tiene (a nivel de instancia) el resultado de un SELECT.
Vamos a empezar con algo sencillo: proyección y selección sobre una tabla.
La sintaxis básica del SELECT es
SELECT atr1,...,atrn FROM tabla WHERE condicion ORDER BY criterio de ordenamiento
La parte SELECT ... FROM ... WHERE ... la podemos escribir en AR así
P<atr1,...,atrn>(S<cond> tabla)
Con el ORDER BY vemos una característica de los SGBD distinta a la teoría del modelo relacional: las tablas están ordenadas, una tabla es una secuencia de filas, no un conjunto de filas. Las tablas que forman la instancia de BD se ordenan (en ppio) con un criterio físico que no viene al caso. Lo que sí puedo hacer es ordenar el resultado de una consulta, para eso el ORDER BY.
Veamos ejemplos ...
Joins
Volvemos a la sintaxis básica
SELECT atr1,...,atrn FROM tabla WHERE condicion ORDER BY criterio de ordenamiento
ahora quiero joinear dos tablas; ponele, quiero día, hora, ciudad y provincia de cada función de abril, entonces (que lo digan ellos) tengo que joinear ciudad con funcion mediante natural join.
¿En qué lugar de la sentencia SELECT pondrían el join ...? Usen su intuición (los que no saben SQL, claro)
Bien, va dentro del FROM, la tabla
del FROM puede ser el resultado de una operación (¿de un SELECT también? pero claro que sí, eso lo vamos a ver en detalle la clase que viene).
Para joinear dos tablas mediante join natural ... tabla 1 NATURAL JOIN tabla2. Por costumbre se escribe así
SELECT atr1,...,atrn FROM tabla1 NATURAL JOIN tabla2 WHERE condicion ORDER BY criterio de ordenamiento
¿Y si quiero joinear varias? Ponele la descripción en inglés de los actos que van a formar parte de una función. En AR (que lo piensen) tengo que hacer
formaParte * acto * S<idioma='ingles'>textoActo
que es lo mismo que
S<idioma='ingles'>(formaParte * acto * textoActo)
en SQL lo vamos a escribir en principio de esta forma, entonces nos queda
SELECT atr1,...,atrn FROM tabla1 NATURAL JOIN tabla2 NATURAL JOIN tabla3 WHERE condicion ORDER BY criterio de ordenamiento
También puedo hacer las otras versiones de JOIN
Para join con condición ("moñito")
FROM tabla1 JOIN tabla2 ON condicion
Para producto cartesiano
FROM tabla1 JOIN tabla2