Documente Academic
Documente Profesional
Documente Cultură
SQL Bsico: Las instrucciones SQL bsicas para la consulta de datos de cualquier base
de datos relacional.
SQL Avanzado: Las instrucciones SQL avanzadas para un control completo sobre
cualquier base de datos relacional.
Funciones SQL: SQL tiene multiples funciones predefinidas para realizar ciertos
clculos sobre los datos.
Comandos SQL: Listado de todos los comandos SQL disponibles en este curso, para
una referencia rpida de los mismos.
Estas son las instrucciones SQL bsicas para el acceso a cualquier base de datos relacional.
SELECT
Una de las sentencias SQL ms importantes es SELECT, ya que permite realizar consultas
sobre los datos almacenados en la base de datos.
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
LUIS
LOPEZ
PEREZ
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
LUIS
LOPEZ
PEREZ
Si queremos consulta todos los nombres y primer apellido de todas las personas
nombre
apellido1
ANTONIO
PEREZ
ANTONIO
GARCIA
LUIS
LOPEZ
DISTINCT
Al realizar una consulta puede ocurrir que existan valores repetidos para algunas columnas.
Por ejemplo
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.
nombre
ANTONIO
LUIS
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
*
WHERE nombre = 'ANTONIO'
FROM
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
personas
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.
OR
Condicion1 OR condicion2
En la tabla personas
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
LUIS
LOPEZ
PEREZ
SELECT
*
WHERE
nombre
AND apellido1 = 'GARCIA'
FROM
=
nombre
apellido1
apellido2
ANTONIO
GARCIA
BENITO
personas
'ANTONIO'
SELECT
*
WHERE
nombre
OR apellido1 = 'GARCIA'
FROM
=
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
BENITO
personas
'ANTONIO'
SELECT
*
FROM
WHERE
nombre
=
AND (apellido1 = 'GARCIA' OR apellido1 = 'LOPEZ)
nombre
apellido1
apellido2
ANTONIO
GARCIA
BENITO
ORDER
personas
'ANTONIO'
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
FROM
ORDER BY nombre_columna(s) ASC|DESC
nombre_columna(s)
nombre_tabla
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
BENITO
SELECT
FROM
ORDER BY apellido1 ASC
nombre,
apellido1
personas
nombre
apellido1
LUIS
LOPEZ
ANTONIO
GARCIA
ANTONIO
PEREZ
SELECT
FROM
ORDER BY apellido1 DESC
nombre,
apellido1
personas
nombre
apellido1
ANTONIO
PEREZ
ANTONIO
GARCIA
LUIS
LOPEZ
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
VALUES (valor1, valor2, valor3, .)
INTO
INSERT
INTO
nombre_tabla
VALUES (valor1, valor2, valor3, .)
nombre_tabla
(columna1,
columna2,
columna3,.)
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
VALUES
('PEDRO',
'RUIZ',
INSERT
INTO
personas
(nombre,
VALUES ('PEDRO', 'RUIZ', 'GONZALEZ')
apellido1,
personas
'GONZALEZ')
apellido2)
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
UPDATE
La sentencia UPDATE se utiliza para modificar valores en una tabla.
La sintaxis de SQL UPDATE es:
UPDATE
SET
columna1
WHERE columna3 = valor3
valor1,
columna2
La clusula SET establece los nuevos valores para las columnas indicadas.
nombre_tabla
valor2
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
UPDATE
SET
apellido2
WHERE
nombre
AND
apellido1
AND apellido2 = 'BENITO'
=
=
=
personas
'RODRIGUEZ'
'ANTONIO'
'GARCIA'
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
DELETE
WHERE nombre_columna = valor
FROM
nombre_tabla
Si queremos borrar todos los registros o filas de una tabla, se utiliza la sentencia:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
LUIS
LOPEZ
PEREZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
DELETE
WHERE
nombre
AND
apellido1
AND apellido2 = 'PEREZ'
FROM
=
=
personas
'LUIS'
'LOPEZ'
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
AVANZADO
La sentencia SQL TOP se utiliza para especificar el nmero de filas a mostrar en el resultado.
Esta clusula SQL TOP es til en tablas con muchos registros, para limitar el nmero de filas a
mostrar en la consulta, y as sea ms rpida la consulta, consumiendo tambin menos recursos
en el sistema.
Esta clusula se especifica de forma diferente segn el sistema de bases de datos utilizado.
Clusula SQL TOP para SQL SERVER
SELECT
PERCENT
FROM nombre_tabla
TOP
nmero
nombre_columna
SELECT
LIMIT nmerofilas
columna(s)
FROM
tabla
FROM
tabla
SELECT
columna(s)
WHERE ROWNUM <= nmerofilas
Ejemplo SQL TOP para MySQL:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
LIKE
El operador LIKE se utiliza en la clusula WHERE para buscar por un patrn.
Sintaxis de SQL LIKE
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Si quiero seleccionar los nombres que empiezan por 'AN' en la tabla 'personas', ejecutara el
comando siguiente:
SELECT
*
WHERE nombre LIKE 'AN%'
FROM
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
personas
FROM
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
PEDRO
RUIZ
GONZALEZ
personas
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]
[^lista]
[!lista]
Ejemplos:
Dada la siguiente tabla 'personas'
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
Ejemplos Wildcards
Seleccionar las personas cuyo nombre contenga una 'R'
SELECT
*
WHERE nombre LIKE '%R%'
FROM
Resultado:
nombre
apellido1
apellido2
PEDRO
RUIZ
GONZALEZ
personas
SELECT
*
WHERE apellido1 LIKE 'PE_EZ'
FROM
personas
Resultado:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
SELECT
*
WHERE apellido1 LIKE '[PG]%'
FROM
personas
Resultado:
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
IN
SELECT
FROM
WHERE
IN (valor1, valor2, valor3, .)
columna
tabla
columna
Ejemplo SQL IN
Dada la siguiente tabla 'personas'
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
SELECT
WHERE
IN ('PEREZ','RUIZ')
FROM
personas
apellido1
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
PEDRO
RUIZ
GONZALEZ
BETWEEN
El operador BETWEEN se utiliza en la clusula WHERE para seleccionar valores entre un
rango de datos.
Sintaxis de SQL BETWEEN
SELECT
FROM
tabla
BETWEEN valor1 AND valor2
WHERE
columna
columna
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
SELECT
FROM
WHERE
BETWEEN 'FERNANDEZ' AND 'HUERTAS'
*
personas
apellido1
nombre
apellido1
apellido2
ANTONIO
GARCIA
RODRIGUEZ
SELECT
FROM
WHERE
NOT BETWEEN 'FERNANDEZ' AND 'HUERTAS'
nombre
apellido1
apellido2
*
personas
apellido1
ANTONIO
PEREZ
GOMEZ
PEDRO
RUIZ
GONZALEZ
JOINS
La sentencia SQL JOIN permite consultar datos de 2 o ms tablas.
Dichas tablas estarn relacionadas entre ellas de alguna forma, a travs de alguna de sus
columnas.
Existen 3 tipos de JOINS: JOIN interno, JOIN externo y JOIN cruzado.
Una clave primaria es una columna con un valor nico para cada registro de una tabla.
El propsito del JOIN es unir informacin de diferentes tablas, para no tener que repetir datos
en diferentes tablas.
Ejemplo:
Si tenemos las siguientes tablas
Tabla personas, con la clave primaria "per "
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
dep
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
Si queremos saber los nombres de las personas que trabajan en INFORMATICA, tendramos
que hacer un JOIN de las 2 tablas "personas" y "departamentos", que se relacionaran por la
columna "dep".
Es decir, que desde la tabla "personas" y mediante la columna "dep", podemos acceder a la
informacin de la tabla "departamentos".
INNER JOIN
La sentencia INNER JOIN es el sentencia JOIN por defecto, y consiste en combinar cada fila de
una tabla con cada fila de la otra tabla, seleccionado aquellas filas que cumplan una determinada
condicin.
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
dep
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
nombre
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
PEDRO
RUIZ
INFORMATICA
LEFT JOIN
La sentencia LEFT JOIN combina los valores de la primera tabla con los valores de la
segunda tabla. Siempre devolver las filas de la primera tabla, incluso aunque no cumplan la
condicin.
SELECT
*
LEFT
JOIN
WHERE tabla1.columna1 = tabla2.columna1
Ejemplo de SQL LEFT JOIN
Tabla personas, con la clave primaria "per "
FROM
tabla1
tabla2
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
dep
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
SELECT
nombre,
FROM
LEFT
JOIN
WHERE personas.dep = departamentos.dep
apellido1,
nombre
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
PEDRO
RUIZ
departamento
personas
departamentos
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
dep
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
SELECT
nombre,
FROM
RIGHT
JOIN
WHERE personas.dep = departamentos.dep
apellido1,
nombre
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
departamento
personas
departamentos
COMERCIAL
Aunque no exista ninguna persona del departamento 'COMERCIAL' (3), esta fila aparecer con
las otras columnas en blanco
FULL
JOIN
La sentencia FULL JOIN combina los valores de la primera tabla con los valores de la
segunda tabla. Siempre devolver las filas de las dos tablas, aunque no cumplan la condicin.
La sentencia FULL JOIN es la unin de LEFT JOIN y RIGHT JOIN
per
nombre
apellido1
apellido2
dep
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
dep
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
SELECT
FROM
nombre,
apellido1,
departamento
personas
FULL
JOIN
WHERE personas.dep = departamentos.dep
departamentos
nombre
apellido1
departamento
ANTONIO
PEREZ
ADMINISTRACION
ANTONIO
GARCIA
INFORMATICA
PEDRO
RUIZ
COMERCIAL
UNION
La sentencia SQL UNION es utilizada para acumular los resultados de dos sentencias
SELECT.
Las dos sentencias SELECT tienen que tener el mismo nmero de columnas, con el mismo
tipo de dato y en el mismo orden.
Sintaxis SQL UNION
SELECT
columna1,
columna2
UNION
SELECT columna1, columna2 FROM tabla2
FROM
tabla1
per
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
SELECT
nombre,
apellido1
FROM
UNION
SELECT nombre, apellido1 FROM personas_empresa2
nombre
apellido1
ANTONIO
PEREZ
personas_empresa1
ANTONIO
GARCIA
PEDRO
RUIZ
JUAN
APARICIO
LUIS
LOPEZ
ALL
La sentencia SQL UNION ALL es utilizada para acumular los resultados de dos sentencias
SELECT, incluso aparecern las filas que estn repetidas en los resultados de ambas
SELECT.
Las dos sentencias SELECT tienen que tener el mismo nmero de columnas, con el mismo
tipo de dato y en el mismo orden.
Sintaxis SQL UNION
SELECT
columna1,
columna2
UNION
SELECT columna1, columna2 FROM tabla2
FROM
tabla1
ALL
per
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
SELECT
nombre,
apellido1
FROM
UNION
SELECT nombre, apellido1 FROM personas_empresa2
nombre
apellido1
ANTONIO
PEREZ
personas_empresa1
ALL
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.
SELECT
INTO
La sentencia SQL SELECT INTO se utiliza para seleccionar datos de una tabla y copiarlos
en otra tabla diferente.
Se suele utilizar para hacer una copia de seguridad (backup) de los datos de una tabla.
Sintaxis SQL SELECT INTO
SELECT
INTO
FROM tablaactual
nuevatabla
[IN
*
nuevabasedatos]
SELECT
INTO
FROM personas
*
personasBackup
SELECT
INTO
FROM personas
columna1,
columna2
personasBackup
SELECT
INTO
FROM
WHERE nombre = 'ANTONIO'
*
personasBackup
personas
SELECT
personas.nombre,
personas.apellido1,
departamentos.departamento
INTO
personasInformatica
FROM
personas
INNER
JOIN
departamentos
ON personas.dep = 'INFORMATICA'
CREATE
DATABASE
TABLE
La sentencia CREATE TABLE se utiliza para crear una tabla en una base de datos existente.
Sintaxis CREATE TABLE
CREATE
{
nombrecolumna1
nombrecolumna2
nombrecolumna3
..
}
TABLE
nombretabla
tipodato1,
tipodato2,
tipodato3,
CREATE
{
nombre
apellido1
apellido2
dep
}
TABLE
personas
varchar(255),
varchar(255),
varchar(255),
int
Existen diferentes tipos de datos, algunos son iguales en todas las bases de datos (MySQL,
ORACLE, DB2, ..) y otros pueden ser particulares para ser usados nicamente en alguna de
estas bases de datos.
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
NOT
NULL
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
{
identificador
nombre
apellido1
apellido2
TABLE
int
varchar(255)
varchar(255)
personas
NOT
NOT
NOT
NULL,
NULL,
NULL,
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.
Ejemplo SQL UNIQUE para las bases de datos ORACLE, SQLSERVIR, ACCESS
CREATE
{
identificador
nombre
apellido1
apellido2
}
TABLE
int
NOT
varchar(255)
varchar(255)
UNIQUE
personas
NULL
NOT
NOT
ALTER
UNIQUE,
NULL,
NULL,
varchar(255),
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
ADD UNIQUE (identificador)
TABLE
personas
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
ADD
CONSTRAINT
UNIQUE (identificador, apellido1)
peronas
copersonas
ALTER
DROP INDEX copersonas
TABLE
personas
ALTER
DROP CONSTRAINT copersonas
PRIMARY
TABLE
personas
KEY
La clave primaria, PRIMARY KEY, identifica de manera nica cada fila de una tabla.
La columna definida como clave primaria (PRIMARY KEY) debe ser UNIQUE (valor nico) y
NOT NULL (no puede contener valores nulos).
Cada tabla slo puede tener una clave primaria (PRIMARY KEY).
Ejemplo PRIMARY KEY , clave primaria en MySQL
CREATE TABLE personas { identificador int NOT NULL, nombre varchar(255) NOT
NULL, apellido1 varchar(255) NOT NULL, PRIMARY KEY (identificador) }
Ejemplo PRIMARY KEY , clave primaria en ORACLE, SQLSERVER, ACCESS
CREATE TABLE personas { identificador int NOT NULL PRIMARY KEY, nombre
varchar(255) NOT NULL, apellido1 varchar(255) NOT NULL, }
La clave primaria (PRIMARY KEY) puede estar compuesta por varias columnas, por ejemplo
por las columnas 'identificador' y 'nombre', entonces se define as:
CREATE TABLE personas { identificador int NOT NULL, nombre varchar(255) NOT
NULL, apellido1 varchar(255) NOT NULL, CONSTRAINT pers PRIMARY KEY
(identificador, nombre) }
La clave primaria tambin se puede definir despus de haber creado la tabla, para eso
utilizaremos el comando ALTER TABLE
Ejemplo PRIMARY KEY con ALTER TABLE ALTER TABLE personas ADD PRIMARY
KEY (identificador)
Ejemplo PRIMARY KEY multiple ALTER TABLE ALTER TABLE personas CONSTRAINT
pers PRIMARY KEY (identificador, nombre)
FOREIGN KEY
La clave externa o FOREIGN KEY, es una columna o varias columnas, que sirven para sealar
cual es la clave primaria de otra tabla.
La columna o columnas sealadas como FOREIGN KEY, solo podrn tener valores que ya
existan en la clave primaria PRIMARY KEY de la otra tabla.
Ejemplo de FOREIGN KEY
Tabla "departamentos", con la clave primaria "dep"
dep
departamento
ADMINISTRACION
INFORMATICA
COMERCIAL
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
CREATE
TABLE
departamento
PRIMARY
}
CREATE
{
per
nombre
apellido1
dep
PRIMARY
FOREIGN
}
departamentos
dep
KEY
int
NOT
NULL,
varchar(255),
(dep)
TABLE
int
NOT
int
KEY
personas
NOT
KEY
REFERENCES
(dep)
NULL,
varchar(255),
varchar(255),
NULL,
(per),
departamentos(dep)
CREATE
{
dep
int
departamento
}
CREATE
{
per
nombre
apellido1
dep
int
}
TABLE
NOT
departamentos
NULL
PRIMARY
KEY,
varchar(255),
TABLE
int
NOT
FOREIGN
KEY
NULL
REFERENCES
personas
PRIMARY
KEY,
varchar(255),
varchar(255),
departamentos
(dep)
Si la clave externa o fornea (FOREIGN KEY) est compuesta por varias columnas o queremos
ponerle un nombre, utilizaremos la frmula siguiente:
Borrar FOREIGN KEY en MySQL ALTER TABLE personas DROP FOREIGN KEY dep
Borrar FOREIGN KEY en ORACLE, SQLSERVER y ACCESS
CREATE TABLE departamentos { dep int NOT NULL CHECK (dep>0) departamento
varchar(255), }
Ejemplo CHECK en ALTER TABLE en MySQL
ADD
CONSTRAINT
ckpersona
CHECK
(pers>0,
La restriccin DEFAULT se utiliza para establecer un valor por defecto a una columna.
Si no se especifica un valor al insertar una fila, entonces se podr el valor por defecto
(DEFAULT) que tenga cada columna.
SQL DEFAULT en la sentencia CREATE TABLE
CREATE TABLE pedidos { idpedido int, producto int, cantidad int, fecha date DEFAULT
GETDATE() }
Si al crear un pedido, no especificamos el valor de la columna 'fecha', entonces para esa
columna se insertar por defecto obtenido de ejecutar la funcion GETDATE(), que devuelve
la fecha del sistema
En lugar de una funcin, podemos insertar una valor concreto '2001-01-01' o cualquier otro
valor.
SQL DEFAULT en la sentencia ALTER TABLE para MySQL
INDEX
Se pueden crear ndices NICOS, es decir, ndices que no admiten valores duplicados.
Sintaxis para SQL CREATE INDEX
CREATE
ON nombretabla (nombrecolumna)
INDEX
nombreindice
La columna que forma parte de este ndice admite valores duplicados en su columna.
Sintaxis para SQL CREATE UNIQUE INDEX
CREATE
UNIQUE
ON nombretabla (nombrecolumna)
INDEX
nombreindice
La columna que forma parte de este ndice NO admite valores duplicados en su columna,
porque es una clave nica.
Ejemplos para SQL CREATE INDEX
Creamos la ndice 'indicepersonas' sobre la columna 'persona' de la tabla 'personas'
CREATE
ON personas (persona)
INDEX
indicepersonas
Si queremos crear un ndice sobre varias columnas, por ejemplo, apellido1 y apellido2
CREATE
ON personas(apellido1, apellido2)
INDEX
indice2personas
DROP
La sentencia DROP se utiliza para borrar definitivamente un ndice, tabla o base de datos.
DROP INDEX
Sintaxis DROP INDEX para MySQL
ALTER
DROP INDEX nombreindice
TABLE
nombretabla
DROP
ON nombretabla
INDEX
nombreindice
La sentencia SQL ALTER se utiliza para aadir, eliminar o modificar columnas de una tabla.
Sintaxis SQL ALTER
Para aadir una nueva columna a una tabla
ALTER
TABLE
ADD nombrecolumna tipodatocolumna
nombretabla
ALTER
DROP COLUMN nombrecolumna
TABLE
nombretabla
ALTER
TABLE
ALTER COLUMN nombrecolumna tipodatocolumna
Ejemplos de SQL ALTER
nombretabla
per
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
ADD fechadenacimiento date
TABLE
per nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
personas
fechadenacimiento
Si queremos modificar el tipo de dato de la columna 'fecha', y ponerle tipo 'year' en lugar de tipo
'date'
ALTER
TABLE
ALTER COLUMN fechadenacimiento year
personas
ALTER
DROP COLUMN fechadenacimiento
TABLE
personas
per
nombre
apellido1
apellido2
ANTONIO
PEREZ
GOMEZ
ANTONIO
GARCIA
RODRIGUEZ
PEDRO
RUIZ
GONZALEZ
AUTO
INCREMENT
AUTO INCREMENT permite generar un nmero nico cuando insertamos un nuevo registro
en la tabla.
Se utiliza para tener una clave primaria de una tabla mediante la generacin automtica de
un nmero secuencial nico en la tabla.
Sintaxis SQL AUTO INCREMENT
CREATE
SELECT
FROM
WHERE condicin
VIEW
nombrevista
AS
nombrecolumna(s)
nombretabla
nombre
apellido1
apellido2
edad
ANTONIO
PEREZ
GOMEZ
30
ANTONIO
GARCIA
RODRIGUEZ
45
PEDRO
RUIZ
GONZALEZ
50
CREATE
VIEW
[personas
SELECT
nombre,
FROM
WHERE nombre = 'ANTONIO'
que
se
llaman
apellido1,
ANTONIO]
AS
apellido2,edad
personas
nombre
apellido1
apellido2
edad
ANTONIO
PEREZ
GOMEZ
30
ANTONIO
GARCIA
RODRIGUEZ
45
REPLACE
VIEW
[personas
SELECT
nombre,
FROM
WHERE edad > 20
que
se
apellido1,
llama
ANTONIO]
AS
apellido2,
edad
personas
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
YYYY o YY
NOW
CURDATE
CURTIME
DATE
EXTRACT
DATE_ADD
DATE_SUB
DATEDIFF
DATE
Formato YYYY-MM-DD
DATETIME
Funciones para SQL Server sobre los tipos de datos de fecha y hora anteriores
GETDATE
CREATE
(
idpedido
nombreproducto
TABLE
int
varchar(50)
pedidos
NOT
NOT
NULL,
NULL,
fechapedido
PRIMARY
)
datetime
NOT
NULL
(idpedido)
KEY
idpedido
nombreproducto
fechapedido
papel oficina
2012-02-23 14:05:00
NULL
nombre
apellido1
ANTONIO
PEREZ
LUIS
LOPEZ
ANTONIO
GARCIA
apellido2
edad
30
PEREZ
45
50
nombre
apellido1
apellido2
edad
ANTONIO
PEREZ
30
ANTONIO
GARCIA
50
nombre
apellido1
apellido2
edad
LUIS
LOPEZ
PEREZ
45
FUNCIONES
NULL
Si queremos cambiar un valor NULL por otro valor cualquiera, utilizaremos las siguientes
funciones (ISNULL, IFNULL, NVL, COLACESCE) segn el sistema de base de datos.
Para nuestros ejemplos, queremos que si el valor es NULL se cambie por el valor 0
Ejemplo para SQL SERVER se utiliza ISNULL:
SELECT
preciounidad
*
FROM productos
(unidadesstock
producto,
ISNULL(unidadespedido,
0)
SELECT
preciounidad
FROM productos
(unidadesstock
producto,
NVL(unidadespedido,
0)
SELECT
preciounidad
*
FROM productos
SELECT
preciounidad
*
FROM productos
DATOS
(unidadesstock
(unidadesstock
TEXTO
producto,
IFNULL(unidadespedido,
0)
producto,
COALESCE(unidadespedido,
0)
para
MySQL
VARCHAR
El tipo de datos VARCHAR sirve para almacenar una cadena de datos (caracteres, nmeros
y caracteres especiales) de longitud variable.
La longitud mxima es de 255 caracteres.
Hace un buen uso del espacio en disco, porque no reserva el espacio de la longitud mxima
definida, si no que solo ocupa espacio el tamao real de los datos almacenados en ese
campo.
Es el tipo de dato ms utilizado para campos pequeos.
TINYTEXT
El tipo de datos TINYTEXT sirve para almacenar una cadena de datos (solo caracteres, no
admite nmero ni caracteres especiales) de una longitud mxima de 255 caracteres.
TEXT
El tipo de dato TEXT sirve para almacenar una cadena de caracteres de longitud mxima de
65,535 caracteres.
BLOB
El tipo de datos BLOB sirve para almacenar datos de tipo BLOB (Binary Large Object).
Admite una longitud mxima de 65,535 bytes de datos.
MEDIUMTEXT
El tipo de dato MEDIUMTEXT sirve para almacenar una cadena con una longitud mxima de
16.777.215 caracteres.
MEDIUMBLOB
El tipo de datos MEDIUMBLOB Sirve para almacenar datos tipo BLOB con longitud mxima
16.777.215 bytes.
LONGTEXT
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'
DATOS
NUMRICOS
para
MySQL
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
empiezan en 0 hasta 16777215.
Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
INT
El tipo de dato numrico INT permite nmeros desde -2147483648 hasta 2147483647.
Tambin se puede definir como UNSIGNED (sin signo), entonces los valores posibles
empiezan en 0 hasta 4294967295.
Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
BIGINT
El tipo de dato numrico BIGINT permite nmeros desde -9223372036854775808 hasta
9223372036854775807.
Tambin se puede definir como UNSIGNED (sin signo), entonces los valores posibles
empiezan en 0 hasta 18446744073709551615.
Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
FLOAT
El tipo de dato numrico FLOAT permite almacenar pequeos nmeros decimales (de punto
flotante).
Al ser de punto flotante, sus clculos son aproximados. Podemos especificar el nmero
mximo de dgitos (tamao) y el nmero de decimales (decimal).
DOUBLE
El tipo de dato numrico DOUBLE permite almacenar grandes nmeros decimales (de punto
flotante).
Al ser de punto flotante, sus clculos son aproximados. Podemos especificar el nmero
mximo de dgitos (tamao) y el nmero de decimales (decimal).
DOUBLE(5,1) tendr 4 dgitos enteros y 1 dgito decimal, por ejemplo, 5467.1
DECIMAL
El tipo de dato numric DECIMAL permite almacenar grandes nmeros decimales de punto
fijo, por tanto, los clculos con este tipo DECIMAL son exactos.
Podemos especificar el nmero mximo de dgitos (tamao) y el nmero de decimales
(decimal). El nmero mximo de dgitos es de 65.
Por ejemplo DECIMAL(20,6) quiere decir que tendr 14 dgitos enteros y 4 dgitos decimales.
SQL DATOS FECHA MYS
DATOS
FECHA
para
MySQL
DATE
El tipo de dato DATE sirve para almacenar una fecha con el formato YYYY-MM-DD (4 dgitos
para el ao, guin, 2 dgitos para el mes, guin, 2 dgitos para el da).
DATETIME
El tipo de dato DATETIME sirve para almacenar fecha y hora, con el formato YYYY-MM-DD
HH:MM:SS
TIMESTAMP
El tipo de dato TIMESTAMP es equivalente al tipo anterior, DATETIME, YYYY-MM-DD
HH:MM:SS
TIME
El tipo de dato TIME sirve para almacenar la hora con el formato HH:MM:SS
YEAR
El tipo de dato YEAR sirve para almacenar el ao con el formato YYYY
DATOS
NUMRICOS
para
MySQL
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
empiezan en 0 hasta 16777215.
Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
INT
El tipo de dato numrico INT permite nmeros desde -2147483648 hasta 2147483647.
Tambin se puede definir como UNSIGNED (sin signo), entonces los valores posibles
empiezan en 0 hasta 4294967295.
Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
BIGINT
El tipo de dato numrico BIGINT permite nmeros desde -9223372036854775808 hasta
9223372036854775807.
Tambin se puede definir como UNSIGNED (sin signo), entonces los valores posibles
empiezan en 0 hasta 18446744073709551615.
Opcionalmente, se puede definir el nmero mximo de dgitos entre parntesis
FLOAT
El tipo de dato numrico FLOAT permite almacenar pequeos nmeros decimales (de punto
flotante).
Al ser de punto flotante, sus clculos son aproximados. Podemos especificar el nmero
mximo de dgitos (tamao) y el nmero de decimales (decimal).
FLOAT(6,2) tendr 4 dgitos enteros y 2 decimales, por ejemplo, 5467.67
DOUBLE
El tipo de dato numrico DOUBLE permite almacenar grandes nmeros decimales (de punto
flotante).
Al ser de punto flotante, sus clculos son aproximados. Podemos especificar el nmero
mximo de dgitos (tamao) y el nmero de decimales (decimal).
DOUBLE(5,1) tendr 4 dgitos enteros y 1 dgito decimal, por ejemplo, 5467.1
DECIMAL
El tipo de dato numric DECIMAL permite almacenar grandes nmeros decimales de punto
fijo, por tanto, los clculos con este tipo DECIMAL son exactos.
Podemos especificar el nmero mximo de dgitos (tamao) y el nmero de decimales
(decimal). El nmero mximo de dgitos es de 65.
Por ejemplo DECIMAL(20,6) quiere decir que tendr 14 dgitos enteros y 4 dgitos decimales.