Anda di halaman 1dari 29

Terminologa del SQL

SQL Structured Query Language o Lenguaje de Consultas Estructurado. Es el lenguaje que permite la comunicacin con el Sistema Gestor de Bases de Datos (Oracle en nuestro caso). El SQL es un lenguaje unificado Lo utilizan todo tipo de usuarios, desde el administrador de la base de datos, DBA, hasta el usuario final. El SQL es un lenguaje no procedimental. El usuario especifica Qu quiere, no Cmo ni Dnde conseguirlo. El SQL es relacionalmente completo. Permite la realizacin de cualquier consulta de datos. SQL= DDL + DML Las sentencias del SQL se clasifican como parte del DDL o del DML. Lenguaje de Definicin de Datos, DDL sentencias del SQL que permiten definir los objetos de la Base de Datos (create, revoke, grant, alter, etc.). Cuando se definen dichos objetos se almacenan en el diccionario de datos. Lenguaje de Manipulacin de Datos, DML sentencias del SQL que se utilizan para manejar los datos de la base de datos (select, insert, update, delete, etc). commit/rollback cada vez que se realiza alguna operacin en la base de datos se realiza no sobre la tabla en s, sino sobre una copia local de la misma. As, si queremos que los resultados de la modificacin se trasladen a la base de datos y perduren en el tiempo hay que confirmar dicha operacin con el comando commit. Tambin se puede impedir que los ltimos cambios lleguen a efectuarse con rollback, aunque existen algunas sentencias SQL que se 'autoconfirman' y no se pueden volver atrs. Diccionario de la Base de Datos Guarda la definicin de todos los objetos almacenados en la base de datos; sus caractersticas, restricciones, privilegios, relaciones entre ellos, etc.

2 Tipos de Sentencias

Las sentencias SQL pertenecen a dos categoras principales: Lenguaje de Definicin de Datos, DDL y Lenguaje de Manipulacin de Datos, DML. Estos

dos lenguajes no son lenguajes en s mismos, sino que es una forma de clasificar las sentencias de lenguaje SQL en funcin de su cometido. La diferencia principal reside en que el DDL crea objetos en la base de datos y sus efectos se pueden ver en el diccionario de la base de datos; mientras que el DML es el que permite consultar, insertar, modificar y eliminar la informacin almacenada en los objetos de la base de datos. Cuando se ejecutan las sentencias DDL de SQL, el SGBD confirma la transaccin actual antes y despus de cada una de las sentencias DDL. En cambio, las sentencias DML no llevan implcito el commit y se pueden deshacer. Existe pues un problema al mezclar sentencias DML con DDL, ya que estas ltimas pueden confirmar las primeras de manera involuntaria e implicita, lo que en ocasiones puede ser un problema. A continuacin se presenta una tabla con las sentencias SQL ms comunes, clasificadas segn el lenguaje al que pertenecen.
Sentencia DDL Alter procedure Alter Table Analyze Objetivo Recompilar un procedimiento almacenado. Aadir o redefinir una columna, modificar la asignacin de almacenamiento. Recoger estadsticas de rendimiento sobre los objetos de la BD para utilizarlas en el optimizador basado en costes.

Create Table Crear una tabla. Create Index Crear un ndice. Drop Table Drop Index Grant Truncate Revoke Sentencia DML Insert Delete Update Select Commit Eliminar una tabla. Eliminar un ndice. Conceder privilegios o papeles, roles, a un usuario o a otro rol. Eliminar todas las filas de una tabla. Retirar los privilegios de un usuario o rol de la base de datos. Objetivo Aadir filas de datos a una tabla. Eliminar filas de datos de una tabla. Modificar los datos de una tabla. Recuperar datos de una tabla. Confirmar como permamentes las modificaciones realizadas.

Rollback

Deshacer todas las modificaciones realizadas desde la ltima confirmacin.

3 SQL*Plus
La herramienta que nos proporciona ORACLE para interactuar con la base de datos se llama SQL*Plus. Bsicamente, es un intrprete SQL con algunas opciones de edicin y formateo de resultados. Antes de ver la manera de conectarse a SQL*Plus, conviene tener claros algunos conceptos: Usuario/Clave Para poder acceder a una base de datos gestionada por ORACLE debemos ser un usuario autorizado de la misma y conocer la palabra clave, password, asociada al usuario. Variable de ambiente ORACLE_SID Indica la base de datos con la que vamos a trabajar.

3.1 Conexin
Para entar en SQL*Plus se debe ejecutar el comando $ sqlplus usuario/passwd donde le indicamos al SGBD Oracle quin somos y nuestra palabra clave. Si la configuracin del SGBD Oracle se corresponde a una configuracin clienteservidor asentada sobre una red (SQL*Net v2) deberemos indicar, adems, el sevicio (o base de datos) con el que queremos contactar. Esto se hace colocando el smbolo @ antes del nombre del servicio como se indica a continuacin: $ sqlplus usuario/passwd@servicio Otra circunstancia que hay que tener en cuenta a la hora de conectarnos a SQL*Plus es el modo establecido por el DBA para la autentificacin del usuario

de la base de datos. La primera posibilidad es que recaiga sobre el SGBD Oracle la autentificacin de los usuarios, por lo que tendremos que darle nuestro nombre de usuario y la palabra de paso. Pero existe la posibilidad de que el SGBD Oracle deje en manos del Sistema Operativo esta responsabilidad. As, no ser necesario demostrarle al SGBD Oracle quin somos ya que el SO se ha encargado previamente de comprobar que todo es correcto. En este segundo caso, el comando de conexin con SQL*Plus debe omitir el nombre de usuario y la palabra clave, pero manteniendo el resto de esta manera: $ sqlplus /@servicio Una vez que hemos conseguido entrar en SQL*Plus nos presenta el prompt y espera la inserccin de sentencias SQL. Todas las sentencias deben acabar con un ';'. Una sentencia puede continuar en varias lneas, que SQL*Plus va numerando. Si queremos anular la sentencia actual podemos hacerlo colocando un '.' como nico carcter en una lnea. Si queremos volver a ejecutar la ltima sentencia se puede hacer con el comando '/'. Si queremos ejecutar las sentencias que almacena un fichero .sql podemos hacerlo anteponiendo el smbolo '@' al nombre del fichero. Para cerrar la sesin vale con teclear 'exit'.

3.2 Posibilidades de Edicin


SQL*Plus almacena en un buffer la ltima sentencia SQL introducida. El buffer mantiene slo una sentencia cada vez, y si se introduce una nueva sentencia se sobreescribe sobre la anterior. La sentencia en el buffer puede ser recuperada para ejecutarla de nuevo con los comandos: que visualiza la sentencia en el buffer antes de ejecutarla; / que ejecuta la sentencia sin visualizarla.
RUN

SQL*Plus tambin nos permite editar la sentencia SQL alamacenada en el buffer mediante un sencillo (y limitado) editor en lnea, cuyos comandos se enumeran a continuacin:
Comando APPEND texto Abreviatura A texto Descripcin Aade texto al final de la lnea.

CHANGE/fuente/destino C/fuente/destino Cambia el contenido 'fuente' por el

'destino' CHANGE/texto CLEAR BUFFER DEL INPUT INPUT texto LIST LIST n LIST * LIST LAST LIST m n C/texto CL BUFF DEL I I texto L Lnn L* L LAST Lmn Quita 'texto' de una lnea. Borra el buffer Borra una lnea. Inserta una o ms lneas. Inserta una lnea con 'texto'. Lista las lneas del buffer Lista la lnea n-sima. Lista la lnea actual. Lista la ltima lnea. Lista las lneas desde la m-sima a la n-sima.

Al contenido del buffer tambin se puede acceder desde el editor del Sistema Operativo. As, el buffer podr ser manipulado con las posibilidades del editor con el que estemos acostumbrados a trabajar. Al salir del editor se devuelve el control al SQL*Plus. Para conseguir trabajar con el editor del Sistema Operativo basta con colocar la variable DEFINE_EDITOR y luego llamar al editor. SQL> define_editor=vi SQL> edit

3.3 Utilizacin de Ficheros


SQL*Plus considera dos tipos de ficheros: de spool y de comandos. Un fichero de spool almacena los resultados de una consulta (o varias) en un fichero con la extensin .lst (o lo manda a la impresora). Los comandos asociados con los ficheros spool son
SPOOL fichero

Manda el resultado de las consultas al fichero.


SPOOL OUT

Manda el resultado de las consultas a la impresora.


SPOOL OFF

Cierra el fichero de spool.


EXIT

Al salir de SQL*Plus se cierran los ficheros de spool.

Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado, almacenado y/o ejecutado; y tienen por defecto la extensin .sql : Para editarlo se puede utilizar el comando edit fichero. Para ejecutarlo se utilizar el comando START fichero o @fichero El SQL*Plus nos proporciona ms posibilidades en relacin con los ficheros de comandos, la comunicacin con el usuario final y la generacin de informes. Pero antes de ver este tipo de cosas, es mejor que sigamos profundizando en el conocimiento del lenguaje SQL. Al final del curso se puede se encuentra un captulo con algunas de las cosillas que quedan por contar del SQL*Plus.

4 Creacin
La primera fase de cualquier base de datos comienza siempre con sentencias DDL, ya que antes de poder almacenar informacin debemos definir los objetos bsicos donde agrupar la informacin. Los objetos bsicos con que trabaja SQL son las tablas. Una tabla es un conjunto de celdas agrupadas en filas y columnas donde se almacenan elementos de informacin. Antes de llevar a cabo la creacin de una tabla conviene planificar: nombre de la tabla, nombre de cada columna, tipo y tamao de los datos almacenados en cada columna, informacin adicional, restricciones, etc. Hay que tener en cuenta tambin ciertas restricciones en la formacin de los nombres de las tablas: longitud mxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un carcter alfabtico, permitir caracteres alfanumricos y el guin bajo '_', y Oracle no distingue entre maysculas y minsculas. La sintaxis del comando que permite crear un tabla es la siguiente: CREATE TABLE [esquema.]tabla ({columna tipoColumna [NOT NULL],} +, {CONSTRAINT nombreRestriccin {UNIQUE ([column,]+)|

DEFAULT expresion| CHECK (condicion)| PRIMARY KEY ([column,]+)| FOREIGN KEY (column) REFERENCES tabla(columna)},} *) Del examen de la sintaxis de la sentencia Create Table se pueden concluir que necesitamos conocer los distintos tipos de columna y las distintas restricciones que se pueden imponer al contenido de las columnas. Vayamos por partes.

4.1 Tipos de Columnas


Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una informacin de naturaleza distinta. Los tipos de datos ms comunes y sus caractersticas se resumen en la siguiente tabla.
Tipo de Dato
VARCHAR2(tamao) CHAR(tamao) LONG

Descripcin Almacena datos de tipo carcter alfanumrico de longitud variable, con un tamao mximo de 2.000. Almacena datos de tipo carcter alfanumrico de longitud fija, con un tamao mximo de 255. Almacena datos de tipo carcter alfanumrico de longitud variable con un tamao mximo de hasta 2 Gb. Almacena datos numricos de dig dgitos, de los cuales dec son decimales. El tamao mximo es de 38 dgitos. Almacena fechas desde el 1-Ene-4712 AC hasta el 31-Dic4712 DC. Almacena datos de longitud variable, con un tamao mximo de 255 bytes. Almacena datos de longitud variable, con un tamao mximo de 2 Gb.

NUMBER(dig,dec)

DATE RAW(tamao) LONG RAW

4.2 Restricciones
Las restricciones de los datos se imponen para asegurarnos que los datos cumplen con una serie de condiciones predefinidas para cada tabla. Estas restricciones ayudan a conseguir la integridad de referencia: todas las referencias dentro de una BD son vlidas y todas las restricciones se han cumplido.

Las restricciones se van a definir acompaadas por un nombre, lo que permitir activarlas o desactivarlas segn sea el caso; o tambin mezcladas en la definiciones de las columnas de la tabla. A continuacin vamos a describir cada una de las restricciones mencionadas.
NOT NULL

Establece la obligatoriedad de que esta columna tenga un valor no nulo. Se debe especificar junto a la columna a la que afecta. Los valores nulos no ocupan espacio, y son distintos a 0 y al espacio en blanco. Hay que tener cuidado con los valores nulos en las operaciones, ya que 1 * NULL es igual a NULL.
UNIQUE

Evita valores repetidos en una columna, admitiendo valores nulos. Oracle crea un ndice automticamente cuando se habilita esta restriccin y lo borra al deshabilitarse.
DEFAULT

Establece un valor por defecto para esa columna, si no se le asigna ninguno.


CHECK

Comprueba que se cumpla una condicin determinada al rellenar esa columna. Esta condicin slo debe estar construida con columnas de esta misma tabla.
PRIMARY KEY

Establece el conjunto de columnas que forman la clave primaria de esa tabla. Se comporta como nica y obligatoria sin necesidad de explicitarlo. Slo puede existir una clave primaria por tabla. Puede ser referenciada como clave ajena por otras tablas. Crea un ndice automticamente cuando se habilita o se crea esta restriccin. En Oracle, los ndices son construidos sobre rboles B+.
FOREIGN KEY

Establece que el contenido de esta columna ser uno de los valores contenidos en una columna de otra tabla maestra. Esta columna marcada como clave ajena puede ser NULL. No hay lmite en el nmero de claves ajenas. La clave ajena puede ser otra columna de la misma tabla. Se puede forzar que cuando una fila de la tabla maestra sea borrada, todas las filas de la tabla detalle cuya clave ajena coincida con la clave borrada se borren tambin. Esto se consigue aadiendo la coletilla ON DELETE CASCADE en la definicin de la clave ajena. Seguidamente se presenta un ejemplo en el que se crean dos tablas, una de departamentos y otra de empleados: REM

REM tabla departamento con un cdigo de departamento, un nombre y una REM localizacin. REM create table dep ( cod_dep number(3), nombre varchar2(15) not null, loc varchar2(10), constraint dep_pk primary key (cod_dep), constraint dep_loc check (loc in ('Valladolid', 'Boecillo', 'Cigales')) ); REM REM tabla empleado con un cdigo de empleado, un nombre, un oficio, un REM jefe, una fecha de alta en la empresa, un salario mensual, una REM comisin y el cdigo del departamento donde trabaja. REM create table emp ( cod_emp number(3), nombre varchar2(10) not null, oficio varchar2(11), jefe number(3), fecha_alta date, salario number(10), comision number(10), cod_dep number(3), constraint emp_pk primary key (cod_emp), constraint emp_fk foreign key (cod_dep) references dep(cod_dep) on delete cascade, constraint emp_ck check (salario > 0) );

4.3 Comando Describe


Oracle nos proporciona un comando que resulta muy til cuando queremos conocer la estructura de una tabla, las columnas que la forman y su tipo y restricciones. Este comando toma una mayor importancia segn nos alejemos del momento de creacin de una tabla. La sintsis es la siguiente

DESCRIBE tabla Y un ejemplo de su utilizacin se puede ver al describir la definicin de las dos tablas creadas antes. Como no es una sentencia SQL no necesita el ';' al final. Tambin se puede abreviar como DESC. SQL> describe dep Name Null? Type ------------------------------- -------- ---COD_DEP NOT NULL NUMBER(3) NOMBRE NOT NULL VARCHAR2(15) LOC VARCHAR2(10) SQL> desc emp Name Null? Type ------------------------------- -------- ---COD_EMP NOT NULL NUMBER(4) NOMBRE NOT NULL VARCHAR2(10) OFICIO VARCHAR2(10) JEFE NUMBER(4) FECHA_ALTA DATE SALARIO NUMBER(10) COMISION NUMBER(10) COD_DEP NUMBER(3)

5 Modificacin
Despus de crear una tabla, a veces nos encontramos con que se necesita aadir una columna adicional o modificar la definicin de una columna existente. Esta operacin se puede realizar con el comando ALTER TABLE. ALTER TABLE tabla {ADD | MODIFY} ({columna tipoColumna [NOT NULL],}+); Hay que tener en cuenta varios puntos: No es posible disminuir el tamao de un columna.

En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la tabla debe estar vaca. La opcin ADD ... NOT NULL slo ser posible si la tabla est vaca. La opcin MODIFY ... NOT NULL slo podr realizarse cuando la tabla no contenga ninguna fila con valor nulo en la columna en cuestin. Por ejemplo la sentencia siguiente aade la fecha de nacimiento a la tabla de empleados. SQL> alter table emp add (fecha_nac date not null); Tambin se puede querer modificar una tabla aadiendo o eliminando restricciones. En este caso el comando a utilizar ser ALTER TABLE tabla {ADD | DROP} CONSTRAINT restriccin;

6 Insercin, Actualizacin y Borrado


Una vez que tenemos definida la estructura de una tabla se pueden insertan los datos, modificarlos o borrarlos de la tabla. Esta tarea entra dentro de las operaciones que se realizan con el lenguaje DML. Este lenguaje permite manipular los objetos de la base de datos, insertando, modificando y/o borrando el contenido de las tablas. Hay que recordar que estas sentencias no son 'autoconfirmadas' y requieren de la sentencia COMMIT para que sus efectos perduren en el tiempo, o de la sentencia ROLLBACK para deshacer los cambios efectuados. A continuacin vamos a estudiar tres de las sentencias DML ms comunes.

6.1 Insercin
El comando que permite insertar filas en las tablas es el siguiente. INSERT INTO tabla [({columna,}*)] VALUES ({expresin,}+);

Slo especificaremos las columnas donde insertar y su orden cuando no insertemos datos en todas ellas o no lo hagamos en el mismo orden en que definimos la tabla. La asociacin columna-valor es posicional. Los valores deben cumplir con los tipos de datos definidos. Los valores de tipo caracter y fecha deben ir encerrados entre comillas simples, (''). A continuacin se puede ver la insercin de filas en las tablas de ejemplo. REM insertar filas en la tabla dep insert into dep values (100,'Administracion','Valladolid'); insert into dep values (200,'I+D','Boecillo'); insert into dep values (300,'Produccion','Cigales'); REM insertar filas en la tabla emp insert into emp values (101,'Cano','Presidente',null,'3-FEB-96',450000,null,100); insert into emp values (102,'Roncal','Director',101,'3-FEB-96',350000,null,100); insert into emp values (103,'Rueda','Secretario',102,'17-MAR-96',175000,null,100); insert into emp values (104,'Martin','Contable',102,'17-MAR-96',235000,null,100); insert into emp values (105,'Sanz','Comercial',101,'17-MAR-96',150000,10,100); insert into emp values (106,'Lopez','Comercial',101,'21-MAR-96',150000,15,100); insert into emp values (201,'Perez','Director',101,'4-JUN-96',350000,null,200); insert into emp values (202,'Sastre','Analista',201,'8-JUN-96',300000,null,200); insert into emp values (203,'Garcia','Programador',202,'8-JUN-96',225000,null,200); insert into emp values (204,'Mateo','Programador',202,'8-JUN-96',200000,null,200); insert into emp values (301,'Yuste','Director',101,'3-OCT-96',350000,null,300); insert into emp values (302,'Recio','Analista',301,'4-FEB-97',300000,null,300); insert into emp values (303,'Garcia','Programador',302,'4-FEB-97',210000,null,300); insert into emp values

(304,'Santana','Programador',302,'4-FEB-97',200000,null,300);

6.2 Actualizacin
Otra de las operaciones ms comunes es la modificacin de la informacin almacenada en las tablas. Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a continuacin. UPDATE tabla SET {columna = expresin,} + [WHERE condicin]; Se especificar en la clusula SET las columnas que se actualizarn y con qu valores. La clusula WHERE indica las filas con las que se va a trabajar. Si se omite la actualizacin afectar a todas las filas de la tabla.

6.3 Borrado
Con insertar y modificar, la otra operacin que completa el trio es la de borrado de filas. La sintaxis es la que sigue: DELETE FROM tabla [WHERE condicin]; Borrar todas las filas que cumplan la condicin especificada en la clusula WHERE. Si esta clusula no se fija, se borrarn todas las filas de la tabla. Aqu cabe decir que aunque con DELETE borremos todas las filas de una tabla, no borramos la definicin de la tabla del diccionario y podemos insertar datos posteriormente en la tabla. Esta es una diferencia con la sentencia DROP TABLE, que produce la eliminacin tanto del contenido de la tabla como de la definicin de la misma.

7 Seleccin
La recuperacin de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT, seleccionar. Esta sentencia permite indicar al SGBD la informacin que se quiere recuperar. Esta es la sentencia SQL, con diferencia, ms habitual. La sentencia SELECT consta de cuatro partes bsicas:

La clusula SELECT seguida de la descripcin de lo que se desea ver, los nombres de las columnas a seleccionar. Esta parte es obligatoria. La clusula FROM seguida de la especificacin de las tablas de las que se han de obtener los datos. Esta parte es obligatoria. La clusula WHERE seguida por un criterio de seleccin, una condicin. Esta parte es opcional. La clusula ORDER BY seguida por el criterio de ordenacin. Esta parte es opcional. Una primera aproximacin a la sintaxis de la sentencia SELECT puede mostrarnos la siguiente expresin: SELECT {* | {columna,}+} FROM {tabla,}+ [WHERE condicin] [ORDER BY {expresinColumna [ASC | DESC],}+]; Como una primera utilizacin de la sentencia SELECT podemos utilizarla para ver todas las tablas que tenemos en la base de datos. SQL> select table_name from user_tables; TABLE_NAME -----------------------------DEP EMP Un breve anlisis de la sentencia anterior nos permite observar que hemos consultado sobre la columna llamada table_name almacenada en la tabla user_tables, que es la tabla que guarda la informacin sobre todas las tablas de cada usuario.

7.1 Seleccin de Columnas


Las columnas a seleccionar se enumeran sin ms en la clusula SELECT. Si se desea seleccionar todas las columnas de una tabla se puede hacer enumerando a todas las columnas o colocando un asterisco, *, en su lugar.

Cuando se consulta una base de datos, los nombres de las columnas se usan como cabeceras de presentacin. Si ste resulta demasiado largo, corto o crptico, puede cambiarse con la misma sentencia SQL de consulta, creando un alias de columna. SQL> select nombre "Departamento", loc "Est en" from dep; Departamento Esta en --------------- ---------Administracion Valladolid I+D Boecillo Produccion Cigales

7.2 Clusula FROM


La clusula FROM define las tablas de las que se van a seleccionar las columnas. Se puede aadir al nombre de las tablas el usuario propietario de las mismas de la forma usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y otro. Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no se lo indiquemos. De esta forma dos o ms usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Si quisiramos acceder a las filas de la tabla dep del usuario jperez, (ademas de tener privilegios de lectura sobre esa tabla) deberamos escribir la siguiente sentencia SQL: SQL> select * from jperez.dep; Tambin se puede asociar un alias a las tablas para abreviar los nombres de las tablas. Un ejemplo se puede ver en la sentencia SQL siguiente: SQL> select d.nombre from dep d;

7.3 Clusula WHERE


Hasta ahora hemos visto como puede utilizarse la sentencia SELECT para recuperar todas las columnas o un subconjunto de ellas de una tabla. Pero este efecto afecta a todas las filas de la tabla, a menos que especifiquemos algo ms en la clusula WHERE. Es aqu donde debemos proponer la condicin que han de cumplir todas las filas para salir en el resultado de la consulta. La complejidad del criterio

de bsqueda es prcticamente ilimitada, y en l se pueden conjugar operadores de diversos tipos con funciones de columnas, componiendo expresiones ms o menos complejas. Operadores de Comparacin
Operador Operacin = Igualdad Ejemplo
select * from emp where cod_dep = 100; select * from emp where cod_dep != 100; select * from emp where cod_dep < 200; select * from emp where cod_dep > 200; select * from emp where cod_dep <= 200; select * from emp where cod_dep >= 200; select * from emp where cod_dep in (100, 300); select * from emp where cod_dep not in (200); select * from emp where cod_emp between 100 and 199; select * from emp where cod_emp not between 100 and 199; select * from emp where nombre like 'Ma%';

!=, <>, ^= Desigualdad < > <= >= in not in between not between like '_abc%' Menor que Mayor que Menor o igual que Mayor o igual que Igual a cualquiera de los miembros entre parntesis Distinto a cualquiera de los miembros entre parntesis Contenido en el rango Fuera del rango Contiene la cadena 'abc' a partir del segundo carcter y luego cualquier cadena de caracteres

Operadores de Aritmticos
Operador Operacin Ejemplo + * / Suma Resta Producto Divisin
select nombre, salario+comision from emp where oficio='VENDEDOR'; select nombre from emp where sysdate-fecha_alta > 365; select nombre, salario*12 from emp; select nombre, salario/31 from emp;

Operadores de Cadenas de Caracteres

Operador ||

Operacin Concatenacin

Ejemplo
select nombre||oficio from emp;

7.4 Clusula ORDER

BY

Se utiliza para especificar el criterio de ordenacin de la respuesta a la consulta. Por defecto la ordenacin es ascendente, aunque se puede especificar un orden descendente. La ordenacin se puede establecer sobre el contenido de columnas o sobre expresiones con columnas. A continuacin se puede ver un ejemplo de uso de la clusula ORDER BY en la que quiere obtener un listado de los empleados ordenado de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre. SQL> select nombre, salario from emp order by salario desc, nombre; NOMBRE SALARIO ---------- ---------Cano 450000 Perez 350000 Roncal 350000 Yuste 350000 Recio 300000 Sastre 300000 Martin 235000 Garcia 225000 Garcia 210000 Mateo 200000 Santana 200000 Rueda 175000 Lopez 150000 Sanz 150000 14 rows selected.

7.5 Clusula DISTINCT


Cuando se realiza una consulta sobre una tabla en la que se extrae informacin de varias columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal, obtengamos filas repetidas en la respuesta.

Si este comportamiento no nos resulta satisfactorio podemos utilizar la clusula DISTINCT para eliminar las filas duplicadas obtenidas como respuesta a una consulta. Podemos ver como funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de nuestros empleados. SQL> select oficio from emp; Sin utilizar la clusula DISTINCT obtendremos la siguiente respuesta OFICIO ----------Presidente Director Secretario Contable Comercial Comercial Director Analista Programador Programador Director Analista Programador Programador 14 rows selected. Pero si incluimos la clusula DISTINCT la respuesta vara para adecuarse ms a nuestras espectativas. SQL> select distinct oficio from emp; OFICIO ----------Analista Comercial Contable Director

Presidente Programador Secretario 7 rows selected.

7.6 Funciones
Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las consultas. Se utilizan dentro de las expresiones y actuan con los valores de las columnas, variables o constantes. Se pueden incluir en las clsulas SELECT, WHERE y ORDER
BY.

Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos: aritmticas, de cadenas de caracteres, de manejo de fechas, de conversin, otras, de grupo. Funciones Aritmticas
Funcin ABS(n) CEIL(n) Cometido Calcula el valor absoluto de n. Calcula el valor entero inmediatamente superior o igual a n. Ejemplo
select abs(-15) from dual; select ceil(15.7) from dual;

Resultado 15 16

FLOOR(n) MOD(m,n) POWER(m,n) ROUND(m,n)

Calcula el valor entero select floor(15.7) inmediatamante inferior o igual from dual; 15 a n. Calcula el resto resultante de dividir m entre n. Calcula la potencia n-esima de m. Calcula el redondeo de m a n decimales. Si n<0 el
select mod(11,4) from dual; select power(3,2) from dual; select round(123.456,1)

3 9 123.5

redondeo se efectua a por la izquierda del punto decimal. SQRT(n) Calcula la raz cuadrada de n.

from dual; select sqrt(4) from dual; select trunc(123.456,1) from dual;

2 123.4

Calcula m truncado TRUNC(m,n) a n decimales (n puede ser negativo). SIGN(n)

Calcula el signo de n, select sign(-12) devolviendo -1 si n<0, 0 si n=0 from dual; y 1 si n>0.

-1

Funciones de Cadenas de Caracteres


Funcin CHR(n) ASCII(cad) Cometido Devuelve el carcter cuyo valor codificado es n. Devuelve el valor ascii de cad. Ejemplo
select chr(65) from dual; select ascii('A') from dual;

Resultado A 65

Devuelve cad1 concaten CONCAT(cad1,cad2 ada con cad2. Esta ) funcin es esquivalente al operador ||. LOWER(cad)

select concat(concat(nombre, Cano es ' es '),oficio) from Presidente, etc. emp;

Devuelve la cadena cad con todas sus select lower('MinUsCulAs') letras convertidas a from dual; minsculas. Devuelve la cadena cad con todas sus select upper('maYuSCulAs') letras convertidas a from dual; maysculas. Devuelve cad con el primer caracter en maysculas. Devuelve cad1 con longitud n, y ajustada a la derecha, rellenando por la izquierda con cad2.
select initcap('isabel') from dual;

minusculas

UPPER(cad)

MAYUSCUL AS

INITCAP(cad)

Isabel

LPAD(cad1,n,cad2)

select lpad('P',5,'*') from dual;

****P

Devuelve cad1 con RPAD(cad1,n,cad2) longitud n, y ajustada a la izquierda, rellenando

select rpad('P',5,'*') from dual;

P****

por la derecha con cad2. Devuelve cad en la que cada ocurrencia de la REPLACE(cad,ant,n cadena ant ha sido ue) sustituida por la cadena nue. SUBSTR(cad,m,n) Devuelve la sudcadena de cad compuesta por n caracteres a partir de la posicionm. Devuelve la longitud de cad.
select replace('digo','i','i diego e') from dual;

select substr('ABCDEFG',3,2) CD from dual; select length('cadena') from 6 dual;

LENGTH(cad)

Funciones de Manejo de Fechas


Funcin SYSDATE ADD_MONTHS(d,n) Cometido Ejemplo Resultado Devuelve la fecha y select sysdate from dual; 14-MARhora actuales. 97 Devuelve la select fecha d incrementa add_months(sysdate,4) from dual; da en n meses. Devuelve la fecha del ltimo da del mes de d.
select last_day(sysdate) from dual;

14-JUL-97 31-MAR97

LAST_DAY(d)

Devuelve la MONTHS_BETWEEN(d diferencia en meses select 2.4340942 months_between(sysdate,'0 1, d2) entre las 4 1-JAN-97') from dual; fechas d1 y d2. NEXT_DAY(d,cad) Devuelve la fecha del primer da de la select next_day(sysdate, semana cad despu 'sunday') from dual; s de la fecha d. 16-MAR97

Funciones de Conversin de Tipos


Funcin Cometido Convierte la cadena cad a un TO_NUMBER(cad,fmto) nmero, opcionalmente de acuerdo con el Ejemplo
select to_number('12345') from dual;

Resultado

124345

formato fmto. Convierte la fecha d a una cadena de caracteres, opcionalmente de acuerdo con el formato fmto.

TO_CHAR(d, fmto)

select to_char(sysdate) from dual;

'14-MAR97'

TO_DATE(cad,fmto)

Convierte la cadena cad de tipo varchar2 a fecha, select to_date('1- 01-JANopcionalmente de JAN-97') from dual; 97 acuerdo con el formato fmto.

Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentacin de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan. Mscaras de Formato Numricas
Formato cc scc y,yyy sy,yyy Cometido Valor del siglo. Ejemplo Resultado

select to_char(sysdate,'cc') 20 from dual;

Ao con coma, con o select to_char(sysdate,'y,yyy') sin signo. from dual;

1,997

Ao sin signo con select yyyy yyy cuatro, tres, dos o un to_char(sysdate,'yyyy') from 1997 yy y dual; dgitos. q ww w mm Trimestre.
select to_char(sysdate,'q') from dual;

Nmero de la select to_char(sysdate,'ww') semana del ao o del from dual; 11 mes. Nmero del mes.
select to_char(sysdate,'mm') 03 from dual; select to_char(sysdate,'ddd') from dual;

Nmero del da del ddd dd ao, del mes o de la d semana. hh hh12 La hora en formato hh24 12h. o 24h. mi Los minutos de la

073

select to_char(sysdate,'hh') 12 from dual; select to_char(sysdate,'mi') 15

hora. ss sssss

from dual;

Los segundos dentro select del minuto, o desde to_char(sysdate,'sssss') from dual; las 0 horas.

44159

Mscaras de Formato de Caracteres


Formato Cometido syear year month o mon Ao en Ingls Ejemplo Resultado

select nineteen to_char(sysdate,'syear) from ninety-seven dual;

Nombre del mes o su select to_char(sysdate,'month') abreviatura de tres from dual; letras.

march

Nombre del da de la select semana o su to_char(sysdate,'day') from friday day dy abreviatura de tres dual; letras. a.m. p.m. El espacio del da.
select to_char(sysdate,'a.m.') from p.m. dual;

Indicador del ao select to_char(sysdate,'b.c.') from a.d. b.c. a.d. respecto al del nacimiento de Cristo. dual;

Otras Funciones
Funcin Cometido Convierte el DECODE(var, val1, valor de var, de cod1, val2, cod2, ..., acuerdo con la defecto) codificacin. GREATEST(exp1, exp2, ...) LEAST(cad,fmto) Ejemplo
select decode(oficio, 'Presidente', 'P', 'Director', 'D', 'X') from emp;

Resultado P, D, X, ...

Devuelve el mayor valor de sin ejemplo. una lista. Devuelve el menor valor de sin ejemplo. una lista. Devuelve la expresin exp select salario+nvl(comision,0) si val es NULL, y val si from emp; en otro caso.

sin ejemplo. sin ejemplo.

NVL(val, exp)

450000, 350000, ...

7.7 Clusula GROUP

BY

SQL nos permite agrupar las filas resultado de una consulta en conjuntos y aplicar funciones sobre esos conjuntos de filas. La sintaxis es la siguiente: SELECT {* | {columna,}+} FROM {tabla,}+ WHERE condicin GROUP BY {columna ,}+ HAVING condicin ORDER BY {expresinColumna [ASC | DESC],} +; En la clusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la clusula HAVING se especifica la condicin que han de cumplir los grupos para pasar al resultado. La evaluacin de las diferentes clusulas en tiempo de ejecucin se efecta en el siguiente orden: filtra las filas GROUP BY crea una tabla de grupo nueva HAVING filtra los grupos ORDER BY clasifica la salida
WHERE

Un ejemplo de utilizacin de la seleccin de grupos puede ser seleccionar los empleados agrupados por su oficio. Un primer intento de consulta es el siguiente: SQL> select nombre, oficio from emp group by oficio; select nombre, oficio from emp * ERROR at line 1: ORA-00979: not a GROUP BY expression Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas en el SELECT y que no aparezcan en la clusula GROUP BY deben tener

una funcin de agrupamiento. En otras palabras, la columnanombre debe tener una funcin de agrupamiento que actue sobre ella (max, min, sum, count, avg). Si no puede ser as, deber llevar dicha columna a la clusula GROUP BY. De nuevo, el ejemplo quedar as: SQL> select count(nombre), oficio from emp group by oficio; COUNT(NOMBRE) OFICIO ------------- ----------2 Analista 2 Comercial 1 Contable 3 Director 1 Presidente 4 Programador 1 Secretario 7 rows selected. Las funciones de agrupamiento que se pueden utilizar son las siguientes. Funciones de Agrupamiento
Funcin COUNT(col) Cometido Cuenta el nmero de filas agrupadas. Calcula el valor medio de todos los valores de la columna col. Calcula el valor mximo de todos los valores de la columna col. Calcula el valor mnimo de todos los valores de la columna col. Calcula la suma de los valores de la columna col. Calcula la desviacin tpica de los valores de la Ejemplo
select count(nombre),oficio from emp group by oficio; select avg(salario),oficio from emp group by oficio; select max(salario),oficio from emp group by oficio; select min(salario),oficio from emp group by oficio; select sum(salario), oficio from emp group by oficio; select stddev(salario), oficio from emp group by oficio;

AVG(col)

MAX(col)

MIN(col)

SUM(col) STDDEV(col)

columna col sin tener en cuenta los valores nulos. Calcula la varianza de los valores de la columna col sin select variance(salario), oficio from emp group by VARIANCE(col) tener en cuenta los valores oficio; nulos.

Hay que tener en cuenta que los valores nulos no participan en el clculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las clusulas DISTINCT y ALL. Tambin se pueden utilizar aunque no realicemos agrupacin alguna en la consulta, considerando a toda la tabla como un grupo. SQL> select count(*) from emp; COUNT(*) ---------14

7.8 Expresiones con Sentencias

Select

El resultado de cada consulta es un conjunto de filas. Y con conjuntos se pueden realizar tres operaciones tpicas: la unin, la interseccin y la diferencia. Unin, UNION Combina todas las filas del primer conjunto con todas las filas del segundo. Cualquier fila duplicada se reducir a una sla. Interseccin, INTERSECT Examinar las filas de los conjuntos de entrada y devolver aquellas que aparezcan en ambos. Todas las filas duplicadas sern eliminadas antes de la generacin del conjunto resultante. Diferencia, MINUS Devuelve aquellas filas que estn en el primer conjunto pero no en el segundo. Las filas duplicadas del primer conjunto se reducirn a una fila nica antes de empezar la comparacin con el segundo conjunto. Reglas para el Manejo de los Operadores de Conjuntos: Pueden ser encadenados en cualquier combinacin, siendo evaluados de izquierda a derecha. No existe jerarqua de precedencia en el uso de estos operadores, pero puede ser forzada mediante parntesis.

Pueden ser empleados con conjuntos de diferentes tablas siempre que se apliquen las siguientes reglas: o Las columnas son relacionadas en orden, de izquierda a derecha. o Los nombres de las columnas son irrelevantes. o Los tipos de datos deben coincidir. Como ejemplo podemos consultar sobre todos los nombres de empleado que trabajan para los departamentos 100 o 300. Esto se consigue restando a todos los nombres de empleados, aquellos que estn en el departamento 200. SQL> select nombre from emp 2 minus 3 select nombre from emp where cod_dep=200; NOMBRE ---------Cano Lopez Martin Recio Roncal Rueda Santana Sanz Yuste 9 rows selected.

7.9 Combinaciones
Hasta ahora hemos construido consultas con una nica tabla, pero esto no debe ser siempre as. De hecho, slo se alcanza la verdadera potencia del SQL cuando combinamos el contenido de ms de una tabla. Supongamos que queremos conseguir una lista con los empleados y los departamentos para los que trabajan. Esta informacin est repartida en las dos tablas que tenemos, emp y dep. As, podramos intentar una consulta que seleccionara el campo nombre de la tabla emp y el nombre del departamento. Y aqu surge el primer problema, cmo distinguimos entre dos columnas que

llamndose igual, pertenecen a tablas distintas? Para eso se utiliza como prefijo o el nombre de la tabla (dep.nombre) o un alias de tabla, un nombre que se asocia a cada tabla y se coloca como prefijo a la columna (d.nombre). Realicemos la consulta ... SQL> select e.nombre, d.nombre from emp e, dep d; NOMBRE NOMBRE ---------- --------------Cano Administracion Roncal Administracion Rueda Administracion Martin Administracion Sanz Administracion Lopez Administracion Perez Administracion Sastre Administracion Garcia Administracion Mateo Administracion Yuste Administracion Recio Administracion Garcia Administracion Santana Administracion Cano I+D Roncal I+D Rueda I+D ... 42 rows selected. El resultado puede sorprender un poco. Lo que obtenemos es el producto cartesiano de todos los empleados por todos los departamentos. SQL ha cogido cada fila de la tabla emp y le ha asociado todos los cod_dep de la tabla dep. Para conseguir lo que queremos tenemos que forzar que se asocie a un empleado con el nombre del departamento para el que trabaja. Y esto se puede hacer si aadimos la condicin de que el cod_dep tenga el mismo valor en la fila de la tabla emp que en la fila escogida de la tabla dep: SQL> select e.nombre, d.nombre from emp e, dep d 2> where e.cod_dep = d.cod_dep;

Anda mungkin juga menyukai