Capítulo 3. El lenguaje SQL.
SQL (Structured Query Language) es un lenguaje de programación para acceder y manipular bases de datos.
SQL surgió de un proyecto de IBM en el que investigaba el acceso a bases de datos relacionales. Esto poco a poco se ha ido convirtiendo en un estándar de lenguaje de bases de datos y gran parte de ellas lo soportan. Por esta razón, se considera a SQL como un lenguaje normalizado, que nos permite interactuar con cualquier tipo de base de datos (MS Access, SQL Server, MySQL…)
Básicamente SQL está formado por dos tipos de comandos:
– DDL que permiten crear y definir nuevas bases de datos, campos e índices.
– DML que permiten generar consultas para ordenar, filtrar, insertar, modificar y extraer datos de la base de datos.
En este capítulo se usarán solamente los comandos DML, dejándose los comandos DDL para el capítulo correspondiente a MySQL, desde el cual se crearán las tablas y sus campos de forma visual desde su página gestora. También podremos realizar las operaciones correspondientes a los comandos DML desde la página de MySQL, pero su utilidad principal será desde las páginas PHP que creemos.
Para los comandos SQL usaremos la siguiente nomenclatura:
– Las palabra clave del lenguaje SQL se pondrán en mayúsculas (aunque los gestores de Bases de Datos funcionan indistintamente en mayúsculas, minúsculas o aunque mezclemos ambas en una palabra). Ejemplos de estas palabras son: SELECY, FROM, INSERT, ORDER, etc.
– Entre corchetes cuadrados indicaremos las partes de un comando opcional. Si además aparecen varias opciones separadas por la barra “|” esto nos indica que podremos usar una u otra, pero no las dos.
– Entre las llaves “{“ y “}” indicaremos las partes del comando que pueden aparecer varias veces.
– Entre los símbolos “<“ y “>” indicaremos qué deberemos de poner en ese lugar y que lo sustituiremos por el texto correspondiente, por ejemplo, por el nombre de una tabla o de un campo (sin poner esos símbolos).
– Se recomienda el uso del “sangrado” para indicar que una parte de un comando está incluida en la parte del comando que aparece en la línea anterior (un comando podrá necesitar más de una línea, por eso se recomienda el uso del “sangrado”).
Recordamos al alumno que el objetivo de este curso no es conocer perfectamente SQL, por lo que se verán las instrucciones más importantes y sin entrar en detalle en ellas.
Para los siguientes ejemplos vamos a suponer que las tablas del ejemplo “cursosprofesores” contienen los siguientes datos:
CodProfesor | DNI | Nombre | Apellidos |
1 | 15754658L | Carlos | García López |
2 | 14587465M | Pedro | Rodríguez Abad |
3 | 28456474B | Carlos | Martínez Díaz |
4 | 36574834A | Manuel | Arroyo Gil |
CURSOS:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 1 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |
OFI01 | Ofimática: Word y Excel. | 2 |
OFI02 | Ofimática: Writer y Calc. | 2 |
OFI03 | Ofimática Avanzada: Word, Escel. | 2 |
Notese que para cada ejercicio siempre vamos a partir de estas tablas, aunque en un ejercicio anterior se haya modificado alguna de ellas.
Esta instrucción nos permite “seleccionar” información de la Base de Datos. Su sintaxis general es la siguiente:
SELECT [ALL | DISTINCT ] <nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla> [{,<nombre_tabla>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo>}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
[ORDER BY <nombre_campo> [ASC | DESC]
[{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
Aunque no veremos todas sus posibilidades, vamos a ir poco a poco viendo sus posibles usos basándonos en las tablas del ejemplo “cursos-profesores”.
SELECT *
FROM Profesores;
El resultado será:
CodProfesor | DNI | Nombre | Apellidos |
1 | 15754658L | Carlos | García López |
2 | 14587465M | Pedro | Rodríguez Abad |
3 | 28456474B | Carlos | Arroyo Díaz |
4 | 36574834A | Manuel | Martínez Gil |
Como podemos ver nos muestra tanto todos los campos de la tabla “Profesores” (esto viene indicado por el asterísco) como todos los profesores.
Además, y como se puede ver, es recomendable terminar la instrucción con un punto y coma.
En este caso como sólo queremos ver el nombre y los apellidos sustituimos el asterísco por esa información:
SELECT Nombre, Apellidos
FROM Profesores;
Observemos que la lista de campos que queremos obtener está separada por una coma. Y la solución será:
Nombre | Apellidos |
Carlos | García López |
Pedro | Rodríguez Abad |
Carlos | Arroyo Díaz |
Manuel | Martínez Gil |
SELECT Nombre, Apellidos
FROM Profesores
WHERE CodProfesor > 2;
Y el resultado será:
Nombre | Apellidos |
Carlos | Arroyo Díaz |
Manuel | Martínez Gil |
En los ejemplos anteriores vemos que el listado normalmente saldrá en el orden en que se dieron de alta los profesores. Para que nos salgan los datos ordenados usaremos ORDER:
SELECT *
FROM Profesores
ORDER BY Nombre;
Y el resultado será:
CodProfesor | DNI | Nombre | Apellidos |
1 | 15754658L | Carlos | García López |
3 | 28456474B | Carlos | Arroyo Díaz |
4 | 36574834A | Manuel | Martínez Gil |
2 | 14587465M | Pedro | Rodríguez Abad |
Como puede observarse salen ordenados por nombre, pero en el caso de que haya dos profesores con el mismo nombre posiblemente aparezcan en el orden en que se dieron de alta, esto dependerá del Sistema Gestor de Bases de Datos
SELECT *
FROM Profesores
ORDER BY Nombre, Apellidos;
Y el resultado será:
CodProfesor | DNI | Nombre | Apellidos |
3 | 28456474B | Carlos | Arroyo Díaz |
1 | 15754658L | Carlos | García López |
4 | 36574834A | Manuel | Martínez Gil |
2 | 14587465M | Pedro | Rodríguez Abad |
En este ejemplo vamos a ver como obtener datos de dos tablas a través de la relación que existe entre ellas con el campo “CodProfesor”.
SELECT Profesores.Nombre, Cursos.CodCurso, Cursos.Nombre
FROM Profesores, Cursos
WHERE Profesores.Nombre = ‘Carlos’
AND Profesores.CodProfesor = Cursos.CodProfesor;
Y el resultado será:
Nombre | CodCurso | Nombre |
Carlos | PHP01 | Introducción al PHP |
Carlos | PHP02 | PHP. Acceso a Bases de Datos |
En la instrucción podemos observar varias cosas:
– Cuando tenemos varias tablas y en ellas hay campos con el mismo nombre (en este caso el campo “Nombre”) debemos poner delante el nombre de la tabla seguido de un punto para hacer referencia a dicho campo:
“Profesores.Nombre”, “Profesores.CodProfesor”, etc.
– Cuando usamos el signo igual para compararlo con un número no hacía falta poner las comillas, pero en el caso de querer compararlo con un texto (en este caso con el nombre “Carlos”) debemos ponerlo entre comillas.
– Si necesitamos que se cumplan varias condiciones en el WHERE usaremos AND si estas condiciones se han de complir simultáneamente, y usaremos OR si es sufuciente con que se cumpla sólo alguna de ellas.
– Para expresar la relación entre dos tablas usaremos la igualdad entre los campos que hacen referencia a dicha relación entre las dos tablas (o más si fuera necesario): “Profesores.CodProfesor = Cursos.CodProfesor”.
Esta instrucción nos permite “insertar” información de la Base de Datos. Su sintaxis general es la siguiente:
INSERT INTO <nombre_tabla>
[(<campo1>[,<campo2>,…])]
VALUES (<valor1>,<valor2>,…);
Las inserciones sólo se pueden hacer de una en una, es decir, si deseamos insertar 3 nuevos registros deberemos hacer 3 veces esta instrucción: una para cada nuevo registro.
A continuación veremos unos ejemplos de esta instrucción.
INSERT INTO Cursos
VALUES (‘PRG01’, ‘Programación en C’, 4);
Esta instrucción nos insertará un registro nuevo, y la tabla “Cursos” quedará como:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 1 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |
OFI01 | Ofimática: Word y Excel. | 2 |
OFI02 | Ofimática: Writer y Calc | 2 |
OFI03 | Ofimática Avanzada: Word, Escel. | 2 |
PRG01 | Programación en C | 4 |
En el ejemplo vemos que en caso de no indicar los campos que vamos a rellenar, se toma por defecto que vamos a darle valor a todos los campos en el orden en los que aparecen definidos. Si no queremos dar valor a todos los campos deberemos indicar a cuales vamos a darselo (ver siguiente ejemplo).
INSERT INTO Cursos CodCurso, Nombre
VALUES (‘PRG01’, ‘Programación en C’);
Esta instrucción nos insertará un registro nuevo, y la tabla “Cursos” quedará como:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 1 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |
OFI01 | Ofimática: Word y Excel. | 2 |
OFI02 | Ofimática: Writer y Calc | 2 |
OFI03 | Ofimática Avanzada: Word, Escel. | 2 |
PRG01 | Programación en C |
Podemos observar que no le hemos asignado profesor (CodProfesor) al curso, por lo que éste aparecerá con valor nulo. Entonces pueden pasar varias cosas:
– Si el campo no acepta nulos (esto se indica cuando definimos los campos): la instrucción dará error.
– Que se guarde el registro y que a los campos que no se les ha indicado nada re pongan a “nulo”.
– Que se guarde el registro y que a los campos que no se les ha indicado nada tomen un valor por defecto (que se indicó al definirlos), o un valor “automático” (cuando se definió de tipo autoincremental).
INSERT INTO Profesores DNI, Nombre, Apellidos
VALUES (‘27345463E’, ‘Luis’, ‘Olmos Pérez’);
Esta instrucción nos insertará un registro nuevo, y la tabla “Profesores” quedará como:
CodProfesor | DNI | Nombre | Apellidos |
1 | 15754658L | Carlos | García López |
2 | 14587465M | Pedro | Rodríguez Abad |
3 | 28456474B | Carlos | Martínez Gil |
4 | 36574834A | Manuel | Arroyo Díaz |
5 | 27345463E’ | Luis’ | Olmos Pérez’ |
Y podemos observar que el campo CodProfesor, de tipo autoincremental, toma el siguiente valor.
Esta instrucción nos permite “actualizar” información de la Base de Datos. Su sintaxis general es la siguiente:
UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,…,<campoN> = <valorN>]}
[WHERE <condicion>];
Las actualizaciones pueden afectar a uno, varios o a todos los registros de una tabla de la Base de Datos. Con esta instrucción (igual que con la de borrado) debemos tener cuidado por que es muy importante usar la opción “WHERE” (aunque sea opcional) pues si no la ponemos nos actualizará todos los registros de la tabla.
UPDATE Cursos
SET CodProfesor = 4
WHERE CodCurso = ‘PHP01’;
La tabla “Cursos” quedará:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 4 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |
OFI01 | Ofimática: Word y Excel. | 2 |
OFI02 | Ofimática: Writer y Calc | 2 |
OFI03 | Ofimática Avanzada: Word, Escel. | 2 |
Normalmente en la condición se usará con el campo clave de la tabla para así conseguir que sólo afecte el cambio a un registro (como en el ejemplo anterior), pero podemos usar cualquier campo y condición (como en este ejemplo).
UPDATE Cursos
SET CodProfesor = 4
WHERE CodProfesor = 2;
La tabla “Cursos” quedará como:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 1 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |
OFI01 | Ofimática: Word y Excel. | 4 |
OFI02 | Ofimática: Writer y Calc | 4 |
OFI03 | Ofimática Avanzada: Word, Escel. | 4 |
Vemos que se han realizado cambios en 3 registros.
Esta instrucción nos permite “borrar” información de la Base de Datos. Su sintaxis general es la siguiente:
DELETE FROM <nombre_tabla>
[WHERE <condicion>];
El borrado puede afectar a uno, varios o a todos los registros de la Base de Datos. Hemos de tener en cuenta que aunque borremos todos los registros, la tabla seguirá existiendo, aunque sin datos. Para borrar la tabla o su estructura existen otras órdenes que no usaremos por que en caso de necesitarlo podremos hacerlo desde pmpMyAdmin de forma más sencilla (igual que cuando hemos creado la tabla).
Esta instrucción es muy sencilla, pero debermos tener en cuenta una cosa: no debemos de borrar un profesor si éste tiene cursos asignados. Esto aveces es imposible: cuando al definir la tabla “Cursos” le hemos indicado que “CodProfesor” es referencia a otra tabla (“Profesores”) y que no puede tener valores nulos.
DELETE FROM Cursos
WHERE CodCurso = ‘OFI03’;
La tabla “Cursos” quedará como:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 1 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |
OFI01 | Ofimática: Word y Excel. | 4 |
OFI02 | Ofimática: Writer y Calc | 4 |
– Borrar los cursos del profesor Pedro.
DELETE FROM Cursos
WHERE CodProfesor = 2;
La tabla “Cursos” quedará como:
CodCurso | Nombre | CodProfesor |
PHP01 | Introducción al PHP | 1 |
PHP02 | PHP. Acceso a Bases de Datos | 1 |