【MySQL】Conceptos básicos de la base de datos③

 Capítulo anterior:  [MySQL] Conceptos básicos de la base de datos②                                                                                                  

✍Mesa temporal

ilustrar:

Las tablas temporales de MySQL son muy útiles cuando necesitamos guardar algunos datos temporales. Las tablas temporales solo son visibles en la conexión actual. Cuando se cierra la conexión, Mysql eliminará automáticamente la tabla y liberará todo el espacio.

Las tablas temporales se agregan en MySQL 3.23. Si su versión de MySQL es anterior a la 3.23, no puede usar las tablas temporales de MySQL.

Si usa otro programa cliente MySQL para conectarse al servidor de base de datos MySQL para crear una tabla temporal, la tabla temporal solo se destruirá cuando se cierre el programa cliente, por supuesto, también puede destruirla manualmente.

1. Crea una tabla temporal

  • Crear tabla temporal
 CREATE TEMPORARY TABLE product_temporary (
    product_name VARCHAR(50) NOT NULL,
    total_sales DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    sold_total INT UNSIGNED NOT NULL DEFAULT 0
);
  • Agregar un dato a Pro 
INSERT INTO product_temporary (product_name, total_sales, price, sold_total) VALUES ('手机', 100.25, 90, 2);
  • ver los datos en la tabla temporal 
select * from product_temporary;

 

Cuando utilice el comando SHOW TABLES para mostrar una lista de tablas de datos, no podrá ver la tabla product_temporary.

Si sale de la sesión actual de MySQL y luego usa el comando SELECT para leer los datos de la tabla temporal creada anteriormente, encontrará que la tabla no existe en la base de datos, porque la tabla temporal se destruyó cuando salió.

2. Eliminar la tabla temporal

ilustrar:

De forma predeterminada, las tablas temporales se destruyen automáticamente cuando se desconecta de la base de datos. Por supuesto, también puede usar el comando  DROP TABLE  en la sesión actual de MySQL para eliminar manualmente la tabla temporal.

  • Eliminar manualmente la tabla temporal

 DROP TABLE product_temporary;

✍Copiar tabla

ilustrar:

Si necesitamos copiar completamente la tabla de datos de MySQL, incluida la estructura de la tabla, el índice, el valor predeterminado, etc. Esto no es posible con solo el comando CREAR TABLA ... SELECCIONAR  .

Cómo copiar completamente la tabla de datos de MySQL, los pasos son los siguientes:

  • Utilice  el comando SHOW CREATE TABLE  para obtener la declaración de creación de una tabla de datos ( CREATE TABLE ), que incluye la estructura, el índice, etc. de la tabla de datos original.
  • Copie la instrucción SQL que muestra el siguiente comando, modifique el nombre de la tabla de datos y ejecute la instrucción SQL. El comando anterior copiará completamente la estructura de la tabla de datos.
  • Si desea copiar el contenido de la tabla, puede usar  la  declaración INSERT INTO ... SELECT para lograrlo.

1. Paso 1

  • Demuestra cómo copiar la tabla text_table.
SHOW CREATE TABLE text_table \G;
  • Obtenga la estructura completa de la tabla de datos. 
*************************** 1. row ***************************
       Table: text_table
Create Table: CREATE TABLE `text_table` (
  `text_id` int unsigned NOT NULL AUTO_INCREMENT,
  `text_title` varchar(100) NOT NULL,
  `text_author` varchar(40) NOT NULL,
  `submission_date` date DEFAULT NULL,
  PRIMARY KEY (`text_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)

2. Paso 2

  • Modifique el nombre de la tabla de datos de la instrucción SQL y ejecute la instrucción SQL.
CREATE TABLE `text_copy` (
  `text_id` int unsigned NOT NULL AUTO_INCREMENT,
  `text_title` varchar(100) NOT NULL,
  `text_author` varchar(40) NOT NULL,
  `submission_date` date DEFAULT NULL,
  PRIMARY KEY (`text_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3;

3. Paso tres

  • Después de realizar el segundo paso, creará una nueva tabla clonada text_copy en la base de datos. Si desea copiar los datos de la tabla de datos, puede usar  la instrucción INSERT INTO... SELECT  para lograrlo.
INSERT INTO text_copy (text_id,text_title,text_author,submission_date)
SELECT text_id,text_title,text_author,submission_date FROM text_table;

Después de realizar los pasos anteriores, el contenido de la tabla se copiará por completo, incluida la estructura de la tabla y los datos de la tabla.

  •  Ver la tabla text_copy clonada
mysql> select * from  text_copy;
+---------+----------------+--------------+-----------------+
| text_id | text_title     | text_author  | submission_date |
+---------+----------------+--------------+-----------------+
|       1 | 安徒生童话     | 臭弟弟       | 2023-06-16      |
|       2 | 小天鹅与丑小鸭 | 你才是臭弟弟 | 2023-06-16      |
|       3 | 西游记         | 我不是臭弟弟 | 2023-06-16      |
|       5 | csdn           | 作者         | 2023-06-19      |
|       6 | 测试           | text         | 2023-06-19      |
+---------+----------------+--------------+-----------------+
5 rows in set (0.29 sec)

✍Metadatos

ilustrar:

Los metadatos MySQL (Metadatos) se refieren a la información sobre la estructura de datos en la base de datos MySQL, como base de datos, tabla, columna, índice y otra información. En MySQL, los metadatos generalmente se almacenan en la base de datos del sistema en forma de diccionario de datos, y la información de los metadatos se puede obtener consultando el diccionario de datos.

1. Declaraciones de consulta de metadatos de uso común

  • consultar todas las bases de datos
SHOW DATABASES;
  • Consultar todas las tablas en la base de datos especificada
SHOW TABLES;
  •  Consultar la información de la columna de la tabla especificada
DESCRIBE table_name;
  • Consultar la información de índice de la tabla especificada
SHOW INDEX FROM table_name;
  • Consultar la información del espacio de tabla de la tabla especificada
SHOW TABLE STATUS LIKE 'table_name';
  • Consultar los permisos de todos los usuarios
SELECT user, host, grant_priv, super_priv FROM mysql.user;
  • Consultar los permisos del usuario actualmente conectado
SELECT * FROM information_schema.USER_PRIVILEGES;
  • Consultar el uso del espacio de tabla de todas las bases de datos
SHOW TABLE STATUS;

2. Obtener metadatos del servidor

Orden describir
SELECCIONAR VERSIÓN() Información de la versión del servidor
SELECCIONAR BASE DE DATOS() nombre de la base de datos actual (o retorno vacío)
SELECCIONAR USUARIO() nombre de usuario actual
MOSTRAR ESTADO el estado del servidor
MOSTRAR VARIABLES Variables de configuración del servidor


✍Manejo de datos duplicados

ilustrar:

Puede haber registros duplicados en la tabla de datos, en algunos casos permitimos la existencia de datos duplicados, pero a veces también necesitamos eliminar estos datos duplicados.

Presenta principalmente cómo evitar datos duplicados en la tabla de datos y cómo eliminar los datos duplicados en la tabla de datos.

1. Prevenir datos duplicados en la tabla

  • Puede establecer el campo especificado en la tabla de datos de MySQL como CLAVE PRIMARIA (clave principal) o índice ÚNICO (único) para garantizar la unicidad de los datos.

Ejemplo: no hay índices ni claves principales en la siguiente tabla, por lo que se permiten múltiples registros duplicados en esta tabla.

CREATE TABLE person_table
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);
  •  Si desea configurar los campos de nombre y apellido en la tabla, los datos no se pueden repetir, puede configurar el modo de clave principal dual para establecer la singularidad de los datos, si configura la clave principal dual, entonces el valor predeterminado de eso key no puede ser NULL, puede establecerla en NOT NULL.

Como sigue:

CREATE TABLE person_table
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

 Reponer:

Por supuesto, es más conveniente y eficiente usar herramientas de visualización, como se muestra a continuación. 

  • Si establecemos un índice único, al insertar datos duplicados, la instrucción SQL no se ejecutará correctamente y se generará un error.
  • La diferencia entre INSERT IGNORE INTO e INSERT INTO es que INSERT IGNORE INTO ignorará los datos existentes en la base de datos.Si no hay datos en la base de datos, se insertarán nuevos datos, y si hay datos, estos datos se omitirán. De esta forma, los datos existentes en la base de datos pueden conservarse para lograr el propósito de insertar datos en el espacio vacío.

El siguiente ejemplo usa INSERT IGNORE INTO, no habrá ningún error después de la ejecución y no se insertarán datos duplicados en la tabla de datos:

mysql> INSERT IGNORE INTO person_table (last_name, first_name)VALUES( 'mr.xiao', 'csdn');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> INSERT IGNORE INTO person_table (last_name, first_name)VALUES( 'mr.xiao', 'csdn');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from person_table;
+------------+-----------+------+
| first_name | last_name | sex  |
+------------+-----------+------+
| Thomas     | Jay       | NULL |
| csdn       | mr.xiao   | NULL |
+------------+-----------+------+
2 rows in set (0.00 sec)
  • INSERTAR IGNORAR EN Al insertar datos, después de establecer la unicidad del registro, si se insertan datos duplicados, no se devolverá ningún error, solo se devolverá una advertencia. Para REPLACE INTO, si hay un registro con el mismo primario o único, elimínelo primero. Luego inserte un nuevo registro.

Otra forma de establecer la unicidad de los datos es agregar un índice ÚNICO, como este:

CREATE TABLE person_table
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   UNIQUE (last_name, first_name)
);

2. Datos estadísticos duplicados

  • Cuente el número de registros duplicados de first_name y last_name en la tabla person_table
SELECT
	COUNT(*) AS repetitions,
	last_name,
	first_name 
FROM
	person_table 
GROUP BY
	last_name,
	first_name 
HAVING
	repetitions > 1;

    La consulta SQL anterior tiene valores duplicados para la combinación last_name y first_name en la tabla person_table. Devuelve el número total de cada combinación (repeticiones) y el last_name y first_name en la combinación.

En concreto, esta consulta:

  • La función COUNT(*) se usa para contar el número de filas (es decir, el número de repeticiones) para cada combinación, y se llama repeticiones.
  • La cláusula GROUP BY se usa para agrupar filas con el mismo apellido y nombre.
  • La cláusula HAVING se usa para filtrar combinaciones con repeticiones mayores que 1.

Los resultados se ordenarán por apellido y nombre y se devolverán las filas con valores duplicados.

3. Filtra datos duplicados

  • Si necesita leer datos no duplicados, puede usar la palabra clave DISTINCT en la declaración SELECT para filtrar datos duplicados.
SELECT DISTINCT
	last_name,
	first_name 
FROM
	person_table;
  •  También puede usar GROUP BY para leer datos no duplicados en la tabla de datos
SELECT
	last_name,
	first_name 
FROM
	person_table 
GROUP BY
	last_name,
	first_name;

4. Eliminar datos duplicados

  • Use la palabra clave DISTINCT y el operador UNION
SELECT DISTINCT * FROM (  
  SELECT column_name1, column_name2, ... FROM table_name  
  UNION  
  SELECT column_name1, column_name2, ... FROM table_name  
) AS tmp;

 Este método copiará todas las filas de la tabla en una tabla temporal y utilizará la palabra clave DISTINCT para eliminar las filas duplicadas.

  • Uso de las cláusulas GROUP BY y HAVING
DELETE table_name  
FROM table_name  
WHERE column_name IN (  
  SELECT column_name  
  FROM table_name  
  GROUP BY column_name  
  HAVING COUNT(*) > 1  
);

Este método utilizará una subconsulta para encontrar columnas con valores duplicados y eliminar esas filas en la tabla principal.

  • Use NOT IN o LEFT JOIN
DELETE table_name  
FROM table_name  
WHERE id NOT IN (  
  SELECT MIN(id)  
  FROM table_name  
  GROUP BY column_name  
);

 o use una combinación izquierda

DELETE t1  
FROM table_name t1  
LEFT JOIN (  
  SELECT MIN(id) AS id  
  FROM table_name  
  GROUP BY column_name  
) t2 ON t1.id = t2.id  
WHERE t2.id IS NULL;

 Ambos métodos eliminan los valores duplicados de la tabla, pero no todas las filas de la columna que contienen valores duplicados. En cambio, solo se elimina una fila de valores duplicados.

✍inyección SQL

Cómo prevenir ataques de inyección SQL:

  1. Uso de declaraciones preparadas: las declaraciones preparadas son un método de precompilación de declaraciones SQL antes de ejecutar consultas SQL. Este enfoque separa la consulta SQL de los datos, lo que hace imposible que los atacantes exploten los ataques de inyección SQL.
  2. Usar consulta parametrizada (Parameterized Query): La consulta parametrizada es una forma de separar la consulta SQL y los datos. Lo hace separando las cadenas de consulta de los parámetros variables, evitando así los ataques de inyección SQL.
  3. Filtrar caracteres especiales: al crear consultas SQL, puede utilizar el método de filtrado de caracteres especiales para evitar ataques de inyección SQL. Por ejemplo, las expresiones regulares se pueden usar para filtrar caracteres especiales en la entrada.
  4. Use privilegios mínimos: asegúrese de que el usuario de MySQL utilizado por la aplicación tenga privilegios mínimos. Esto significa que una aplicación solo necesita usar permisos suficientes para realizar sus tareas y no se requieren permisos adicionales.
  5. Use una biblioteca de conexión segura: cuando use la biblioteca de conexión de MySQL, asegúrese de usar la última versión de la biblioteca de conexión. Estas bibliotecas a menudo contienen mejoras de seguridad y protección contra ataques de inyección SQL.
  6. Valide y filtre la entrada: antes de aceptar la entrada del usuario, valide y filtre la entrada para asegurarse de que se ajuste al formato y tipo esperados. Esto evita que la entrada maliciosa provoque ataques de inyección SQL.
  7. Use un firewall de aplicaciones o WAF: use un firewall de aplicaciones o WAF en el nivel de la aplicación para detectar y bloquear ataques de inyección SQL. Estos cortafuegos suelen tener capacidades de detección y bloqueo basadas en reglas, que pueden proteger eficazmente las aplicaciones de los ataques de inyección SQL.

                                                                                              

Supongo que te gusta

Origin blog.csdn.net/weixin_50002038/article/details/131283216
Recomendado
Clasificación