Sei sulla pagina 1di 27

BASE DE DATOS

DE
IA Y
E R S
NI A ION
E E M C
G T
IN I S UTA
S M
CO

Base de Datos (Comandos SQL Server)

Docente: Mg. Santos Sotelo Antaurco


Crear una tabla
Vamos a crear una tabla llamada empleado en alguna
base de datos, por ejemplo test.
test=> CREATE TABLE empleado (
nombre VARCHAR(20),
apellido VARCHAR(20),
sueldo FLOAT,
sexo CHAR(1),
edad INTEGER,
transaccion TIMESTAMP DEFAULT
CURRENT_TIMESTAMP,
ingreso DATE);
Insertar datos
test=> INSERT INTO empleado (nombre,
apellido, sueldo, sexo, edad, ingreso)
VALUES
('Javier', 'Ramrez', 34452.89, 'M', 23, '4-06-08');
Observamos que se ponen las columnas en las
que se va a insertar, no se puso la columna
transaccion ya que esta se inserta por default
con la hora y la fecha actuales.
Seleccionar
Obtener toda la tabla empleado
test=> SELECT * FROM empleado;

Obtener algunas columnas y todos los


renglones de la tabla empleado
test=> SELECT apellido, sueldo, ingreso
FROM empleado;
Seleccionar renglones especficos
En SELECT se usa la clusula WHERE, donde se
especifican los renglones que se quieren obtener. Por
ejemplo el nombre y apellido de los empleados cuya
edad sea mayor igual a 25 aos.
test=> SELECT nombre, apellido FROM empleado
WHERE edad >=25;

O bien, los que su apellido sea Ramrez


test=> SELECT nombre, apellido FROM empleado
WHERE apellido = 'Ramrez';
Como se trata de columnas tipo caracter, se usan
apstrofes y debe escribirse exactamente como est en
la base de datos.
Removiendo datos con DELETE
Con DELETE podemos mover uno bien
todos los renglones de una tabla, por
ejemplo DELETE FROM empleado;
eliminara todos los datos de la tabla
empleado. Si utilizamos la clusula
WHERE se eliminan los renglones que
cumplan la condicin, por ejemplo:
test=> DELETE FROM empleado
WHERE ingreso = '2008-12-24;
Modificando datos con UPDATE
En una base de datos adems de insertar y
eliminar datos hay que actualizar. Por ejemplo,
la edad del empleado Javier Prez es de 35
aos.
test=> UPDATE empleado SET edad = 35
WHERE apellido = 'Prez';
La clusula WHERE controla los renglones en los
que se llevar a cabo la modificacin. Si no se
pone esta clusula, se cambiaran la edad de
todos los empleados a 35.
Ordenando datos con ORDER BY
Cuando hacemos un SELECT, los renglones se
despliegan con un orden no determinado. Si se
quieren obtener los renglones en un orden
especfico, es necesario aumentar la clusula
ORDER BY al final del SELECT.
test=> SELECT * FROM empleado ORDER BY apellido;
Para invertir el orden se usa DESC
test=> SELECT * FROM empleado ORDER BY edad
DESC;
Se puede ordenar por distintas columnas, si en la primera
hay dos valores iguales, se usa la siguiente para ver
cual va primero.
Destruyendo tablas con DROP
Cuando queremos eliminar
completamente la tabla escribimos:
DROP TABLE empleado;
Si queremos eliminar todos los datos de
una tabla pero conservar su estructura
utilizamos (no ejecutarla):
DELETE FROM empleado;
Caracteres especiales
Si el empleado que vamos a insertar tiene un
apstrofe en el nombre, por ejemplo:
test=> INSERT INTO empleado (nombre,
apellido, sueldo, sexo, edad, ingreso)
VALUES
('Jack', 'O'Donnell', 34452.89, 'M', 23, '4-06-08');
Me marca un error: test'>
Para resolverlo:
'O''Donnell',se ponen dos apstrofes
'O\'Donnell' se pone una diagonal invertida
Etiquetado de columnas y
Comentarios
El nombre que aparece en la salida de un SELECT
hasta arriba es la etiqueta de la columna que
corresponde al nombre del atributo. Se puede cambiar
usando la palabra clave AS, por ejempo:
test=> SELECT nombre AS Razn_Social FROM cuenta;
test=> SELECT 1 + 3 AS total;

Con dos guiones -- indica que hasta el final del rengln


es un comentario
Con /* al principio y con */ al final indica que todo lo que
est contenido es un comentario
test=> /*Esto es un comentario
y no ejecuta nada*/;
Uso de AND/OR
AND y OR se usan para conectar condiciones simples.
Insertaremos ms datos en empleado:
test=> INSERT INTO empleado (nombre, apellido, sueldo, sexo, edad,
ingreso)
VALUES ('Mara', 'Prez', 2317.89, 'F', 23, '30-07-2005');
test=> INSERT INTO empleado (nombre, apellido, sueldo, sexo, edad,
ingreso)
VALUES ('Alejandro', 'Padilla', 4317.86, 'M', 24, '12-08-2006');
test=> INSERT INTO empleado (nombre, apellido, sueldo, sexo, edad,
ingreso)
VALUES ('Raquel', 'Carmona', 5817.86, 'F', 24, '15-02-2006');
test=> INSERT INTO empleado (nombre, apellido, sueldo, sexo, edad,
ingreso)
VALUES ('Armando', 'Pinillos', 7317.86, 'M', 24, '13-08-2005');
test=> INSERT INTO empleado (nombre, apellido, sueldo, sexo, edad,
ingreso)
VALUES ('Mara', 'Romero', 11317.89, 'F', 23, '30-08-2004');
AND se usa para combinar las dos comparaciones que conecta,
ejemplo:
test=> SELECT * FROM empleado WHERE nombre='Mara' AND
apellido='Prez';
OR verifica que se cumpla una de las dos comparaciones al menos,
ejemplo:
test=> SELECT * FROM empleado WHERE sexo = 'F' OR edad = 24;
Si se combinan ANDs y ORs en un mismo query es mejor agrupar los
ANDs y los ORs usando parntesis. Los ANDs se evalan primero.
Por ejemplo, si se quieren los de apellido Prez y que sean
hombres mujeres si no usamos parntesis el resultado es
incorrecto, ya que se evala el AND primero:
test=> SELECT * FROM empleado WHERE apellido='Prez' AND
sexo='M' OR sexo='F'; Me da los de apellido Prez Y son de sexo
M pero tambin todos los de sexo F, ya que primero se ejecuta el
AND y despus el OR.
Lo correcto es:
test=> SELECT * FROM empleado WHERE apellido='Prez' AND
(sexo='M' OR sexo='F'); Este me da los que son de apellido Prez
y que son de sexo M F.
Between y Like
Si queremos aqullos empleados que estn entre 24 y 30
aos de edad:
test=> SELECT * FROM empleado WHERE edad >= 24
AND edad <= 30;
test=> SELECT * FROM empleado WHERE edad
BETWEEN 24 AND 30;
Para obtener los datos de los empleados cuyo apellido
inicia con la letra R:
test=> SELECT * FROM empleado WHERE apellido LIKE
'R%';
Obtener los que ingresaron en 2008:
test=> SELECT * FROM empleado WHERE ingreso LIKE
'2008%';
Comparaciones con LIKE
Empieza con una D LIKE D%
Contiene una D LIKE %D%
Tiene D en 2da posicin LIKE _D%
Empieza con D y tiene una e LIKE D%e%
No empieza con D NOT LIKE D%
Agregacin
A veces es necesario resumir cierta
informacin. En lugar de ver renglones,
solo se necesita saber cuntos son. Para
esto se usan las siguientes palabras clave:
COUNT(*) cuenta renglones
SUM(nombre_col) total
MAX(nombre_col) mximo
MIN(nombre_col) mnimo
AVG(nombre_col) promedio
Ejemplos
Contar nmero de renglones
test=> SELECT COUNT(*) FROM empleado;
Obtener la suma de los sueldos
test=> SELECT SUM(sueldo) FROM empleado;
Obtener el sueldo mximo
test=> SELECT MAX(sueldo) FROM empleado;
Obtener la edad mnima
test=> SELECT MIN(edad) FROM empleado;
Obtener el sueldo promedio
test=> SELECT AVG(sueldo) FROM empleado;
GROUP BY
En los ejemplos anteriores nos regres un rengln como
resultado y slo se us una columna con el agregado.
Usando los agregados con GROUP BY se tendr la
aplicacin del agregado en una columna, en los
renglones agrupados por otra columna.
SELECT COUNT(*) FROM empleado, regresa el nmero
de renglones en la tabla.
Si queremos contar cuntos son sexo M y cuantos F:
test=> SELECT sexo, COUNT(*) FROM empleado
GROUP BY sexo;
Si por sexo se quiere saber datos del salario y de la edad:
test=> SELECT sexo,MIN(edad),MAX(edad),AVG(sueldo)
FROM empleado GROUP BY sexo ORDER BY 4 DESC;
HAVING
Permite probar condiciones en los valores agregados. A
menudo se usa con GROUP BY. Con HAVING se
pueden incluir o excluir grupos basados en el valor de
agregacin para ese grupo.
En el ejemplo de contar los empleados por sexo, podemos
limitar para que despliegue solo aqullos que sean ms
de 3, el query que cuenta empleados por sexo es:
test=> SELECT sexo, COUNT(*) FROM empleado
GROUP BY sexo;
Slo los que sean ms de 3 empleados de ese sexo:
test=> SELECT sexo, COUNT(*) FROM empleado
GROUP BY sexo HAVING COUNT(*)>3;
Restricciones (Constraints)
Ayudan a prevenir el insertar datos invlidos en
una base de datos.
Al definir un tio de datos para una columna ya es
en s una restriccin. Por ejemplo, el tipo DATE
solo permite el insertar fechas vlidas.
Se cubrirn:
NOT NULL, UNIQUE, PRIMARY KEY, FOREING
KEY/REFERENCES, CHECK y casos
especiales de algunos de stos.
NOT NULL
Previene que aparezcan NULLs en una columna. Por ejemplo
test=> CREATE TABLE prueba_not_null (
col1 INTEGER,
col2 INTEGER NOT NULL);

test=> INSERT INTO prueba_not_null VALUES(1, NULL);


ERROR: null value in column "col2" violates not-null constraint

test=> INSERT INTO prueba_not_null (col1) VALUES(1);


ERROR: null value in column "col2" violates not-null constraint

test=> INSERT INTO prueba_not_null VALUES(1, 23);


INSERT 0 1

test=> UPDATE prueba_not_null SET col2 = NULL;


ERROR: null value in column "col2" violates not-null constraint

Para evitar errores se puede poner un Default en la columna col2 al


crear la tabla, por ejemplo:
col2 INTEGER NOT NULL DEFAULT 5
UNIQUE
Previene valores duplicados en la columna. Se implementa creando un ndice
nico en la columna, por ejemplo
test=> CREATE TABLE prueba_unique (col1 INTEGER UNIQUE);
NOTICE: CREATE TABLE / UNIQUE will create implicit index
"prueba_unique_col1_key" for table "prueba_unique

test=> INSERT INTO prueba_unique VALUES(22);


INSERT 0 1

test=> INSERT INTO prueba_unique VALUES(22);


ERROR: duplicate key violates unique constraint "prueba_unique_col1_key"

test=> INSERT INTO prueba_unique VALUES(NULL);


INSERT 0 1
test=> SELECT * FROM prueba_unique;
col1
------
22
(2 filas) Nos contesta que hay dos renglones, uno con 22
y el otro con NULL, por lo tanto se puede insertar un
NULL en una columna con restriccin UNIQUE.
PRIMARY KEY
Marca la columna que identifica en forma nica a cada rengln. Es una
combinacin de UNIQUE y NOT NULL,el primero previene de duplicados y
el segundo de valores NULL. Se crea un ndice automticamente.
Ejemplo:
test=> CREATE TABLE prueba_primary (col INTEGER PRIMARY KEY);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
"prueba_primary_pkey" for table "prueba_primary

Cuando se tiene una llave primaria compuesta:


test=> CREATE TABLE prueba_primary_compuesta
(col1 INTEGER,
col2 INTEGER,
PRIMARY KEY(col1, col2));
test=> INSERT INTO prueba_primary_compuesta VALUES(22,22);
INSERT 0 1
test=> INSERT INTO prueba_primary_compuesta VALUES(22,23);
INSERT 0 1
test=> INSERT INTO prueba_primary_compuesta VALUES(22,23);
ERROR: duplicate key violates unique constraint
"prueba_primary_compuesta_pkey"
FOREING KEY/REFERENCES
Son ms complejas que las primary, ya que su restriccin se basa en
columnas que estn en otras tablas. Por ejemplo:
test=> CREATE TABLE nombre_estado (codigo CHAR(2) PRIMARY KEY,
nombre VARCHAR(30));
test=> INSERT INTO estado VALUES('TX', 'Texas');
test=> CREATE TABLE cliente
(id_cliente INTEGER PRIMARY KEY,
nombre VARCHAR(30),
estado CHAR(2) REFERENCES nombre_estado);
Las llaves forneas ligan las tablas y previenen que se inserten datos
invlidos en las tablas que las tienen:
test=> INSERT INTO cliente VALUES(123, 'Wallmart', 'TX');
INSERT 0 1
test=> INSERT INTO cliente VALUES(323, 'Superama', 'ME');
ERROR: insert or update on table "cliente" violates foreign key constraint
"cliente_estado_fkey"
DETAIL: Key (estado)=(ME) is not present in table nombre_estado".
Modificacin de la Primary Key
Si se tiene una llave fornea que con una referencia (REFERENCES) a
una llave primaria y si algn rengln de esta llave primaria se
actualiza o se elimina, se pueden manejar las siguientes opciones al
definir la llave fornea:
ON UPDATE NO ACTION ON DELETE NO ACTION: est prohibido
update delete de la llave primaria si hay llaves forneas que estn
haciendo referencia a dicha llave.
ON UPDATE CASCADE ON DELETE CASCADE: Un UPDATE de la
llave primaria causa UPDATE de todas las llaves forneas que hagan
referencia a esta llave primaria. Lo mismo para un DELETE.
ON DELETE SET NULL ON UPDATE SET NULL: Si se borra
actualiza un rengln de la llave primaria, el valor de la llave fornea
se pone en NULL.
ON DELETE SET DEFAULT ON UPDATE SET DEFAULT: Si se borra
actualiza un rengln de la llave primaria, el valor de la llave fornea
se pone en el valor de DEFAULT
EJEMPLO MODIFICAR y BORRAR LA PRIMARY KEY
test=> drop table cliente;
test=> CREATE TABLE cliente (
id_cliente INTEGER PRIMARY KEY,
n_cliente VARCHAR(20),
a_estado CHAR(2) REFERENCES estado ON UPDATE CASCADE ON
DELETE SET NULL);
test=> INSERT INTO estado VALUES('LA', 'ALABAMA');
test=> INSERT INTO cliente VALUES('434', 'Target', 'LA');
Hacer un select de las tablas cliente y estado
test=> UPDATE estado SET codigo='AL' WHERE codigo='LA';
Otra vez hacer un select de las tablas cliente y estado y observamos que se
actualiz el campo a_estado en la tabla cliente, esto porque pusimos ON
UPDATE CASCADE en la dfinicin de la columna.

Ahora, si eliminamos el rengln de ALABAMA en estado:


test=> DELETE FROM estado WHERE codigo='AL';
test=> SELECT * FROM cliente;
Observamos que dej en NULL ese dato en la tabla cliente, ya que en la
definicin de la tabla pusimos ON DELETE SET NULL
CHECK
Establece los valores permitidos para una columna, ejemplo:
test=> CREATE TABLE trabajador (
id_trabajador INTEGER PRIMARY KEY,
n_trabajador VARCHAR(30),
q_edad INTEGER CHECK(q_edad>=18),
x_sexo CHAR(1) CHECK(x_sexo IN('M', 'F')),
d_ingreso DATE CHECK(d_ingreso BETWEEN '1982-01-01' AND
CURRENT_DATE)
);
Hacer un INSERT que no cumpla con alguna(s) de las restricciones de
dominio:
test=> INSERT INTO trabajador VALUES(123, 'Javier Gonzlez', 12,
'M', '2007-01-01');

Ir cambiando en el INSERT para violar las restricciones de los otros


campos.

Potrebbero piacerti anche