【MySQL】数据库基础 ③

news2024/11/15 14:23:43

 上一章: 【MySQL】数据库基础 ②                                                                                                  

✍临时表

说明:

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。

临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。

如果你使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁

1、创建临时表

  • 创建临时表
 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
);
  • 给临添加一条数据 
INSERT INTO product_temporary (product_name, total_sales, price, sold_total) VALUES ('手机', 100.25, 90, 2);
  • 查看临时表中的数据 
select * from product_temporary;

 

当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 product_temporary 表。

如果你退出当前MySQL会话,再使用 SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时该临时表已经被销毁了。

2、删除临时表

说明:

默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你也可以在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。

  • 手动删除临时表

 DROP TABLE product_temporary;

✍复制表

说明:

如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。

如何完整的复制MySQL数据表,步骤如下:

  • 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
  • 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
  • 如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。

1、步骤一

  • 演示复制表 text_table。
SHOW CREATE TABLE text_table \G;
  • 获取数据表的完整结构。 
*************************** 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、步骤二

  • 修改SQL语句的数据表名,并执行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、步骤三

  • 执行完第二步骤后,你将在数据库中创建新的克隆表 text_copy 。 如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。
INSERT INTO text_copy (text_id,text_title,text_author,submission_date)
SELECT text_id,text_title,text_author,submission_date FROM text_table;

执行以上步骤后,会完整的复制表的内容,包括表结构及表数据。

  •  查看克隆后的 text_copy 表
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)

✍元数据

说明:

MySQL元数据(Metadata)是指MySQL数据库中关于数据结构的信息,如数据库、表、列、索引等信息。在MySQL中,元数据通常以数据字典的形式存储在系统数据库中,可以通过查询数据字典来获取元数据信息。

1、常用元数据查询语句

  • 查询所有数据库
SHOW DATABASES;
  • 查询指定数据库中的所有表
SHOW TABLES;
  •  查询指定表的列信息
DESCRIBE table_name;
  • 查询指定表的索引信息
SHOW INDEX FROM table_name;
  • 查询指定表的表空间信息
SHOW TABLE STATUS LIKE 'table_name';
  • 查询所有用户的权限
SELECT user, host, grant_priv, super_priv FROM mysql.user;
  • 查询当前登录用户的权限
SELECT * FROM information_schema.USER_PRIVILEGES;
  • 查询所有数据库的表空间使用情况
SHOW TABLE STATUS;

2、获取服务器元数据

命令描述
SELECT VERSION()服务器版本信息
SELECT DATABASE()当前数据库名 (或者返回空)
SELECT USER()当前用户名
SHOW STATUS服务器状态
SHOW VARIABLES服务器配置变量


✍处理重复数据

说明:

数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。

主要介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。

1、防止表中出现重复数据

  • 可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。

实例:下表中无索引及主键,所以该表允许出现多条重复记录。

CREATE TABLE person_table
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);
  •  如果你想设置表中字段 first_name,last_name 数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。

如下所示:

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

 补充:

当然使用可视化工具 更方便效率更高,如下图 

  • 如果我们设置了唯一索引,那么在插入重复数据时,SQL 语句将无法执行成功,并抛出错。
  • INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE INTO 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:

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)
  • INSERT IGNORE INTO 当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而 REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。

另一种设置数据的唯一性方法是添加一个 UNIQUE 索引,如下所示:

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、统计重复数据

  • 统计 person_table 表中 first_name 和 last_name的重复记录数
SELECT
	COUNT(*) AS repetitions,
	last_name,
	first_name 
FROM
	person_table 
GROUP BY
	last_name,
	first_name 
HAVING
	repetitions > 1;

    以上SQL查询在person_table表中具有重复值的last_name和first_name组合。它返回每个组合的总数(repetitions)以及组合中的last_name和first_name。

具体来说,这个查询:

  • 使用了COUNT(*)函数来计算每个组合的行数(即重复次数),并将其命名为repetitions。
  • 使用了GROUP BY子句来分组具有相同last_name和first_name的行。
  • 使用了HAVING子句来筛选出重复次数大于1的组合。

结果将按照last_name和first_name的顺序进行排序,并返回具有重复值的行。

3、过滤重复数据

  • 如果需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
SELECT DISTINCT
	last_name,
	first_name 
FROM
	person_table;
  •  也可以使用 GROUP BY 来读取数据表中不重复的数据
SELECT
	last_name,
	first_name 
FROM
	person_table 
GROUP BY
	last_name,
	first_name;

4、 删除重复数据

  • 使用DISTINCT关键字和UNION操作符
SELECT DISTINCT * FROM (  
  SELECT column_name1, column_name2, ... FROM table_name  
  UNION  
  SELECT column_name1, column_name2, ... FROM table_name  
) AS tmp;

 这个方法会将表中的所有行复制到临时表中,并使用DISTINCT关键字删除重复的行。

  • 使用GROUP BY和HAVING子句
DELETE table_name  
FROM table_name  
WHERE column_name IN (  
  SELECT column_name  
  FROM table_name  
  GROUP BY column_name  
  HAVING COUNT(*) > 1  
);

这个方法将使用子查询查找具有重复值的列,并在主表中删除这些行。

  • 使用NOT IN或LEFT JOIN
DELETE table_name  
FROM table_name  
WHERE id NOT IN (  
  SELECT MIN(id)  
  FROM table_name  
  GROUP BY column_name  
);

 或者使用左连接

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;

 这两种方法都会从表中删除重复值,但不会删除包含重复值的列中的所有行。而是只删除重复值中的一行。

✍SQL注入

如何防止 SQL 注入攻击:

  1. 使用预编译语句(Prepared Statement):预编译语句是一种在执行 SQL 查询之前预编译 SQL 语句的方法。这种方法将 SQL 查询和数据分开,使得攻击者无法利用 SQL 注入攻击。
  2. 使用参数化查询(Parameterized Query):参数化查询是一种将 SQL 查询和数据分开的方法。它通过将查询字符串和变量参数分离来实现,从而避免了 SQL 注入攻击。
  3. 过滤特殊字符:在构建 SQL 查询时,可以使用过滤特殊字符的方法来防止 SQL 注入攻击。例如,可以使用正则表达式来过滤输入中的特殊字符。
  4. 使用最小化权限:确保应用程序使用的 MySQL 用户具有最小的权限。这意味着,应用程序只需要使用足够的权限来执行其任务,而不需要额外的权限。
  5. 使用安全的连接库:使用 MySQL 的连接库时,请确保使用最新版本的连接库。这些库通常包含安全性和防止 SQL 注入攻击的改进。
  6. 对输入进行验证和过滤:在接受用户输入之前,请对输入进行验证和过滤,以确保其符合预期的格式和类型。这可以防止恶意输入导致 SQL 注入攻击。
  7. 使用应用防火墙或 WAF:在应用程序级别上使用应用防火墙或 WAF,以检测和阻止 SQL 注入攻击。这些防火墙通常具有基于规则的检测和阻止功能,可以有效地保护应用程序免受 SQL 注入攻击。

                                                                                              

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

局域网实验报告

计算机网络综合实训 实训报告一 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 柯宗武 教授 提交时间 2023.3.10 网络层实验报告 (湖北师范大学计算机与信息工程学院 中国 黄石 435002) 1 集线器与交换机的对比实验 1.1 背…

【Python】自动化构建项目结构样式

引言 在使用Python或者其它编程语言的项目时候,编写README.md 往往是不可或缺的; 而在README.md 中,关于项目结构的样式展示,这个是可选的。不展示也无伤大雅,但有展示的话,有以下优点: 提供…

第九章 总结及作业(4)【编译原理】

第九章 总结及作业(4)【编译原理】 前言推荐第九章 运行时存储空间组织9.1 目标程序运行时的活动9.1.1过程的活动9.1.2参数传递 9.2 运行时存储器的划分9.2.1运行时存储器的划分9.2.2 活动记录9.2.3 存储分配策咯 9.3 静态存储分配9.3.1数据区*9.3.2公用…

基于深度学习的人脸检测技术

用到环境 1、pycharm community edition 2022.3.2 2、Python 3.10 整篇内容都已上传至我的csdn资源中,想用的请移步。 流程 多任务级联卷积神经网络(Multi-task Cascaded Convolutional Networks, MTCNN)算法进行人脸检测 普通人脸检测 单人人脸检测 图1 单人人…

我最喜欢的编程语言是python,以及我的见解!!

这里写目录标题 我最喜欢的编程语言:1、我个人认为编程语言优劣的评选标准2、我对不同编程语言的优点与缺点的拙见**1. Java****2. Python****3. JavaScript****4. C语言:****5. C语言:** 3、对python编程语言未来发展的猜测和未来趋势 我最喜…

Vicuna-13B使用云服务器部署

Vicuna概述 Vicuna由一群主要来自加州大学伯克利分校的研究人员推出,仍然是熟悉的配方、熟悉的味道。Vicuna同样是基于Meta开源的LLaMA大模型微调而来,它的训练数据是来自ShareGPT上的7万多条数据(ShareGPT一个分享ChatGPT对话的谷歌插件&am…

kerberos配置dolphinscheduler

kerberos配置dolphinscheduler 一、添加dolphin 用戶1.所有節點上執行如下命令: 二、DolphinScheduler集群模式部署1.集群规划2.前置准备工作3.解压DolphinScheduler安装包4. 创建元数据库及用户5. 配置一键部署脚本6 初始化数据库7.修改common配置文件8. 一键部署D…

华为、思科和瞻博网络三个厂商如何配置基本ACL和高级ACL?

今天给大家带来基本ACL和高级ACL的配置,主要会介绍三个厂商的配置: 其他厂商也可以参考,比如华三的可以参考华为的,锐捷的参考思科的。 1. 基本ACL配置 基本ACL(Access Control List)是一种简单的网络安全…

【Java高级语法】(十二)可变参数:Java中的“可变之美“,做好这些细节,你的程序强大又灵活~

Java高级语法详解之可变参数 🔹 前言1️⃣ 概念2️⃣ 优势和缺点3️⃣ 特征和应用场景3.1 特征3.2 应用场景 4️⃣ 使用和原理5️⃣ 使用技巧5.1 可变参数结合泛型5.2 使用元组或列表进行参数传递5.3 使用默认值5.4 缓存计算结果 6️⃣ 实战:构建动态日志…

【Vue3+Ts project】认识 Websocket 以及 socket.io 库

目录 Websocket socket.io Socket.iO 事件名总结: Socket.IO 方法总结 Websocket 作用: WebSocket 仍然提供实时的双向通信功能,使用Vue3 应用程序能够与服务器进行实时数据交换降低延迟和网络开销:相比传统的HTTP请求-响…

scratch lenet(7): C语言计算可学习参数数量和连接数量

scratch lenet(7): C语言计算可学习参数数量和连接数量 1. 目的 按照 LeNet-5 对应的原版论文 LeCun-98.pdf 的网络结构,算出符合原文数据的“网络每层可学习参数数量、连接数量”。 网络上很多人的 LeNet-5 实现仅仅是 “copy” 现有的别人的项目, 缺…

求2的N次幂(C++)解决高精度运算

​👻内容专栏:《C/C专栏》 🐨本文概括: 计算高精度的2的N次方数字。 🐼本文作者:花 碟 🐸发布时间:2023.6.22 文章目录 ​前言求2的N次方,N ≤ 10000实现思路&#xff1a…

SpringBoot 如何使用 @PathVariable 进行数据校验

SpringBoot 如何使用 PathVariable 进行数据校验 在 SpringBoot 项目中,我们经常需要从 URL 中获取参数并进行相关的数据校验。而 PathVariable 注解就是一种非常方便的方式,可以让我们在方法参数中直接获取 URL 中的参数,并进行数据校验。本…

基于python开发实现数学中各种经典曲线的可视化

今天正好有点时间就想着把之前零星时间里面做的一点小东西整合一下梳理出来,本文的核心目的就是想要基于python来开发实现各种有趣的数学曲线的可视化展示。 笛卡尔心形线 笛卡尔心形线是一种二维平面曲线,由法国数学家笛卡尔在17世纪提出。它得名于其…

基于springboot+Redis的前后端分离项目(三)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 优惠券秒杀 优惠券秒杀1 -全局唯一ID2 -Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 优惠券秒杀-一人一单…

Spring Boot 异常处理的主要特点

Spring Boot 异常处理的主要特点 在 Web 应用程序中,异常处理是非常重要的一部分。在 Spring Boot 中,异常处理是非常简单和灵活的。本文将介绍 Spring Boot 异常处理的主要特点,并提供一些示例代码来帮助您更好地理解。 异常处理的主要特点…

王道计算机网络学习笔记(1)——计算机网络基本知识

前言 文章中的内容来自B站王道考研计算机网络课程,想要完整学习的可以到B站官方看完整版。 一:计算机网络基本知识 1.1.1:认识计算机网络 计算机网络的功能 网络把许多计算机连接在一起,而互联网则将许多网络连接在一起&#x…

第一章JavaScript简介

第一章JavaScript简介 js是一门,高级,动态,解释型编程语言 每种语言都必须有一个平台或标准库,用于执行包括基本输入和输出在内的基本操作.核心js语言定义了最小限度的API,可以操作数组,文本,数组,集合,映射等,但不包括任何输入输出的功能.输入和输出(以及更加复杂的特性,如联…

基于Servlet实现分页查询

Servlet JSPJSTL MySQLBootstrap 等技术实现分页查询功能。 所用工具:IDEA 2022.3.3 Navicat Tomcat 等。 本文目录 一:运行效果 二:代码详解 (1)index.jsp (2)PageBean &#xff08…

图解操作系统笔记

硬件基础 CPU是如何执行程序的? 程序执行的基本过程 第一步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据&#…