SQL-La orden SELECT

Cuando necesitamos recuperar información desde una base de datos, utilizaremos el comando SELECT. Este comando, espera que le indiquemos las condiciones de búsqueda que han de cumplir los registros, y a partir de las mismas nos construye una vista con las columnas pedidas.

SELECT  FROM 
      [ WHERE  ]
      [ ORDER BY  ]

La orden SELECT nos permite indicar una lista de campos a recuperar, o un * si queremos recuperarlos todos, y espera que le indiquemos de que tabla o tablas son esos campos.

Oracle- Sentencia SQL

Como vemos en la imagen, nos permite especificar la lista de las columnas que queremos devolver, la tabla que deseamos leer, la condición que queremos que cumplan las columnas que queremos seleccionar, y podemos también, indicar el orden en que queremos que se seleccionen las filas , indicando los campos y si ha de ser ascendente o descendente.

Veamos sus posibilidades en detalle:

En la lista de campos, podemos especificar:

  • Cualquier/todos los campos de las tablas que figuren en FROM. Si un nombre de columna aparece repetido en mas de una tabla, indicaremos el nombre de la tabla, punto (.) y el nombre del campo.
    SELECT cliente.id, pedido.id, nombrecliente, .....
  • Podemos especificar funciones aritméticas (suma como +, resta como -, multiplicación como *, división como /)
    SELECT  id, nombre, sueldo * 12, ....
  • Podemos definir alias para los nombres de columna, tanto para que sirvan de identificador en nuestros programas, como para que aparezcan como cabecera de columna en las presentaciones
    SELECT id, nombre, sueldo*12 AS Salario_Anual, .....

Tras la clausula FROM podemos especificar:

  • las tablas que intervienen en la consulta
SELECT id, nombre, direccion FROM clientes,....
  • Les podemos asignar alias, y utilizar dichos alias en vez del nombre de las tablas
    SELECT c.id, c.nombre, d.nombre,....FROM cliente c, departamento d, .........
  • Si utilizamos mas de una tabla, deberemos especificar las condiciones de relación, que veremos mas adelante.

En la clausula WHERE, deberemos indicar la(s) condición(es) que deberá cumplir una fila,  para aparecer en la consulta;

SELECT * FROM clientes WHERE id>10

Por ejemplo, seleccionar todos los clientes que tengan un ID mayor que 10.

Las distintas condiciones, las podemos enlazar con relaciones AND y OR, así como utilizar paréntesis para controlar el orden de ejecución.

En la ultima parte del SELECT podemos indicar si queremos realizar la seleccion ordenada por alguna columna, y en que orden (ascendente/descendente. Para ello, podemos especificar:

SELECT ... FROM ... WHERE ... ORDER BY id DESC

para una selección clasificada por «id», de forma descendente, o

SELECT ... FROM ... WHERE ... ORDER BY nombre

para una selección clasificada por nombre de forma ascendente.

Ejemplos:

Para empezar con las pruebas, deberemos crear una base de datos, unas tablas e insertar algunos registros. Mas adelante explicaremos porque ponemos lo que ponemos, ahora solo abrir SQLDeveloper con una conexión de administración y pegar los scripts:

Creación tabla de clientes

 CREATE TABLE "CLIENTES" 
 ( "ID" NUMBER NOT NULL ENABLE, 
 "USUARIO" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
 "PASSWORD" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
 "NOMBRE" VARCHAR2(200 BYTE), 
 "DIRECCION" VARCHAR2(200 BYTE), 
 "POBLACION" VARCHAR2(50 BYTE), 
 "PROVINCIA" NUMBER, 
 "FECHA_ALTA" DATE, 
 CONSTRAINT "CLIENTES_PK" PRIMARY KEY ("ID"));
 

 CREATE INDEX "CLIENTES_PROVINCIAS" ON "CLIENTES" ("PROVINCIA"); 

Creación tabla de provincias

 CREATE TABLE "PROVINCIA" 
 ( "ID_PROVINCIA" NUMBER NOT NULL ENABLE, 
 "NOMBRE_PROVINCIA" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
 "ID_PAIS" NUMBER NOT NULL ENABLE, 
 CONSTRAINT "PROVINCIA_PK" PRIMARY KEY ("ID_PROVINCIA"));
 
 CREATE OR REPLACE TRIGGER "PROVINCIA_TRG" 
BEFORE INSERT ON PROVINCIA 
FOR EACH ROW 
BEGIN
 <>
 BEGIN
 NULL;
 END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "PROVINCIA_TRG" ENABLE;

 CREATE OR REPLACE TRIGGER "PROVINCIA_TRG1" 
BEFORE INSERT ON PROVINCIA 
FOR EACH ROW 
BEGIN
 <>
 BEGIN
 IF INSERTING AND :NEW.ID_PROVINCIA IS NULL THEN
 SELECT PROVINCIA_SEQ1.NEXTVAL INTO :NEW.ID_PROVINCIA FROM SYS.DUAL;
 END IF;
 END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "MIGARCIA"."PROVINCIA_TRG1" ENABLE;

Creación tabla País:

 CREATE TABLE "PAIS" 
 ( "ID_PAIS" NUMBER NOT NULL ENABLE, 
 "NOMBRE_PAIS" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
 CONSTRAINT "PAIS_PK" PRIMARY KEY ("ID_PAIS"));

 CREATE OR REPLACE TRIGGER "PAIS_TRG" 
BEFORE INSERT ON PAIS 
FOR EACH ROW 
BEGIN
 <>
 BEGIN
 IF INSERTING AND :NEW.ID_PAIS IS NULL THEN
 SELECT PAIS_SEQ.NEXTVAL INTO :NEW.ID_PAIS FROM SYS.DUAL;
 END IF;
 END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "PAIS_TRG" ENABLE;

Insertando datos en las tablas

SET DEFINE OFF;
--------------------------------------------------------
-- Tabla de Paises
--------------------------------------------------------
REM INSERTING into PAIS

Insert into PAIS (ID_PAIS,NOMBRE_PAIS) values ('1','España');

--------------------------------------------------------
-- Tabla de provincias
--------------------------------------------------------
REM INSERTING into PROVINCIA

Insert into PROVINCIA (ID_PROVINCIA,NOMBRE_PROVINCIA,ID_PAIS) values ('1','Barcelona','1');
Insert into PROVINCIA (ID_PROVINCIA,NOMBRE_PROVINCIA,ID_PAIS) values ('6','Tarragona','1');
Insert into PROVINCIA (ID_PROVINCIA,NOMBRE_PROVINCIA,ID_PAIS) values ('7','Lerida','1');
Insert into PROVINCIA (ID_PROVINCIA,NOMBRE_PROVINCIA,ID_PAIS) values ('10','Gerona','1');

--------------------------------------------------------
-- Tabla de clientes
--------------------------------------------------------
REM INSERTING into CLIENTES

Insert into CLIENTES (ID,USUARIO,PASSWORD,NOMBRE,DIRECCION,POBLACION,PROVINCIA,FECHA_ALTA) values ('1','miguel','miguel','Miguel Garcia','Pez 5','Barcelona','1',to_date('18/10/95','DD/MM/RR'));
Insert into CLIENTES (ID,USUARIO,PASSWORD,NOMBRE,DIRECCION,POBLACION,PROVINCIA,FECHA_ALTA) values ('2','antonio','antonio','Antonio Perez','Acuario 32 1º','Barcelona','1',to_date('20/03/06','DD/MM/RR'));
Insert into CLIENTES (ID,USUARIO,PASSWORD,NOMBRE,DIRECCION,POBLACION,PROVINCIA,FECHA_ALTA) values ('3','jjose','jjose','Jose Rodriguez','Marsalada 123 ','Barcelona','7',to_date('12/05/14','DD/MM/RR'));

Una vez cargados los datos, podemos empezar con las pruebas

1-Listar las columnas id, usuario, nombre y población de la tabla de clientes

SELECT SQL Ejemplo

2-Ver en cuantas poblaciones tenemos clientes

 Vamos a utilizar la clausula DISTINCT:

SELECT. Clausula DISTINCT

3-Presentar nombre de cliente, población y provincia

Indicamos los campos que queremos de las dos tablas, las tablas implicada y como se relacionan, que en este campo se hacen con dos columnas con distinto nombre

SELECT con WHERE

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, SQL y etiquetada . Guarda el enlace permanente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.