Aprendiendo PHP, parte 25: Introducción a MySQL, registros

Como dijimos anteriormente, las tablas están compuestas por registros, por ejemplo en nuestra tabla nacionalidad, cada registro será, valga la redundancia, una nacionalidad. Pero para trabajar con esos registros debemos aprendernos las cuatro operaciones, que son insertar, modificar, eliminar y mostrar registros. Comencemos.

Vamos a asegurarnos como siempre que tanto nuestro servicio de Apache y MySQL estén encendidos. A esta altura ya deberíamos tenerlo bien claro, pero por las dudas:

Vamos a abrir el navegador y vamos a ir a:

https://localhost/phpmyadmin/

Y una vez dentro vamos a hacer clic en la base de datos con la que venimos trabajando hace tiempo que es mi_primer_db.

Insertar registros

Dentro del campo de ingreso SQL, (para ir, hay que pulsar el botón SQL) vamos a insertar nuestro primer registro.

La sintaxis para esto es la siguiente:

INSERT INTO tabla(atributo1, atributo2)
VALUES(valor_atributo1, valor_atributo2);

Sabiendo esto, vamos a insertar una nacionalidad con el siguiente código:

INSERT INTO nacionalidad(valor)
VALUES('Argentina');

Bien, en primer lugar, esta tabla tiene dos atributos, nacionalidad_id y valor, pero el primer atributo podemos ignorarlo, porque al ser auto_increment, como dijimos en la publicación anterior, se irá auto incrementados de a 1, 2, 3 y así sucesivamente, a medida que insertemos nuevos registros.

Otra cosa que hay que tener en cuenta es que el atributo valor, es un varchar, osea una cadena de texto, por tanto debe ir entre comillas:

'Argentina'

También podemos insertar de a varios registros:

INSERT INTO nacionalidad(valor)
VALUES('Brasil');
INSERT INTO nacionalidad(valor)
VALUES('Paraguay');
INSERT INTO nacionalidad(valor)
VALUES('Uruguay');

Otra forma de insertar registros es ingresando la sintaxis de INSERT INTO (atributos) e ir separando por coma los values:

INSERT INTO nacionalidad(valor)
VALUES
('Bolivia'),
('Chile'),
('Perú'),
('Colombia'),
('Ecuador'),
('Venezuela');

Ambas formas son correctas.

Sabiendo esto podemos insertar un registro que esté ligado a otro, por ejemplo podemos insertar un usuario con la nacionalidad 1, en mi caso ‘Argentina’:

INSERT INTO usuario(nombre, apellido, email, contrasena, fecha_alta, fecha_modificacion, nacionalidad_id)
VALUES('Juan', 'Pérez', 'jperez@mail.com', '1234', sysdate(), sysdate(), 1);

En primer lugar, para guardar el valor de la fecha_alta y fecha_modificacion, usamos la función sysdate(), que nos devolverá la fecha y hora actual, en donde se está insertando el registro. También podríamos haber puesto la fecha y hora manualmente:

INSERT INTO usuario(nombre, apellido, email, contrasena, fecha_alta, fecha_modificacion, nacionalidad_id)
VALUES('Juan', 'Pérez', 'jperez@mail.com', '1234', '2013-12-29 21:54:27', '2013-12-29 21:54:27', 1);

Además para ingresar el valor de nacionalidad_id, ingresamos el id que le corresponde. En nuestro caso como es Argentina el id 1, éste será el valor.

Modificar registros

Así como insertamos registros, también podemos modificarlos mediante la sentencia UPDATE:

UPDATE tabla SET atributo1 = valor1, atributo2 = valor2;

Por ejemplo si quisiéramos modificar el registro que acabamos de insertar:

UPDATE usuario SET nombre = 'Pedro', apellido = 'Rodríguez', fecha_modificacion = sysdate();

El problema es que este código SQL va a modificar todos los registros de la tabla usuario, con el nombre ‘Pedro’, apellido ‘Rodríguez’ y también actualizará la fecha de modificación. Para modificar un registro específico, debemos agregar una condición con la palabra reservada WHERE y la condición. Por ejemplo si quisiéramos modificar el registro con el usuario_id que sea 1:

UPDATE usuario SET nombre = 'Pedro', apellido = 'Rodríguez', fecha_modificacion = sysdate() WHERE usuario_id = 1;

En la mayoría de los casos se utiliza una condición para UPDATE, de esta manera podemos modificar un registro específico o varios registros que cumplan una condición.

Por ejemplo con esto podemos modificar todos los usuarios que se tengan como nombre ‘Pedro’:

UPDATE usuario SET nombre = 'Juan', apellido = 'Rodríguez', fecha_modificacion = sysdate() WHERE nombre = 'Pedro';

 

Eliminar registros

Si lo que queremos es eliminar registros debemos usar la palabra reservada DELETE:

DELETE FROM tabla;

Obviamente al igual que UPDATE podemos especificar una condición para eliminar uno o más registros. Por ejemplo, si quisiéramos eliminar el que acabamos de crear y modificar:

DELETE FROM usuario WHERE usuario_id = 1;

 

Mostrar registros

Bien, ya sabemos cómo insertar, modificar y eliminar registros, pero esto es sólo una parte del trabajo con registros. También nosotros debemos tener la posibilidad de recuperar esos registros, buscar uno o varios que cumplan una condición, ordenarlos, etc.

Por ejemplo supongamos que queremos recuperar todos los registros de la tabla nacionalidad:

SELECT * FROM nacionalidad;

El caracter * nos devolverá todas las columnas de la tabla, en este caso son sólo dos, pero en consultas con muchas columnas y muchos registros, es aconsejable sólo llamar a las columnas con los valores que necesitamos recuperar, para así hacer la consulta más liviana. Por ejemplo para recuperar sólo la columna valor:

SELECT valor FROM nacionalidad;

Esto nos devolverá:

Argentina
Brasil
Paraguay
Uruguay
Bolivia
Chile
Perú
Colombia
Ecuador
Venezuela

También podemos agregar condiciones, por ejemplo recuperar el registro con el id 2, que en mi caso es Brasil:

SELECT valor FROM nacionalidad WHERE nacionalidad_id = 2;

O también:

SELECT valor FROM nacionalidad WHERE valor = 'Brasil';

Tener en cuenta que al ser una cadena debemos usar comillas como dijimos antes.

También podemos ordenar nuestros registros, por ejemplo por el nombre de la nacionalidad, mediante la palabra reservada order by:

 SELECT nacionalidad_id, valor FROM nacionalidad ORDER BY valor;

O en forma descendente, con la palabra DESC detrás del nombre del atributo, osea en lugar de que el primero que se muestre sea ‘Argentina’, sea ‘Venezuela’, que en orden alfabéticamente, son el primero y último registro respectivamente:

SELECT nacionalidad_id, valor FROM nacionalidad ORDER BY valor DESC;

Otra posibilidad es la de limitar los registros, por ejemplo que me traiga los 5 primeros que encuentre:

SELECT nacionalidad_id, valor FROM nacionalidad LIMIT 5;

O seleccionar registros buscándolos por coincidencia, por ejemplo si quisiéramos recuperar las nacionalidades que contengan la cadena ‘guay’, que son ‘Paraguay’ y ‘Uruguay’. Aquí tendremos que usar la palabra LIKE, en lugar del igual (=)

SELECT nacionalidad_id, valor FROM nacionalidad WHERE valor LIKE '%guay%';

Con respecto al caracter %, en SQL ese caracter es un comodín. Lo que hará la consulta en realidad es buscar todas las nacionalidades en donde su valor esté formado por en juego de caracteres ‘guay’, y gracias al comodín aclaramos que esa cadena sea buscada en el medio, osea sin importar los caracteres que se encuentren atrás o delante de la misma.

También podríamos buscar todas las nacionalidades, que por ejemplo empiecen con ‘B’, osea ‘Bolivia’ y ‘Brasil’:

SELECT nacionalidad_id, valor FROM nacionalidad WHERE valor LIKE 'B%';

En este caso ingresamos el caracter comodín sólo delante, para especificar que el primer caracter debe ser ‘B’, y el resto puede ser cualquier cosa

O buscar todas las nacionalidades que terminen con ‘a’, que en nuestro caso serán: ‘Argentina’, ‘Bolivia’, ‘Colombia’ y ‘Venezuela’:

SELECT nacionalidad_id, valor FROM nacionalidad WHERE valor LIKE '%a';

Incluso podemos hacer una consulta bastante trabajada con todo lo que acabamos de aprender de SELECT, por ejemplo recuperar los tres primeros registros de todas las nacionalidades que tengan la letra ‘e’ y ordenarlos en forma descendente:

SELECT valor FROM nacionalidad WHERE valor LIKE '%e%' ORDER BY valor DESC LIMIT 3;

El resultado será:

Venezuela
Perú
Ecuador

Unión de tablas

Supongamos que queremos hacer un SELECT, pero en lugar de traer registros de una tabla, queremos combinar consultas con dos o más registros de tablas diferentes. Por ejemplo, queremos recuperar los usuarios de nuestra base de datos, pero en lugar de traer el id de la nacionalidad, queremos ver el texto, el nombre de la nacionalidad. Para conseguir eso debemos combinar el registro de cada usuario con el registro de la nacionalidad, con la que el usuario está conectado.

En primer lugar vamos a insertar un listado de usuarios con distintas nacionalidades:

INSERT INTO usuario(nombre, apellido, email, contrasena, fecha_alta, fecha_modificacion, nacionalidad_id)
VALUES
('Ricardo', 'Caruso Lombardi', 'caruso@mail.com', '1234', sysdate(), sysdate(), 1),
('Susana', 'Giménez', 'susana@mail.com', '1234', sysdate(), sysdate(), 1),
('Wilson', 'Sanguinetti', 'wilson@mail.com', '1234', sysdate(), sysdate(), 4),
('Ronaldo', 'Santos', 'ronaldo@mail.com ', '1234', sysdate(), sysdate(), 2),
('Marisa', 'Santa Cruz', 'marisa@mail.com', '1234', sysdate(), sysdate(), 3);

Como se ve en el ejemplo, insertamos cinco usuarios, de los cuales dos tienen nacionalidad Argentina, y otros tres con nacionalidad de Uruguay, Paraguay y Brasil.

Entonces para recuperar los usuarios por su nombre y apellido, y el atributo valor de la tabla nacionalidad, con la que le corresponde al usuario, deberíamos hacer esto:

SELECT usuario.nombre, usuario.apellido, nacionalidad.valor FROM usuario LEFT JOIN nacionalidad ON usuario.nacionalidad_id = nacionalidad.nacionalidad_id;

En primer lugar, hacemos un SELECT de una tabla como venimos haciendo, luego agregamos la unión mediante LEFT JOIN y el nombre de la tabla con la que queremos unir la consulta, en este caso nacionalidad.

La razón por la cual usamos el nombre de la tabla más un punto y el nombre del atributo, se debe a que cuando unimos tablas, éstas pueden tener atributos con el mismo nombre, por esto es una buena práctica al unir tablas, llamar a los atributos con el nombre de la tabla y el punto adelante.

Por último, la palabra reservada ON, nos permitirá indicar cuáles son los atributos que deben coincidir, en nuestro caso los atributos con el mismo nombre nacionalidad_id, de ambas tablas.

Esta consulta nos devolverá:

Ricardo Caruso Lombardi Argentina
Susana Giménez Argentina
Wilson Sanguinetti Uruguay
Ronaldo Santos Brasil
Marisa Santa Cruz Paraguay

Ahora, supongamos que quisiéramos realizar esto pero a la inversa,osea que en lugar de recuperar los usuarios y sus nacionalidades, queremos recuperar las nacionalidades y los usuarios que pertenecen a las mismas. Para esto tenemos dos posibilidades, una es rotar en la consulta la tabla usuario y nacionalidad, de modo que la que quede del lado izquierdo (LEFT JOIN) sea nacionalidad. O bien, modificar LEFT JOIN por RIGHT JOIN:

SELECT usuario.nombre, usuario.apellido, nacionalidad.valor FROM usuario RIGHT JOIN nacionalidad ON usuario.nacionalidad_id = nacionalidad.nacionalidad_id;

Esta consulta nos devolverá lo siguiente:

Ricardo Caruso Lombardi Argentina
Susana Giménez Argentina
Ronaldo Santos Brasil
Marisa Santa Cruz Paraguay
Wilson Sanguinetti Uruguay
NULL NULL Bolivia
NULL NULL Chile
NULL NULL Perú
NULL NULL Colombia
NULL NULL Ecuador
NULL NULL Venezuela

Si observamos bien, la consulta nos devolverá todas las nacionalidades, en el caso de Argentina veremos dos registros, ya que hay dos usuarios con esta nacionalidad, en el caso de Brasil, Paraguay y Uruguay nos devolverá tan sólo un registro, ya que cada uno de estos tiene un sólo usuario con esa nacionalidad. Pero, también nos devolverá aquellas nacionalidades, que aún no tienen usuarios asociados a las mismas, una vez por cada una de estas y con el valor de nombre y apellido en NULL, claro está, como acabo de decir, no tienen usuarios asociados.

Si bien en la tabla usuario, la nacionalidad del mismo es obligatoria, podría existir la posibilidad que no lo sea, y que algunos usuarios hayan sido insertados sin nacionalidad, y en ese caso, al tirar la primer consulta (LEFT JOIN) hubiese pasado lo mismo que pasó con la última (RIGHT JOIN), nos hubiese devuelto usuarios con nacionalidad_id con el valor NULL, en aquellos registros que hagan referencia a usuarios sin nacionalidad.

Si lo que en cambio queremos es realizar una consulta que no depende de una tabla u otra, sino que nos devuelva todos aquellos registros en que coincidan, entonces deberíamos usar INNER JOIN. Entonces podríamos modificar la consulta finalmente por:

SELECT usuario.nombre, usuario.apellido, nacionalidad.valor FROM usuario INNER JOIN nacionalidad ON usuario.nacionalidad_id = nacionalidad.nacionalidad_id;

En este caso no nos devolverá aquellos usuarios que no tengan nacionalidad (si existiera esa posibilidad), o las nacionalidades que no estén ligadas a ningún usuario. Los registros encontrados serán sólo usuarios con nacionalidad y nacionalidades que pertenezcan a usuarios.

Bueno, con esto terminamos nuestra introducción a MySQL. Y en el capítulo que viene vamos retomar PHP con MySQL.

Recordá que si querés profundizar en ciertos temas, siempre podés consultar a la página oficial de MySQL:

https://www.mysql.com/

Saludos!

Anterior: Aprendiendo PHP, parte 24: Introducción a MySQL, creación de tablas

Siguiente: Aprendiendo PHP, parte 26: Conectar PHP con MySQL

Redes sociables

    One Reply to “Aprendiendo PHP, parte 25: Introducción a MySQL, registros”

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    *