No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de SQL y MySQL

Curso de SQL y MySQL

Alberto Alcocer (Beco)

Alberto Alcocer (Beco)

Inserción de datos usando queries anidados

13/24
Recursos

Aportes 79

Preguntas 24

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para los que no entendieron el contexto va de nuevo:

Tenemos un archivo CVS con la siguiente información

El laberinto de la Soledad | Octavio Paz | 1955
Vuelta al laberinto de la Soledad | Octavio Paz | 1960

Mediante un script de PHP podemos obtener estos datos e ir iterando para las insercciones, pero el problema surge en que nuestra tabla de books tenemos solo el title y el year, el nombre del autor lo tenemos en otra tabla llamada authors.

Ahora

Supongamos que insertamos un libro, pero como el autor es de tipo integer
por referencia lógica a la tabla authors, en un primer momento tenemos que hacer un select a la tabla authors, fijarse que id tiene el autor en cuestión y regresar a insertar el registro

INSERT INTO books (title, author_id) VALUES ('El laberinto de la Soledad', 6);

Sin embargo al usar INSERT con SELECT anidados, podemos saltarnos el paso de hacer el select previo a la tabla de autores y colocarlo internamente en la consulta de insercción

Para el campo author_id, su valor lo obtengo de una subconsulta, de ahí que este entre parentesis, para que se haga primero

INSERT INTO books (title, author_id, year) VALUES ('Vuelta al laberinto de la Soledad',
(SELECT author_id FROM authors WHERE name = 'Octavio Paz'),
1960);

aHORA si , todo esto dentro de un bucle y problema solucionado

11- Inserción de datos usando querys anidados

  • LIMIT 1; Esta sentencia limita sólo traer la primera ocurrencia. Esa sentencia sumamente importante cuando decidimos traer un registro.

  • Los sub-querys normalmente tienen una notación On una función exponencial.Los sub-querys pueden tardar sé demasiado y también puede insertar datos erróneos en el caso de los insert anidados.

  • Se puede realizar insert de datos haciéndolo de forma anidada con un SELECT Ejemplo tenemos lo siguientes registro para hacer un insert anidado

Resumen de la Clase:
Tips:

  • Recordar que relaciones entre tablas se deberían dar por valores enteros.
  • Al hacer queries anidados es buena práctica limitar a que se traiga un registro si estamos trabajando con ids.
  • Hacer inserción de datos usando queries anidados se debería hacer con cuidado, los tiempos de cómputo se van al cuadrado.

Código de la clase:

/* Clase 11 */

/* Insertamos a mano */
INSERT INTO books(title, author_id) VALUES('El laberinto de la Soledad', 6);

/* Insertamos con select */
INSERT INTO books(title, author_id, `year`)
VALUES('Vuelta al Laberinto de la Soledad', 
(SELECT author_id 
FROM authors 
WHERE name = 'Octavio Paz'
LIMIT 1), 1960);

El comando SELECT es el uno de los más importantes si no el más importantes nos permite pedirle información de las tablas
💾➡➡➡📖

Me parece que la manera que afecta al rendimiento en cuanto al tiempo le quita atractivo.

INSERT INTO books(title, author_id)
VALUES('El Laberinto de la Soledad',6);

INSERT INTO books(title, author_id, year)
VALUES('Vuelta al Laberinto de la Soledad',
	(SELECT author_id FROM authors
	WHERE name = 'Octavio Paz'
	LIMIT 1
	),1960
);```

Por lo que entiendo hasta ahora lo recomendado es que los id se generen desde la misma tabla mientras que los queries anidados no sean a ese nivel.

\G = Display result vertically.

Que tipo de brujeria fue ese INSERT? jajajaja

en la nueva version de MYSQL el year lo reconoce por defecto como campo, por lo que no hay que poner el year como texto como sale en el video ‘year’.

INSERT INTO pruebaplatzi.books(title, author_id, year)
VALUES ('OTRO LIBRO DE PRUEBA x3',
	(SELECT author_id
    FROM pruebaplatzi.authors 
    WHERE name = 'sam altman'
    LIMIT 1 )
    ,1960);

LIMIT 1; Esta sentencia limita sólo traer la primera ocurrencia. Esa sentencia sumamente importante cuando decidimos traer un registro

Esto es muy útil cuando se necesita hacer una precarga de datos para que arranque la aplicación que utilizará la BD, pero como dices SE DEBE USAR CON CUIDADO, por experiencia me ha pasado que he mezclado todos los datos por no hacerlo bien.

My interesanto los subqueries pero también hay que tener mucho cuidado.

Inserción de datos usando querys anidados

El plural de query en inglés es queries

Siempre es aconsejable, ejecutar antes el select para ver si realmente es lo que espero obtener y luego pasar ese select como subconsulta o consulta anidada.

No sabia que se podia hacer una subquery, esto abre un mundo de posibilidades

INSERT INTO `books`(title, author_id, `year`)
VALUES('Vueltra al laberinto de la soledad',
    (SELECT author_id FROM authors
    where name = 'Octavio Paz'
    LIMIT 1
    )
);```

Interesante, esto de los sub querys no me lo sabia…Me gustaria saber como aplicarlos en un insert de un proyecto. A INVERTIGAR, Y MAS ALLA!!!

INSERT INTO books (title, autor_id, year)
VALUES (“Vuelta al Laberinto de la Soledad”,
(SELECT autor_id FROM authors
WHERE name = “Octavio Paz”
LIMIT 1
), 1960
)

A como entendi es, hacer un insert donde seleccionaremo el autor id de otra tabla que tiene como nombre octavio y esta consulta nos permitira registrar en la tabla libro

INSERT INTO t_books(title, author_id, year)
VALUES ('Vuelta al laberinto de la soledad', (
SELECT author_id FROM t_authors 
WHERE name = 'Octavio Paz' 
LIMIT 1 
), 1960
);```

INSERT INTO ‘books’(title,author_id,gender)
(‘el libro secreto’, (select author_id from authors
WHERE name = ‘Octavio Perez’ limit 1)
,‘m’);
//*Este es un select anidado que nos permite obtener el ID apartir del nombre del autor, hay que tener cuidado ya que puede ser muy peligroso dependiendo como se use. Puede traer información incorrecta y ser muy tardado.

Para algunos que todavía tienen dudas de porque se usa LIMIT 1 , es para limitar los resultados del SELECT y que solamente me retorne un resultado

Cuando ejecuto este query

<INSERT INTO books(title, author_id) VALUES('Cien años de soledad', 2);>

La consola de mysql dice que se tarda (0.07 sec) y cuando ejecuto el query anidado solo se tarda (0.04 sec). tarda menos tiempo.

Los sub-querys normalmente tienen una notación On una función exponencial.Los sub-querys pueden tardar sé demasiado y también puede insertar datos erróneos en el caso de los insert anidados.

La forma más directa de insertar una fila nueva en una tabla es mediante una sentencia INSERT. En la forma más simple de esta sentencia debemos indicar la tabla a la que queremos añadir filas, y los valores de cada columna. Las columnas de tipo cadena o fechas deben estar entre comillas sencillas o dobles, para las columnas númericas esto no es imprescindible, aunque también pueden estar entrecomilladas.

mysql> INSERT INTO gente VALUES (‘Fulano’,‘1974-04-12’);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO gente VALUES (‘Mengano’,‘1978-06-15’);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO gente VALUES
-> (‘Tulano’,‘2000-12-02’),
-> (‘Pegano’,‘1993-02-10’);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM gente;
±--------±-----------+
| nombre | fecha |
±--------±-----------+
| Fulano | 1974-04-12 |
| Mengano | 1978-06-15 |
| Tulano | 2000-12-02 |
| Pegano | 1993-02-10 |
±--------±-----------+
4 rows in set (0.08 sec)

mysql>

  • Comando para traer un dato de una tabla e insertarlo en una nueva tabla.
    INSERT INTO books(title, author_id, language) VALUES('Vuelta al laberinto de la soledad', (SELECT author_id FROM authors WHERE name = 'Juan Rulfo' LIMIT 1), 'ES');

Se pueden hacer sentencias INSERT con SLECTS anidados, es potente y funciona correctamente, pero a su vez presenta otros probelmas: a. Exponencialmente eleva el tiempo de respuesta según la cantidad de SELECTS que tenga anidados. b. Puede llegar a generar errores inesperados que no podemos controlar. c. Si la BD tiene un tamaño importante puede sobre esforzar la máquina. RESUMEN: unciona, funciona muy bien, pero se debe usar con mucho cuidado y preferiblemente solo usarlo para pruebas, no para la logica final.

vacanisimo este curso, no llevo nada de contenido, pero esta mas claro que el agua, super, la pregunta es con que lenguajes puedo hacer las consultas y conexiones?

tiempo se eleva al cuadrado, se demora mucho más en anidados

Recuerden que tambien pueden visualizar una lista de datos con \G

mysql> select * from books \G
*************************** 1. row ***************************
    book_id: 1
  author_id: 6
      title: El Laberinto de la Soledad
       year: 1900
   language: es
  cover_url: NULL
      price: 10.00
   sellable: 1
     copies: 1
description: NULL
*************************** 2. row ***************************
    book_id: 2
  author_id: 6
      title: Vuelta al Laberinto de la Soledad
       year: 1960
   language: es
  cover_url: NULL
      price: 10.00
   sellable: 1
     copies: 1
description: NULL
2 rows in set (0.00 sec)

mysql>

Para que se me vea mejor la tabla, solamente agrandé la pantalla y se vé perfecto.

Ejemplo de inserción anidada

Demos el caso de inserta una nueva tupla en la tabla books la cual incluirá el título del libro así como el, id del autor, de manera manual podríamos escribir

INSERT INTO books(title, author_id)
VALUES('El laberinto de la soledad', 6);
-- en el este caso el author id fue investigado manualmente

Una opción más eficiente y menos propensa a errores es la inserción con un query anidado

INSERT INTO books(title, author_id)
VALUES('Vuelta al laberinto de la soledad',
	(SELECT author_id FROM authors
	WHERE name = 'Octavio Paz'
	LIMIT 1
	-- colocar el limite es recomendable para traer solamente una ocurrencia
	)
);

Nota:

La recomendación del profesor es no usar esta herramienta en favor de realizar esta tarea en una capa de negocio, pudiendo manejarse desde el lenguaje de programación, una de las razones es la elevación al cuadrado del tiempo de procesamiento

INSERT INTO books(title, author_id, 'year')
VALUES('Vuelta al laberinto de la Soledad',
    (SELECT author_id FROM authors
    WHERE name ='Octavio Paz'
    LIMIT 1
    ), 1960
);

– -- INSERCIÓN DE DATOS USANDO QUERIES ANIDADOS –

El laberinto de la Soledad, Octavio Paz, 1952 (CSV)

– Lo optimo sería (manualmente):

en SQL sería SELECT * FROM authors where name = ‘Octavio Paz’;

INSERT INTO books (title, author_id) VALUES ('El laberinto de la Soledad',7)

– con esto vemos si está añadido:

select * from books;

– ahora queremos añadir otro libro en formato CSV. Con truco (subqueries):

Vuelta al laberinto de la soledad, Octavio Paz, 1960 (CSV)

INSERT INTO books (title, author_id, `year`) VALUES ('Vuelta al laberinto de la Soledad',
    (SELECT author_id FROM authors WHERE name = 'Octavio Paz' LIMIT 1), 1960 -- En este subqueries primero se ejecuta lo que está en paréntesis y luego el INSERT
);

inserción de datos con un query anidado se utiliza en columnas que estan relacionadas en diferentes tablas

El Laberito de la Soledad, Octabio Paz, 1952
Vuelta al Laberinto de la Soledad, Octavio Paz, 1960
INSERT INTO books( title, author_id) VALUES (‘El Laberito de la Soledad’, 18);

INSERT INTO books( title, author_id, year)
VALUES( ‘Vuelta al Laberinto de la Soledad’, (SELECT author_id FROM authors
WHERE name = 'Octavio Paz’
LIMIT 1
), 1960
);

SELECT author= me estoy trayendo una table de books una sentencia de traer una tabla a otra.
) es una sentencia que irá aparte( un programa dentro de otro programa)
al momento de traer otros Query a otras tablas, se tiene que usar con cuidado.

select * from books;
El título= va en una tabla
El nombre= va en otra tabla
select * from authors where name = ‘Octavio Paz’;

Tablas + Columnas = Base de datos

En resumen lo que entiendo es lo siguiente:
Queremos ingresar tres valores (tittle, author, year), por eso la sentencia:

INSERT INTO books(title, author_id, year)

title = 'Vuelta al laberinto de la Soledad’
year = 1960

El asunto está con el autor, entonces, author_id es buscando con un select en la sentencia:

SELECT author_id FROM authors WHERE neme = 'Octavio Paz'

author_id = 6 (En este ejemplo el id de Ocavio Paz es 6).

Es de cuidado el uso de los Queries anidados por su complejidad tanto para realizarlas cómo para su comprensión. Aquí toca paso por paso.

excelente curso

buen curso

Que gusto saber que podes desarrollarte con personas capases a nivel consola me gjstaria fuera mas aya y hacer los ejercicios en un id que no sea mysql

excelente !!

BUENAS CLASES

INSERT INTO books(title, aothor_id, year)
VALUES(‘Vuelta al Laberinto de la Soledad’,
WHERE name = 'Octavio Paz’
LIMIT 1
), 1960
);

Muy interesante los sub querys de un Insert:

INSERT INTO books(title, author_id)
VALUES(‘El Laberinto de la Soledad’,6);

INSERT INTO books(title, author_id, year)
VALUES(‘Vuelta al Laberinto de la Soledad’,
(SELECT author_id FROM authors
WHERE name = 'Octavio Paz’
LIMIT 1
),1960
);

Muchas gracias Aprendi arto

gracias, ya solucione, agradesco la ayuda en sus comentarios…

Muy claro todo!!

Listo y entendido

INSERT INTO books(title,author_id,price) values ('el libro secreto', (select author_id from authors WHERE name = 'Octavio Perez' limit 1) ,16.00);

Hola, alguien tiene este error ERROR 1364 (HY000): Field ‘language’ doesn’t have a default value

¿Qué es mejor, selects anidados o los joins?

Perfect!

INSERT INTO books (tittle, author_id)
VALUES ('Laberinto de las Soledad', 6);

INSERT INTO books (tittle, author_id, year) 
VALUES('Que viva la música!', (SELECT author_id FROM authors WHERE name = 'Andrés Caicedo' LIMIT 1), 1994);```

ami me da error el Query me ayudan:

mysql> insert into books(title, author_id) Values(‘El Laberinto de la Soledad’, 6);
ERROR 1364 (HY000): Field ‘copies’ doesn’t have a default value

con el segundo select creo que seria mejor invocar es el id del autor ya que un nombre puede ser demasiado repetitivo

INSERT INTO books (title, author_id, 'year') 
	VALUES ('Vuelta al Laberinto de la Soledad', 
		(select author_id FROM authors 
		where  id = '3'), 1960
);

NOTA: no importa el orden de inserción con INSERT INTO, si en nuestra tabla tenemos definido primero, nombre, municipio, edad. en el INSERT podemos poner:
INSERT INTO municipio (edad,nombre,municipio)
VALUES (23,‘Alex’,‘Ameca’); Solo hay que colocar el mismo orden en los VALUES.

INSERT INTO books (title,author_id,`year`,sellable)
VALUES ('El laberinto de la soledad',(SELECT author_id FROM authors WHERE name = 'Freddy Vega'),2010,0)```

lo principal para usar bases de datos relacionales son (select from where)

INSERT INTO books(title, author_id, `year`, language)
    VALUES('Vuelta al Laberinto de la Soledad',
    (SELECT author_id FROM authors
    WHERE name LIKE '%Octavio%' LIMIT 1),
    1960,'es');

El tiempo en Queries anidados se elevará al cuadrado.

INSERT INTO books(author_id, title) VALUES((SELECT author_id FROM authors WHERE `name` = 'Manuel Rivera'), 'Bajo la luz de la luna');```

En SQL siempre debemos procurar que una sentencia no se demore mucho tiempo en ejecutarse. Para conocer en MySQL ese tiempo debemos en consola ejecutar el siguiente comando:

SET profiling = 1;

una vez activado podemos ir realizando los query que necesitemos y con el siguiente comando verificamos cuando demoro una SELECT, un INSERT, un UPDATE u otros

SHOW profiles

Lo verías así:

Recuerden que los sub-querys normalmente tienen una notación o una función exponencial, pueden tardarse demasiado,lo ideal es que sean potentes y a la vez no tarden mucho,también puede insertar datos erróneos en el caso de los insert anidados.
Hay que procurar no utilizarlos,lo mejor es insertar con nuestro lenguaje de programación

Interesante 😃

Vaya yo escribí Octvio Paz y aun hizo la consulta solo que el id no ponía 6 sino NULL

INSERT INTO books (title, author_id) VALUES (‘El laberinto de la Soledad’, 6);
INSERT INTO books (title, author_id, year) VALUES (‘Vuelta al laberinto de la Soledad’,
(SELECT author_id FROM authors WHERE name = ‘Juan Carlos Onetti’),
1960);

Tengo una duda bastante basica, se me borro la base de datos de platzi_operation, como hago para asegurarme que este segura y en un directorio donde la pueda consultar.

Hola a todos! !

tengo una pregunta ¿hay alguna manera para poner en el query un “if not exists” o algo parecido para evitar que al ejecutar dos veces se duplique el registro?
Gracias!
1 el laberinto de la soledad 1900 es 10.00 1 1 3
2 el laberinto de la soledad 1900 es 10.00 1 1 3

Siento que me voy a preocupar cuando use este tipo de query jajaja.

antes no entendía nada, lo importante que es ver las cosas organizadas 😄

INSERT INTO Books(Authors_id,title,`year`)
  VALUES
    (
      (SELECT id FROM Authors
      WHERE `name` = 'Octavio Paz'
      LIMIT 1),
      'Vuelta al laberinto de la soledad',
      1960
    )
;

Notas de clases:

El laberinto de la Soledad ,Octavio Paz , 1952
INSERT INTO  books(title, author_id) VALUES('El laberinto de la Soledad','Octavio Paz');

select * from authors where name = 'Octavio Paz';

El laberinto de la Soledad ,Octavio Paz , 1952
INSERT INTO books(title, author_id) VALUES('El laberinto de la Soledad',6);

Vuelta al laberinto de la Soledad, Octavio Paz, 1960
INSERT INTO books(title, author_id,`year`) 
VALUES('Vuelta al laberinto de la Soledad',
    (SELECT author_id FROM authors 
    WHERE name = 'Octavio Paz'
    LIMIT 1
    ), 1960
);

Muy bien explicado

Por si alguno no comprendió lo de los archivos CSV, son un tipo de documento en formato abierto sencillo para representar datos en forma de tabla, en las que las columnas se separan por comas y las filas por saltos de línea.

Potente pero peligroso

.

INSERT INTO books (title, author_id, year) VALUES ('Vuelta al laberinto de la Soledad',
(SELECT author_id FROM authors WHERE name = 'Octavio Paz'),
1960);

Interesante lo de queries anidados, sin embargo es contraproducente usarlo debido a que aumenta la complejidad algoritmica y es mejor hacer hacer estos inserts usando scripts.

Interesante! hay que seguir practicando

mysql> INSERT INTO books (title, author_id, year)
-> VALUES (“Vuelta al laberinto de la Soledad”,
-> (SELECT author_id FROM author
-> WHERE name= “Octavio Paz”
-> LIMIT 1
-> ), 1960
-> );
Query OK, 1 row affected (0.26 sec)