2. Sentencias de manipulacion
2. Sentencias de manipulacion Dataprix 18 September, 2009 - 09:56Una vez creada la base de datos con sus tablas, debemos poder insertar, modificar y borrar los valores de las filas de las tablas. Para poder hacer esto, el SQL92 nos ofrece las siguientes sentencias: INSERTpara insertar, UPDATE para modificar y DELETE para borrar. Una vez hemos insertado valores en nuestras tablas, tenemos que poder consultarlos. La sentencia para hacer consultas a una base de datos con el SQL92 es SELECT FROM. Veamos a continuación estas sentencias.
2.1. Insercion de las filas en una tabla
2.1. Insercion de las filas en una tabla Dataprix 18 September, 2009 - 10:00Antes de poder consultar los datos de una base de datos, es preciso introducirlos con la sentencia INSERT INTO VALUES, que tiene el formato:
INSERT INTO nombre_tabla [(columnas)]
{VALUES ({v1|DEFAULT|NULL}, ..., {vn/DEFAULT/NULL})|};
Inserción de múltiples filas |
Para insertar más de una fila |
Los valores v1, v2, ..., vn se deben corresponder exactamente con las columnas que hemos dicho que tendríamos con el CREATE TABLE y deben estar en el mismo orden, a menos que las volvamos a poner a continuación del nombre de la tabla. En este último caso, los valores se deben disponer de forma coherente con el nuevo orden que hemos impuesto. Podría darse el caso de que quisiéramos que algunos valores para insertar fuesen valores por omisión, definidos previamente con la opción DEFAULT. Entonces pondríamos la palabra reservada DEFAULT. Si se trata de introducir valores nulos, también podemos utilizar la palabra reservada NULL.
Inserción de una fila en BDUOC
La forma de insertar a un cliente en la tabla clientes de la base de datos de BDUOC es:
INSERT INTO clientes
VALUES (10, ‘ECIGSA’, ‘37.248.573-C’, ‘ARAGON 242’, ‘Barcelona’, DEFAULT);
o bien:
INSERT INTO clientes(nif, nombre_cli, codigo_cli, telefono, direccion,
ciudad)
VALUES (‘37.248.573-C’, ‘ECIGSA’, 10, DEFAULT, ‘ARAGON 242’, ‘Barcelona’);
2.2. Borrado de las filas de una tabla
2.2. Borrado de las filas de una tabla Dataprix 18 September, 2009 - 10:01Para borrar valores de algunas filas de una tabla podemos utilizar la sentencia DELETE FROM WHERE. Su formato es el siguiente:
DELETE FROM nombre_tabla
[WHERE condiciones];
En cambio, si lo que quisiéramos conseguir es borrar todas las filas de una tabla, entonces sólo tendríamos que poner la sentencia DELETE FROM, sin WHERE.
Borrado de múltiples filas |
Notemos que el cliente con el código 2 podría tener más de un proyectyo contratado y, por lo tanto, se borraría más de una fila con una sola sentencia. |
Borrar todas las filas de una tabla en BDUOC
Podemos dejar la tabla proyectos sin ninguna fila:
DELETE FROM proyectos;
En nuestra base de datos, borrar los proyectos del cliente 2 se haría de la forma que mostramos a continuación:
DELETE FROM proyectos
WHERE codigo_cliente = 2;
2.3. Modificacion de filas de una tabla
2.3. Modificacion de filas de una tabla Dataprix 18 September, 2009 - 10:03Si quisiéramos modificar los valores de algunas filas de una tabla, tendríamos que utilizar la sentencia UPDATE SET WHERE. A continuación presentamos su formato:
UPDATE nombre_tabla
SET columna = {expresión|DEFAULT|NULL}
[, columna = {expr|DEFAULT|NULL} ...]
WHERE condiciones;
Modificación de múltiples filas |
Notemos que el proyecto número 2 podría tener a más de un empleado asignado y, por lo tanto, se modificaría la columna sueldo, de más de una fila con una sola sentencia |
Modificación de los valores de algunas filas en BDUOC
Supongamos que queremos incrementar el sueldo de todos los empleados del proyecto 2 en 1.000 euros. La modificación a ejecutar sería:
UPDATE empleados
SET sueldo = sueldo + 1000
WHERE num_proyec = 2;
2.4. Introduccion de filas en la base de datos relacional BDUOC
2.4. Introduccion de filas en la base de datos relacional BDUOC Dataprix 18 September, 2009 - 11:20
Antes de empezar a hacer consultas a la base de datos BDUOC, habremos introducido unas cuantas filas en sus tablas con la sentencia INSERT INTO. De esta forma, podremos ver reflejado el resultado de las consultas que iremos haciendo, a partir de este momento, sobre cada extensión; esto lo podemos observar en las tablas correspondientes a cada extensión, que presentamos a continuación:
• Tabla departamentos:
nombre_dep | ciudad_dep | telefono |
---|---|---|
DIR | Barcelona | 93.422.60.70 |
DIR | Girona | 972.23.89.70 |
DIS | Lleida | 973.23.50.40 |
DIS | Barcelona | 93.224.85.23 |
PROG | Tarragona | 977.33.38.52 |
PROG | Girona | 972.23.50.91 |
• Tabla clientes:
codigo_cli | nombre_cli | nif | direccion | ciudad | telefono |
---|---|---|---|---|---|
10 | EGICSA | 38.567.893-C | Aragón 11 | Barcelona | NULL |
20 | CME | 38.123.898-E | Valencia 22 | Girona | 972.23.57.67 |
30 | ACME | 36.432.127-A | Mallorca 33 | Lleida | 973.23.45.67 |
40 | JGM | 38.782.345-B | Rosellon 44 | Tarragona | 977.33.71.43 |
• Tabla empleados:
codigo_empleado | nombre_empl | apellido_empl | sueldo | nombre_dep | ciudad_dep | num_proyec |
---|---|---|---|---|---|---|
1 |
María |
Puig |
100.000 |
DIR |
Girona |
1 |
2 |
Pedro |
Mas |
90.000 |
DIR |
Barcelona |
4 |
3 |
Ana |
Ros |
70.000 |
DIS |
Lleida |
3 |
4 |
Jorge |
Roca |
70.000 |
DIS |
Barcelona |
4 |
5 |
Clara |
Blanc |
40.000 |
PROG |
Tarragona |
1 |
6 |
Laura |
Tort |
30.000 |
PROG |
Tarragona |
3 |
7 |
Rogelio |
Salt |
40.000 |
NULL |
NULL |
4 |
8 |
Sergio |
Grau |
30.000 |
PROG |
Tarragona |
Null |
• Tabla proyectos
codigo_proyec | nombre_proyec | precio | fecha_inicio | fecha_prev_fin | fecha_fin | codigo_cliente |
---|---|---|---|---|---|---|
1 |
GESCOM |
1.000.000 | 1-1-98 | 1-1-99 | NULL | 10 |
2 | PESCI | 2.000.000 | 1-10-96 | 31-3-98 | 1-5-98 | 10 |
3 | SALSA | 1.000.000 | 10-2-98 | 1-2-99 | NULL | 20 |
4 | TINELL | 4.000.000 | 1-1-97 | 1-12-99 | NULL | 30 |
2.5. Consultas a una base de datos relacional
2.5. Consultas a una base de datos relacional Dataprix 18 September, 2009 - 11:35Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sentencia SELECT FROM, que tiene el siguiente formato:
SELECT nombre_columna_a_seleccionar [[AS] col_renombrada]
[,nombre_columna_a_seleccionar [[AS] col_renombrada]...]
FROM tabla_a_consultar [[AS] tabla_renombrada];
La opción AS nos permite renombrar las columnas que queremos seleccionar o las tablas que queremos consultar que en este caso, es sólo una. Dicho de otro modo, nos permite la definición de alias. Fijémonos en que la palabra clave AS es opcional, y es bastante habitual poner sólo un espacio en blanco en lugar de toda la palabra.
Consultas a BDUOC
A continuación presentamos un ejemplo de consulta a la base de datos BDUOC para conocer todos los datos que aparece en la tabla clientes:
SELECT *
FROM clientes;
El * después de SELECT indicaque queremos ver todos los atributos que aparecen en la tabla.
La respuesta a esta consulta sería:
codigo_cli | nombre_cli | nif | direccion | ciudad | telefono |
---|---|---|---|---|---|
10 | EGICSA | 38.567.893-C | Aragón 11 | Barcelona | NULL |
20 | CME | 38.123.898-E | Valencia 22 | Girona | 972.23.57.67 |
30 | ACME | 36.432.127-A | Mallorca 33 | Lleida | 973.23.45.67 |
40 | JGM | 38.782.345-B | Rosellon 44 | Tarragona | 977.33.71.43 |
Si hubiésemos querido ver sólo el código, el nombre, la dirección y la ciudad, habríamos hecho:
SELECT codigo_cli, nombre_cli, direccion, ciudad
FROM clientes;
Y habríamos obtenido la respuesta siguiente:
codigo_cli | nombre_cli | direccion | ciudad |
---|---|---|---|
10 | EGICSA | Aragón 11 | Barcelona |
20 | CME | Valencia 22 | Girona |
30 | ACME | Mallorca 33 | Lleida |
40 | JGM | Rosellon 44 | Tarragona |
Con la sentencia SELECT FROM podemos seleccionar columnas de una tabla, pero para seleccionar filas de una tabla es preciso añadirle la cláusula WHERE. El formato es:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE condiciones;
La cláusula WHERE nos permite obtener las filas que cumplen la condición especificada en la consulta.
codigo_emple |
2 |
4 |
7 |
Consultas a BDUOC seleccionando filas
Veamos un ejemplo en el que pedimos “los códigos de los empleados que trabajan en el proyecto número 4”:
SELECT codigo_empl
FROM empleados
WHERE num_proyec = 4;
La respuesta a esta consulta sería la que podéis ver en el margen.
Para definir las condiciones en la cláusula WHERE, podemos utilizar alguno de los operadores de los que dispone el SQL, que son los siguientes:
= | Igual |
< | Menor |
> | Mayor |
<= | Menor o igual |
>= | Mayor o igual |
<> | Diferente |
NOT | Para la negación de condiciones |
AND | Para la conjunción de conciciones |
OR | Para la disyunción de condiciones |
Si queremos que en una consulta nos aparezcan las filas resultantes sin repeticiones, es preciso poner la palabra clave DISTINCT inmediatamente después de SELECT. También podríamos explicitar que lo queremos todo, incluso con repeticiones, poniendo ALL (opción por defecto) en lugar de DISTINCT. El formato de DISTINCT es:
SELECT DISTINCT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
[WHERE condiciones];
30.000 |
40.000 |
70.000 |
90.000 |
100.000 |
Consulta a BDUOC seleccionando filas sin repeticiones
Por ejemplo, si quisiéramos ver qué sueldos se están pagando en nuestra empresa, podríamos hacer:
SELECT DISTINCT sueldo
FROM empleados;
La respuesta a esta consulta, sin repeticiones, sería la que aparece en el margen.
2.5.1. Funciones de agregacion
2.5.1. Funciones de agregacion Carlos 17 September, 2009 - 11:52El SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los datos de una base de datos:
Función | Descripción |
COUNT | Nos da el número total de filas seleccionadas |
SUM | Suma los valores de una columna |
MIN | Nos da el valor mínimo de una columna |
MAX | Nos da el valor máximo de una columna |
AVG | Calcula el valor medio de una columna |
En general, las funciones de agregación se aplican a una columna, excepto la función de agregación COUNT, que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas. Por lo tanto,COUNT (*) contará todas las filas de la tabla o las tablas que cumplan las condiciones. Si se utilizase COUNT(distinct columna), sólo contaría los valores que no fuesen nulos ni repetidos, y si se utilizase COUNT(columna), sólo contaría los valores que no fuesen nulos.
Ejemplo de utilización de la función COUNT (*)
Veamos un ejemplo de uso de la función COUNT, que aparece en la cláusula SELECT, para hacer la consulta “¿Cuántos departamentos están ubicados en la ciudad de Lleida?”:
SELECT COUNT(*) AS numero_dep
FROM departamentos
WHERE ciudad_dep = ‘Lleida’;
numero_dep |
1 |
La respuesta a esta consulta sería la que aparece reflejada en la tabla que encontraréis en el margen.
Veremos ejemplos de las demás funciones de agregación en los siguientes apartados.
2.5.2. Subconsultas
2.5.2. Subconsultas Dataprix 18 September, 2009 - 11:30Una subconsulta es una consulta incluida dentro de una cláusula WHERE o HAVING de otra consulta. En ocasiones, para expresar ciertas condiciones no hay más remedio que obtener el valor que buscamos como resultado de una consulta.
codigo_proyec | nombre_proyec |
4 | TINELL |
Subconsulta en BDUOC
Si quisiéramos saber los códigos y los nombres de los proyectos de precio más elevado, en primer lugar tendríamos que encontrar los proyectos que tienen el precio más elevado. Lo haríamos de la forma siguiente:
Los proyectos de precio más bajo |
Si en lugar de los códigos y los nombres de los proyectos de precio más alto hubiésemos querido saber los de precio más bajo, habríamos aplicado la función de agregación MIN. |
SELECT codigo_proyec, nombre_proyec
FROM proyectos
WHERE precio = (SELECT MAX(precio)
FROM proyectos);
El resultado de la consulta anterior sería lo que puede verse al margen.
2.5.3. Otros predicados
2.5.3. Otros predicados Dataprix 21 September, 2009 - 09:571) Predicado BETWEEN
Para expresar una condición que quiere encontrar un valor entre unos límites concretos, podemos utilizar Roman;">BETWEEN</span>:</p>
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna BETWEEN límite1 AND límite2;
Ejemplo de uso del predicado BETWEEN
Un ejemplo en el que se pide “Los códigos de los empleados que ganan entre 20.000 y 50.000 euros anuales” sería:
codio_empl |
---|
5 |
6 |
7 |
8 |
La respuesta a esta consulta sería la que se ve en el margen.
2) Predicado IN
Para comprobar si un valor coincide con los elementos de una lista utilizaremos IN, y para ver si no coincide, NOT IN:
Ejemplo de uso del predicado IN
“Queremos saber el nombre de todos los departamentos que se encuentran en las ciudades de Lleida o Tarragona”:
nombre_dep |
ciudad_dep |
---|---|
DIS | Lleida |
PROG | Tarragona |
La respuesta sería la que aparece en el margen.
3) Predicado LIKE
Para comprobar si una columna de tipo carácter cumple alguna propiedad determinada, podemos usar LIKE:
Los patrones del SQL92 para expresar características son los siguientes:
Otros patrones |
Aunque_y % son los caracteres elegidos por el estandar, cada sistema relacional comercial ofrece diversas variantes. |
a) Pondremos un carácter _ para cada carácter individual que queramos considerar.
b) Pondremos un carácter % para expresar una secuencia de caracteres, que puede no estar formada por ninguno.
Ejemplo de uso del predicado LIKE
Atributos añadidos |
Aunque la consulta pide sólo los nombres de empleados añadimos los códigos para poder diferenciar dos empleados con el mismo nombre. |
A continuación presentamos un ejemplo en el que buscaremos los nombres de los empleados que empiezan por J, y otro ejemplo en el que obtendremos los proyectos que comienzan por S y tienen cinco letras:
a) Nombres de empleados que empiezan por la letra J:
codigo_empl |
nombre_empl |
---|---|
4 | Jorge |
La respuesta a esta consulta seria la que se muestra den el margen.
b) Proyectos que empiezan por S y tienen cinco letras:
codigo_progec |
---|
3 |
Y la respuesta a esta otra consulta sería la que aparece en el margen.
4) Predicado IS NULL
Para comprobar si un valor es nulo utilizaremos IS NULL, y para averiguar si no lo es, IS NOT NULL. El formato es:
Ejemplo de uso del predicado IS NULL
Un ejemplo de uso de este predicado sería “Queremos saber el código y el nombre de todos los empleados que no están asignados a ningún proyecto”:
codigo_emple |
nombre_emple |
---|---|
8 | Sergio |
Obtendríamos la respuesta que tenemos al margen.
5) Predicados ANY/SOME y ALL
Los predicados ANY/SOME |
Podemos elegir cualquiera de los predicados para pedir que alguna fila satisfaga una conducción. |
Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus filas (ANY/SOME) satisfagan una condición, podemos hacer:
Ejemplo de uso de los predicados ALL y ANY/SOME
a) Veamos un ejemplo de aplicación de ALL para encontrar los códigos y los nombres de los proyectos en los que los sueldos de todos los empleados asignados son menores que el precio del proyecto:
codigo_proyec | nombre_proyec |
---|---|
1 | GESCOM |
2 | PESCI |
3 | SALSA |
4 | TINELL |
Fijémonos en la condición de WHERE de la subconsulta, que nos asegura que los sueldos que observamos son los de los empleados asignados al proyecto de la consulta. La respuesta a esta consulta sería la que aparece en el margen.
b) A continuación, presentamos un ejemplo de ANY/SOME para buscar los códigos y los nombres de los proyectos que tienen algún empleado que gana un sueldo más elevado que el precio del proyecto en el que trabaja.
codigo_proyec | nombre_proyec |
---|---|
La respuesta a esta consulta está vacía, como se ve en el margen.
6) Predicado EXISTS
Para comprobar si una subconsulta produce alguna fila de resultados, podemos utilizar la sentencia denominada test de existencia: EXISTS. Para comprobar si una subconsulta no produce ninguna fila de resultados, podemos utilizar NOT EXISTS.
Ejemplo de uso del predicado EXISTS
codigo_empl | nombre_empl |
---|---|
1 |
María |
2 | Pedro |
3 | Ana |
4 | Jorge |
5 | Clara |
6 | Laura |
7 | Rogelio |
Un ejemplo en el que se buscan los códigos y los nombres de los empleados que están asignados a algún proyecto sería:
La respuesta a esta consulta sería la que se muestra en el margen.