数据库基础知识---以MySQL为例

一、什么是MySQL

  • 数据保存在不同的表中,而不是将所有数据放在一个大仓库内

二、特点

  • 开源--免费下载
  • 跨平台--可以在多个操作系统进行运行
  • 性能好--可以出来大量数据
  • 简单--安装配置简单
  • 支持多种编程语言--可以与多种编程语言进行无缝集成

三、分类

  • DDL--数据定义语言:用来定义数据库对象、数据库、表、列
  • DML--数据操作语言:用来对数据库中表的记录进行更新
  • DQL--数据查询语言:用来查询数据库中表的记录
  • DCL--数据控制记录:用来定义数据库的访问权限、安全级别、创建用户

四、常用数据类型

 大致分为三类:数值、时间/日期、字符/字符串

1.数值

  • int
  • double

2.时间/日期

  • date-- YYYY-MM-DD
  • time--HH:MM:SS
  • year--YYYY

3.字符/字符串

  • varchar--变长字符串
  • char--定长字符串 

五、注释

  • 单行注释:--空格
  • 多行注释:/* */
  • #--MySQL特有注解 

六、分类(详细)

1.DDL

  • //库
    create database 数据库名:创建数据库
    
    create database 数据库名 character set 字符集:创建一个数据库,并设置其字符集
     
    select database(): 查看正在使用的数据库
    
    use 数据库名:切换到 数据库操作
    
    show databases:查看所有的数据库
    
    show creat database 数据库名:查看指定数据库的定义信息
    
    alter database 数据库名 character set 字符集:修改指定数据库的字符集
    
    drop database 数据库名:永久删除指定数据库
    
    //表
    
    CREATE TABLE 表名(
    
    字段名称1 字段类型(长度),
    
    字段名称2 字段类型 最后一列不加逗号
    
    );
    
    CREATE TABLE 新表名 like 旧表名:复制表结构
    
    show tables; 查看根数据库的所有表名
    
    desc 表名 :查看数据表的结构
    
    drop table 表名; 删除表
    
    drop table if exists 表名; 存在的话就删除,不存在就不执行删除
    
    rename table 旧表名 to 新表名:修改表名
    
    alter table 表明 character set 字符集名:修改表的字符集
    
    alter table 表名 add 字段名称 字段类型:向表中添加列 关键字 ADD(删除列 关键字 DROP)
    
    //列
    alter table 表名 modify 字段名称 字段类型:修改表中列的 数据类型或长度 ,关键字 MODIFY
    
    alter table 表明 change 旧列名 新列名 类型(长度):修改列名称,关键字 CHANGE
    
    alter table 表明 drop 列名:删除列,关键字 DROP

2.DML

  • insert into 表名 values (字段1,字段2...):插入全部字段
    注意事项
    1.值与字段必须对应 ——个数相同,数据类型相同
    2.值的数据大小,必须在字段的长度范围内
    3.varchar char date 类型,必须使用单引号或双引号
    4.要插入空值,可以忽略该字段,或插入 null
    
    update 表名 set 列名 = 值 where 条件表达式:带条件修改
    
    delete from 表名 where 条件表达式:指定条件删除

3.DQL

  • select * from 表名:查询所有数据
    
    select 字段1,字段2 from 表名:查询指定字段数据
    
    别名查询 关键字 AS
    
    select distinct * from 表名:去重关键字 distinct
    
    排序——Order By
    select 字段名 from 表名 [where 字段 = 值 ] order by 字段名[ ASC / DESC]
    ASC 表示升序,默认 ——ascending
    DESC 表示降序——Descending
    
    单例排序——只按照某一个字段排序
    select 字段名 from 表名 [where 字段 = 值 ] order by 字段名[ ASC / DESC]
    
    组合排序——同时对多个字段排序
    select 字段名 from 表名 [where 字段 = 值 ] order by 字段名1[ ASC / DESC] , 字段名2[ ASC / DESC] ;
    
    聚合函数
    SELECT 聚合函数(字段名) FROM 表名;
    聚合函数类型及作用
    count(字段)	统计指定列不为NULL的记录行数
    sum(字段)	计算指定列的数值和
    min(字段)	计算指定列的最大值
    max(字段)	计算指定列的最小值
    avg(字段)	计算指定列的平均值
    
    分组——GROUP BY
    select 分组字段/聚合函数 from 表名 group by 分组字段 [having 条件]
    
    limit关键字
    select 字段1,字段2 ... from 表名 limit 起始行数 , 返回行数;
    limit offset , length; 关键字可以接受一个 或者两个 为0 或者正整数的参数
    offset 起始行数, 从0开始记数, 如果省略 则默认为 0.
    length 返回的行数
    分页公式 起始索引 = (当前页 - 1) * 每页条数

七、运算符

1.比较运算符

运算符

说明

> < = = <> !=

大于、小于、大于(小于)等于、不等于

BETWEEN ...AND...

显示在某一区间的值

例如: 2000-10000之间: Between 2000 and 1000

IN(集合)

集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)in中的每个数据都会作为一次条件,只要满足条件就会显示

LIKE '%张%'

模糊查询

IS NULL

查询某一列为NULL的值, 注: 不能写 = NULL

 2.逻辑运算符

运算符

说明

And &&

多个条件同时成立

Or ||

多个条件任一成立

Not

不成立,取反。

3.通配符--模糊查询

通配符

说明

%

匹配任意多个字符串

_

匹配一个字符

 八、约束

1.作用

  • 对表中的数据进行进一步限制,从而保证数据的正确性,有效性,完整性。违反约束的条件,将无法插入到表中

2.常见约束

  • 主键 —— primary key
  • 语法格式:字段名 字段类型 primary key
    
    创建主键:1.CREATE TABLE 表名(
    
                 字段名1 数据类型 ,
    
                 字段名2 数据类型 PRIMARY KEY ,
    
                 字段名3 数据类型
    
              );
    
              2.CREATE TABLE 表名(
    
                 字段名1 数据类型 ,
    
                 字段名2 数据类型 ,
     
                 字段名2 数据类型 ,
    
                 PRIMARY KEY(字段名2)
    
             );
             3.alter table 表名 add primary key(字段名)
    
    删除主键:alter table 表名 drop primary key
    
    主键自增:字段名 数据类型 primary key auto_increment (字段类型必须是 整数类型)
    
  • 唯一 —— unique
  • 特点:表中的某一列值不能有重复值
    
    字段名 字段类型 unique

  • 非空 —— not null
  • 特点: 某一列数据不可为空
    
    字段名 字段类型 not null

  • 外键 —— foreign key
  • 外键指的是在从表中与主表的主键对应的那个字段
    
    注意事项
    1.外键指向的表的字段,要求是primary key 或者是 unique
    2.表的类型的innodb ,这样的表才支持外键
    3.外键字段的类型 要和 主键字段的类型一致(长度可以不同)
    4.外键字段的值,必须在主键字段中出现过,或者为null
    5.一旦建立主外键关系,数据不能随意删除
    6.添加数据时,先添加主表中的数据
    7.删除数据时,先删除从表中的数据
    
    创建外键
    [constraint] [外键约束名称] foreign key(外键字段名) references 主表名(主键字段名)
    
    已有表添加外键
    ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES主表(主 键字段名);
    
    删除外键
    alter table 从表 drop foreign key 外键约束名称

  • 默认值——default
  • 用来指定某列的默认值
    
    字段名 字段类型 default 默认值

九、事务 

1.什么是

  • 事务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有一条SQL出现异常,整个操作就会回滚,整个业务执行失败

2.回滚

  •  即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成 的操作全部撤销,滚回到事务开始时的状态。(在提交之前执行)

3.基本操作

  • start transaction / begin ——开始一个事务
    
    rollback ——回滚全部事务
    
    commit——提交事务,所有的操作生效,无法在回滚

4.四大特性

  • 原子性: 事务是一个不可拆分的整体,要么全部成功要么全部失败
  • 一致性: 数据的状态,在执行前后保持一致
  • 隔离性:事务与事务之间互不影响,执行保持隔离状态
  • 持久性:执行成功,对数据库的修改是永久性的

5.产生问题及隔离级别

(1) 产生问题

  • 脏读: 一个事务读取到另一个事务尚未提交的数据
  • 幻读: 一个事务内,多次查询同一数据时,数据量不一致
  • 不可重复读:同一个事务多次读取同一条数据时,数据不一致

(2)隔离级别

  •  

6. 表

  • 一对一
  • 一对多
  • 例如:班级和学生,客户与订单
  • 建表原则:在从表(多方)创建一个字段,字段作为外键指向主表的(一方)的主键
    • 主:少
    • 从:多
  • 多对多
  • 例如:老师和学生,客户与销售
  • 建表原则:创建一个中间表,中间表至少两个字段,分别作为外键指向各自一方的主键
  • 注意:多对多关系中,多个表之间,中间表就成了从表

7. 多表查询分类

(1)内连接:交集

  • 隐式链接
  • SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
  • 显式链接
  • select 字段名 from 左表[ INNER ] JOIN 右表 ON 连接条件 where 条件

(2)外连接

  • 左外连接
  • 以左表为基准, 匹配右边表中的数据,如果匹配的上,就展示匹配到的数据,如果匹配不到, 左表中的数据正常展示, 右边的展示为null.
  • SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
  • 右外连接
  • 以右表为基准, 匹配左边表中的数据,如果匹配的上,就展示匹配到的数据,如果匹配不到, 右表中的数据正常展示, 左边的展示为null.
  • SELECT 字段名 FROM 右表 RIGHT [OUTER] JOIN 左表 ON 条件

(3)子查询

  • 什么是
  • 一条select 查询语句的结果, 作为另一条 select 语句的一部分
  • 特点
  • 子查询必须放在小括号中
  • 子查询一般作为父查询的查询条件使用

十、数据库设计

 1.三范式

  • 第一范式
  • 原子性,列不能在分
    
    最基本范式
    
    最小数据单元
  • 第二范式
  • 在第一范式基础上进行跟进,目的是为了让表中的每一列与主键相关
  • 第三范式
  • 消除传递依赖

十一、MySQL索引

1.分类

  • 主键索引
  • 唯一索引
  • 普通索引 

2.优缺点

  • 优点 
  • 提高查询速度
  • 减少查询中分组与排序的时间
  • 缺点
  • 咋用一定得储存空间
  • 减少创建和维护索引的时间
  • 不恰当查询语句会导致索引失效

十二、MySQL视图

1.什么是

  • 一种虚拟表 

2.作用

  • 控制权限 
  • 比如说,有几个列可以运行用户查询,其他列不允许运行;我们可以开通视图,只查询特定的列,这样起到权限控制作用
  • 简化多表查询
  • 比如说,我们要进行一次复杂的查询,我们可以构建一张视图,用户只要查询视图就可以获取相关信息

3.视图和表的区别

  • 删除视图,表不受影响,删除表,视图也将不存在

十三、MySQL优化

  • select语句中避免使用*
  • -- 不推荐 
    SELECT * FROM employees; 
    
    -- 推荐
    SELECT id, name, position FROM employees; 
  • 只需要一行数据的时候使用limit 1
  • -- 不推荐(可能返回多行) 
    SELECT name FROM employees WHERE position = 'Manager';
    
    -- 推荐(确保只返回一行)
    SELECT name FROM employees WHERE position = 'Manager' LIMIT 1;
  • 将where中用的比较频繁的字段建立索引
  • -- 假设`position`字段在`WHERE`子句中经常使用
    CREATE INDEX idx_position ON employees(position);
  • 减少使用join查询次数
  • -- 不推荐(多个JOIN) 
    SELECT e.name,  d.department_name   
    FROM employees e 
    JOIN departments d ON e.department_id  = d.id  
    JOIN projects p ON e.project_id  = p.id; 
    
    -- 推荐(减少JOIN,分步查询)
    SELECT name FROM employees WHERE department_id = 1;
    SELECT department_name FROM departments WHERE id = 1;
  • 减少子查询的次数
  • -- 不推荐(使用子查询)
    SELECT name FROM employees WHERE department_id = (SELECT id FROM departments WHERE department_name = 'Sales');
    
    -- 推荐(用JOIN替代子查询) 
    SELECT e.name   
    FROM employees e 
    JOIN departments d ON e.department_id  = d.id  
    WHERE d.department_name  = 'Sales';
  • 对大数据量的查询,使用分页查询、分区表、分表
  • -- 不推荐(一次性查询所有数据)
    SELECT * FROM employees; 
    
    -- 推荐(分页查询)
    SELECT * FROM employees LIMIT 10 OFFSET 0; -- 查询第一页,每页10条
  • 使用动态SQL,避免生成多余复杂的语句,防止SQL注入
  • -- 不推荐(拼接SQL,易注入)
    SELECT * FROM employees WHERE name = 'O'Reilly'; -- 危险! 
    
    -- 推荐(使用参数化查询)
    PREPARE stmt FROM 'SELECT * FROM employees WHERE name = ?';
    SET @name = 'O\'Reilly'; 
    EXECUTE stmt USING @name; 
  • 优化数据类型:根据实际情况选择合适的数据类型,例如,对于整数类型,可以根据范围选择适当的类型,避免使用不必要的大整数类型。
  • -- 不推荐(使用过大类型)
    CREATE TABLE employees (id BIGINT, age INT);
    
    -- 推荐(选择合适类型)
    CREATE TABLE employees (id INT, age TINYINT); 
  • 垂直分区:如果一个表过于庞大,可以将其拆分成多个表,每个表只包含相关的列,这样可以减少表的大小和查询的复杂度。
  • -- 假设按年份分区
    CREATE TABLE employees_2020 (id INT, name VARCHAR(50), ...); 
    CREATE TABLE employees_2021 (id INT, name VARCHAR(50), ...); 
    
    -- 查询时根据年份选择相应的表
    SELECT * FROM employees_2021 WHERE name = 'John'; 
  • 水平分区:将数据分布到多个表中,根据某个字段的值进行分区,例如按照时间范围或地区进行分区。这样可以提高查询的局部性和并行处理能力。
  • -- 假设按年份分区
    CREATE TABLE employees_2020 (id INT, name VARCHAR(50), ...); 
    CREATE TABLE employees_2021 (id INT, name VARCHAR(50), ...); 
    
    -- 查询时根据年份选择相应的表
    SELECT * FROM employees_2021 WHERE name = 'John'; 
  • 定期优化表:定期执行 OPTIMIZE TABLE 命令来优化表的结构,整理数据和索引,提高查询性能。
  • -- 定期执行 
    OPTIMIZE TABLE employees; 
  • 缓存查询结果:对于频繁查询的结果,可以使用缓存来提高性能,例如在应用程序中使用缓存框架或在 MySQL 中使用查询缓存。
  • -- 在应用程序层面使用缓存(伪代码)
    if (cache.get('employee_list')  == null) {
        result = db.query('SELECT  * FROM employees'); 
        cache.set('employee_list',  result, 60); // 缓存60秒
    } else { 
        result = cache.get('employee_list'); 
    } 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漫话机器学习系列】028.CP

Mallows’ Cp&#xff1a;标准化公式解析与应用 Mallows’ Cp 是一种常用的模型选择工具&#xff0c;用于在一系列候选模型中权衡拟合度和复杂性&#xff0c;帮助我们选择性能最优的模型。本文将基于其标准化公式展开详细解析&#xff0c;并探讨其应用场景、实现方法、优点与局…

pyqt5 设计pdf 和word文件互相转换小程序

给自己编写一个免费简单的设计pdf 和word文件互相转换小程序&#xff0c;使用pyqt5 做ui设计。 代码如下&#xff1a; # 导入必要的库和模块 from PyQt5 import QtCore, QtWidgets from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog from pdf2docx import …

SQL 实战:基于经纬度的距离计算与位置查询

在位置服务&#xff08;LBS&#xff09;系统中&#xff0c;基于地理位置查询和距离计算是核心功能之一。例如&#xff1a; 查找附近的商铺、加油站或医院。计算两点之间的实际直线距离。筛选出指定范围内的用户或设备位置。 MySQL 提供了多种方式实现地理位置查询&#xff0c…

一个最简单的ios程序(object_c)的编写

前言 如何在苹果系统MacOS创建一个简单的ios&#xff08;iphone&#xff09;程序&#xff0c;貌似非常的简单。但是&#xff0c;作为习惯了Windows开发的程序员来说&#xff0c;有时候还觉得有点麻烦&#xff0c;至少开始有点很不习惯。 本博文试着把这个过程展现一下&#xff…

高效搭建Nacos:实现微服务的服务注册与配置中心

一、关于Nacos 1.1 简介 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统&#xff0c;特别是在微服务架构中。Nacos 提供了简单易用…

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的发展&#xff0c;在现在&#xff0c;编程技术的IDE里面也融合了AI的基本操做。本例&#xff0c;以微软的Visual Studio中的人工智能的功能介绍例子。 本例的环境&#xff1a; Visual Studio 17.12 1 AI 智能变量检测&#xff1a; 上图展示了一…

【SpringMVC】SpringMVC 快速入门

通常&#xff0c;Web 应用的工作流程如下&#xff1a; 用户通过浏览器访问前端页面&#xff1b; 前端页面通过异步请求向后端服务器发送数据&#xff1b; 后端采用“表现层-业务层-数据层”三层架构进行开发&#xff1a; 表现层接收页面请求将请求参数传递给业务层业务层访问…

如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈

如果你的网站是h5网站&#xff0c;如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈 h5如何转小程序 如果当年你们开发网站是用的h5但是没有开发小程序&#xff0c;也没有使用uniapp这样的混开框架&#xff0c;但是目前根据业务需…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

如何在LabVIEW中更好地使用ActiveX控件?

在LabVIEW中&#xff0c;ActiveX控件可以帮助实现与其他应用程序或第三方组件的集成&#xff08;例如Microsoft Excel、Word、Internet Explorer等&#xff09;。以下是一些建议&#xff0c;帮助您更好地在LabVIEW中使用ActiveX控件&#xff1a; ​ 1. 理解ActiveX控件的基本原…

Speckly:基于Speckle文档的RAG智能问答机器人

前言 Speckly 是一个基于 检索增强生成 (RAG) 技术的智能问答机器人&#xff0c;它能像一位经验丰富的工程师&#xff0c;理解你的问题&#xff0c;并从 Speckle 文档中精准地找到答案。更厉害的是&#xff0c;它甚至可以帮你生成代码片段&#xff01;&#x1f680; 本文将详…

TencentOS 2.4 final 安装mysql8.0备忘录

准备 tencentOS 2.4 与Red Hat Enterprise Linux 7 是兼容的。 我们首先从oracle官网上下载mysql的源文件。 下载完成后你会得到以下文件&#xff1a; mysql84-community-release-el7-1.noarch.rpm 安装 首先你需要切换到root用户下。 1.安装源文件 yum localinstall my…

怎么在家访问公司服务器?

在日常工作中&#xff0c;特别是对信息技术从业者而言&#xff0c;工作往往离不开公司的服务器。他们需要定期访问服务器&#xff0c;获取一些关键的机密文件或数据。如果您在家办公&#xff0c;并且需要处理未完成的任务&#xff0c;同时需要从公司服务器获取所需的数据&#…

快速搭建springcloud 3.X+mybatis+nacos本地项目

环境&#xff1a; jdk17 idea 2019 springboot:3.2.4 spring-cloud:2023.0.1 大概记录下关键配置 1 创建父工程 创建项目 删除src目录 因为是父子结构不需要。 引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…

衣物褶皱织物褶皱检测数据集VOC+YOLO格式939张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;939 标注数量(xml文件个数)&#xff1a;939 标注数量(txt文件个数)&#xff1a;939 标注…

【C++】B2064 斐波那契数列

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式输入输出样例输入输出 &#x1f4af;思路分析**题目本质** &#x1f4af;代码实现与对比**我的代码实现**代码展示思路解析优点不足 **老师的代码…

springboot521基于Spring Boot的校园闲置物品交易系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装校园闲置物品交易系统软件来发挥其高效地信息处理的作用&am…

el-table动态行和列及多级表头

主页面 <template><div class"result-wrapper"><dynamic-table :table-data"tableData" :table-header"tableConfig" :tableTitle"tableTitle" :flowParams"flowParams"></dynamic-table></div…

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

2024年12月30日Github流行趋势

项目名称&#xff1a;free-programming-books 项目地址url&#xff1a;https://github.com/EbookFoundation/free-programming-books项目语言&#xff1a;HTML历史star数&#xff1a;343,398今日star数&#xff1a;246项目维护者&#xff1a;vhf, eshellman, davorpa, MHM5000,…