- Entre 1974 y 1975 se implementó en un prototipo llamado SEQUEL-XRM.
 - Entre 1976 y 1977, condujeron a una revisión del lenguaje (SEQUEL/2)
 - Cambió de nombre por motivos legales. convirtiéndose en SQL.
 - A partir de 1981, IBM comenzó a entregar sus productos relacionales
 - En 1983 empezó a vender DB2
 - En 1986, el ANSI adoptó SQL como estándar para los lenguajes relacionales.
 - En 1987 se transformó en estándar ISO, con el nombre de SQL/86.
 - Luego se presento la versión SQL/89.
 - En 1992 se lanza un nuevo estándar ampliado y revisado del SQL llamado "SQL-92"
 - SQL3 nuevo estándar de SQL en 1999, después de más de 7 años de debate.
 
Funciones de SQL:
DDL: Data Definition Language
- Creación de estructuras de la base de datos.
 - Integridad de los datos.
 - Se tienen tres comandos:
 - Create: Crear un objeto. Ej. CREATE DATABASE nombreDB
 - Alter: Modificar un objeto.
 - Drop: Eliminar un objeto. (Eliminar Tablas)
 
DML: Data Manipulation Language
- Recuperación de datos.
 - Manipulación de datos.
 - Se tienen cuatro comandos:
 - Insert: Insertar datos dentro de una tabla. Ej. CREATE DATABASE nombreDB
 - Update: Actualizar datos dentro de una tabla.
 - Delete: Borrar datos dentro de una tabla. (No se borra la tabla).
 - Select: Comando de consulta de datos
 
DCL: Data Control Language
- Control de acceso.
 - Compartición de datos.
 - Se tienen dos comandos:
 - Grant: Otorga permisos sobre lo que queramos.
 - Revoke: Eliminar o quitar permisos.
 
Roles SQL:
Invocación de SQL 
Invocación Directa o Interactiva:
Invocación Directa o Interactiva:
- La sentencia es invocada desde el terminal.
 - Los datos devueltos se presentan en pantalla.
 - El resultado puede ser:
 - Un valor
 - Una lista de valores
 - Una tabla
 - Vacío
 
Invocación desde programa:  
- La sentencia se invoca como parte de la ejecución del programa.
 - Los datos devueltos se recogen en una área de entrada del rea de entrada del programa.
 
- Independencia de los fabricantes
 - Portabilidad a cualquier tipo de plataforma
 - SQL está estandarizado
 - Basado en el modelo relacional
 - Lenguaje de alto nivel
 - Consultas interactivas ad-hoc
 - Utilización en Lenguaje de programación
 - Múltiples vistas de los datos
 - Lenguaje de base de datos
 - Definición dinámica de datos
 - Arquitectura cliente/servidor
 
Tipos de Datos:
Creación de Dominios:
- Los dominios se pueden utilizar como tipos de datos.
 - Permite Cambiar el tipo simultáneamente a varios atributos.
 
CREATE DOMAIN dominio [AS] tipodatos 
[DEFAULT valor_defecto] 
[CHECK condicion]
Operadores:
- Comparación: =, <>, <, >, <=, >=, IS NULL
 - Lógicos: AND, OR, NOT
 - Intervalos: BETWEEN … AND...Ej.( BETWEEN 90 AND 95)
 - Cadenas de texto: LIKE Ej. (apellido LIKE ‘%nandez%’)
 - Conjuntos: IN Ej. color IN (‘Red’, ‘Blue’)
 
Creación de Tablas:
- Se utiliza el comando CREATE TABLE
 - Al crear la tabla se puede indicar el esquema en el que se crea: nombre_esquema.nombre_tabla
 - Se especifican los atributos de la relación y sus tipos.
 - Se especifica la clave primaria.
 - Se especifica las restricciones de integridad.
 - Se especifica la integridad referencial.
 
Restricciones de columna:
- UNIQUE 
 - NOT NULL
 - DEFAULT < valor_por_defecto>
 - CHECK (condicion) 
 - PRIMARY KEY
 - REFERENCES nombre_tabla(nombre_atributo) accion_referencial
 
Restricciones de tabla:
- UNIQUE 
 - PRIMARY KEY
 - FOREIG KEY
 - CHECK
 
Acciones Referenciales
- ON UPDATE
 - ON DELETE
 - RESTRICT
 - Si no se especifica nada, se considera RESTRICT
 
Borrado de tablas:
Se utiliza el comando:
- Si se utiliza CASCADE CONSTRAINT, se elimina la tabla y sus restricciones.
 - Si no se utiliza CASCADE CONSTRAINT y si la tabla tiene restricciones, no se elimina, por lo que hay que eliminar primero las restricciones.
 - Al eliminar una tabla, se eliminan los datos almacenados.
 
Modificar una Tabla:
- Acciones de modificación
 - Añadir atributos
 - ADD nuevo_atributo tipo restricciones
 - Las restricciones sólo pueden ser NOT NULL, CHECK y DEFAULT
 - Un atributo NOT NULL sólo se puede añadir a una tabla si esta vacía
 - Borrar atributos
 - DROP (nombre_atributo, …)
 - DROP COLUMN nombre atributo [CASCADE CONSTRAINT] [CASCADE CONSTRAINT]
 - Modificar atributos
 - MODIFY nombre_atributo nuevo_tipo restricciones
 - Se puede cambiar el tipo o disminuir el tamaño de un atributo si todas las tuplas tienen ese campo vacío
 - Un atributo existente se puede hacer NOT NULL si todas las tuplas tienen valor en ese atributo
 -  Si no se especifica algo en la modificación, permanece como estaba
 
Inserción de Datos:
- Introduce información en la tabla y atributos indicados.
 - El orden y el tipo de los atributos debe coincidir con el orden y tipo de los valores.
 - Los valores se pueden obtener mediante una consulta.
 - Si un atributo no se indica, toma valor null.
 
- Si se omite la lista de atributos, los valores se almacenan de acuerdo al orden de definición de los mismos en el CREATE TABLE.
 - Los tipos de la lista de valores deben coincidir con los tipos de definición en el CREATE TABLE
 
Modificación de datos:
- Actualiza en la tabla indicada los valores del atributo siempre y cuando se cumpla la condición especificada.
 - Los valores se pueden obtener mediante una subconsulta o mediante fórmulas matemáticas.
 - Si no hay condición, se actualizan todas las filas de la tabla (PELIGRO).
 
Borrado de datos:
- Borra de la tabla las tuplas que cumplen cierta condición.
 - Si no hay condición se borran todas las filas de la tabla (PELIGRO).
 - A diferencia de DROP TABLE no borra la estructura de la tabla.
 
Consulta de Datos:
- Consulta valores de una o varias tablas de acuerdo a las condiciones impuestas en la sentencia.
 - Las únicas partes obligatorias son SELECT Y FROM, el resto son opcionales.
 - Si aparecen deben ir en el orden que aparecen en la sentencia.
 - HAVING solo puede aparecer si hay GROUP BY.
 - SELECT: se indican los atributos que se quieren obtener como erspuesta a la consulta.
 - FROM: indica la tabla o tablas que son necesarias para obtener la información.
 - WHERE: se indican las condiciones que deben cumplir las tuplas obtenidas como resultado de la consulta.
 - GROUP BY: se utiliza para formar grupos de datos en función de algún atributo.
 - HAVING: establece condiciones sobre los grupos que se formen.
 - ORDER BY: indica si muestra el resultado ordenado en función de algún atributo.
 
SELECT:
- Lista de atributos separados por comas.
 - SELECT at1 , at2 , …, atn …
 - Se indican solamente aquellos atributos que queremos que aparezcan en el resultado.
 - Se utiliza * si queremos todos los atributos de las tablas involucradas.
 - SELECT * …
 - Pueden aparecen filas duplicas.
 - Para evitarlos se puede utilizar DISTINCT.
 - SELECT DISTINCT lista_atributos …
 - Sólo se obtienen como resultado filas no duplicadas para la combinación de los atributos que aparecen en el SELECT.
 - Los nombres de los atributos se pueden cambiar en el resultado de la consulta (alias de atributo)
 - SELECT nombre_atributo [AS] nuevo_nombre …
 
FROM:
- Lista de tablas que se utilizan en la consulta separadas por comas.
 - …FROM tab1 , tab2 , …, tabn …
 - Realiza el producto cartesiano (X) de las mismas
 - Las condiciones (WHERE, GROUP BY) se imponen sobre el producto cartesiano
 - Los atributos que aparecen en el SELECT se toman del producto cartesiano
 - Dentro de la consulta una tabla se puede renombrar (alias de tabla)
 - … FROM nombre_tabla nuevo_nombre_tabla …
 
WHERE:
- Indica las condiciones que deben cumplir las filas obtenidas como resultado.
 - Si no aparece se recuperan todas las filas del producto cartesiano de las tablas que hay en el FROM.
 - La condición es una expresión n booleana.
 - Sólo se obtienen aquellas filas que cumplen la condición.
 - Operadores para construir condiciones.
 - Comparación: =, <>, >, <, >=, <=
 - Lógicos: AND, OR, NOT.
 - Matemáticos: +, -, *, /
 - Otros: BETWEEN … AND, IN, LIKE
 
JOIN:
- No se realiza automaticamente.
 - Hay que escribir la condición en la consulta.
 - Si no se pone la condición de join, se obtiene el producto cartesiano (X).
 - Escritura de join:
 - Las tablas tienen que estar relacionadas mediante claves foráneas (atributos comunes).
 - Igualar los atributos comunes de las tablas participantes en la consulta.
 
Ambigüedades:
- Cuando el mismo nombre de atributo aparece en más de una tabla:
 - Hay que distinguir a que atributo se refiere.
 - Se cualifica el atributo con el nombre de la tabla: nombre_tabla.nombre_atributo
 
Alias en Tablas:
- Cuando la misma relación se la usa más de una vez en la consulta.
 - En ese caso se utilizan alias para las tablas.
 
Funciones de Agregación:
Subconsultas:- Son funciones que toman una colección de valores como entrada y producen un único valor de salida.
 - COUNT (atributo)
 - Devuelve el número de tuplas o valores especificados en una consulta para el atributo indicado.
 - Se puede utilizar como atributo *.
 - SUM (atributo), MAX (atributo), MIN (atributo) AVG (atributo)
 - Se aplican a valores numéricos y devuelven la suma, el máximo, mínimo y media de los atributos indicados.
 - Se pueden utilizar en la cláusula SELECT o en el HAVING.
 - En el SELECT no pueden aparecer otros atributos a menos que se incluyan en el GROUP BY.
 
- En general se admiten varios niveles de anidación.
 - Para evitar la ambigüedad los atributos sin cualificar siempre se referirán a las relaciones declaradas en la consulta más interna.
 - Para evitar problemas es aconsejable cualificar los atributos y utilizar alias para las relaciones.
 
Operadores de Subconsultas:
- EXISTS (subconsulta)
 - Se utiliza para comprobar si el resultado de una consulta anidada es vacio.
 - Devuelve true si la tabla no es vacía, en otro caso devuelve falso.
 - NOT EXISTS (subconsulta)
 - Se utiliza para comprobar si el resultado de una consulta anidada no es vacio.
 - Devuelve true si la tabla es vacía, en otro caso devuelve falso.
 - atributo operador_comparación ALL (subconsulta)
 - Se utiliza para comparar, mediante alguno de los operadores de comparación, si el valor de un atributo es mayor, menor, igual, … que todos los valores de un determinado conjunto de valores.
 - La subconsulta debe devolver una lista de valores.
 - Atributo operador_comparación ANY (subconsulta)
 - Es similar al operador ALL, lo único que lo diferencia es que el valor del atributo únicamente tiene que ser igual, menor, mayor, … que al menos uno de los valores del conjunto.
 - La subconsulta debe devolver una lista de valores.
 
GROUP BY 
- Se utiliza para formar agrupaciones de tuplas en función de los valores de uno o varios atributos.
 - Se utiliza con funciones de agregación.
 - No es necesario utilizar WHERE.
 - Como resultado en el SELECT, sólo pueden aparecer funciones de agregación o los atributos que aparecen en GROUP BY.
 
Referencias:
- Orígenes y Evolución de SQL. (Sin fecha). Recuperado el 23 de noviembre de 2016 de http://sql3.wikispaces.com/4.-+Or%C3%ADgenes+y+Evoluci%C3%B3n+de+SQL.
 - Características de SQL. (Sin fecha). Recuperado el 23 de noviembre de 2016 de http://aprende-web.net/progra/sql/sql_2.php
 - Óscar Marbán Gallego. (2012). SQL. Diciembre 5, 2016, de Facultad de Informática - UPM. Sitio web: http://pegaso.ls.fi.upm.es/BD/Documentacion/06-SQL.pdf
 


