jueves, 2 de diciembre de 2010

Comandos Avanzados De SQL

Sentencias Avanzadas de SQL

Formas avanzadas SQL


Inserciones en múltiples filas
Una característica de SQL es el uso de constructores de filas para insertar múltiples filas a la vez, con una sola sentencia SQL:
INSERT INTO ''tabla'' (''columna1'', [''columna2,... '']) 
               VALUES (''valor1a'', [''valor1b,...'']), (''value2a'', [''value2b,...'']),...
Esta característica es soportada por DB2, PostgreSQL (desde la versión 8.2), MySQL, y H2.
Ejemplo (asumiendo que 'nombre' y 'número' son las únicas columnas en la tabla 'agenda _ telefónica'):
INSERT INTO agenda _ telefónica VALUES ('Roberto Fernández', '4886850'), 
                                                                             ('Alejandro Sosa', '4556550');
Que podía haber sido realizado por las sentencias
INSERT INTO agenda _ telefónica VALUES ('Roberto Fernández', '4886850');
INSERT INTO agenda _ telefónica VALUES ('Alejandro Sosa', '4556550');
Notar que las sentencias separadas pueden tener semántica diferente (especialmente con respecto a los triggers), y puede tener diferente rendimiento que la sentencia de inserción múltiple.
Para insertar varias filas en MS SQL puede utilizar esa construcción:
INSERT INTO phone_book
SELECT 'John Doe', '555-1212'
UNION ALL
SELECT 'Peter Doe', '555-2323';
Tenga en cuenta que no se trata de una sentencia SQL válida de acuerdo con el estándar SQL (SQL: 2003), debido a la cláusula subselect incompleta.
Para hacer lo mismo en Oracle se usa DUAL TABLE, siempre que se trate de solo una simple fila:
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM DUAL
UNION ALL
SELECT 'Peter Doe','555-2323' FROM DUAL
Una implementación conforme al estándar de esta lógica se muestra el siguiente ejemplo, o como se muestra arriba (no aplica en Oracle):
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM LATERAL (VALUES (1)) AS t(c)
UNION ALL
SELECT 'Peter Doe','555-2323' FROM LATERAL (VALUES (1)) AS t(c)
Copia de filas de otras tablas
Un INSERT también puede utilizarse para recuperar datos de otros, modificarla si es necesario e insertarla directamente en la tabla. Todo esto se hace en una sola sentencia SQL que no implica ningún procesamiento intermedio en la aplicación cliente. Un SUBSELECT se utiliza en lugar de la cláusula VALUES. El SUBSELECT puede contener JOIN, llamadas a funciones, y puede incluso consultar en la misma TABLA los datos que se inserta. Lógicamente, el SELECT se evalúa antes que la operación INSERT esté iniciada. Un ejemplo se da a continuación.
INSERT INTO phone_book2
 
SELECT *
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe')
Una variación es necesaria cuando algunos de los datos de la tabla fuente se están insertando en la nueva tabla, pero no todo el registro. (O cuando los esquemas de las tablas no son iguales.)
INSERT INTO phone_book2 ( [name], [phone Number] )
 
SELECT [name], [phone Number]
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe')
El SELECT produce una tabla (temporal), y el esquema de la tabla temporal debe coincidir con el esquema de la tabla donde los datos son insertados.

UPDATE

Una sentencia UPDATE de SQL es utilizada para modificar los valores de un conjunto de registros existentes en una tabla.

Forma básica

 UPDATE ''tabla'' 
SET ''columna1'' = ‘‘valor1’’, ‘‘columna2’’ = ''valor2'',...
 WHERE ''columnaN = ''valorN''

Ejemplo

UPDATE My_table SET field1 = 'updated value' WHERE field2 = 'N';

DELETE

Una sentencia DELETE de SQL borra uno o más registros existentes en una tabla,

Forma básica

 DELETE FROM ''tabla'' WHERE ''columna1'' = ''valor1''

Ejemplo

DELETE FROM My_table WHERE field2 = 'N';
 
 
 
 

Recuperación de clave

Los diseñadores de base de datos que usan una clave suplente como la clave principal para cada tabla, se ejecutará en el ocasional escenario en el que es necesario recuperar automáticamente la base de datos, generando una clave primaria de una sentencia SQL INSERT para su uso en otras sentencias SQL. La mayoría de los sistemas no permiten sentencias SQL INSERT para retornar fila de datos. Por lo tanto, se hace necesario aplicar una solución en tales escenarios.
Implementaciones comunes incluyen:
  • Utilizando un procedimiento almacenado especifico de base de datos que genera la clave suplente, realice la operación INSERT, y finalmente devuelve la clave generada.
  • Utilizando una sentencia SELECT específica de base de datos, sobre una tabla temporal que contiene la última fila insertada. DB2 implementa esta característica de la siguiente manera:
SELECT *
FROM NEW TABLE ( INSERT INTO phone_book VALUES 
                                    ( 'Cristobal Jeldrez','0426.817.10.30' ) ) 
  • Utilizando una sentencia SELECT después de la sentencia INSERT con función específica de base de datos, que devuelve la clave primaria generada por el registro insertado más recientemente.
  • Utilizando una combinación única de elementos del original SQL INSERT en una posterior sentencia SELECT.
  • Utilizando un GUID en la sentencia SQL INSERT y la recupera en una sentencia SELECT.
  • Utilizando la función de PHP mysql_insert_id () de MySQL después de la sentencia INSERT.
  • Utilizando un INSERT con la cláusula RETURNING para Oracle, que sólo se puede utilizar dentro de un PL/SQL bloque, en el caso de PostgreSQL se puede usar también tanto con SQL como con PL/SQL.
INSERT INTO phone_book VALUES (‘Cristobal Jeldrez',’0426.817.10.30’)
RETURNING phone_book_id INTO v_pb_id
  • En el caso de MS SQL se puede utilizar la siguiente instrucción:
SET NoCount ON;
INSERT INTO phone_book VALUES (‘Cristobal Jeldrez',’0426.817.10.30’);
SELECT @@Identity AS ID


La sentencia SELECT

    La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos.
    El formato de la sentencia select es:

SELECT [ALL | DISTINCT ]
             <nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>|<nombre_vista>
        [{,<nombre_tabla>|<nombre_vista>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC]
                [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]


    Veamos por partes que quiere decir cada una de las partes que conforman la sentencia.

Significada

SELECT: Palabra clave que indica que la sentencia de SQL que queremos ejecutar es de selección. 

 
ALL: Indica que queremos seleccionar todos los valores.Es el valor por defecto y no suele especificarse casi nunca.


 
DISTINCT: Indica que queremos seleccionar sólo los valores distintos.


FROM: Indica la tabla (o tablas) desde la que queremos recuperar los datos. En el caso de que exista más de una tabla se denomina a la consulta "consulta combinada" o "join". En las consultas combinadas es necesario aplicar una condición de combinación a través de una cláusula WHERE.


WHERE: Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Admiten los operadores lógicos AND y OR.


GROUP BY: Especifica la agrupación que se da a los datos. Se usa siempre en combinación con funciones agregadas.


HAVING: Específica una condición que debe cumplirse para los datos especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Su funcionamiento es similar al de WHERE pero aplicado al conjunto de resultados devueltos por la consulta. Debe aplicarse siempre junto a GROUP BY y la condicion debe estar referida a los campos contenidos en ella.


ORDER BY: Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado es ASC.


    Para formular una consulta a la tabla tCoches (creada en el capítulo de tablas) y recuperar los campos matricula, marca, modelo, color, numero_kilometros, num_plazas debemos ejecutar la siguiente consulta. Los datos serán devueltos ordenados por marca y por modelo en orden ascendente, de menor a mayor.

SELECT matricula, 
                marca,
                modelo,
                color,
                numero_kilometros,
                num_plazas 
FROM tCoches
ORDER BY marca, modelo ;

    La palabra clave FROM  indica que los datos serán recuperados de la tabla tCoches. Podríamos haber especificado mas de una tabla, pero esto se verá en el apartado de consultas combinadas.
    También podríamos haber implicado la consulta a través del uso del comodín de campos, el asterisco "*".

SELECT *
FROM tCoches
ORDER BY marca,modelo;

    El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla.
La cláusula WHERE
    La cláusula WHERE es la instrucción que nos permite filtrar el resultado de una sentencia SELECT.  Habitualmente no deseamos obtener toda la información existente en la tabla, sino que queremos obtener sólo la información que nos resulte útil es ese momento. La cláusula WHERE filtra los datos antes de ser devueltos por la consulta.
    En nuestro ejemplo, si queremos consultar un coche en concreto debemos agregar una cláusula WHERE. Esta cláusula especifica una o varias condiciones que deben cumplirse para que la sentencia SELECT devuelva los datos. Por ejemplo, para que la consulta devuelva sólo los datos del coche con matricula M-1525-ZA debemos ejecutar la siguiente sentencia:

SELECT matricula,
                marca,
                modelo,
                color,
                numero _ kilómetros,
                num_plazas
FROM coches
WHERE matricula = 'M-1525-ZA';

             Cuando en una cláusula where queremos incluir un tipo texto, debemos incluir el valor entre comillas simples.
    Además, podemos utilizar tantas condiciones como queramos, utilizando los operadores lógicos AND y OR. El siguiente ejemplo muestra una consulta que devolverá los coches cuyas matriculas sean M-1525-ZA o bien M-2566-AA. 


SELECT
matricula,
             marca,
             modelo,
             color,
             numero_kilometros,
             num_plazas
FROM tCoches
WHERE matricula = 'M-1525-ZA'
        OR matricula = 'M-2566-AA' ;

    Además una condición WHERE puede ser negada a través del operador lógico NOT. La siguiente consulta devolverá todos los datos de la tabla tCohes menos el que tenga matricula M-1525-ZA.


SELECT
matricula,
             marca,
             modelo,
             color,
             numero_kilometros,
             num_plazas
FROM tCoches
WHERE NOT matricula = 'M-1525-ZA'  ;

    Podemos también obtener las diferentes marcas y modelos de coches ejecutando la consulta.

SELECT DISTINCT
marca,
                                  modelo
FROM tCoches;
 
    La ver los valores distintos. En el caso anterior se devolverán palabra clave DISTINCT indica que sólo queremos os valores distintos del par formado por los campos marca y modelo
-.La cláusula ORDER BY
    Como ya hemos visto en los ejemplos anteriores podemos especificar el orden en el que serán devueltos los datos a través de la cláusula ORDER BY.

SELECT matricula, 
                marca,
                modelo,
                color,
                numero_kilometros,
                num_plazas 
FROM tCoches
ORDER BY marca ASC,modelo DESC;
    Como podemos ver en el ejemplo podemos especificar la ordenación ascendente o descendente a través de las palabras clave ASC y DESC. La ordenación depende del tipo de datos que este definido en la columna, de forma que un campo numérico será ordenado como tal, y un alfanumérico se ordenará de la A a la Z, aunque su contenido sea numérico. De esta forma el valor 100 se devuelve antes que el 11.
    También podemos especificar el en la cláusula ORDER BY el índice numérico del campo dentro del la sentencia SELECT para la ordenación, el siguiente ejemplo ordenaría los datos por el campo marca, ya que aparece en segundo lugar dentro de la lista de campos que componen la SELECT.

SELECT matricula, 
                marca,
                modelo,
                color,
                numero_kilometros,
                num_plazas 
FROM tCoches
ORDER BY 2;
    El resto de opciones que podemos especificar al construir sentencias SELECT se irán presentando en los siguientes capítulos de este tutorial.
 
Integrantes:
Angel Hurtado
Jimenez Eliana

1 comentario: