Fundamentos de SQL
Fundamentos de SQL
Manual SQL
1.
Introduccin
SQL
2.
Sintaxis
Un sistema de base de datos suele contener varias bases de datos. Cada base de datos suele
contener varias tablas. Las tablas almacenan los datos organizados por filas. Cada fila
contiene varios campos.
Cada campo tiene una serie de propiedades, como por ejemplo, el nombre del campo, su
longitud, tipo de dato que se va a almacenar, etc. Las sentencias SQL no son sensibles a
maysculas y minsculas, es decir, 'SELECT' y 'select' son dos palabras iguales para SQL.
Algunos sistemas de bases de datos necesitan un punto y coma despus de cada sentencia
SQL para ejecutarse correctamente
CREATE DATATABASE mibasedeatos;
Este punto y coma tambin puede servir para separar una sentencia SQL de otra sentencia
SQL en la misma lnea.
CREATE DATATABASE mibasedeatos; CREATE TABLE mitabla1;
Las sentencias SQL se pueden agrupar por funcionalidades:
A.- Lenguaje de definicin de datos (DDL).
DDL est compuesto por sentencias para la creacin (CREATE), modificacin (ALTER) y
borrado (DROP) de los componentes principales de una base de datos:
base de datos (DATABASE), tablas (TABLE), vistas (VIEW), ndices (INDEX),
procedimientos almacenados (PROCEDURE), disparadores (TRIGGER).
B.- Lenguaje de manipulacin de datos (DML).
DML est compuesto por sentencias que sirven para :
consultar (SELECT), insertar (INSERT), modificar (UPDATE), borrar (DELETE)
C.- Lenguaje de control de datos (DCL).
DCL est compuesto por sentencias SQL para controlar las funciones de administracin :
Confirmar la operacin (COMMIT), retroceder la operacin (ROLLBACK), dar permisos
(GRANT), quitar permisos (REVOKE).
SQL
3.
Sentencia SELECT
Una de las sentencias SQL ms importantes es SELECT, ya que permite realizar consultas
sobre los datos almacenados en la base de datos. Sintaxis SQL SELECT:
SELECT * FROM nombretabla
SELECT columna1, columna2 FROM nombretabla
Para los ejemplos, tendremos la siguiente tabla de personas denominada personas. Estos
son los datos almacenados en la tabla personas:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
LUIS
LOPEZ
PEREZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
LUIS
LOPEZ
PEREZ
Si queremos consultar todos los nombres y primer apellido de todas las personas:
SELECT nombre, apellido1 FROM personas
nombre
apellido1
ANTONIO
PEREZ
ANTONIO
GARCIA
LUIS
LOPEZ
SQL
4.
Sentencia DISTINC
Al realizar una consulta puede ocurrir que existan valores repetidos para algunas columnas.
Por ejemplo:
SELECT nombre FROM personas
nombre
ANTONIO
LUIS
ANTONIO
Esto no es un problema, pero a veces queremos que no se repitan, por ejemplo, si queremos
saber los nombre diferentes que hay en la tabla personas", entonces utilizaremos
DISTINCT.
SELECT DISTINCT nombre FROM personas
nombre
ANTONIO
LUIS
5.
Sentencia WHERE
La clusula WHERE se utiliza para hacer filtros en las consultas, es decir, seleccionar
solamente algunas filas de la tabla que cumplan una determinada condicin. El valor de la
condicin debe ir entre comillas simples ''.
Por ejemplo seleccionar las personas cuyo nombre sea ANTONIO:
SELECT * FROM personas WHERE nombre = 'ANTONIO'
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
SQL
6.
Operadores OR y AND
Los operadores AND y OR se utilizan para filtrar resultados con 2 condiciones. El operador
AND mostrar los resultados cuando se cumplan las 2 condiciones. Condicin1 AND
condicin2
El operador OR mostrar los resultados cuando se cumpla alguna de las 2 condiciones.
Condicion1 OR condicion2
En la tabla personas:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
LUIS
LOPEZ
PEREZ
apellido1
apellido2
ANTONIO
GARCIA
BENITO
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
apellido1
apellido2
ANTONIO
GARCIA
BENITO
SQL
7.
ORDER BY
ORDER BY se utiliza para ordenar los resultados de una consulta, segn el valor de la
columna especificada. Por defecto, se ordena de forma ascendente (ASC) segn los valores
de la columna. Si se quiere ordenar por orden descendente se utiliza la palabra DES.
SELECT nombre_columna(s) FROM nombre_tabla
ORDER BY nombre_columna(s) ASC|DESC
Por ejemplo, en la tabla personas :
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
BENITO
apellido1
LUIS
LOPEZ
ANTONIO
GARCIA
ANTONIO
PEREZ
apellido1
ANTONIO
PEREZ
ANTONIO
GARCIA
LUIS
LOPEZ
SQL
8.
Sentencia INSERT
La sentencia INSERT INTO se utiliza para insertar nuevas filas en una tabla. Es posible
insertar una nueva fila en una tabla de dos formas distintas:
INSERT INTO nombre_tabla
VALUES (valor1, valor2, valor3, .)
INSERT INTO nombre_tabla (columna1, columna2, columna3,.)
VALUES (valor1, valor2, valor3, .)
Ejemplo, dada la siguiente tabla personas:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
BENITO
Si queremos insertar una nueva fila en la tabla personas, lo podemos hacer con cualquiera
de las dos sentencias siguientes:
INSERT INTO personas VALUES ('PEDRO', 'RUIZ', 'GONZALEZ')
INSERT INTO personas (nombre, apellido1, apellido2)
VALUES ('PEDRO', 'RUIZ', 'GONZALEZ')
Cualquiera de estas sentencias anteriores produce que se inserte una nueva fila en la tabla
personas, quedando as dicha tabla:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
BENITO
PEDRO
RUIZ
GONZALEZ
SQL
9.
Sentencia UPDATE
La sentencia UPDATE se utiliza para modificar valores en una tabla. La sintaxis de SQL
UPDATE es:
UPDATE nombre_tabla SET columna1 = valor1, columna2 = valor2
WHERE columna3 = valor3
La clusula SET establece los nuevos valores para las columnas indicadas. La clusula
WHERE sirve para seleccionar las filas que queremos modificar.
Ojo: Si omitimos la clusula WHERE, por defecto, modificar los valores en todas las filas
de la tabla. Ejemplo del uso de SQL UPDATE:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
BENITO
PEDRO
RUIZ
GONZALEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
SQL
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
SQL
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
10
SQL
Si quiero seleccionar los nombres que empiezan por 'AN' en la tabla 'personas', ejecutara el
comando siguiente:
SELECT * FROM personas WHERE nombre LIKE 'AN%'
El carcter '%' es un comodn, que sirve para uno o ms caracteres. Este es el resultado:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
Otro ejemplo de SQL LIKE, para seleccionar las personas que tienen un 'Z' en su apellido1,
ejecutaramos:
SELECT * FROM personas WHERE apellido1 LIKE '%Z%'
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
PEDRO
RUIZ
GONZALEZ
13. WILDCARDS
Los caracteres Wildcards (comodines) son caracteres especiales que se utilizan para realizar
bsquedas especiales, como por ejemplo, buscar palabras que empiecen por una letra
determinada (letra%) o que contengan la letra a (%a%), o que contengan alguna vocal
([aeiou]), etc.
Los caracteres Wildcards se utilizan con el operador SQL LIKE en una sentencia SELECT.
Los caracteres Wildcards son :
%
[lista]
11
SQL
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Ejemplos Wildcards, Seleccionar las personas cuyo nombre contenga una 'R'
SELECT * FROM personas WHERE nombre LIKE '%R%'
Resultado:
nombre
apellido1
apellido2
PEDRO
RUIZ
GONZALEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
12
SQL
14. Operador IN
El operador IN permite seleccionar mltiples valores en una clusula WHERE. La sintaxis
SQL IN es:
SELECT columna FROM tabla WHERE columna IN (valor1, valor2, valor3, .)
Ejemplo SQL IN dada la siguiente tabla 'personas':
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
PEDRO
RUIZ
GONZALEZ
apellido1
apellido2
ANTONIO
GARCIA
RODRIGUEZ
13
SQL
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
PEDRO
RUIZ
GONZALEZ
16. ALIAS
Un alias, es otra forma de llamar a una tabla o a una columna, y se utiliza para simplificar
las sentencias SQL cuando los nombre de tablas o columnas son largos o complicados.
Sintaxis SQL ALIAS para una tabla:
SELECT columna FROM nombretabla AS aliastabla
Sintaxis SQL ALIAS para una columna
SELECT nombrecolumna AS aliascolumna FROM tabla
Ejemplos SQL ALIAS dada la siguiente tabla 'personas':
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Utilizamos el alias 'p' para la tabla 'personas', para simplificar la sentencia SELECT
SELECT p.apellido1, p.apellido2 FROM personas AS p WHERE p.nombre = 'ANTONIO'
apellido1
apellido2
PEREZ
GOMEZ
GARCIA
RODRIGUEZ
14
SQL
apellido2
PEREZ
GOMEZ
GARCIA
RODRIGUEZ
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
15
SQL
tabla1
INNER
JOIN
tabla2
WHERE
tabla1.columna1
Ejemplo SQL INNER JOIN de la tabla personas, con la clave primaria "per ":
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
PEDRO
RUIZ
INFORMATICA
16
SQL
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
PEDRO
RUIZ
17
SQL
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
COMERCIAL
Aunque no exista ninguna persona del departamento 'COMERCIAL' (3), esta fila aparecer
con las otras columnas en blanco
18
SQL
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
PEDRO
RUIZ
COMERCIAL
19
SQL
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Tabla "personas_empresa2":
per
nombre
apellido1
apellido2
JUAN
APARICIO
TENS
ANTONIO
GARCIA
RODRIGUEZ
LUIS
LOPEZ
VAZQUEZ
apellido1
ANTONIO
PEREZ
ANTONIO
GARCIA
PEDRO
RUIZ
JUAN
APARICIO
LUIS
LOPEZ
20
SQL
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Tabla "personas_empresa2":
per
nombre
apellido1
apellido2
JUAN
APARICIO
TENS
ANTONIO
GARCIA
RODRIGUEZ
LUIS
LOPEZ
VAZQUEZ
apellido1
ANTONIO
PEREZ
ANTONIO
GARCIA
PEDRO
RUIZ
JUAN
APARICIO
ANTONIO
GARCIA
LUIS
LOPEZ
La persona 'ANTONIO GARCIA RODRIGUEZ' aparecer dos veces, porque est en los
dos resultados de las sentencias SELECT.
21
SQL
22
SQL
23
SQL
23. Restricciones
Las CONSTRAINTS son restricciones que se utilizan para limitar el tipo de dato que puede
recibir una columna de una tabla. Las restricciones se puede definir cuando creamos la tabla
(CREATE TABLE) o posteriormente con la sentencia ALTER TABLE.
Las posibles restricciones son: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY,
CHECK, DEFAULT.
24.
La restriccin NOT NULL sirve para especificar que una columna no acepta el valor NULL,
es decir, que esa columna siempre tiene que tener algn valor, no puede estar vaca.
Ejemplo SQL NULL:
CREATE TABLE personas (
nombre varchar(255) NOT NULL,
apellido1 varchar(255) NOT NULL,
apellido2 varchar(255) )
Esta sentencia crea una tabla denominada 'personas', donde tenemos 3 columnas. Las
columnas 'nombre' y 'apellido' llevan NOT NULL, esto quiere decir que cualquier fila
insertada en esta tabla tiene que tener algn valor para las columnas 'nombre' y 'apellido1'.
25. Restriccin UNIQUE
La restriccin UNIQUE identifica de manera nica a cada fila de una tabla. Puede haber
varias restricciones UNIQUE en diferentes columnas de una tabla. Existen varias formas
diferentes de sintaxis segn el sistema de base de datos utilizado.
Ejemplo SQL UNIQUE para la base de datos MySQL:
CREATE TABLE personas (
identificador int NOT NULL,
nombre varchar(255) NOT NULL,
apellido1 varchar(255) NOT NULL,
apellido2 varchar(255),
UNIQUE (identificador))
La sentencia anterior crea la tabla 'personas' con 4 columnas, donde la columna
'identifcador' tiene un valor diferente para cada fila de la tabla. Si intentamos insertar un fila
con un identificador que ya exista, nos dar un error y no nos dejar insertarlo.
24
SQL
Ejemplo SQL UNIQUE para las bases de datos ORACLE, SQL SERVER, ACCESS:
CREATE TABLE personas (
identificador int NOT NULL UNIQUE,
nombre varchar(255) NOT NULL,
apellido1 varchar(255) NOT NULL,
apellido2 varchar(255))
26. Restriccin UNIQUE ALTER TABLE
La restriccin UNIQUE se puede aadir a una columna de una tabla, despus de ser creada,
mediante la sentencia ALTER TABLE. Sintaxis de UNIQUE ALTER TABLE:
ALTER TABLE personas ADD UNIQUE (identificador)
Crea una restriccin UNIQUE (valor nico en toda la tabla) para la columna 'identificador'.
Se puede crear tambin restricciones para varias columnas a la vez:
ALTER
TABLE
personas
UNIQUE (identificador, apellido1)
ADD
CONSTRAINT
copersonas
SQL
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
26
SQL
Tabla personas, con una clave externa FOREIGN KEY 'dep', que hace referencia a la clave
primaria 'dep' de la tabla anterior 'departamentos' y por tanto, solo puede tener un valor de
los que tiene en esa tabla.
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
27
SQL
SQL
personas
ADD
CONSTRAINT
29
ckpersona
CHECK
(pers>0,
SQL
30
SQL
31
SQL
32
SQL
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Dada la siguiente tabla de 'personas', queremos aadir una nueva columna, denominada
'fechadenacimiento':
ALTER TABLE personas ADD fechadenacimiento date
per
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
fechadenacimiento
Si queremos modificar el tipo de dato de la columna 'fecha', y ponerle tipo 'year' en lugar de
tipo 'date':
ALTER TABLE personas ALTER COLUMN fechadenacimiento year
Si queremos borrar la columna 'fechadenacimiento' y dejarlo igual que al principio:
ALTER TABLE personas DROP COLUMN fechadenacimiento:
per
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
33
SQL
34
SQL
apellido1
apellido2
edad
ANTONIO
PEREZ
GOMEZ
30
ANTONIO
GARCIA
RODRIGUEZ
45
PEDRO
RUIZ
GONZALEZ
50
apellido1
apellido2
edad
ANTONIO
PEREZ
GOMEZ
30
ANTONIO
GARCIA
RODRIGUEZ
45
35
SQL
37. DATES
Existen diferentes formatos para almacenar las fechas y horas en los distintos sistemas de
bases de datos. Los tipos de datos de cada columna se definen cuando se crea la tabla.
Tipos de Datos para las fechas y horas en la base de datos MySQL:
Tipo
Formato
Ejemplo
DATE
YYYY-MM-DD
2008-11-11
DATETIME
YYYY-MM-DD HH:MM:SS
2008-11-11 13:23:44
TIMESTAMP
YYYY-MM-DD HH:MM:SS
YEAR
YYYY o YY
CURDATE
CURTIME
DATE
EXTRACT
DATE_ADD
DATE_SUB
DATEDIFF
DATE_FORMAT
36
SQL
Formato YYYY-MM-DD
DATETIME
SMALLDATETIME
TIMESTAMP
Funciones para SQL Server sobre los tipos de datos de fecha y hora anteriores:
GETDATE
DATEPART
DATEADD
DATEDIFF
CONVERT
nombreproducto
fechapedido
papel oficina
2012-02-23 14:05:00
37
SQL
apellido1
ANTONIO
PEREZ
LUIS
LOPEZ
ANTONIO
GARCIA
apellido2
edad
30
PEREZ
45
50
apellido1
apellido2
edad
ANTONIO
PEREZ
30
ANTONIO
GARCIA
50
apellido1
apellido2
edad
LUIS
LOPEZ
PEREZ
45
38
SQL
39
SQL
40
SQL
El tipo de dato LONGTEXT sirve para almacenar una cadena de longitud mxima de
4.294.967.295 caracteres.
LONGBLOB
El tipo de dato LONGBLOB sirve para almacenar un BLOB de longitud mxima de de
4.294.967.295 bytes.
ENUM
El tipo de dato ENUM sirve para introducir una lista de posibles valores. La longitud
mxima es de 65.535 posibles valores. Si se intenta introducir un valor en este campo, que
no est incluido en la lista, no se insertar nada y tendr un valor vaco ('').
Por ejemplo si definimos una columna como ENUM('uno', 'dos'), entonces en esta columna
solo puede almacenar los valores 'uno' o 'dos'. Si queremos insertar cualquier otro valor (por
ejemplo 'tres'), no se grabar 'tres' y en su lugar quedar el campo vaco, sin valor ('').
SET
El tipo de dato SET es similar a ENUM pero la longitud mxima de valores posibles es de
64, y los valores posibles se pueden combinar.
Por ejemplo, si definimos una columna como SET ('uno', 'dos) entonces esa columna podr
tomar los siguientes valores 'uno' o 'dos' o 'uno,dos', 'dos,uno'.
41. Datos de Nmero MySQL
MySQL admite los siguientes tipos de datos numricos para sus columnas:
TINYINT
El tipo de dato numrico TINYINT permite nmeros desde -128 hasta 127. Tambin se
puede definir como UNSIGNED (sin signo), entonces los valores posibles empiezan en 0
hasta 255. Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
(tamao).
SMALLINT
El tipo de dato numrico SMALLINT permite nmeros desde -32768 hasta 32767. Tambin
se puede definir como UNSIGNED (sin signo), entonces los valores posibles empiezan en 0
hasta 65535. Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
MEDIUMINT
El tipo de dato numrico MEDIUMINT permite nmeros desde -8388608 hasta 8388607.
Tambin se puede definir como UNSIGNED (sin signo), entonces los valores posibles
41
SQL
42
SQL
43