A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de SQL y MySQL

Curso de SQL y MySQL

Alberto Alcocer

Alberto Alcocer

Inserci贸n de datos usando queries anidados

13/24
Recursos

Aportes 72

Preguntas 22

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

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

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
馃捑鉃♀灐鉃○煋

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);
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
);```

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

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.

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.

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鈥e gustaria saber como aplicarlos en un insert de un proyecto. A INVERTIGAR, Y MAS ALLA!!!

INSERT INTO books (title, autor_id, year)
VALUES (鈥淰uelta al Laberinto de la Soledad鈥,
(SELECT autor_id FROM authors
WHERE name = 鈥淥ctavio 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 鈥榖ooks鈥(title,author_id,gender)
(鈥榚l libro secreto鈥, (select author_id from authors
WHERE name = 鈥極ctavio Perez鈥 limit 1)
,鈥榤鈥);
//*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.

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

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 (鈥楩ulano鈥,鈥1974-04-12鈥);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO gente VALUES (鈥楳engano鈥,鈥1978-06-15鈥);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO gente VALUES
-> (鈥楾ulano鈥,鈥2000-12-02鈥),
-> (鈥楶egano鈥,鈥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');

鈥 -- 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 = 鈥極ctavio 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
);

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

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 (鈥楨l Laberito de la Soledad鈥, 18);

INSERT INTO books( title, author_id, year)
VALUES( 鈥榁uelta 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 = 鈥極ctavio 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).

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.

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 !!

Que tipo de brujeria fue ese INSERT? jajajaja

BUENAS CLASES

INSERT INTO books(title, aothor_id, year)
VALUES(鈥榁uelta 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(鈥楨l Laberinto de la Soledad鈥,6);

INSERT INTO books(title, author_id, year)
VALUES(鈥榁uelta 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 鈥榣anguage鈥 doesn鈥檛 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(鈥楨l Laberinto de la Soledad鈥, 6);
ERROR 1364 (HY000): Field 鈥榗opies鈥 doesn鈥檛 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,鈥楢lex鈥,鈥楢meca鈥); 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 (鈥楨l laberinto de la Soledad鈥, 6);
INSERT INTO books (title, author_id, year) VALUES (鈥榁uelta al laberinto de la Soledad鈥,
(SELECT author_id FROM authors WHERE name = 鈥楯uan Carlos Onetti鈥),
1960);

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?

Hola a todos! !

tengo una pregunta 驴hay alguna manera para poner en el query un 鈥渋f 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.

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.

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 (鈥淰uelta al laberinto de la Soledad鈥,
-> (SELECT author_id FROM author
-> WHERE name= 鈥淥ctavio Paz鈥
-> LIMIT 1
-> ), 1960
-> );
Query OK, 1 row affected (0.26 sec)