You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

2 Días
19 Hrs
3 Min
25 Seg
Curso de SQL y MySQL 2018

Curso de SQL y MySQL 2018

Alberto Alcocer (Beco)

Alberto Alcocer (Beco)

Tipos de columnas / Creación de la tabla authors

9/24
Resources

How to relate tables in MySQL in a logical way?

Relating tables in a database is fundamental to achieve a good structuring of the information. In MySQL, this relationship must be logical, not rigid or active. We need to understand that a database will not necessarily tell us if there is an error in the relationships between tables, but it depends on the way we structure our data.

It is crucial that the database is able to handle, through IDs or unique identifiers, these relationships in order to later be able to identify who did what, for example, in the case of a relationship between books and authors.

What are the naming conventions for tables and columns?

MySQL allows the use of upper and lower case in both reserved words and column or table names. Although there are no strict rules, it is a good practice to distinguish them to improve the clarity of our code.

  • Column and table names: Use lowercase.
  • SQL language reserved words: Use uppercase to clearly differentiate them.

How to create a table of authors in MySQL?

To manage authors in a database, it is essential to define a table containing the relevant information, such as ID and name. In addition, we can choose to include a field for the country of origin.

Here is how an authors table could be structured:

CREATE TABLE IF NOT EXISTS author ( author_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, country_code CHAR(3) DEFAULT NULL );

In this example, we use author_id as a primary key that is automatically incremented, ensuring that each author has a unique identifier.

How to verify the existence of tables and what to do in case of errors?

When executing SQL commands, errors may arise, but MySQL offers us to describe the error in detail. This is useful to quickly identify and correct any misspelled syntax.

How to list tables and examine content:

To see what tables exist in your database and examine their contents, use the following commands:

  • SHOW ALL TABLES:
SHOW TABLES;
  • Describe the structure of a table:
DESCRIBE authors;

How to handle errors when creating tables?

If you try to create a table that already exists, you can use IF NOT EXISTS to avoid errors. However, if when executing a CREATE TABLE you receive a warning, use:

SHOW WARNINGS;

This will show you the warning or problem that caused the warning. For example, it could be that a table is trying to be created but already exists in the database.

When to use the DROP command and what precautions to take?

The DROP command is very powerful and dangerous, as it deletes a table, its structure and its contents permanently. There is no undo! Therefore, check carefully before doing this to avoid losing essential data.

DROP TABLE authors;

You must be absolutely sure before executing it, and it is advised to check letter by letter the name of the table you want to delete.

How to describe columns and understand table structures in MySQL?

To better understand the structures of your tables, the DESCRIBE command and its acronym DESC is extremely useful. It gives you an overview of each column in the tables, their data types and more.

  • Describe all columns including comments:
SHOW FULL COLUMNS FROM books;

This will be valuable when working with tables created by others or when you need to review the specifications of your own tables.

With these guidelines you can start organizing and relating your MySQL tables with certainty and clarity. Your data structure will be ready to move on to more complex applications; continue exploring and learn how to master these powerful tools!

Contributions 171

Questions 65

Sort by:

Want to see more contributions, questions and answers from the community?

7- Tipos de columnas / Creación de la tabla authors

  1. La tabla de bases datos como se comentó anteriormente necesitan una PRIMARY KEY osea un “id” para identificar los registros.

  2. Es buena práctica: MySQL permite minúsculas y mayúsculas en el nombre de tablas y sentencias sql, pero es recomendable colocar en mayúsculas las sentencias(palabras reservadas) sql y todo lo relaciona con lo propio de MySQL y en minúscula el nombre de tablas y columnas.

  3. Como la relación entre tablas es lógica y se realiza mediante los id, en la tabla en donde se referencia la columna debe ser del mismo tipo de datos.

  4. El error vs Warnings: la diferencia entre estos dos es que el error rompe cualquier flujo de trabajo que tengamos en nuestra aplicación mientras que el warnnigs nos muestra una advertencia que no rompe el flujo de trabajo workflow.

  5. DROP TABLE name_table; borra la estructura de la tabla de bases de datos y su contenido

  6. DESCRIBE name_table; muestra la estructura de nuestra tabla. Nos muestra las columnas: field, type, Null, Key, Default, Extra.

  7. DESC name_table; es un acrónimo de describe que realiza la misma función de describir la estructura de la tabla.

  8. SHOW FULL COLUMNS FROM name_table; Esta función describe la estructura de la bases de datos incluyendo más información cómo: field, Type, Collation, Null, Key, Default, Extra, Privileges, comment.

  9. Cuando queremos usar una palabra reservada del lenguaje como nombre de alguna columna lo colocamos encerrado entre comillas de acento ejemplo: year.

Creación de la tabla authors.

CREATE TABLE `authors` (
  `author_id`          int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name`                varchar(100) NOT NULL,
  `nationality`        varchar(100) DEFAULT NULL,
  `active`                TINYINT(1) NOT NULL DEFAULT 1,
  `created_at`       TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at`       TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
 
  PRIMARY KEY (`author_id`),
  UNIQUE KEY `uniq_author` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=193 DEFAULT CHARSET=utf8;

-. DROP TABLE name_table;
Es un instrucción que se utiliza para eliminar la estructura de una tabla junto con su información

/*Eliminar una tabla*/
DROP TABLE `authors`;

-.DESCRIBE name_table;
Es una instrucción que se utiliza para describir la estructura de una tabla de forma resumida.

/*describe el contenido (columnas) las tabla book*/
DESCRIBE `books`;

-. SHOW FULL COLUMNS FROM name_table;
Es una instrucción que se utiliza para describir la estructura de una tabla junto con sus comentarios y privilegios.

/*describe todo el contenido de la tabla,
como: field, Type data, collaction,
Null, key, Extra, Privileges, coment*/
SHOW FULL COLUMNS FROM `books`;

esto es un aporte para los nuevos que ingresan a este curso: por favor escriban el mismo código del profesor de esta manera en la consola, para que no tengan problemas, por favor que este muy bien la sintaxis revisen bien antes de ejecutar o les aparecerá un error osea me refiero a que escriban muy bien, ahí les dejo la imagen espero les haya servido.

En mi caso vengo del curso de fundamentos de db, donde se dice que se debe establecer una relación por medio de una llave foránea, así que dejo el código.

ALTER TABLE `platzi_operation`.`books` 
ADD CONSTRAINT `author_id`
  FOREIGN KEY (`author_id`)
  REFERENCES `platzi_operation`.`authors` (`author_id`)
  ON DELETE NO ACTION
  ON UPDATE CASCADE;```

Les comparto mi codigo para que no les aparescan esos 2 warnings

CREATE TABLE IF NOT EXISTS books (
    book_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    author_id INT UNSIGNED,
    title VARCHAR(100) NOT NULL,
    year INT UNSIGNED NOT NULL DEFAULT 1900,
    language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Language',
    cover_url VARCHAR(500),
    price DOUBLE NOT NULL DEFAULT 10.0,
    sellable TINYINT DEFAULT 1,
    copies INT NOT NULL DEFAULT 1,
    description TEXT
);```

Cuando las filas ocupan más de un reglón, puedes terminar el comando con \G en lugar de ; para que las filas se muestren en formato vertical.

No se deberia especificar authors_id como Foreign Key? en la tabla de books

Por qué no usa Foreign Key en author_id cuando crea la tabla books? Se enlazan sin tener que usarla? No veo como hace referencia al author_id sin tener que indicarle tabla y campo de authors.

tener en cuenta.
| Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. | | Warning | 1681 | Integer display width is deprecated and will be removed in a future release.

AQUÍ EL RESULTADO DEL RETO
UNOS CONSEJOS :
1.)SIEMPRE TRATEN DE ESPECIFICAR SI EL CAMPO ES FK O PK SOLO COMO BUENAS PRÁCTICAS
2.) LAS BASES DE DATOS CASI SIEMPRE LAS ESCRIBO CON MAYÚSCULA PARA QUE AL MOMENTO DE HACER CONEXIÓN NO ME EQUIVOQUE CON LOS CAMPOS.
3.) SIEMPRE ANTES DE REALIZAR UNA BASE DE DATOS DEBEN REALIZAR UN MODELADO DE LA MISMA CASI SIEMPRE SE REALIZA 1_MER (MODELO ENTIDAD RELACION)
2_MR (MODELO RELACIONAL)

4.) CADA DATO QUE TENGA UNA TABLA SIEMPRE TRATEN DE ESPECIFICAR DE QUE TABLA VIENE
EJ:
EN LA TABLA CLIENTES Y BOOKS TENEMOS UN ESTADO (ACTIVO O INACTIVO)
LO MÁS CONVENIENTE SERÍA DECLARARLOS ASÍ
STATE_CLIENT TINYINT(1) DEFAULT 1 NOT NULL
STATE_BOOK TINYINT(1) DEFAULT 1 NOT NULL
PARA ASÍ ESPECIFICAR DE QUE TABLA SE ESTÁ HABLANDO

CREATE TABLE OPERATIONS
(
	OPERATIONS_ID INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    BOOK_ID_FK INTEGER UNSIGNED NOT NULL,
    TYPE_OPERATIONS ENUM('RENTADO','COMPRADO','DEVUELTO') NOT NULL,
    CLIENT_ID_FK INTEGER UNSIGNED NOT NULL,
    DATE_OPERATION DATETIME NOT NULL,
    CREATE_AT_OPERATIONS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP NOT NULL,
    UPDATE_AT_OPERATIONS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL,
    STATE_OPERATIONS TINYINT(1) DEFAULT 1 NOT NULL,
    FINISH_OPERATION TINYINT(1) NOT NULL,
    FOREIGN KEY (BOOK_ID_FK) REFERENCES BOOKS (ID_BOOK),
    FOREIGN KEY (CLIENT_ID_FK) REFERENCES CLIENTS (ID_CLIENT)
);

para limpiar pantalla en la consola de mysql en windows : “system cls”

En la actual versión de mysql (8.0), arrojará los siguientes warnings:
| Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release.

CREATE TABLE IF NOT EXISTS books (
book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
author_id INTEGER UNSIGNED,
title VARCHAR(100) NOT NULL,
‘year’ INTEGER UNSIGNED NOT NULL DEFAULT 1900,
‘lenguage’ VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO 639-1 Language’,
‘cover_url’ VARCHAR(500),
price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
sellable TINYINT(1) DEFAULT 1,
copies INTEGER NOT NULL DEFAULT 1,
description TEXT
);

CREATE TABLE IF NOT EXISTS authors (
author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
‘name’ VARCHAR(100) NOT NULL,
nationality VARCHAR(3)
);

Una forma mas fácil de crear las llaves foráneas, es cuando estamos creando el campo que será la llave foránea.

Pasaríamos de esto…

author_id INTEGER NOT NULL,
FOREIGN KEY (author_id) REFERENCES authors(author_id)

a esto…

author_id INTEGER NOT NULL REFERENCES authors(author_id)

y nos ahorramos una linea de código 😉

Para los que le sale warnings, es por los parentesis despues de los tipos de datos numericos, al parecer ya no hace falta especificarlos, en futuras versiones ya no se hará uso del mismo. 😃

CREATE TABLE IF NOT EXISTS books (
    book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    author_id INTEGER UNSIGNED,
    title VARCHAR(100) NOT NULL,
    year INTEGER UNSIGNED NOT NULL DEFAULT 1900,
    language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Language',
    cover_url VARCHAR(500),
    price DOUBLE NOT NULL DEFAULT 10.00,
    sellable TINYINT DEFAULT 1,
    copies INTEGER NOT NULL DEFAULT 1,
    descripcion TEXT
);

código para crear tablas funcionando:

books

create table if not exists books (
    `book_id` integer unsigned primary key auto_increment, -- unique id per transaction
    `author_id` integer unsigned,
    `title` varchar(100) not null,
    `year` integer unsigned not null default 1900,
    `language` varchar(2) not null default 'es' comment 'ISO 639-1 Language',
    `cover_url` varchar(500),
    `price` double(6, 2) not null default 10.00, -- (total_numbers, decimal_numbers) in this case the result is XXXX.YY
    `sellable` tinyint(1) default 1,
    `copies` integer unsigned not null default 1,
    `description` text
);

authors:

create table if not exists authors(
    `author_id` integer unsigned primary key auto_increment,
    `name` varchar(100) not null,
    `nationality` varchar(3)
); 

Notas en 2022:

  • Specifying number of digits for floating point data types is deprecated and will be removed in a future release.
  • Integer display width is deprecated and will be removed in a future release.

Está muy aburrido éste curso.

Para usar una palabra reservada en el nombre de una columna debemos usar la comilla (`) de esta forma:

 `nombre_columna`

Por ejemplo si queremos usar year, date

buenas tardes les recomiendo el editor de código Visual Studio Code, para cuando todo esto de armar los querys.

La comilla es llamada acento grave y se puede hacer con ALT + 96

Esos 2 warning no se porque aparecen si lo estoy haciendo todo como el profesor y me da un query ok

Definitivamente si no has tomado el curso de Fundamentos de bases de datos y has llegado hasta aquí sin conocimientos previos, mis respetos 🤣.

Aquí el código que funcionó sin problema en mi consola.

	CREATE TABLE IF NOT EXISTS books (
		book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
		author_id INTEGER UNSIGNED,
		title VARCHAR(100) NOT NULL,
		`year` INTEGER UNSIGNED NOT NULL DEFAULT 1900,
		language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 693-1 Language',
		cover_url VARCHAR(500),
		price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
		sellable TINYINT(1) DEFAULT 1,
		copies INTEGER NOT NULL DEFAULT 1,
		description TEXT
	);

CREATE TABLE IF NOT EXISTS authors (
	author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(100) NOT  NULL,
	nationality VARCHAR(3)
);
  • Crear database
CREATE DATABASE IF NOT EXISTS operation;
  • Mostrar warnings
SHOW warnings;
  • Crear tablas, con sus columnas
CREATE TABLE IF NOT EXISTS authors (
	author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(100) NOT NULL,
	nationality VARCHAR(3)
);

CREATE TABLE IF NOT EXISTS books (
    book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    author_id INTEGER UNSIGNED,
    title VARCHAR(100) NOT NULL,
    `year` INTEGER UNSIGNED NOT NULL DEFAULT 0000,
    `lenguage` VARCHAR(2) NOT NULL DEFAULT 'en' COMMENT 'ISO 639-1 Language',
    `cover_url` VARCHAR(500),
    price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
    sellable TINYINT(1) DEFAULT 1,
    copies INTEGER NOT NULL DEFAULT 1,
    description TEXT
);
  • Ver tablas
SHOW tables;

Eliminar una tabla “irrecuperablemente”, no usar a menos que sea necesario:

DROP table authors;
  • **Ver **una tabla, es un comando muy útil
DESCRIBE authors;
  • Ver una toda la información de una tabla, así poder ver también los comentarios de esta.

Generalmente la información se mostrara desordenada, se >recomienda reducir el zoom

SHOW full columns from books;
  • Si necesitas asignarle un nombre a una columna que sea igual a una palabra reservada,
    como “data”, ejemplo:
year INTEGER UNSIGNED NOT NULL DEFAULT 0000

Para esto debes de encerrar a year con acento grave, ejemplo:

`year` INTEGER UNSIGNED NOT NULL DEFAULT 0000,

Al fin me funcionó crear la tabla. Mi problema eran las comillas de ´es´ e ´iso 639-1 Language´
No estoy seguro si las que aparecen acá son las correctas pero probé con otras y funcionó después de muchos Error: ERR_PARSE_ERROR…

Al asignarle la cantidad de digitos que recibirá un int o un double manda warning al parecer ya no es necesario y será removido en siguientes versiones

Un tips de la clase, cuando el dice una relación lógica, es porque no existe una relación de Foreign Key. Lo que hace con esto, es tener una relación de 0 a muchos, es decir un libro puede tener 0 autores o muchos autores. Aunque para este caso solo se podrá poner o 0 autores = NULL o 1 autor = author_id. Si se deseara poner más autores de debería romper en una tabla “detalle”.

Algunas formas de escribir los tipos de datos han cambiado para la las nuevas versiones de MySql.

Deberia entender a este error como que DOUBLE ya no recibirá valores en un futuro y que INTEGER ya no se utilizara?

Para que no escriban: ```js CREATE TABLE authors( author_id INTEGER UNSIGNED AUTO_INCREMENT, name VARCHAR(100) NOT NULL, nationality VARCHAR(3), PRIMARY KEY (author_id)); ```
Para los que ven el curso en el 2024, si les arroja un error con la query del profesor, intenten copiar la siguiente: `CREATE TABLE IF NOT EXISTS books (` ` book_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,` ` author_id INT UNSIGNED,` ` title VARCHAR(100) NOT NULL,` ` year INT UNSIGNED NOT NULL DEFAULT 1900,` ` language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1',` ` cover_url VARCHAR(500),` ` price DOUBLE(6,2) NOT NULL DEFAULT 10.0,` ` sellable TINYINT(1) DEFAULT 1,` ` copies INT NOT NULL DEFAULT 1,` ` description TEXT` `);`

Sí hacen

select database()

Y les muestra

+------------+
| database() |
+------------+
| NULL       |
+------------+

Usen el comando

use platzi_operation

Y así les cambiará la base de datos que están usando.

el codigo es de detalles escribien, ojo con la dislexia

CREATE TABLE IF NOT EXISTS books(
-> book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> author_id INTEGER UNSIGNED,
-> title VARCHAR(100) NOT NULL,#NO PERMITE QUE SEA NULO#
-> year INTEGER UNSIGNED NOT NULL DEFAULT 1900,
-> language VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO639-1 Language’,
-> cover_url VARCHAR(500),
-> price DOUBLE(6,2) NOT NULL DEFAULT 10.0, #de 6 digitos, 2 seran decimales y los otros cuatro no
-> sellable TINYINT(1) DEFAULT 1,
-> copies INTEGER NOT NULL DEFAULT 1,
-> description TEXT
-> );

Hola a tod@s. Les comparto una lista de algunos comandos que hemos visto a lo largo del curso:
CREATE DATABASE <database_name> -->crear una nueva base de datos
SHOW dabases; -->muestra las bases de datos disponibles
USE <dabase_name>; -->acceder a una base de datos
SELECT database(); -->muestra en que base de datos estoy
SHOW tables; -->muestra las tablas de la base de datos
DESC <table_name>; -->muestra información de las columnas de una tabla
SHOW FULL COLUMNS FROM <table_name>; -->muestra una descripción mas completa de las columnas de una tabla
SHOW WARNINGS; -->sirve para mostrar advertencias

los que necesiten limpiar ventana con Windows es con system cls;

En el archivo que deja el profesor con algunos bloques de codigo para la creacion de tablas, hay un comando que se repite en todas las tablas que expresa lo siguiente:
** Engine = InnoDB … Este comando lo que indica es que la tabla que se esta creando debe ser “InnoDB” ya que todas las tablas por defecto son: MyISAM.

Por otro lado, si se ejecuta esa misma linea de codigo tal cual como esta, hay un Warning 3719 y la forma de solventarlo es cambiando el valor ‘utf8’ por ‘utf8mb4’, dejo copiado un fragmento de texto extraido de Stack overflow, a su vez dejo el enlace:

"Dado que está utilizando MySQL 8.0, que maneja muy bien las diferencias entre utf8mb3 y utf8mb4 (las versiones 5.5 y 5.6 tenían algunas incompatibilidades molestas), veo que la advertencia no es gran cosa.

MySQL 8.0 tiene como valor predeterminado utf8mb4una intercalación más nueva que la que tenía 5.7. Por lo tanto, las bases de datos creadas inicialmente en 8.0 deberían estar mejor que en versiones anteriores.

Recomiendo (a todos los usuarios de MySQL) usar utf8mb4. Esto debería funcionar “mejor” en el futuro previsible. Si lo hace, evitará la confusión que puede surgir cuando se utf8cambia de significado utf8mb3a utf8mb4."

https://stackoverflow.com/questions/50032196/django-mysql-utf8-is-currently-an-alias-for-the-character-set-utf8mb3-which-w

Sin ánimo de hacer hate, las palabras en inglés “author” y “auto” se pronuncián al comienzo como si fuera una “o” (en español) no “au”.

Tupla sería una “fila” en SQL

system cls; -> para limpiar el terminal

crear: CREATE database platzi_operation;

CREATE DATABASE IF NOT EXISTS platzi_operation; -> nos mostrará OK pero con un warning (no como un error). Es una condicional para que se ejecute si no existe.

SHOW warnings; -> nos mostrará los errores

SHOW databases; -> me muestra las bases de datos creadas

SELECT DATABASE(); -> Nos muestra la tabla actual

SHOW tables; -> nos muestra las tablas de la BD actual

USE platzi_operation; -> para entrar a la BD indicada

DROP table authors; -> Nos borra la tabla pero no tiene respaldo, es Borrado completo para siempre. Borra la tabla el contenido y la estructura.

describe authors; -> Nos muestra las columnas que tenemos en nuestras tablas.

desc books; -> nos muestra las columnas de la tabla (pero abreviado)

show full columns from books; -> Muestra más columas, incluso los comentarios de COMMENT.

show tables; -> mostrar tablas en esta BD. En este caso me muestra emptyset (no hay datos). Nos dará NULL si no existe la tabla ni el contenido

Los comentarios en SQL se colocan con “–”.
Una buena práctica que es las tablas se llame en PLURAL. Una tabala necesita SI o SI un ID. Ahora amos a crear nuestra nueva tabla:

CREATE TABLE IF NOT EXISTS books (
book_id INTEGER UNSIGNED PRIMARY AUTO_INCREMENT, – Unisgned no almacena el signo (+ o -, por tanto almaceno positivos). Auto_increment aumetna 1 a 1.
author ,
title VARCHAR(100) NOT NULL, – Not null nos indica que no puede estar nulo (no hay información, no hay nada ni epacios).
year INTEGER UNSIGNED NOT NULL DEFAULT 1900, – Default si no le mando nada le asigno algo (1900).
language VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO 639-1 Language’, – Podemos añadir un comentario y sólo lo puede ver el admin
cover_url VARCHAR(500),
price DOUBLE(6,2) NOT NULL DEFAULT 10.0, – Double almacena números y dos decimales. Float almacena 6 decimales. en este caso 6 dígitos, pero reserva 2 para decimales (4 para números y 2 decimales = 6)
sellable TINYINT(1) DEFAULT 1, – Tynyint significado que puede tener 1 o 0
copies INTEGER NOT NULL DEFAULT 1,
description TEXT – Text mete todo lo que pueda
);

Sin comentarios:

CREATE TABLE IF NOT EXISTS books (
book_id INTEGER UNSIGNED PRIMARY AUTO_INCREMENT,
author ,
title VARCHAR(100) NOT NULL,
year INTEGER UNSIGNED NOT NULL DEFAULT 1900,
language VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO 639-1 Language’,
cover_url VARCHAR(500),
price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
sellable INYINT(1) DEFAULT 1,
copies INTEGER NOT NULL DEFAULT 1,
description TEXT
);

CREATE TABLE IF NOT EXISTS authors (
author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
nationality VARCHAR(3)
);

VARCHAR es un tipo de texto y se debe indicar el nmúmero máximo de caracteres.
Dato NULO es diferente a algo VACÍO. Vacío, hay algo que es nada (por ejemplo espacios o ningún cmampo). Nulo es que no se a almacenado completamente nada.

Vamos a la consola, nos aseguramos de estar en la BD correcta y colocamos el código.

En consola con SELECT DATABASE() podemos ver en qué base estamos.

SELECT * FROM authors; -> Nos dice qué datos tienen en la tabla

Cuando empleamos nombres reservados del lenguaje SQL podemos hacer lo siguiente: year, colocar backticks para indicarle una cadena que identifica una columna.

poner entre comillas nombre de palabra reservada para poder usarla como nombre de columna.
ej:
CREATE TABLE books (
‘year’ INTERGER UNSIGNED NOT NULL );

Por si alguien esta todavia enredado con la ’ para la creacion de tablas en mi caso funciono poner la que se pone donde esta el simbolo de pregunta ?, esto en windows 10 al que le sirva excelente

Un pequeño aporte…

  • Si no quieres estar haciendo copy and paste del código, guarda tu script en un archivo (ejemplo tablas_libreria.sql).
    Y ejecutalo en la terminal de linux:
$ mysql -u root -p platzi_operation < tablas_libreria.sql

La ‘desventaja’ de hacerlo así es que la terminal no nos mostrará el resultado de los queries que ejecutamos en la consola. Para poder ver la salida, tendríamos que almacenarla en algún archivo que nos sirva de logger. ¡Puedes ver el curso de terminal linux para profundizar más!

  • Otra opción es que dentro de la terminal de mysql utilices el siguiente comando:
mysql> source ruta/a/tu/archivo/tablas_libreria.sql

Esta mostrará los resultados en la terminal de mysql.

¡Espero que esto les sea de utilidad!

show full columns from books; //muestra todas las columnas (propiedades) de la tabla seleccionada

Comando muy básicos pero a lo largo de la vida y de nuestras profesiones por no practicarlo lo olvidamos

Buenas a alguien le salio estos warnings

Query OK, 0 rows affected, 2 warnings (0.55 sec)


| Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release.

He leído muchos comentarios sobre si las llaves foráneas deben crearse dentro del create table o en una sentencia aparte, también que si los nombres de las tablas deben ir en singular o plural.
Y la verdad es que no son reglas, solo son buenas prácticas.

Me encanta los tips que nos da, osea no solo enseñan a hechar código, sino un poco de sus experiencia

Excelente profesor, se nota su experiencia y explica de una manera muy detallada pero al grano.

describe authors;
desc books;

📝Hay les dejo mis notas espero que les sean útiles

-- Creacion de base de datos
CREATE DATABASE platzi_operation;
-- Creacion de base de datos usando un condicional
CREATE DATABASE IF NOT EXISTS platzi_operation;
-- Mostar Warnings
SHOW warnings;
-- Mostar bases de datos
SHOW DATABASES
-- Utilizar una base de datos
USE platzi_operation;
-- Mostrar tablas
SHOW TABLES;
-- Como saber que base de datos estoy usando, RTA:
SELECT DATABASE();
-- Borrar tabla
DROP TABLE books
-- Mostar tablas
SHOW TABLES;
-- Describe los campos de la base de datos
DESCRIBE books
DESC authors
-- Mostar todo el esquema de la tabla (Incluyendo los comentarios)
SHOW FULL COLUMNS FROM books;

-- CREACION DEL PROYECTO [LIBRERIA]

-- Buena practica: Usar el nombre de la tabla en plural
CREATE TABLE IF NOT EXISTS books(
  book_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  author_id INT UNSIGNED ,
  title VARCHAR(100) NOT NULL,
   year INT UNSIGNED NOT NULL DEFAULT 1900,
  language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Lenguage',
  cover_url VARCHAR(500),
  price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
  sellable TINYINT(1) DEFAULT 1,
  copies INT NOT NULL DEFAULT 1,
  description TEXT
);

CREATE TABLE IF NOT EXISTS authors (
  author_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  nationality VARCHAR(3)
);

DROP TABLE: Borrar una tabla, contenido y extructura.

Este curso es de lo mejor! Nos ayuda a tener mejores prácticas en la Base de datos, así como también, no acostumbrarse a un IDE para poder interactuar con el Esquema y las tablas
.

Genial, aprendiendo cada día mas, gracias!!

Como hago para que al copiar desde el editor de texto, se pegue tal cual está ahi pero en la consola ? Yo lo hago y queda como en la imagen. Muchas gracias. ![](https://static.platzi.com/media/user_upload/image-1e9ecc26-770a-437f-8c81-99937a5e6c60.jpg)
Recomiendo usar la terminal del VSCode, pregunten a chatGPT como hacerlo si no les funciona. Por otro lado, es mejor crear un archivo.sql en cualquier lado (escritorio) y escribir todo lo que va haciendo el profe... Luego, al final, copiamos y pegamos en la terminal todo lo realizado. Esto es porque el editor de la terminal no permite subir a lineas anteriores para corregir errores de tipeo!
Corregir los errores en caliente es buena metodología utilizada por el profesor ;)
OJO! Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. Tradicionalmente, en MySQL, se podía especificar la precisión (o número de dígitos) para tipos de datos como `FLOAT` y `DOUBLE`. Por ejemplo, `FLOAT(5, 2)` indicaba un número con 5 dígitos totales, de los cuales 2 son decimales. MySQL ha decidido que esta funcionalidad es innecesaria y la eliminará en el futuro. La advertencia aparece para informarte que debes dejar de usar esta especificación y solo usar `FLOAT` o `DOUBLE` sin especificar la precisión.
No olvidar las llaves foráneas. ```js ALTER TABLE books ADD CONSTRAINT autor FOREIGN KEY (author) REFERENCES platzi_operation.authors(author_id) ON DELETE NO ACTION ON UPDATE CASCADE; ```
Si tienen problemas con las lineas 5 o 6, referidas a year y language, les recomiendo agregar publication\_ al inicio de la columna, es decir: publication\_year y publication\_language. Sucede que "YEAR" es una palabra reservada en MySQL.

No logré comprender la utilidad del UNSIGNED. ¿Cuál es su función?

chucha que buenos datos

La clave primaria, o PRIMARY KEY es el verdadero identificador de cada registro. Sólo puede haber una columna con clave primaria por tabla, y los registros deben ser también únicos, es decir no pueden estar repetidos ni ser nulos.
aprende-web .net

show full columns from books; Con esto podemos ver el datalle de las columnas

Tipos de columnas / Creación de la tabla authors
• La tabla de bases datos como se comentó anteriormente necesitan una PRIMARY KEY osea un “id” para identificar los registros.
• Es buena práctica: MySQL permite minúsculas y mayúsculas en el nombre de tablas y sentencias sql, pero es recomendable colocar en mayúsculas las sentencias(palabras reservadas) sql y todo lo relaciona con lo propio de MySQL y en minúscula el nombre de tablas y columnas.
• Como la relación entre tablas es lógica y se realiza mediante los id, en la tabla en donde se referencia la columna debe ser del mismo tipo de datos.
• El error vs Warnings: la diferencia entre estos dos es que el error rompe cualquier flujo de trabajo que tengamos en nuestra aplicación mientras que el warnnigs nos muestra una advertencia que no rompe el flujo de trabajo workflow.
• DROP TABLE name_table; borra la estructura de la tabla de bases de datos y su contenido
• DESCRIBE name_table; muestra la estructura de nuestra tabla. Nos muestra las columnas: field, type, Null, Key, Default, Extra.
• DESC name_table; es un acrónimo de describe que realiza la misma función de describir la estructura de la tabla.
• SHOW FULL COLUMNS FROM name_table; Esta función describe la estructura de la bases de datos incluyendo más información cómo: field, Type, Collation, Null, Key, Default, Extra, Privileges, comment.
• Cuando queremos usar una palabra reservada del lenguaje como nombre de alguna columna lo colocamos encerrado entre comillas de acento ejemplo: year.

para poder hacer la práctica tuve que hacerla desde xampp ya que desde la terminal no me funcionaba crear las tablas

si bien va muy rápido, el profesor es de muy alto nivel pues enseña prácticas de la industria

Tal vez sea insignificante pero aca dejo las comillas para crear los alias: ``
Solo copia y pega

No sé si a alguien ya le sucedió pero comparto igual:

Yo escribí inicialmente el código en word, y cuando lo pegaba en la consola me aparecía que tenía un error en las palabras entrecomilladas, el problema se solucionó cuando copie todo el texto en el bloc de notas y remplacé las comillas allí, copié nuevamente a la consola y funcionó bien.

el formato de comillas en word es distinto al de el bloc de notas y genera conflicto, no sé por qué.

esta es la otra tabla

CREATE TABLE IF NOT EXISTS authors(
-> author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(100) NOT NULL,
-> nationality VARCHAR (3)
-> );

Para que sirve UNSIGNED?

Hola Chicos, hay algo que me está inquietando un poco. Tengo entendido que los atributos no pueden llamarse igual en ningún caso, ni siquiera cuando estamos exportando una llave primaria de una entidad independiente a su dependiente y ésta última la recibe como llave foranea; por ejemplo, si su llave primaria se llama: “author_id” podría considerar que su llave foranea se llame: “author_id1” o “author_id_foreign”… Igual, creo que no es obligación, pero sí una buena práctica definitivamente

CREATE TABLE authors (
author_id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
nationality varchar(100) DEFAULT NULL,
PRIMARY KEY (author_id),
UNIQUE KEY uniq_author (name)
);

CREE MIS TABLAS INDICANDO LA LLAVE PRIMARIA AL FINAL POR ALGUNA RAZON NO ME DEJA CREAR LA LLAVE PRIMARIA EN EL MOMENTO DE ASIGNARLA AL PRINCIPIO

Aquí les dejo un pequeño aporte:

Obtener información sobre la base de datos Mysql:

show databases; – Listar todas las bases de datos.
connect [database]; – Conectarse a esa base de datos.
show tables; – Listar todas las tablas de una base de datos.
show table status; – Muestra información sobre las tablas de la base de datos.
describe [table]; – Muestra la estructura de una tabla de la base de datos.

Manejo de bases de datos Mysql:

drop table [table]; – Elimina la tabla, incluyendo registros y estructura.
drop table if exists [table]; – Elimina la tabla de la base de datos, pero antes verifica que exista.
truncate table [table]; – Elimina los registros, pero mantiene la estructura de la tabla.
rename table [table] to [nuevo nombre de tabla]; – Renombrar una tabla de la base de datos.
Algunos comando útiles para consultas Mysql:

select * from [table] limit [numero]; – Muestra los registros desde el 1 hasta [numero].
Ej. select * from tabla limit 10; – Muestra los 10 primeros registros.
select * from [table] limit [numero inicio],[numero]; – Muestra los registros desde el numero de inicio hasta numero inicio + numero.
Ej. select * from tabla limit 11,10; – Muestra desde registro 11 hasta el 20.

Super bien explicado

Ya comencé a practicar con mi base de datos 😄

Les comparto el código que esta correcto, lo que pasa es que tenemos que colocar INT en vez de INTEGER.

CREATE TABLE IF NOT EXISTS authors(
author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
nationality VARCHAR(3)

);
CREATE TABLE IF NOT EXISTS books(
book_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
author_id INT UNSIGNED,
title VARCHAR(100) NOT NULL,
year INT UNSIGNED NOT NULL DEFAULT 1900,
language VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO 639-1 Language’,
cover_url VARCHAR(500),
price DOUBLE NOT NULL DEFAULT 10.0,
sellable TINYINT DEFAULT 1,
copies INT NOT NULL DEFAULT 1,
description TEXT
);

CREATE TABLE IF NOT EXISTS books(
    book_id INTEGER UNSIGNED AUTO_INCREMENT,
    author ,
    title VARCHAR(100) NOT NULL,
    year INTEGER UNSIGNED NOT NULL DEFAULT 1900,
    lenguage VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Lenguage',
    imagen_url VARCHAR(500),
    price DOUBLE (6,2) NOT NULL DEFAULT 10.0,
    sellable TINYINT(1) DEFAULT 1,
    copies INTEGER NOT NULL DEFAULT 1,
    description TEXT
);

NOT NULL permite que un campo no pueda estar sin completar.

INTEGER numero entero
INTEGER UNSIGNED numero entero sin signos, solo pueden ser positivos.

AUTO_INCREMENT: Hace enteros que se auto incrementan,
*Al borrar un dato de MYSQL no lo nota y sigue aumentando números,
EJEMPLO:
1 2 3 4, si se elimina el 3 no le importa y quedaria 1 2 4

DEFAULT: establecer valor por defecto, y se agrega en caso de que no se le envie algo que lo reemplaze
EJEMPLO:
year INTEGER UNSIGNED NOT NULL DEFAULT 1900,
lenguage VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO 639-1 Lenguage’,

VARCHAR(): Definir numero de caracteres que debe tener

La diferencia entre CHAR y VARCHAR es que en el primer tipo de dato se asigna un valor en memoria por defecto
dependiendo el tamaño de espacios que sean asignados, en cambio,
VARCHAR va llenando esos campos en memoria conforme se tengan los datos en el campo.

COMMENT: Comentario a la columna que solo es visible para quien este manejando la base de datos

Para imagenes asignamos VARCHAR, NOTA: no se guarda la imagen como tal, guardamos el url del origen de la imagen

FLOAT es utilizado para calculos precisos, DOUBLE puede ser aplicado de forma simple a los precios de una libreria (en este caso)

DOUBLE (total numeros, cantidad decimales)
EJEMPLO:
price DOUBLE (6,2) NOT NULL DEFAULT 10.0,

TEXT permite agregar texto, grandes cantidades de caracteres

TINYINT: Numérico que admite solo “1” o “0”, también llamado bandera.

No se que ten pedagógico es enseñar desde la consola y no desde la aplicación de mysql. No todos tenemos mac ni la consola de bash de linux.
Aparte una vez que aprendes a usar la aplicación es difícil volver a usar a la usar la consola, ya que es muy poco intuitiva

Resumen

Cuando creamos dos tablas con el mismo nombre, la consola mostrará “Query OK. … 1 WARNING” esto denota un problema.

Por lo tanto, debemos borrar una tabla.

Podemos utilizar el comando DROP. Éste eliminará las tablas sin vuelta de hoja.

El comando describe <nombre de la tabla; nos indicará cuáles son las columnas de nuestra tabla

En algunos casos es conveniente usar GraveAcent para que no exista conflicto con las palabras reservadas. ejemplo:
`int’ int unsigned

Buenos dias, hoy es22/1/2021 y la verdad he perdido mucho tiempo " creando estas dos tablas" a los nuevos como yo tengan especial cuidado en la sintaxis y en particular en el uso de palabras reservadas, minuto 10.40 del video, tuve problemas al querer hacerlo "paso a paso y me consumió mucho tiempo, el código que funciono es:

<CREATE TABLE IF NOT EXISTS books (
book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
author_id INTEGER UNSIGNED,
title VARCHAR(100) NOT NULL,
`year` INTEGER UNSIGNED NOT NULL DEFAULT 1900,
language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Laguage', 
cover_url VARCHAR(500),
price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
sellable TINYINT(1) DEFAULT 1,
copies INTEGER NOT NULL DEFAULT 1,
description TEXT 
);>

CREATE TABLE books(
book_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
autor_id INT UNSIGNED,
title VARCHAR(100) NOT NULL,
year INT UNSIGNER NOT NULL DEFAULT 1900,
Language VARCHAR(2) NOT NULL DEFAULT ‘es’ COMMENT ‘ISO 639-1 Language’,
Cover_url VARCHAR(500),
price DOUBLE(6,2) NOT NULL DEFAULT 10.0,
sellable TINYINT(1) DEFAULT 1,
copies INT NOT NULL DEFAULT 1,
description TEXT
);
no se que hacer me sale el siguiente error y no lo veo :

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘UNSIGNER NOT NULL DEFAULT 1900,
Language VARCHAR(2) NOT NULL DEFAULT ?es? COMME’ at line 5
mysql>

Hola! Me pegué en el curso por que me da error la terminal 😦 Comparto el mensaje que me tira.

![]( Espero su ayuda, soy super nuevo en este mundo.

CREATE TABLE `books` (
  `book_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `author_id` int(10) unsigned DEFAULT NULL,
  `title` varchar(100) NOT NULL,
  `year` int(11) NOT NULL DEFAULT '1900',
  `language` varchar(2) NOT NULL COMMENT 'ISO 639-1 Language code (2 chars)',
  `cover_url` varchar(500) DEFAULT NULL,
  `price` double(6,2) DEFAULT NULL,
  `sellable` tinyint(1) NOT NULL DEFAULT '0',
  `copies` int(11) NOT NULL DEFAULT '1',
  `description` text,
  PRIMARY KEY (`book_id`),
  UNIQUE KEY `book_language` (`title`,`language`)
) ENGINE=InnoDB AUTO_INCREMENT=199 DEFAULT CHARSET=utf8;```

Me está saliendo el Warning 1681, me dice que los FLOATING POINT DATA TYPES y los INTEGER DISPLAY are deprecated and will be removed in a future release, he buscado el problema pero no le encuentro solución, alguien ayuda?

10. drop table authors; //borra la tabla seleccionada
11. describe authors; // ayuda y muestra propiedades de una tabla (tambien se puede utilizar "desc books;")

Siempre usaba MySQL Workbench pero ahora le hago caso al profe y lo hago con mi IDE (Atom). Aunque me gusta la amigabilidad de Workbench para visualizar las tablas.

hay algunos querys en SQL SERVER que no funcionan igual. cuales seria sus equivalentes? por ejemplo show, describe… Gracias 😃

Muy bien explicado.

DESCRIBE cada una de las columnas de la tabla.

Comando DESCRIBE se puede escribir también con su acrónimo DESC

A su vez DESCRIBE es acrónimo de SHOW FULL COLUMNS FROM este comando además mostrará los comentarios de la tabla, privilegios y juego de caracteres (Collation).

La columna price, no recomendaría colocarla en 10.0 si no en 0.00 porque a manera de reporte en algún momento se requiera conocer por ejemplo cuanto valen o suman todos los libros por ejemplo el 10.0 alteraría mi resultado.

excelente curso

buenas clases

Me agrada la idea de relacionar campos de manera lógica.
Es un enfoque que tiene el framework laravel, no te obliga a hacer las relaciones de las tablas con constraints o references.

Pero en una opinión personal, debería aparecer la relación tal cual en la descripción de las tablas.

Alberto Alcocer.
Muy bien detallado lo que va del curso. Excelentemente.
También hiciste el de consola de Linux, no? Ahí sí te faltó un poco más de parsimonia. Ojalá que lo puedas hacer de nuevo, pero tan bien como este curso de MySQL 😉

Listas la sprimeras tablas

drop table tabla; -- mucho cuidado
describe tabla;
desc tabla;
show full columns from books; -- mas detalle"
create table if not exists books 
(
book_id int UNSIGNED primary key auto_increment,
author_id int unsigned,
title varchar(100) not null,
year int  unsigned not null default 2000,
laguage varchar(2) not null default 'es' comment 'iso 639-1 language',
cover_url varchar(500),
price double(6,2) not null default 10.0,
sellable tinyint(1) default 1,
copies int not null default 1,
description text
);

create table if not exists authors
(
author_id int unsigned primary key auto_increment,
name varchar(100) not null,
nationality varchar(3)
);```
CREATE TABLE IF NOT EXISTS `books` (
  `book_id` INT(10) unsigned NOT NULL AUTO_INCREMENT,
  `author_id` INT(10) unsigned DEFAULT NULL,
  `title` VARCHAR(100) NOT NULL,
  `year` INT(11) NOT NULL DEFAULT '1900',
  `language` varchar(2) NOT NULL COMMENT 'ISO 639-1 Language code (2 chars)',
  `cover_url` varchar(500) DEFAULT NULL,
  `price` double(6,2) DEFAULT NULL,
  `sellable` TINYINT(1) NOT NULL DEFAULT '0',
  `copies` INT(11) NOT NULL DEFAULT '1',
  `description` TEXT,
  PRIMARY KEY (`book_id`),
  UNIQUE KEY `book_language` (`title`,`language`)
) ENGINE=InnoDB AUTO_INCREMENT=199 DEFAULT CHARSET=utf8;```

EXCELENTE CURSO

Vaina siempre me daba error porque dejaba una “,” en el último elemento antes del );

He venido teniendo problemas de sintaxis aún utilizando los mismos comandos y siguiendo los pasos del instructor. Que puede estar sucediendo? Por ejemplo , me está tomando los paréntesis como error