1. Introduccin 2. Tipos de datos 3. Consulta de datos. 3.1 Operadores. 3.2 Subconsultas. 3.3 Combinacin de tablas. 3. Combinacin de tablas !combinacin e"terna o Outer #oin$. . %unciones &. '(rupacin elementos ). *+IO+, I+T-RS-CT . /I+*S
1. Introduccin SQL se utiliza para: 1) consultar datos 2) crear, actualizar y eliminar objetos de la BBDD 3) crear, actualizar y eliminar datos de los objetos 4) controlar el acceso a la BBDD y a los objetos Sentencias DDL y DL Create: crear un objeto de la BBDD !tablas, "istas, procedimientos) 0rop: eliminar un objeto de la BBDD 'lter: modi#icar un objeto de la BBDD 1rant: conceder pri"ile$ios sobre un objeto de la BBDD Re2o3e: retirar pri"ile$ios sobre un objeto de la BBDD Sentencias D%L Insert: insertar #ilas de datos en una tabla *pdate: actualizar #ilas de datos de una tabla 0elete: eliminar #ilas de datos de una tabla Select: recuperar #ilas de datos de una tabla o "ista 2
2. Tipos de datos &lmacenan cadenas de caracteres C4'R almacena caracteres de lon$itud #ija entre 1 y 2'' () *+%& ,&- !1') . Las columnas tienen lon$itud #ija . Si se introduce una cadena de menor lon$itud /ue la de#inida, se rellenar0 con blancos a la derec1a 1asta /ue /uede completa . Si se introduce una cadena de mayor lon$itud /ue la #ijada, 2racle de"uel"e error 5'RC4'R2 almacena cadenas de caracteres de lon$itud "ariable 1asta 2333 () &4+LL5D2 6&-,&-2!13) . Las columnas de este tipo tienen una lon$itud "ariable . Si se introduce una cadena de menor lon$itud /ue la de#inida, se almacenar0 con esa lon$itud y no se rellenar0 con nada 1asta completar . Si se introduce una cadena de mayor lon$itud a la #ijada, 2racle de"uel"e error7 +*/6-R &lmacenan datos num8ricos, tanto enteros como decimales, con o sin si$no +7meros en punto 8i#o: 9:%B+- !4recision, +scala) 4recisi;n: n< total de d=$itos del dato /ue se de#ine !1 1asta 3>) +scala: n< de d=$itos a la derec1a del punto decimal +jemplo: 2?552 9:%B+- !@,2) () 1234'AB,>@ 2tra notaci;n: 2?552 9:%B+- !') () 1234' !escala ( 3) +7meros en punto 8lotante: +s un decimal con precisi;n 3> () S:%& 9:%B+- LO+1 &lmacena cadenas de caracteres de lon$itud "ariable 1asta 2 $i$abytes de in#ormaci;n !teCtos muy $randes)7 -estricciones: S;lo se puede de#inir una columna L29D por tabla 9o pueden aparecer en restricciones de inte$ridad 9o sir"e para indeCar 9o se puede utilizar como ar$umento en #unciones ni de"ol"erlo como "alor7 3
9o se puede usar en cl0usulas E,+-+, D-2:4 BF, 2-D+- BF o D5S*59*, ni con operaciones de :9529, 59*+-S+* y %59:S 0'T- &lmacena in#ormaci;n de #ec1as y 1oras () Si$loG&HoG%esGD=aG,oraG%inutosGSe$undos +jemplo: ?+,&I&L*& D&*+ R'9 . LO+1 R'9 &lmacenan datos binarios7 -&E es similar al tipo 6&-,&-2 pero almacenando cadenas de bytes !en lu$ar de caracteres)7 L29D -&E almacena $r0#icos, sonidos, etc +l tamaHo m0Cimo de -&E es de 2'' bytes y para L29D -&E de 2 $i$abytes7 Tipo RO9I0 ada #ila de una tabla tiene una direcci;n /ue identi#ica de #orma Jnica a la #ila7 4odemos consultar la direcci;n pre$untando por la pseudocolumna -2E5D7 +sta columna utiliza la representaci;n binaria de la localizaci;n #=sica de la #ila7 uando se solicita esa columna con"ierte la representaci;n binaria a un dato 1eCadecimal representado como "arc1ar27 +ste dato se di"ide en tres campos: blo/ue7#ila7#ic1ero, por ejemplo, 3333333?7333373332
3. Consulta de datos +l #ormato de la sentencia S+L+* es el si$uiente: S-L-CT K&LL L D5S*59*M KeCpreIcol1, eCpreIcol2, 777, eCpreIcoln L NM %RO/ Ktabla1, tabla2, 777, tablanM K94-R- condici;nM KOR0-R 6: eCpreIcol KD+S L &SM K, eCpreIcol KD+S L &SM 777M; 0onde eCpreIcol puede ser una columna de una tabla, una constante, una eCpresi;n aritm8tica, una #unci;n o "arias #unciones anidadas SELECT * FROM DEPT; +l N da todas las columnas de la tabla y en el orden del 0-SC SELECT DEPT_NO, APELLIDO, SALARIO, COMISION FROM EMPLE; O +l S+L+* ser=a la 4royecci;n del 0l$ebra relacional !atributos a obser"ar en el resultado de la consulta) O +l ?-2% ser=a la operaci;n de 4roducto cartesiano con las tablas a eCaminar O +l E,+-+ ser=a el predicado de la operaci;n Selecci;n7 ,abr0 /ue poner atributos de las relaciones /ue aparecen en la cl0usula ?-2% 4
%RO/ () especi#ica la tabla o lista de tablas de las /ue se recuperar0n los datos Se puede asociar un nue"o nombre a las tablas mediante un PaliasQ SELECT E.EMPLE_NO, E.APELLIDO FROM EMPLE E; 'LL<= recupera todas las #ilas aun/ue al$unas est8n repetidas7 +s la opci;n por de#ecto7 0ISTI+CT () recupera las #ilas /ue son distintas, eliminando las #ilas repetidas Si ponemos SELECT OFICIO FROM EMPLE; nos Salen los trabajos repetidos SELECT DISTINCT OFICIO FROM EMPLE; y nos Salen los distintos trabajos !' #ilas) RQu8 trabajos se realizan en cada departamentoS %ostrar departamentos y los trabajos dentro de los departamentos SELECT DISTINCT DEPT_NO, OFICIO FROM EMPLE; () @ #ilas R+n /u8 departamentos se realizan los distintos trabajosS SELECT DISTINCT OFICIO, DEPT_NO FROM EMPLE; () @ #ilas 3.1 Operadores Operadores aritm>ticos . alias de columna Sir"en para #ormar eCpresiones con constantes y "alores de columnas + - * / SELECT EMPLE_NO, APELLIDO, SALARIO, COMISION, SALARIO*12 ANUAL FROM EMPLE; 94-R- () obtiene las #ilas /ue cumplen la condici;n eCpresada, pudiendo 1acer dic1a condici;n todo lo compleja /ue se re/uiera7 SELECT * FROM EMPLE WHERE SALARIO > 2000; A #ilas 4odemos utilizar como operadores ( ) T )( T( y U( ; T) SELECT * FROM EMPLE WHERE OFICIO = SALASMAN; 4oner el S&L&S%&9 !6&-,&-2) en mayJsculas7 4 #ilas SELECT * FROM EMPLE WHERE OFICIO = SALASMAN; 13 #ilas I+, +OT I+ !con#untos de 2alores$ 4ara comprobar si una eCpresi;n pertenece o no a un conjunto de "alores SELECT * FROM EMPLE WHERE DEPT_NO IN !"0,20#; () lista de "alores, no es un ran$o SELECT * FROM EMPLE WHERE DEPT_NO NOT IN !"0,20#; '
SELECT * FROM EMPLE WHERE OFICIO IN !EMPLEADO,DIRECTOR#; B #ilas SELECT * FROM EMPLE WHERE OFICIO NOT IN !CLER$,MANA%ER#; B #ilas 6-T9--+ '+0 !con#untos de 2alores$ omprueba si un "alor est0 comprendido o no dentro de un ran$o de "alores desde un "alor inicial a un "alor #inal7 -an$o de "alores incluyendo los mismos "alores SELECT * FROM EMPLE WHERE SALARIO BETWEEN ""00 AND &'''; () 11 #ilas SELECT * FROM EMPLE WHERE SALARIO NOT BETWEEN ""00 AND &'''; () 3 #ilas '+0, OR SELECT * FROM EMPLE WHERE DEPT_NO=(0 AND SALARIO>2000; 1 #ila !BL&V+) SELECT * FROM EMPLE WHERE DEPT_NO=(0 OR SALARIO>2000; 11 #ilas E,+-+ condici;n simple &9D condici;n 2 Deben cumplirse las 3 condiciones para /ue &9D condici;n 3 de"uel"a #ilas la consulta E,+-+ condici;n simple 2- condici;n 2 +n cuanto se cumple al$una de las condiciones 2- condici;n 3 en la #ila, se presenta por pantalla E,+-+ !condici;n 1 &9D condici;n 2) ,asta 4 ni"eles de anidamiento deber=a ser 2- el m0Cimo para no aumentar demasiado !condici;n 3 &9D condici;n 4) la complejidad de la consulta SELECT * FROM EMPLE WHERE SALARIO > 2000 AND !DEPT_NO="0 OR DEPT_NO=20#; () ' #ilas7 uidar los par8ntesis LI?- Sir"e para comparar cadenas de caracteres con comodines @ sir"e para representar cual/uier cadena de 3 ; m0s caracteres A representa un car0cter cual/uiera 4ara 1acer una consulta de nombres de empleados /ue empiecen por & SELECT * FROM EMPLE WHERE APELLIDO LIKE A); () 2 #ilas A
SELECT * FROM EMPLE WHERE APELLIDO NOT LIKE A); () 12 #ilas +mpleados con nombre donde el Jltimo "alor de la cadena sea & SELECT * FROM EMPLE WHERE APELLIDO LIKE )A; () 3 #ilas +mpleados con trabajos /ue conten$an +S en cual/uier sitio de la cadena SELECT * FROM EMPLE WHERE OFICIO LIKE )ES); () ' #ilas +mpleados con trabajos /ue conten$an una & en 2W posici;n y no importe lo /ue 1aya a la derec1a SELECT * FROM EMPLE WHERE OFICIO LIKE _A); () B #ilas +mpleados con trabajo /ue conten$a & y 9 por ese orden SELECT * FROM EMPLE WHERE OFICIO LIKE )A)N); () @ #ilas +mpleados cuyo trabajo ten$a ' caracteres y la primera letra sea una SELECT * FROM EMPLE WHERE OFICIO LIKE C____; () 4 #ilas +5L :na operaci;n aritm8tica con un 9:LL, dar0 como resultado 9:LL !'X9:LL ( 9:LL) SELECT APELLIDO, SALARIO, COMISION, SALARIO+COMISION FROM EMPLE; 96L es una #unci;n /ue nos sir"e para sustituir en una consulta los nulos de una columna por lo /ue /ueramos7 4or ejemplo, 96L !2%5S529, 3) () si la "ariable 2%5S529 tiene "alor nulo, le pone un 3 Seleccionar el nombre, el Salario, la comisi;n y el Salario bruto de todos los empleados !S&L&-52B-( 2?552 X 2%5S529) SELECT APELLIDO, SALARIO, COMISION, SALARIO + NVL!COMISION,0# *SALARIO+R, FROM EMPLE; Operador de concatenacin BB 9os ser"ir0 para concatenar la presentaci;n de los datos SELECT APELLIDO -- OFICIO FROM EMPLE; () todo junto SELECT APELLIDO -- -- OFICIO FROM EMPLE; () le metemos un espacio en blanco SELECT APELLIDO -- -- OFICIO -- -- MI OFICIO. -- SALARIO FROM EMPLE; OR0-R 6: +speci#ica el criterio de clasi#icaci;n del resultado de la consulta7 'SC especi#ica ordenaci;n ascendente /ue "iene por de#ecto !menor a mayor) y 0-SC, descendente !mayor a menor) B
S-L-CT OOOOO %RO/ Ktabla1, tabla2, 777, tablanM K94-R- condici;nM KOR0-R 6: eCpreIcol KD+S L &SM K, eCpreIcol KD+S L &SM 777M; SELECT * FROM EMPLE ORDER +/ DEPT_NO; +s posible anidar los criterios7 +l situado m0s a la iz/uierda ser0 el principal SELECT * FROM EMPLE ORDER +/ DEPT_NO, FECHA_ALT DESC, APELLIDO; 3.2.C Subconsultas Son sentencias S+L+* dentro de otra sentencia S+L+*7 La subconsulta es a/uella sentencia S+L+* /ue #orma parte de una cl0usula E,+-+ de una sentencia S+L+* anterior7 S-L-CT .... %RO/ .... 94-R- columna operadorAcomparati2o !S-L-CT .... %RO/ ... 94-R- ...$; La subconsulta se ejecutar0 primero y, posteriormente, el "alor eCtra=do es PintroducidoQ en la consulta principal7 De la tabla +%4L+, obtener el &4+LL5D2 de los empleados con el mismo 2?552 /ue Y&L29S2Z: 1) &"eri$uamos el 2?552 de Y&L29S2Z: SELECT OFICIO FROM EMPLE WHERE APELLIDO = ALONSO; () +%4L+&D2 2) 6isualizamos el &4+LL5D2 de los empleados con el mismo 2?552 /ue Y&L29S2Z: SELECT APELLIDO FROM EMPLE WHERE OFICIO = EMPLEADO; +s posible resumir estas dos consultas con una subconsulta: SELECT APELLIDO FROM EMPLE WHERE OFICIO = (SELECT OFICIO FROM EMPLE WHERE APELLIDO = 'FORD';
>
Subconsultas Due (eneran 2alores simples Son subconsultas /ue de"uel"en una #ila o un "alor simple, como en el caso anterior /ue ten=amos un "alor simple !&9&L5S*&)7 +l si$no ( es un "alor de comprobaci;n simple /ue no se puede usar con listas7 Si la subconsulta obtiene m0s de una #ila, se produce un mensaje de error7 2btener los nombres de los empleados cuyo trabajo coincida con al$Jn trabajo del departamento 23: SELECT APELLIDO FROM EMPLE WHERE OFICIO = (SELECT OFICIO FROM EMPLE WHERE DEPT!NO=2"; +rror de 2racle: la subconsulta de una sola #ila de"uel"e m0s de una #ila +n el departamento 23 1ay "arios o#icios: SELECT OFICIO FROM EMPLE WHERE DEPT!NO=2"; Subconsultas Due (eneran listas de 2alores Son subconsultas /ue de"uel"en m0s de una #ila o m0s de un "alor7 uando una subconsulta de"uel"a m0s de un "alor, usaremos el operador I+ en la cl0usula E,+-+7 La soluci;n al ejemplo anterior ser=a SELECT APELLIDO FROM EMPLE WHERE OFICIO IN (SELECT OFICIO FROM EMPLE WHERE DEPT!NO=2"; onsultar los datos de los empleados /ue trabajen en Y%&D-5DZ o YB&-+L29&Z7 La localidad de los departamentos se obtiene de la tabla D+4*: 1) Localizar los nJmeros de departamento /ue est8n en Dallas o 1ica$o SELECT DEPT!NO FROM DEPARTWHERE LOC IN (MADRID'# BARCELONA'; 2) Seleccionar los datos de los empleados /ue est8n en esos departamentos SELECT * FROM EMPLE WHERE DEPT!NO IN (2"# $"; 3) -eunir las dos sentencias utilizando una subconsulta S-L-CT E %RO/ -/FL- 94-R- 0-FTA+O I+ !S-L-CT 0-FTA+O %RO/ 0-F'RT 94-R- LOC I+ !G/'0RI0G, G6'RC-LO+'G$$; onsultar los nombres y o#icios de todos los empleados del departamento 23 cuyo trabajo sea id8ntico al de cual/uiera de los empleados del departamento YS&L&SZ: SELECT APELLIDO# OFICIO FROM EMPLE WHERE DEPT!NO = 2" AND OFICIO IN (SELECT OFICIO FROM EMPLE WHERE DEPT!NO = @
(SELECT DEPT!NO FROM DEPART WHERE DNOMBRE = 'SALAS'; +l D+4*I92 de S&L&S ser0 el 33 2btener el nombre de los empleados con el mismo o#icio y Salario /ue D5L7 *enemos la "ariante de /ue la subconsulta nos de"uel"a m0s de una columna: SELECT APELLIDO# SALARIOFROM EMPLE WHERE (OFICIO# SALARIO = (SELECT OFICIO# SALARIOFROM EMPLE WHERE APELLIDO = '%IL' =& Si se detallan 2arios campos en la clHusula 94-R-, se deben encerrar entre par>ntesis . Ian de coincidir en n7mero . tipo de datos con los de la sentencia S-L-CT de la consulta interior. Cada columna de la clHusula 94-R- se re8erirH a la correspondiente columna de la subconsulta. S-L-CT &4+LL5D2, S&L&-52?-2% +%4L+ E,+-+ 2?552 ( !S-L-CT 2?552 ?-2% +%4L+ E,+-+ &4+LL5D2 ( [S&9,+\[) &9D S&L&-52( !S-L-CT S&L&-52 ?-2% +%4L+ E,+-+ &4+LL5D2 ( [S&9,+\[ )] () 2tra #orma
Subconsulta Sincronizada 4resentar los empleados cuyo Salario es menor a la media de los Salarios de su departamento S+L+* N ?-2% +%4L+ E,+-+ S&L&-52T 7777 () Rc;mo 1acemos este c0lculoS 1) %edia de los Salarios de cada departamento: SELECT AV% (SALARIO FROM EMPLE WHERE DEPT!NO = 1"; SELECT AV% (SALARIO FROM EMPLE WHERE DEPT!NO = 2"; SELECT AV% (SALARIO FROM EMPLE WHERE DEPT!NO = $"; 2) Datos de empleados de cada departamento con S&L&-52do in#erior a la media de los de su departamento SELECT * FROM EMPLE WHERE DEPT!NO = 1" AND SALARIO' 2(1)*))+; SELECT * FROM EMPLE WHERE DEPT!NO = 2" AND SALARIO' 21+,; SELECT * FROM EMPLE WHERE DEPT!NO = $" AND SALARIO' 1,))*)); 4ero nosotros lo /ueremos todo con una sola consulta () Subselect Sincronizada S-L-CT E %RO/ -/FL- -1 94-R- -1.S'L'RIOJ !S-L-CT '51 !-2.S'L'RIO$ %RO/ -/FL- -2 94-R- -2.0-FTA+O < -1.0-FTA+O$; La media de Salarios calculada en cada subselect por cada empleado ser0 la del departamento de la tabla +1 !la del empleado en concreto) 13
3..C Combinacin de tablas ,asta a1ora, en las consultas /ue 1emos realizado s;lo se 1a utilizado una tabla, indicada a la derec1a de la palabra ?-2%7 4ero 1ay "eces /ue una consulta necesita columnas de "arias tablas, las cuales se eCpresar0n a la derec1a del ?-2%: S-L-CT columnas de las tablas del P#romQ %RO/ tabla1, tabla2, 777 94-R- tabla17columna ( tabla27columna] uando combinamos "arias tablas 1ay /ue tener en cuenta unas re$las: 1) +s posible unir tantas tablas como deseemos 2) +n la cl0usula S+L+* se pueden citar columnas de todas las tablas 3) Si 1ay columnas con el mismo nombre, en las distintas tablas de la cl0usula ?-2% se deben identi#icar especi#icando 9ombre*abla79ombreolumna !usaremos alias) 4) Si el nombre de una columna eCiste s;lo en una tabla, no ser0 necesario especi#icarla como 9ombre*abla79ombreolumna7 Sin embar$o, 1acerlo mejorar=a la le$ibilidad de la sentencia S+L+* () lo 1aremos as= pre#erentemente ') +l criterio /ue se si$a para combinar las tablas 1a de especi#icarse en la cl0usula E,+-+7 Si se omite esta cl0usula, el resultado ser0 un 4-2D:*2 &-*+S5&92 /ue emparejar0 todas las #ilas de una tabla con cada #ila de la otra 2btener el nombre, trabajo, nJmero de empleado, nombre de departamento y localidad de las tablas +%4L+ y D+4*7 SELECT E*APELLIDO# E*OFICIO# E*EMPLE!NO# D*DNOMBRE# D*LOC FROM EMPLE E# DEPARTD WHERE E*DEPT!NO = D* DEPT!NO; Si no ponemos la cl0usula E,+-+, el resultado ser0 el producto cartesiano: SELECT E*APELLIDO# E*OFICIO# E*EMPLE!NO# D*DNOMBRE# D*LOC FROM EMPLE E# DEPART D; -ealizar una consulta para obtener el nombre del alumno, su asi$natura y su nota: SELECT ALUMNOS*APENOM# ASI%NATURAS*NOMBRE# NOTAS*NOTA FROM ALUMNOS# ASI%NATURAS# NOTAS WHERE ALUMNOS*DNI = NOTAS*DNI AND NOTAS*COD = ASI%NATURAS*COD; 2btener los nombres de los alumnos matriculados en Y?2LZ: SELECT APENOM FROM ALUMNOS# ASI%NATURAS# NOTAS 11
WHERE ALUMNOS*DNI = NOTAS*DNI AND NOTAS*COD = ASI%NATURAS*COD AND NOMBRE = FOL-;
Combinacin de tablas !combinacin e"terna o Outer #oin$ ,ay una "ariedad /ue se llama O*T-R KOI+ /ue nos permite seleccionar al$unas #ilas de una tabla aun/ue 8stas no ten$an correspondencia con las #ilas de la otra tabla con la /ue se combina: S-L-CT tabla17colum1, tabla17colum2, tabla27colum1, tabla27colum2 %RO/ tabla1, tabla2 94-R- tabla17colum1 ( tabla27 colum1 !L$] Selecciona todas las #ilas de la tabla *&BL&1, aun/ue no ten$an correspondencia con las #ilas de la tabla *&BL&2 y se denota con el s=mbolo !L$ detr0s de la columna de la tabla *&BL&2 en la cl0usula E,+-+7 +l resto de columnas de la tabla *&BL&2 se rellena con 9:LL7 +l si$no !X) se escribir0 del lado del P3Q ocurrencias asociadas !donde pueda #altar esa cla"e () SELECT * FROM PARALEER; SELECT * FROM LEIDOS; 2DIL5B-2 92%B-+IL5B-2 2DIL5B-2 ?+,& 133 ien aHos de soledad 333 23G32G@@ 233 Los mitos $rie$os 233 11G34G@@ 333 +l camino 4&-&L++- contiene los libros /ue tenemos para leer y L+5D2S los libros /ue ya 1emos le=do, con su #ec1a de terminaci;n 6isualizar la in#ormaci;n de ambas tablas !c;di$o libro, nombre y #ec1a #inalizaci;n de lectura) SELECT P*COD!LIBRO# P*NOMBRE!LIBRO# L*FECHA FROM PARALEER P# LEIDOS L WHERE P*COD!LIBRO = L*COD!LIBRO; () s;lo 2 #ilas con datos de los libros ya le=dos, pero no aparecen los datos del libro /ue no se 1a le=do !133) por/ue no tiene su correspondencia en la tabla L+5D2S SELECT P*COD!LIBRO# P*NOMBRE!LIBRO# L*FECHA FROM PARALEER P# LEIDOS L WHERE P*COD!LIBRO = L*COD!LIBRO (.;
12
. %unciones SQL %unciones: 'ritm>ticas Las #unciones /ue trabajan con datos de tipo num8rico 9:%B+- y tenemos de tres tipos: 1) 6alores simples 2) Drupos de "alores 3) ?unciones de listas 1$ %unciones aritm>ticas de 2alores simples :n "alor simple es: un nJmero !B121,23), una "ariable o una columna de una tabla 4ara probar al$unas de estas #unciones usaremos la tabla D:&L, /ue es una tabla creada para probar #unciones o para 1acer c0lculos r0pidos7 +s una tabla de trabajo de 2racle7 '6S !n$ () de"uel"e el "alor absoluto de PnQ !siempre ser0 un nJmero positi"o) . 2btener el "alor absoluto de O23: SELECT ABS(/2" ABSOLUTO FROM DUAL; . 2btener el "alor absoluto del !2?552&-52 ^ A333) para todas las #ilas de +%4L+L+: SELECT APELLIDO# OFICIO # ABS (OFICIO /)""" FROM EMPLE; C-IL !n$ () obtiene el "alor entero inmediatamente superior o i$ual a PnQ7 . 4ara nJmeros positi"os, el "alor superior de un nJmero decimal es el si$uiente entero, y el "alor superior de un nJmero entero es 8l mismo: SELECT CEIL (2"*+# CEIL (2"*2# CEIL (1) FROM DUAL; () 21 21 1A 4ara nJmeros ne$ati"os el resultado es: SELECT CEIL (/2"*+# CEIL (/2"*2# CEIL (/1) FROM DUAL; () O23 O23 O1A %LOOR !n$ () es lo opuesto a +5L: de"uel"e el "alor entero inmediatamente in#erior o i$ual a PnQ7 . 4ara nJmeros positi"os, el "alor in#erior de un nJmero decimal es el entero anterior, y el "alor in#erior de un nJmero entero es 8l mismo SELECT FLOOR (2"*+# FLOOR (2"*2# FLOOR (1) FROM DUAL; () 23 23 1A . 4ara nJmeros ne$ati"os el resultado es: SELECT FLOOR (/2"*+# FLOOR (/2"*2# FLOOR (/1) FROM DUAL; () O21 O21 O1A /O0 !m,n$ () de"uel"e el resto resultante de di"idir PmQ entre PnQ, pudiendo ser ambos nJmeros reales SELECT MOD (11#0# MOD (11#"# MOD (1"#1,# MOD (/1"#$# MOD (1"#/$# MOD (1"*0#0*, FROM DUAL; () 3 11 13 O1 1 1,4 +5L!2alor, e"p$: Se utiliza para sustituir un "alor nulo por otro "alor7 Si P"alorQ es 9ull es sustituido por la eCpresi;n] si no lo es la #unci;n de"uel"e P"alorQ7
13
FO9-R !m, e"ponente$ () calcula la potencia de un nJmero: PmQ ele"ado al eCponente SELECT POWER ($#0# POWER ($#/0# POWER (/$#0# POWER (0*,#2*0# POWER (0*,#2 FROM DUAL; () >1 ,31234'A> >1 3A,@'>134 23,2' RO*+0 !numero M,mN$ () redondea los nJmeros con la cantidad indicada de d=$itos de precisi;n7 De"uel"e el "alor PnumeroQ redondeado a PmQ decimales7 Si se omite PmQ, de"uel"e PnumeroQ con 3 decimales y redondeado7 & partir de ' Ptira para arribaQ7 SELECT ROUND (1*,)$0#1# ROUND (1*,)$0# ROUND (1*22$0# ROUND (1*22$0#2# ROUND (1*2)+)#$ FROM DUAL; () 1,A 2 1 1,22 1,2A> SQRT !n$ () de"uel"e la ra=z cuadrada de PnQ7 +l "alor de PnQ no puede ser ne$ati"o7 SELECT S1RT (2,# S1RT (2,*) FROM DUAL; () ' ',3'@A443 SELECT S1RT (/2, FROM DUAL; () dar0 un error TR*+C !numero M,mN$ () trunca los nJmeros para /ue ten$an una cierta cantidad de d=$itos de precisi;n7 De"uel"e PnumeroQ truncado a PmQ decimales7 Si se omite PmQ de"uel"e PnumeroQ con 3 decimales SELECT TRUNC (1*,)$0#1# TRUNC (1*1)20#2# TRUNC (1*))2 FROM DUAL] () 1,' 1,1A 1 SI1+!5'LOR$ () 5ndica el si$no del "alor7 Si "alor es ne$ati"o de"uel"e O1 y sino de"uel"e 17 2$ %unciones de (rupos de 2alores ,ay una serie de #unciones estad=sticas /ue actJan sobre un $rupo de #ilas para obtener un "alor7 Los "alores nulos son i$norados por las #unciones de $rupos de "alores, y los c0lculos se realizan sin contar con ellos7 '51 !n$ () calcula el "alor medio de PnQ i$norando los "alores nulos7 0lculo del 2?552 medio de los empleados del departamento 13 de la tabla +%4L+L+ SELECT AV% (OFICIOARIO FROM EMPLE WHERE DEPT!NO=1"; alcular la comisi;n media de los empleados /ue tienen comisi;n: SELECT AV% (COMISION FROM EMPLE; onsidera el cero pero no los 9:LL CO*+T !E B e"presion$ () cuenta el nJmero de "eces /ue PeCpresi;nQ e"alJa al$Jn dato con "alor no nulo7 La opci;n PNQ cuenta todas las #ilas seleccionadas 0lculo del nJmero de #ilas de la tabla +%4L+: SELECT COUNT (* FROM EMPLE; () 14 0lculo del nJmero de #ilas de la tabla +%4L+ donde 2%5S529 no es nula: SELECT COUNT (COMISION FROM EMPLE; () 4 ontar los distintos trabajos /ue 1ay !sin "erlos) !selecci;n de #ilas cuyos "alores en la columna no est8n duplicados) SELECT COUNT (DISTINCT OFICIO CANTIDAD FROM EMPLE; () ' 14
alcular el nJmero de o#icios di#erentes /ue 1ay en total en los departamentos 13 y 23: SELECT COUNT (DISTINCT OFICIOS FROM EMPLE WHERE DEPT!NO IN (1"#2"; () 4 /'O !e"presion$ () calcula el m0Cimo "alor de PeCpresi;nQ 0lculo del m0Cimo 2?552 de la tabla +%4L+: SELECT MA3 (OFICIOARIO FROM EMPLE; 2btener el nombre m0Cimo !al#ab8ticamente) de la tabla +%4L+ SELECT MA3 (APELLIDO FROM EMPLE; /I+ !e"presion$ () calcula el m=nimo "alor de PeCpresi;nQ 2btener el 2?552 m=nimo de la tabla +%4L+: SELECT MIN (OFICIO FROM EMPLELE; S*/ !e"presion$ () obtiene la suma de "alores de PeCpresi;nQ 2btener la suma de todos los 2?552s de la tabla +%4L+: SELECT SUM (OFICIO FROM EMPLE; () 2@32' 4odemos reunir "arias de estas #unciones en una sola consulta: SELECT COUNT (*# AV% (OFICIO# MA3 (OFICIO FROM EMPLE; 3$ %unciones de listas *rabajan sobre un $rupo de columnas dentro de una misma #ila7 omparan los "alores de cada una de las columnas en el interior de una #ila para obtener el mayor o el menor "alor de la lista 1R-'T-ST !2alor1, 2alor2 ...$ () obtiene el mayor "alor de la lista SELECT %REATEST (1# 2# +# , FROM DUAL; () B SELECT %REATEST ( ($.1# (12.( FROM DUAL; 4rimero resuel"e los par8ntesis internos y despu8s eli$e el mayor () 21 L-'ST !2alor1, 2alor2 ...$ () obtiene el menor "alor de la lista SELECT LEAST (1# 2# +# , FROM DUAL; () 1 SELECT LEAST ( ($.1# (12.( FROM DUAL; () 4
%unciones: Cadenas de caracteres +stas #unciones trabajan con datos de tipo ,&- o 6&-,&-2, es decir, datos al#anum8ricos !letras, nJmeros y caracteres especiales) 1'
C4R!n$ () De"uel"e el car0cter cuyo "alor binario es e/ui"alente a PnQ7 CO+C'T!cad1,cad2$ () oncatenaci;n de cadenas7 De"uel"e Pcadena1Q concatenada con Pcadena2Q7 +sta #unci;n es e/ui"alente al operador LL7 LO9-R !cad$ () De"uel"e la cadena PcadQ con todas sus letras con"ertidas a minJsculas7 *FF-R !cad$ () De"uel"e la cadena PcadQ con todas sus letras con"ertidas a mayJsculas7 I+ITC'F !cad$ () on"ierte la primera letra de cada palabra de PcadQ a mayJscula y el resto a minJscula7 LF'0 !cad1, n M,cad 2N$ () aHade caracteres a la iz/uierda de Pcad1Q 1asta /ue alcance una cierta lon$itud7 De"uel"e Pcad1Q con lon$itud PnQ y ajustado a la derec1a7 Pad2Q es la cadena con la /ue se rellena por la iz/uierda, la cual ser0 car0cter blanco si se suprime7 SELECT LPAD !010, 2, 0*0# 3E456"3, LPAD !010, 7, 0*.0# 3E45623, LPAD !010, 2, 0*.0# 3E456(3, LPAD !0HOLA0, "0, 0.0# 3E456&3 FROM D8AL; +jem1 +jem2 +jem3 +jem4 NNNN_ N7N7N_ N7N7_ 777777,2L& 4oner los nombres de la tabla +%4L+ ajustados a la derec1a y lon$itud total de 13 caracteres SELECT LPAD !APELLIDO, "0# *NOM+RE, FROM EMPLE; () cuidado por/ue recorta si ponemos PnQ menor /ue el nJmero de caracteres de la columna RF'0 !cad1, n M,cad 2N$ () aHade caracteres a la derec1a de Pcad1Q 1asta /ue alcance una cierta lon$itud7 De"uel"e Pcad1Q con lon$itud PnQ y ajustado a la iz/uierda7 Pad2Q es la cadena con la /ue se rellena por la derec1a, la cual ser0 car0cter blanco si se suprime7 SELECT RPAD !010, 2, 0*0# 3E4569:;3 FROM D8AL; => 1**** 4ara cada #ila de +%4L+, obtener el nombre de los empleados /ue ten$an una lon$itud de 11 caracteres y rellenar por la derec1a con asteriscos SELECT RPAD !APELLIDO, "", 0*0# 3E<EMPLO3 FROM EMPLE; 1A
LTRI/ !cad$ () Si la cadena tiene blancos a la iz/uierda, la #unci;n de"uel"e la cadena sin esos blancos, y si no tiene blancos la deja como est07 SELECT LTRIM ! =;:># -- LTRIM ! >?@;A# FROM D8AL; => =;:>>?@;A RTRI/ !cad$ () Si la cadena tiene blancos a la derec1a, la #unci;n de"uel"e la cadena sin esos blancos, y si no tiene blancos la deja como est0 SELECT RTRIM !=;:> # -- RTRIM !>?@;A# FROM D8AL; => =;:>>?@;A S*6STR !cad, inicio, M,nN$ () eCtrae una parte de una cadena7 De"uel"e PcadQ /ue abarca desde la posici;n indicada en PinicioQ 1asta tantos caracteres como indi/ue el nJmero PnQ7 Si se omite PnQ, de"uel"e la cadena desde la posici;n especi#icada por PinicioQ7 SELECT S8+STR !0A+CDEF%0,(,2# FROM D8AL; => CD 2btener la cadena a partir de la posici;n cuarta: SELECT S8+STR !0A+CDEF%0,&# FROM D8AL; => DEF% 6isualizar el nombre y su primera letra de la tabla +%4L+ SELECT APELLIDO, S8+STR !APELLIDO, ", "# FROM EMPLE; L-+1T4 !cad$ () de"uel"e el nJmero de caracteres de PcadQ alcular el nJmero de caracteres de las columnas &4+LL5D2 y 2?552 de la tabla +%4L+: SELECT APELLIDO, LEN%TH !APELLIDO#, OFICIO, LEN%TH !OFICIO# FROM EMPLE; Otras 8unciones de cadenas Replace !cad, cadenaAb7sDuedaMcadenaAsustitucinN$. Sustituye un car0cter o "arios caracteres de una cadena con 3 o m0s caracteres7 De"uel"e PcadQ con cada ocurrencia de cadenaIbJs/ueda sustituida por cadenaIsustituci;n7 Translate !cad1,cad2,cad3$. on"ierte caracteres de una cadena en caracteres di#erentes de acuerdo con un plan de sustituci;n /ue marca el usuario7 De"uel"e Pcad1Q con los caracteres encontrados en Pcad2Q y sustituidos por los caracteres de Pcad3Q7 ual/uier car0cter /ue no est8 en la cadena cad2 permanece como estaba7 'SCII!cad$. De"uel"e el "alor &S55 de la primera letra de la cadena PcadQ7 1B
I+STR!cad1,cad2M,comienzoM,mNN$. Busca un conjunto de caracteres en una cadena7 De"uel"e la posici;n PmO8simaQ ocurrencia de cad2 en cad1 empezando la bJs/ueda en la posici;n PcomienzoQ7 4or omisi;n empieza buscando en la posici;n 17 %unciones: /ane#o de 8ecIas 2racle almacena datos de tipo #ec1a !D&*+) y posee una utilidad para #ormatear las #ec1as de cual/uier manera /ue se pueda concebir7 +l tipo D&*+ se almacena en un #ormato especial /ue incluye: mesGd=aGaHoG1oraGminutosGse$undos7 S:S0'T- () de"uel"e la #ec1a del sistema SELECT S/SDATE FROM D8AL; => B;C6>D; DD/MM/// '00A/O+T4S !8ecIa, n$ () de"uel"e la P#ec1aQ incrementada en PnQ meses 2btener el nombre, la #ec1a de in$reso y la #ec1a de in$reso incrementada en 1 mes: SELECT APELLIDO, FECHA_ALT, ADD!MONTHS !FECHA_ALT, "# FROM EMPLE; 4ara restar meses, podemos poner nJmeros ne$ati"os SELECT APELLIDO, FECHA_ALT, ADD_MONTHS !FECHA_ALT, -"2# FROM EMPLE; L'STA0': !8ecIa$ () de"uel"e la #ec1a del Jltimo d=a del mes /ue contiene P#ec1aQ SELECT LAST_DA/ !02"/"/200'0#, LAST_DA/ !"0/2/200'0# FROM D8AL; => ("/"/0' 2E/2/0' /O+T4SA6-T9--+ !8ecIa1, 8ecIa2$ () de"uel"e la di#erencia en meses entre las #ec1as P#ec1a1Q y P#ec1a2Q7 4uede ser un nJmero decimal 2btener el nombre, la #ec1a de in$reso y la anti$`edad en meses de los empleados: SELECT APELLIDO, FECHA_ALT, MONTHS_+ETWEEN !S/SDATE, FECHA_ALT# *ANTI%8EDAD, FROM EMPLE; 2btener el nombre, la #ec1a de in$reso y la anti$`edad en aHos de los empleados: SELECT APELLIDO, FECHA_ALT, FLOOR !MONTHS_+ETWEEN !S/SDATE, FECHA_ALT#/"2 # *ANTI%8EDAD, FROM EMPLE; () para redondear los aHos 1acia abajo La #unci;n #loor de"uel"e el "alor entero inmediatamente in#erior o i$ual al /ue est0 entre par8ntesis7 +-OTA0': !8ecIa,cad$ () De"uel"e la #ec1a del primer d=a de la semana indicado por PcadQ despues de la #ec1a indicada por P#ec1aQ7 1>
%unciones: Con2ersin *rans#orman los objetos de un tipo de dato en otro7 TOAC4'R !8ecIa, P8ormatoQ$ () con"ierte una P#ec1aQ !tipo D&*+) a tipo P6&-,&-2Q en el Y#ormatoZ especi#icado con una determinada m0scara F 4:+D+ 59L:5- L5*+-&L+S +9+--&D2S +9*-+ 2%5LL& D2BL+S7 SELECT TO_CHAR !S/SDATE, DD/MM///// HH2& MI SS# *FECHA, FROM D8AL; %0scaras m0s utilizadas: ::::: aHo FF: Jltimos dos d=$itos del aHo //: nJmero de mes DD: nJmero de d=a del mes 4412: 1ora 1O12 ,,24: 1ora 1O24 /I: minutos SS: se$undos /O+T4: nombre del mes !2*:B-+), montI !octubre), /ontI !2ctubre) 0':: nombre del d=a de la semana !L:9+S) SELECT TO_CHAR !S/SDATE, 06;FD= ?>G0# 3FECHA3 FROM D8AL; & partir de la tabla +%4L+, obtener el nombre y la #ec1a de in$reso #ormateada de manera /ue aparezca el nJmero de d=a de mes, el nombre del mes con todas sus letras y el aHo: SELECT APELLIDO, TO_CHAR !FECHA_ALT, 0DD MONTH ////0# 3N8EHA FECHA3 FROM EMPLE; () probar con %ont1 y con mont1 2btener la #ec1a de 1oy con el si$uiente #ormato: ,oy es nombreIdia, dia mes de nombreImes de aHo SELECT TO_CHAR !S/SDATE, 03H;G 5A 3 ?>G 3,3 DD 3 ?5 3 6;FD= 3 ?5 3 ////0# 3FECHA3 FROM D8AL; TOA0'T- !cad, P8ormatoQ$ () con"ierte PcadQ, de tipo 6&-,&-2 o ,&-, a un "alor de tipo D&*+7 +l #ormato de #ec1a ele$ido es Y#ormatoZ7 on"ertir una cadena a tipo D&*+: SELECT TO!DATE ('"1"12""(' FROM DUAL; =& "14"14"( 1@
4ara poner otro #ormato de representaci;n a las #ec1as usar: ALTER SESSION SET NLS!DATE!FORMAT='DD4MM45555; 2btener el nombre del mes a partir de la cadena Y31312334Z: SELECT TO_CHAR !TO_DATE !0"0"200&, DDMM////#, M;FD=# *MES, FROM D8AL; => EF5C; 2btener el nombre del d=a, el nombre del mes, el d=a y el aHo a partir de la cadena Y1212233@Z: SELECT TO_CHAR !TO_DATE !0"2"2200',0DDMM////0#, 0D>G DD M;FD= ////0# 3FECHA3 FROM D8AL TOAC4'R !numero, P8ormatoQ$ <= con"ierte un nJmero a tipo "arc1ar2 en el #ormato especi#icado7 ?ormatos m0s utilizados: @ () por un car0cter o si es cero por nada7 3 () muestra un cero si el "alor es cero D () car0cter de lo miles D () car0cter decimal L () S=mbolo de la moneda local , () pone coma en la posici;n especi#icada 7 () pone punto en la posici;n especi#icada Select toIc1ar!1,Z@@@Z), toIc1ar!O1,Z@@@Z), toIc1ar!31,Z@@@Z), toIc1ar!3,Z@@@Z), toIc1ar!123,ZL@@@Z) #rom dual] () 1, O1, 1 , Select toIc1ar!1234'7AB, Y@@@D@@@D@@@Z) #rom dual] () 12,34'7 AB TOA+*/6-R!cadena M, 8ormatoN$ <= *S-R De"uel"e el nombre del usuario actual7 *I0 De"uel"e el identi#icador del usuario actual7 *S-R, *I0 : S:S0'T- realmente son pseudocolumnas7 SELECT 8SER FROM D8AL; () S&9,+\ SHOW 8SER () :S+- es PS&9,+\Q
23
%OR/'TO 0- %-C4' 4or de#ecto el #ormato para la #ec1a "iene de#inido por el par0metro +LSAT-RRITOR: ( S4&59 ] este par0metro se inicializa al arrancar 2racle y especi#ica: +l idioma para el #ormato de la #ec1a7 Los separadores de miles7 +l car0cter decimal7 +l s=mbolo de la moneda7
4odemos cambiar el "alor por omisi;n inicializando al$unos par0metros: +LSA0'T-AL'+1*'1-: cambia el idioma de la #ec1a7 +LSA+*/-RICAC4'R'CT-RS: ambia el car0cter de miles y decimales7 +LSAC*RR-+C:: ambia el s=mbolo de la moneda local7 +LSA0'T-A%OR/'T: ambia el #ormato de la #ec1a7 +j: &L*+- S+SS529 S+* 9LSI9:%+-5I,&-&*+-S ( Y,7Z ar0cter decimal la coma y separador de miles, el punto7
21
&.C '(rupacin de elementos: 1RO*F 6: . 4'5I+1 S-L-CT CCCC %RO/ CCCC <= 8iltro a ni2el de 8ila 1RO*F 6: columna1, columna2, columna 3, CCCCCC 4'5I+1 condicin <= 8iltro a ni2el de (rupo OR0-R 6: CCCC Los datos seleccionados en la sentencia S+L+* /ue lle"a el D-2:4 BF deben ser: 678 9:7;<87<=# 678 >679?@7 A= BC6D: (SUM# COUNT# AV%# MIN# MA3# 678 9:E6F78 =GDC=;8A8 =7 =E %ROUP B5* C 1RO*F 6: sir"e para calcular propiedades de uno o m0s conjuntos de #ilas !$rupos)7 5$ual /ue eCiste la condici;n de bJs/ueda E,+-+ para #ilas indi"iduales, tambi8n 1ay una condici;n de bJs/ueda para $rupos de #ilas: C 4'5I+1 () se emplea para controlar cu0l de los conjuntos de #ilas se "isualiza y no puede eCistir sin un D-2:4 BF7 6isualizar el nJmero de empleados /ue 1ay en cada departamento !a$rupar las #ilas de la tabla +%4L+ por departamento y contarlas) SELECT DEPT!NO# COUNT (* FROM EMPLE %ROUP B5 DEPT!NO; () 13O3 23O' 33OA 2:9* es una #unci;n de $rupo y da in#ormaci;n sobre un $rupo de #ilas, no sobre #ilas indi"iduales de la tabla, por lo /ue la cl0usula D-2:4 BF D+4*I92 obli$a a 2:9* a contar las #ilas /ue se 1an a$rupado por cada departamento7 4ara "isualizar s;lo los departamentos con m0s de 4 empleados SELECT DEPT!NO# COUNT (* FROM EMPLE %ROUP B5 DEPT!NO HAVIN% COUNT (* &0; () 23O' 33OA Si adem0s, /ueremos ordenar la S&L&-52ida descendentemente por nJmero de +mpleados: SELECT DEPT!NO# COUNT (* FROM EMPLE %ROUP B5 DEPT!NO HAVIN% COUNT (* &0 ORDER B5 COUNT (* DESC; 4odemos especi#icar en 2-D+- BF #unciones de $rupo, columnas de D-2:4 BF o su combinaci;n7 uando se usa D-2:4 BF, todas las columnas de la S+L+* distintas a #unciones de a$re$aci;n deben aparecer en la cl0usula D-2:4 BF7 Sin embar$o, pueden aparecer columnas en el D-2:4 BF y no estar en la S+L+*7 Qu8 trabajos se realizan en cada departamento y cu0ntos +mpleados lo realizan !en cada departamento tambi8n) SELECT DEPT!NO# OFICIO# COUNT (* FROM EMPLE %ROUP B5 DEPT!NO# OFICIO; La e"aluaci;n de las cl0usulas en tiempo de ejecuci;n se e#ectJa en el si$uiente orden: E,+-+ () D-2:4 BF () ,&659D () 2-D+- BF () S+L+* 22
Selecciona #ilas () a$rupa las #ilas () #iltra los $rupos () ordena los $rupos () proyecta los atributos pedidos 2btener la suma de Salarios, el m0Cimo y el Salario m=nimo por cada departamento: SELECT DEPT!NO# SUM(SALARIO HSUMA SALARIOSH# MA3(SALARIO HMA3IMO SALARIOARIOH# MIN(SALARIO HMINIMO SALARIOARIOH FROM EMPLE %ROUP B5 DEPT!NO; 9ombres y nJmero de departamentos /ue ten$an m0s de 4 personas trabajando: SELECT DEPT!NO# DNOMBRE FROM DEPARTT WHERE DEPT!NO IN (SELECT DEPT!NO FROM EMPLE %ROUP B5 DEPT!NO HAVIN% COUNT (* & 0; Buscar el nJmero m0Cimo de +mpleados /ue 1ay en al$Jn departamento: S+L+* %&_ !2:9*!N)) P%aCimoQ ?-2% +%4L+ D-2:4 BF D+4*I92] 6isualizar el nJmero de departamento, el nombre de departamento y el nJmero de +mpleados del departamento con m0s +mpleados: SELECT E*DEPT!NO# D*DNOMBRE# COUNT (* FROM EMPLE E# DEPT D WHERE E*DEPT!NO = D*DEPT!NO %ROUP B5 E*DEPT!NO# D*DNOMBRE HAVIN% COUNT (* = (SELECT MA3(COUNT(* FROM EMPLE %ROUP B5 DEPT!NO; Si solamente /ueremos n< de departamento y nombre !no el nJmero de +mpleados): SELECT DEPT!NO# DNOMBRE FROM DEPT WHERE DEPT!NO IN (SELECT DEPT!NO FROM EMPLE %ROUP B5 DEPT!NO HAVIN% COUNT (* = (SELECT MA3(COUNT(* FROM EMPLE %ROUP B5 DEPT!NO;
23
).C Operadores de con#untos: *+IO+, I+T-RS-CT . /I+*S *+IO+ () combina los resultados de dos consultas7 Las #ilas duplicadas /ue aparecen se reducen a una #ila Jnica !elimina repetidos)7 aste es su #ormato S+L+* 2L1, 2L2, 777 ?-2% *&BL& 1 E,+-+ condici;n *+IO+ S+L+* 2L1, 2L2, 777 ?-2% *&BL&2 E,+-+ condici;n] 6isualizar los nombres de los alumnos actuales y de los #uturos alumnos SELECT NOMBRE FROM ALUM UNION SELECT NOMBRE FROM NUEVOS; () @ #ilas *+IO+ 'LL () combina los resultados de dos consultas7 ual/uier duplicaci;n de #ilas /ue se d8 en el resultado #inal aparecer0 en la consulta !no elimina repetidos): SELECT NOMBRE FROM ALUM UNION ALL SELECT NOMBRE FROM NUEVOS; () 12 #ilas por/ue no elimina los repetidos I+T-RS-CT () de"uel"e las #ilas /ue son i$uales en ambas consultas, eliminando cual/uier #ila duplicada /ue pudiera sur$ir7 +l #ormato es S+L+* 2L1, 2L2, 777 ?-2% *&BL& 1 E,+-+ condici;n I+T-RS-CT S+L+* 2L1, 2L2, 777 ?-2% *&BL&2 E,+-+ condici;n] 2btener los nombres de alumnos /ue est0n actualmente en el centro y /ue estu"ieron en el centro 1ace ya un tiempo7 SELECT NOMBRE FROM ALUM INTERSECT SELECT NOMBRE FROM ANTI%UOS; () 2 #ilas SELECT NOMBRE FROM ALUM WHERE NOMBRE IN (SELECT NOMBRE FROM ANTI%UOS; () ser=a otra #orma de 1acer la misma consulta /I+*S () de"uel"e a/uellas #ilas /ue est0n en la primera S+L+* y no est0n en la se$unda7 Las #ilas duplicadas se eliminan7 S+L+* 2L1, 2L2, 777 ?-2% *&BL&1 E,+-+ condici;n 2btener los nombres y la localidad de alumnos /ue est0n actualmente en el centro y /ue nunca estu"ieron anteriormente en 8l7 SELECT NOMBRE# LOCALIDAD FROM ALUM MINUS SELECT NOMBRE# LOCALIDAD FROM ANTI%UOS; La anterior consulta se puede 1acer tambi8n con 92* 59 SELECT NOMBRE# LOCALIDAD FROM ALUM WHERE NOMBRE NOT IN (SELECT NOMBRE FROM ANTI%UOS; 24
Seleccionar los nombres de la tabla &L:% /ue est8n en 9:+62S y no est8n en &9*5D:2S SELECT NOMBRE FROM ALUM WHERE NOMBRE IN (SELECT NOMBRE FROM NUEVOS MINUS SELECT NOMBRE FROM ANTI%UOS; () 2 #ilas 4odemos 1acer la consulta sin usar %59:S !usando &9D) SELECT NOMBRE FROM ALUM WHERE NOMBRE IN (SELECT NOMBRE FROM NUEVOS AND NOMBRE NOT IN (SELECT NOMBRE FROM ANTI%UOS; S+L+* 2L1, 2L2, 777 ?-2% *&BL&2 E,+-+ condici;n] 2btener los nombres y la localidad de alumnos /ue est0n actualmente en el centro y /ue nunca estu"ieron anteriormente en 8l7 SELECT NOMBRE# LOCALIDAD FROM ALUM MINUS SELECT NOMBRE# LOCALIDAD FROM ANTI%UOS; Re(las para la utilizacin 1) Las columnas de las dos consultas se relacionan en orden, de iz/uierda a derec1a 2) Los nombres de columna de la primera sentencia S+L+* no tienen por /u8 ser los mismos /ue los nombres de la se$unda 3) Las S+L+* necesitan tener el mismo nJmero de columnas 4) Los tipos de datos deben coincidir, aun/ue la lon$itud no tiene /ue ser la misma SELECT NOMBRE# EDAD FROM ALUM MINUS SELECT APELLIDO# SALARIO FROM EMPLE; () no /uitar0 nin$una #ila de la tabla &L:% Si intercambiamos el orden de las columnas aparecer0 error NOMBRE# EDAD SALARIO# APELLIDO Si el nJmero de columnas es di#erente en las S+L+* tambi8n tendremos error: SELECT NOMBRE# EDAD FROM ALUM MINUS SELECT APELLIDO FROM EMPLE; Los operadores se pueden encadenar, e"alu0ndose los conjuntos de iz/uierda a derec1a7 4ara #orzar la precedencia se pueden utilizar par8ntesis: (SELECT NOMBRE FROM ALUM UNION SELECT NOMBRE FROM ANTI%UOS MINUS SELECT NOMBRE FROM NUEVOS; () A #ilas SELECT NOMBRE FROM ALUM UNION (SELECT NOMBRE FROM ANTI%UOS MINUS SELECT NOMBRE FROM NUEVOS; () @ 2'
Formatos de Fecha La funcin TO_CHAR(<fecha>,<formato>) traduce una fecha/hora (o parte de ella) a una cadena de caracteres, y TO_DATE(<fecha>,<formato>) transforma una cadena de caracteres a una fecha, hora o combinacin fecha/hora. Por ejemplo, TO_DATE('02/08/2002', 'DD/MM/YYYY') dara la fecha 2 de agosto de 2002. Si suponemos que un atributo FECHA almacena esa misma fecha a las 3 de la tarde, TO_CHAR(FECHA, 'DD-MON-YYYY HH:MI AM') devolvera el string 02-AGO-2002 03:00 PM. El formato es una cadena de caracteres en la que se indica el formato siguiendo las claves que se muestran en la Tabla. Esta tabla no incluye absolutamente todos los formatos, pero s un buen nmero de ellos, que deberan ser ms que suficientes para un uso normal. Formatos de fecha en Oracle
Siglos y aos CC Siglo SCC Siglo. Si es AC (Antes de Cristo), lleva un signo YYYY Ao, formato de 4 dgitos SYYY Ao, formato de 4 dgitos. Si es AC lleva un signo YY Ao, formato de 2 dgitos YEAR Ao, escrito en letras y en ingls (por ejemplo, 'TWO THOUSAND TWO') SYEAR dem, pero si es AC lleva el signo BC Antes o Despus de Cristo (AC o DC) para usar con los anteriores, por ejemplo YYYY BC Meses Q Trimestre: Ene-Mar=1, Abr-Jun=2, Jul-Sep=3, Oct-Dic=4 MM Nmero de mes (1-12) RM Nmero de mes en nmeros romanos (I-XII) MONTH Nombre del mes completo rellenado con espacios hasta 10 espacios (SEPTIEMBRE) FMMONTH Nombre del mes completo, sin espacios adicionales MON Tres primeras letras del mes: ENE, FEB,... Semanas WW Semana del ao (1-52) W Semana del mes (1-5)
2A
Das DDD Da del ao (1-366) DD Da del mes (1-31) D Da de la semana (1-7) DAY Nombre del da de la semana rellenado a 9 espacios (MIRCOLES) FMDAY Nombre del da de la semana, sin espacios DY Tres primeras letras del nombre del da de la semana DDTH Da (ordinal): 7TH DDSPTH Da ordinal en palabra, en ingls: SEVENTH horas HH Hora del da (1-12) HH12 Hora del da (1-12) HH24 Hora del da (1-24) SPHH Hora del da, en palabra, ingls: SEVEN AM am o pm, para usar con HH, como 'HH:MI am' PM am o pm A.M. a.m. o p.m. P.M. a.m. o p.m. Minutos y segundos MI Minutos (0-59) SS Segundos (0-59) SSSS Segundos despus de medianoche (0-86399)