



(68 opiniones)
SQL es un conjunto de sentencias u órdenes que todos los programas y usuarios deben utilizar para acceder a bases de datos Oracle. No hay otra manera de comunicarse con Oracle si no es a través de SQL. Dado que SQL es un estándar, todas las bases de datos comerciales de la actualidad utilizan SQL como puente de comunicación entre la base de datos y el usuario.
SQL nació como a partir de una publicación de 1970 escrita por E.F. Cood, y titulada “A relational model of data for large shared data banks” (El modelo de datos relacionales para grandes bancos de datos compartidos). IBM utilizó el modelo planteado por Codd para desarrollar un lenguaje capaz de soportar el recién nacido modelo relacional y así apareció SEQUEL (Structured English QUEry Language). SEQUEL más tarde se convirtió en SQL (Structured Query Language) que continuó pronunciándose en inglés como su predecesor: SEQUEL. En 1979, una desconocida empresa llamada Relational Software, sacó por sorpresa al mercado la primera implementación comercial de SQL. Relational Software más tarde pasó a llamarse Oracle. Después de 20 años, SQL todavía es (y será) siendo el estándar en lenguajes de acceso a base de datos relacionales.
En 1992, ANSI e ISO (organizaciones que se encargan de establecer estándares de todo tipo), completaron la estandarización de SQL y se definió un conjunto de sentencias básicas que debía tener toda implementación para ser llamada estándar. Este SQL se le denominó ANSI-SQL o SQL92.
Hoy en día todas las bases de datos comerciales cumplen el estándar ANSI, aunque cada fabricante añade sus mejoras al lenguaje SQL.
En realidad SQL no es un lenguaje en si, como podría ser un lenguaje de programación de 3ª generación (C, Pascal…), sino que en un sublenguaje orientado a acceso y manipulación de base de datos relacionales. Con SQL como única herramienta sólo podemos acceder a las bases de datos, pero no tenemos las estructuras típicas de un lenguaje de programación. Una buena analogía podría ser un sistema operativo. El interfaz de comandos de un SO nos da todo lo que necesitamos para acceder al sistema de ficheros, pero sólo podemos hacer eso, acceder a ficheros.
SQL actúa de la misma manera, nos da todo lo que necesitamos para acceder a bases de datos, pero no podemos hacer más.
Se dice que SQL es estructurado porque trabaja con conjuntos de resultados (result set) abstractos como unidades completas. Un conjunto de resultados es el esquema básico de una tabla: N filas x N columnas. Este esquema se trata como un todo y es la idea principal de SQL. A la hora de recuperar un conjunto de resultados, éste se trata de la misma forma tenga el número de filas que tenga (0-N) y tenga el número de columnas que tenga (1-N). Además SQL es consistente, esto significa que los "estilos" de las distintas sentencias son uniformes, por lo que el aprendizaje es rápido.
Ya hemos visto anteriormente qué tipos de datos se pueden utilizar en Oracle. Y siempre que haya datos, habrá operaciones entre ellos, así que ahora se describirán qué operaciones y con qué operadores se realizan:
Los operadores se pueden dividir en dos conjuntos: · Aritméticos: utilizan valores numéricos · Lógicos (o booleanos o de comparación): utilizan valores booleanos o lógicos. · Concatenación: para unir cadenas de caracteres.
Operadores arítméticos Retornan un valor numérico: Operadores lógicos Retornan un valor lógico (verdadero o falso) (*) El operador LIKE sirve para hacer igualdades con comodines, al estilo * y ? de MS-DOS.
| Símbo lo | Significado | Ejemplo |
|---|---|---|
| + | Operación suma | 1 + 2 |
| - | Operación resta | 1 - 2 |
| * | Operación multiplicación | 1 * 2 |
| / | Operador división | 1 / 2 |
| Símbolo | Significado | Ejemplo |
|---|---|---|
| = | Igualdad | 1 = 2 |
| != <> ^= | Desigualdad | 1 != 2 1 <> 2 1 ^= 2 |
| > | Mayor que | 1 > 2 |
| < | Menor que | 1 < 2 |
| >= | Mayor o igual que | 1 >= 2 |
| <= | Menor o igual que | 1 <= 2 |
| IN (RS) | Igual a algún elemento del result set. | 1 IN (1,2) |
| [TRUE] | ||
| ANY SOME | 10 >= ANY (1,2,3,10) [TRUE] | |
| ALL | 10 <= ALL (1,2,3,10) [TRUE] | |
| BEETWEEN x AND y | Operando de la izquierda entre x e y. Equivalente a op >= x AND op <= y | 10 BETWEEN 1 AND 100 |
| EXISTS |
Si la |
EXISTS( SELECT 1 FROM DUAL) |
| LIKE(*) | Es como | 'pepe' LIKE |
| 'pe%' | ||
| IS NULL | Si es nulo | 1 IS NULL |
| IS NOT NULL | Si es No nulo | 1 IS NOT NULL |
| NOT cond. | Niega la condición posterios | NOT EXISTS… NOT BETWEEN NOT IN NOT = |
| cond AND cond | Hace un AND lógico entre dos condiciones | 1=1 AND 2 IS NULL |
| Cond OR cond | Hace un OR lógico entre dos condiciones | 1=1 OR 2 IS NULL |
Existen los siguientes comodines: %: Conjunto de N caracteres (de 0 a ∞) _: Un solo carácter
Ejemplo: Las siguientes condiciones retornarán el valor “verdadero” (TRUE)
'significado LIKE 's_gn%fi%d_' 'pepe' LIKE 'pep%' (los que empiecen por 'pep') 'pepote' LIKE 'pep%' 'pepote' LIKE 'pe%te' (los que empiecen por 'pe' y terminen por 'te') 'pedrote' LIKE 'pe%te'
Operador de concatenación Retornan una cadena de caracteres
Oracle puede hacer una conversión automática cuando se utilice este operador con valores numéricos: 10 || 20 = '1020'
Este proceso de denomina CASTING y se puede aplicar en todos aquellos casos en que se utiliza valores numéricos en puesto de valores alfanuméricos o incluso viceversa.
Todo valor (sea del tipo que sea) puede contener el valor NULL que no es más que la ausencia de valor. Así que cualquier columna (NUMBER, VARCHAR2, DATE…) puede contener el valor NULL, con lo que se dice que la columna está a NULL. Una operación retorna NULL si cualquiera de los operandos es NULL. Para comprobar si una valor es NULL se utiliza el operador IS NULL o IS NOT NULL.
El DML (Data Manipulation Language) es el conjunto de sentencias que está orientadas a la consulta, y manejo de datos de los objetos creados. El DML es un subconjunto muy pequeño dentro de SQL, pero es el más importante, ya que su conocimiento y manejo con soltura es imprescindible. Básicamente consta de cuatro sentencias: SELECT, INSERT, DELETE, UPDATE.
La sentencia SELECT es la encargada de la recuperación (selección) de datos, con cualquier tipo de condición, agrupación u ordenación. Una sentencia SELECT retorna un único conjunto de resultados, por lo que podrá ser aplicada en cualquier lugar donde se espere un conjunto de resultados.
La sintaxis básica es:
SELECT columnas FROM tablas WHERE condición GROUP BY columnas de agrupación HAVING condición agrupada ORDER BY columnas de ordenación;
Todas las cláusulas son opcionales excepto SELECT y FROM.
A continuación vamos a hacer una descripción breve de cada cláusula:
SELECT Se deben indicar las columnas que se desean mostrar en el resultado. Las distintas columnas deben aparecer separadas por coma (","). Opcionalmente puede ser cualificadas con el nombre de su tabla utilizando la sintaxis:
TABLA.COLUMNA
Si se quieren introducir todas las columnas se podrá incluir el carácter *, o bien TABLA.* Existe la posibilidad de sustituir los nombres de columnas por constantes (1, 'pepe' o '1-may-2000'), expresiones, pseudocolumnas o funciones SQL.
A toda columna, constante, pseudocolumna o función SQL, se le puede cualificar con un
nombre adicional: COLUMNA NOMBRE CONSTANTE NOMBRE PSEUDOCOLUMNA NOMBRE FUNCION SQL NOMBRE
Si se incluye la cláusula DISTINCT después de SELECT, se suprimirán aquellas filas del resultado que tenga igual valor que otras.
Así
SELECT C_CLIENTE FROM FACTURA;
Puede retornar 1, 3, 5, 5, 1, 7, 3, 2 y 9
Sin embargo, para el mismo caso:
SELECT DISTINCT C_CLIENTE FROM FACTURA;
Retornará (suprimiendo las repeticiones): 1, 3, 5, 7, 2 y 9
Ejemplos:
SELECT REFERENCIA REF, DESCRIPCION SELECT FACTURA.REFERENCIA, DESCRIPCION SELECT * SELECT FACTURA.* SELECT 1 UN_NUMERO_CTE_CUALIFICADO, REFERENCIA SELECT 1+1-3*5/5.4 UNA_EXPRESION_SIN_CUALIFICADA SELECT DESCRIPCION, ROWNUM UNA_PSEUDOCOLUMNA_CUALIFICADA SELECT TRUNC( '1-JAN-2001'+1, 'MON' ) FUNCION_CUALIFICADA SELECT DISTINCT * SELECT DISTINCT DESCRIPCION, IMPORTE SELECT REFERENCIA||DESCRIPCION
FROM se indican el(los) conjunto(s) de resultado(s) que interviene(n) en la consulta. Normalmente se utilizan tablas, pero se admite cualquier tipo de conjunto (tabla, select, vista…). Si apareciese más de una tabla, deben ir separadas por coma. Las tablas deben existir y si no existiera alguna aparecería el siguiente error:
ORA-00942: table or view does not exist
Al igual que a las columnas, también se puede cualificar a las tablas
TABLA NOMBRE
Oracle tiene definida una tabla especial, llamada DUAL, que se utiliza para consultar valores que no dependen de ninguna tabla.
SELECT (1+1.1*3/5)-1-2 FROM DUAL;
Ejemplos:
FROM FACTURA FAC FROM FACTURA FAC, CLIENTE CLI FROM DUAL FROM ( SELECT C_CLIENTE FROM FACTURA ) CLIENTE_FAC
WHERE Indica qué condiciones debe cumplirse para que una fila entre dentro del conjunto de resultados retornado. Para construir las condiciones se podrán utilizar todos los operadores lógicos vistos anteriormente. Es posible construir condiciones complejas uniendo dos o más condiciones simples a través de los operadores lógicos AND y OR.
Ejemplos:
WHERE FACTURA.REFERENCIA = 'AA3455' WHERE FACTURA.C_CLIENTE IS NULL WHERE C_CLIENTE BETWEEN '12' AND '20' WHERE C_CLIENTE IS NULL AND
REFERENCIA IN ('AA23344', 'BB23345') WHERE C_CLIENTE != 55 OR REFERENCIA LIKE 'AA%5_'
GROUP BY La expresión GROUP BY se utiliza para agrupar valores que es necesario procesar como un grupo. Por ejemplo, puede darse el caso de necesitar procesar todas las facturas de cada cliente para ver su total, o para contarlas, o para incrementarles un 10%… Para estos casos se haría un SELECT agrupando por C_CLIENTE. Un SELECT con GRUOP BY es equivalente a un SELECT DISTINCT, siempre y cuando en el SELECT no aparezcan consultas sumarias (ver apartado Funciones SQL).
Trataremos con más profundidad este tipo de consultas en el apartado "Consultas agrupadas".
HAVING Se utiliza para aplicar condiciones sobre agrupaciones. Sólo puede aparecer si se ha incluido la cláusula GROUP BY. Trataremos con más profundidad este tipo de consultas en el apartado "Consultas agrupadas".
ORDER BY Se utiliza para ordenar las filas del conjunto de resultados final. Dentro de esta cláusula podrá aparecer cualquier expresión que pueda aparecer en el SELECT, es decir, pueden aparecer columnas, pseudocolumnas, constantes (no tiene sentido, aunque está permitido), expresiones y funciones SQL. Como característica adicional, se pueden incluir números en la ordenación, que serán sustituidos por la columna correspondiente del SELECT en el orden que indique el número.
La ordenación es el último paso en la ejecución de una consulta SQL, y para ello Oracle suele necesitar crear objetos temporales que son creados en el tablespace Temporal. Por eso es recomendable hacer las ordenaciones del lado de cliente (siempre que sea posible), ya que el servidor puede cargarse bastante si tiene que hacer, por ejemplo, 300 ordenaciones de tablas de 2 millones de registros. Después de cada columna de ordenación se puede incluir una de las palabras reservadas ASC o DESC, para hacer ordenaciones ASCendentes o DESCendentes. Por defecto, si no se pone nada se hará ASC.
Ejemplos:
ORDER BY REFERENCIA ASC ORDER BY REFERENCIA DESC, C_CLIENTE DES, IMPORTE ASC ORDER BY C_CLIENTE ORDER BY 1, C_CLIENTE, 2 ORDER BY TRUNC( '1-JAN-2001'+1, 'MON' ) ORDER BY 1.1+3-5/44.3 -- no tiene sentido ordenar por una cte.
Consultas agrupadas
Una consulta agrupada se utiliza para considerar los registros cuyos ciertos campos tienen el mismo valor, y procesarlos de la misma manera, para contarlos, sumarlos, hacer la media… Las consultas típicas son para contar los registros de cierto tipos, sumar los importes de cierto cliente, etc. Por ejemplo, vamos a sacar el total del importe de las factura, por cliente:
SELECT C_CLIENTE, SUM(IMPORTE) FROM FACTURA GROUP BY C_CLIENTE;
Esto nos sumará (la función SUM suma su parámetro) los registro agrupando por cliente. Internamente Oracle tiene que hacer una ordenación interna de los registros, según las columnas incluidas en el GROUP BY, así que todo lo dicho para el ORDER BY (sobre la sorbecarga del servidor) se puede aplicar para el GROUP BY.
Cuando en la cláusula SELECT no se incluyen funciones SQL (para más información ver el apartado Funciones SQL), una consulta GROUP BY es equivalente a una consulta SELECT DISTINCT.
Un error muy común cuando se construyen consultas agrupadas, es el siguiente:
ORA-00979: not a GROUP BY expression
Esto es debido al modo que tiene Oracle de analizar las consultas agrupadas: Lo que hace es comprobar que todas las columnas incluidas en la cláusula SELECT fuera de funciones sumarias, estén dentro de la cláusula GROUP BY, aunque pueden estar en cualquier orden y en el GROUP BY pueden aparecer columnas que no estén en el SELECT. Si encuentra alguna columna en el SELECT (que no esté dentro de una función sumaria) que no aparezca en el GROUP BY, entonces nos retorna el error anterior. Si pensamos la situación, es lógico que nos retorne un error, porque no podemos agrupar por la columna C_CLIENTE, si luego queremos mostrar otras columnas que estén sin agrupar. O agrupamos por todo, o mostramos sin agrupar, pero ambas a la vez no es posible.
|