MySQL高级详解

news2025/1/31 11:03:34

文章目录

  • 约束
    • 概述
    • 分类
    • 主键约束
      • 概述
      • 特点
      • 定义及删除
      • 主键自增
    • 唯一约束
      • 作用
      • 语法
    • 非空约束
      • 作用
      • 语法
    • 面试题:非空+唯一约束与主键约束有什么区别
    • 默认值约束
      • 作用
      • 语法
    • 总结
  • 表关系及外键约束
    • 表关系
      • 概述
      • 分类
      • 一对多关系表设计
        • 外键字段
        • 设计原则
      • 多对多关系表设定
        • 设计原则
      • 一对一关系表设定
        • 设计原则
  • 外键约束
    • 概述
    • 语法
    • 注意事项
      • 外键的级联
        • 概述
        • 语法
  • 多表查询
    • 笛卡尔积
      • 概述
      • 消除方式
    • 内连接查询
      • 隐式内连接
      • 显示内连接
      • 区别
    • 外连接查询
      • 左外连接
      • 右外连接
    • 子查询
      • 单行单列
      • 多行单列
      • 多行多列

约束

概述

就是一种限制,用于修饰表中的列。
通过这种限制来保证表中数据的正确性有效性完整性

分类

Snipaste_2024-04-11_20-29-20.png

主键约束

概述

设定表中某一字段为主键,那么该字段所在列的数据就能够唯一的标识表中的每一行数据

特点

唯一,非空,非业务相关

定义及删除

  1. 在建表时进行指定

create table 表名 (id int primary key,其他字段,…);

  1. 在已有表中进行指定(原来表没有主键)

alter table 表名 add primary key(字段);

  1. 删除主键

alter table 表名 drop primary key;

主键自增

使用原因:设置主键,如果让我们自己添加主键很有可能有重复的主键而导致数据添加失败,所以我们通常希望在每次插入新纪录时,数据库自动生成主键字段的值
语法
字段名 字段类型 primary key auto_increment;
注意:需要让主键自动增加,主键需要是整数类型
举例
Snipaste_2024-04-11_20-42-12.png
delete和truncate删表对id的影响

  1. delete删除表中的数据,不重置auto_increment的值

就是说用delete删除了id为3的数据,当下次增加一个数据时,id为4

  1. truncate摧毁表,重建表,重置auto_increment的值

使用truncate删除表,当增加数据时,id从1开始自增
设置主键从指定值自增
如果相自定义id的值,可以设定自动增加起始值语法
alter table 表名 auto_increment = 起始值;

唯一约束

作用

被唯一约束的字段,本列数据不允许出现重复数据,null除外,null可以出现多个

语法

  1. 创建表时指定

create table 表名 (字段名 字段类型 unique,其他字段名,…);

  1. 已有表给指定字段添加唯一约束

alter table 表名 add unique(字段);

非空约束

作用

被非空约束的字段,本列数据不允许出现null(即空)数据。

语法

  1. 创建表时指定

create table 表名(字段名 字段类型 not null,其他字段名,…);

  1. 已有表给指定字段添加非空约束

alter table 表名 modify 字段 类型 not null

面试题:非空+唯一约束与主键约束有什么区别

  1. 主键约束在表中只能存在一个,但是非空+唯一约束可以存在多个
  2. 主键可以添加自增约束,但是非空+唯一不能
  3. 主键约束底层维护了一个主键索引,而唯一约束底层维护的是唯一索引(这个知识点后面会描述)

默认值约束

作用

被默认值约束的字段,相当于给字段添加默认值,插入数据值如果字段没有被赋值,则使用默认值
:null相当于空值,也是被赋于值,所以写null时不会使用默认值

语法

  1. 创建表时指定

create table 表名(字段名 字段类型 default 默认值,其他字段,…);

  1. 已有表给指定字段添加默认值约束

alter table 表名 modify 字段 类型 default 默认值;

总结

约束特点关键字
主键约束非空,唯一primary key
唯一约束唯一unique
非空约束列值不能为nullnot null
默认值约束添加默认值default 值

表关系及外键约束

表关系

概述

数据库中的表描述的事物,我们一般被称为实体,实体于实体是存在关系,那么表于表之间也就存在关系

分类

  1. 一对一 (老公和老婆)
  2. 一对多 (部门和员工)
  3. 多对多 (学生和课程)

一对多关系表设计

一个用户可以有多个订单,一个定义只能属于一个用户
用户:订单<=>1:n

外键字段

"一方"叫主表,"多方"叫从表
设计时通常会在从表添加一个字段,用于存放主表主键的值,这个字段叫外键字段
外键存在一种约束,只能是主表中主键存在的值,这样就保证主从表数据之间对应的一致性和完整性

设计原则

在多方创建一个字段作为外键,从表外键值指向一方中的主键
也就是在订单表中设置一个字段user_id(外键字段),里面存放用户表的id主键值

多对多关系表设定

设计原则

需要创建第三张表作为中间表,中间表至少俩个字段(外键字段),分别指向各自一方的主键

一对一关系表设定

设计原则
  1. 两张表合并为一张表
  2. 如果必须要创建外键,任选其中一方作为从表如何设置外键字段

外键约束

概述

就是从表中设定一个字段,用来保存主表中的主键值。
外键约束力从表的外键值只能是主表的主键值

语法

  1. 创建表示时创建外键

create table 表名(
其他字段,
外键字段名 int,
constraint 外键名 foreign key (当前表外键字段名) references 主表名(主键字段)
);

  1. 修改字段为外键

alter table 表名 add constraint 外键名 foreign key (当前表外键字段名) rederence 主表名(主键字段);

  1. 删除

alter table 从表名 drop foreign key 外键名;
Snipaste_2024-04-11_21-38-36.png

注意事项

  1. 添加数据时

先添加主表的数据,再添加从表的数据

  1. 删除数据时

先删从表中的数据,再删主表中的数据

  1. 修改数据时

如果主表中的主键被从表引用了,不能修改此主键的值

外键的级联

概述

就是在修改或者删除主键是可以同时对从表的外键进行修改或删除

语法

on update cascade 修改
on delete cascade 删除
Snipaste_2024-04-11_21-47-13.png

多表查询

笛卡尔积

概述

多张表查询时每张表的每条数据组合成的数据结果集,叫做笛卡尔积(交叉组合)
当我们发现不是所有的数据都是有用,所以就要消除笛卡尔积

消除方式

条件: 从表.外键 = 主表.主键

内连接查询

隐式内连接

select 列名 from 左表,右表 where 从表.外键 = 主表.主键;

显示内连接

select 列名 from 左表 [inner] join 右表 on 从表.外键 = 主表.主键;

区别

结果一样,隐式内连接先进行笛卡尔积在筛选数据;而显示内连接在查询时就对数据进行过滤
显示内连接更能代表内连接
Snipaste_2024-04-11_22-12-10.png

外连接查询

左外连接

左表中所有的记录都出现在结果中,如果右表没有匹配的记录,使用null填充
select 列名 from 坐标 left join 右表 on 从表.外键 = 主表.主键;
Snipaste_2024-04-11_22-14-22.png

右外连接

右表中所有的记录都出现在结果中,如果左表没有匹配的记录,使用null填充
select 列名 from 坐标 right join 右表 on 从表.外键 = 主表.主键;
Snipaste_2024-04-11_22-14-26.png

子查询

单行单列

父查询使用比较运算符: > < =

多行单列

子查询可以认为是一个数组,父查询用in,all,any关键字
Snipaste_2024-04-11_22-16-58.png

多行多列

子查询可以认为它是一个虚拟表,可以使用表连接再次进行多表查询
注意:如果要访问子查询表的字段,需要为子查询表取别名,否则无法访问表中的字段

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

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

相关文章

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

一辆新能源汽车需要多少颗传感器?

随着科技的发展和环保意识的日益提高&#xff0c;新能源汽车&#xff08;包括纯电动汽车、混合动力汽车等&#xff09;在全球范围内越来越受到欢迎。这些汽车不仅减少了碳排放&#xff0c;还推动了汽车产业的创新。然而&#xff0c;这些高科技汽车的背后&#xff0c;隐藏着许多…

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)

文章目录 前言&#xff1a;一、下载(一).链接&#xff08;直达JDK21&#xff09;(二).官网搜索&#xff08;可选其他版本&#xff09; 二、安装三、环境变量配置四、验证安装和配置五、常见问题解答 前言&#xff1a; 本文将为您提供关于Java官网下载JDK21版本的详细教程。作为…

springboot在使用 Servlet API中提供的javax.servlet.Filter 过滤器 对请求参数 和 响应参数 进行获取并记录日志方案

不多说 直接上代码 第一步 package com.xxx.init.webFilter;import com.alibaba.fastjson.JSONObject; import com.xxx.api.constant.CommonConstant; import com.xxx.api.entities.log.OperationLog; import com.xxx.init.utils.JwtHelper; import com.xxx.init.utils.Reques…

King‘s AUTO的QI妙能力|实验室“总导演”

在2023年夏天&#xff0c;两场国际赛事分别在成都、杭州盛大举办——第31届世界大学生夏季运动会&#xff08;大运会&#xff09;以及第19届亚洲运动会&#xff08;亚运会&#xff09;。为确保开幕式的顺利进行&#xff0c;大运会共进行了三次全要素彩排&#xff0c;而亚运会则…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每次学习情况。 一、课程笔记 本次学习的是RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;它是通过检索与用户输入相关的信息片段…

【MATLAB源码-第185期】基于matlab的16QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

springboot如何切换内置web服务器?

切换内置web服务器 这是没有引入web依赖的服务 这是引入web依赖的服务 由此可知默认是tomcat服务器 那么如何切换内置服务器 只要有对应服务器的坐标即可自动切换&#xff0c;先排除tomcat再引入依赖&#xff0c;比如切换成jetty服务器 <dependency><groupId>org…

d3dx9_43.dll丢失的一些可行的解决方案,有效解决d3dx9_43.dll丢失

在电脑中&#xff0c;d3dx9_43.dll文件丢失是一个相当普遍的问题。实际上&#xff0c;要解决这个问题有多种方法。今天&#xff0c;我们将讨论一下关于d3dx9_43.dll文件丢失的问题&#xff0c;并向大家介绍一些可行的解决方案。 一.快速了解d3dx9_43.dll文件 首先&#xff0c;…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

2024-基于人工智能的药物设计方法研究-AIDD

AIDD docx 基于人工智能的药物设计方法研究 AI作为一种强大的数据挖掘和分析技术已经涉及新药研发的各个阶段&#xff0c;有望推动创新药物先导分子的筛选、设计和发现&#xff0c;但基于AI的数据驱动式创新药物设计和筛选方法仍存在若干亟待解决的问题。我们课题组的核心研究…

【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值 文章目录 【Entity Framework】如何使用EF中的生成值一、概述二、默认值三、计算列四、设置主键五、显示配置值生成六、设置日期/时间值生成6.1 创建时间戳6.2 更新时间戳 七、替代值生成八、无值生成九、总结 一、概述 数据库列的值…

服务器端口被扫会出现哪些风险

一、安全风险增加端口扫描是黑客攻击的常见手段之一。通过对服务器端口进行扫描&#xff0c;黑客可以了解服务器的开放端口、服务类型以及可能存在的漏洞。一旦黑客发现漏洞并成功利用&#xff0c;就可能导致服务器被入侵&#xff0c;进而窃取数据、植入恶意软件或进行其他非法…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…

编程规范(保姆级教程)

文章目录 为什么需要编程规范&#xff1f;&#x1f4a1;代码检测工具 ESLint&#x1f4a1;代码格式化 Prettier&#x1f4a1;ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤&#xff1a; 1、调整文件编码&#xff1a;确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下&#xff0c;使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

在keil里用c++编程(1)

做嵌入式开发时&#xff0c;我们对使用c语言写的库有强烈的需求&#xff0c;比如eigen&#xff0c;boost等&#xff0c;但是通常来说&#xff0c;我们的开发是围绕c语言进行的&#xff0c;怎么把c的库文件放在c语言环境下进行编译&#xff0c;就是我们需要面对的问题 1.问题来…

代码随想录第36、37天| 435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 贪心算法&#xff0c;依然是判断重叠区间 | LeetCode&#xff1a;435.无重叠区间_哔哩哔哩_bilibili 给定一个区间的集合 intervals &#xff0c;其中 intervals[…

Python项目1 外星人入侵_外星人

在本章中&#xff0c;我们将在游戏《外星人入侵》中添加外星人。首先&#xff0c;我们在屏幕上边缘附近添加一个外星人&#xff0c;然后生成一群外星人。我们让这群外星人向两边和下面移 动&#xff0c;并删除被子弹击中的外星人。最后&#xff0c;我们将显示玩家拥有的飞船数量…