Iniciación a Oracle - Lenguaje estructurado de consultas SQL (1)

8 - Lenguaje estructurado de consultas SQL (1)

[editar]
Curso gratis creado por José Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999

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.

Historia

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.

SQL como lenguaje estructurado

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.

Operadores SQL

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 a algún elemento del result set (derecha). Debe ser estar precedido por =, !=, <, <=, >, >= Hace un OR lógico entre todos los elementos. 10 >= ANY (1,2,3,10) [TRUE]
ALL a todos los elementos del result set (derecha), Debe ser estar precedido por =, !=, <, <=, >, >= Hace un AND lógico entre todos los elementos. 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 retorna al menos una fila 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.

La ausencia de valor: NULL

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.

Lenguaje de manipulación de datos: DML

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.

Instrucción SELECT

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 mediaLas 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.

[editar]

80 opiniones

hai

muy bueno
Muy bueno!

Esta muy buena la explicacion, la verdad es que pude entender muy bien como va el proceso de Almacenamiento de Datos. Excelente!
Hola

Hola
alamacenamiento oracle

esta bueno para aquellas personas que se estan iniciando en Oracle
nadaaaaaaaaaaa

le verdad no me gusto porque yo buscaba elementos de SQL y no los encontre
1 2 3 4 5 6 7 ... 16 | siguiente >

Cursos gratis relacionados con 'Iniciación a Oracle'

El más completo curso de Oracle.

Autor y licencia de 'Iniciación a Oracle'


Curso gratis de José Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.