mysql 基础(三)

一、多表设计

数据库设计范式

  1. 第一范式(确保每列保持原子性)
    第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
  2. 第二范式就是要有主键,要求其他字段都依赖于主键。
    • 没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录,所以要主键。
    • 其他字段为什么要依赖于主键?
      因为不依赖于主键,就找不到他们。更重要的是,其 他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依 赖于主键,也就成了唯一的
  3. 第三范式,确保每列都和主键列直接相关,而不是间接相关,要求一个数据库表中不包含 已在其它表中包含的非主关键字信息

外键 

外键引用另外一个数据表的某条记录。
外键列类型与主键列类型保持一致
数据表之间的关联/引用关系是依靠具体的主键(primary key)和外键 (foreign key)建立起来的

约束名改则(约定俗成):

注: 

  • 当主表中没有对应的记录时,不能将记录添加到从表。
  • 不能更改主表中的值而导致从表中的记录孤立。
  • 从表存在与主表对应的记录,不能从主表中删除该行。
  • 删除主表前,先删从表

代码示例如下:

/*数据库概念mysql数据库安装sqlddl创建数据库创建表 dmlinsert into update deletedql  select 结果 from 表 where 条件  [group by 条件  order by 列  limit ]函数 单行函数  字符 逻辑  日期 数学函数分组函数数据库设计范式(数据库设计规则) 如何将多个信息合理的进行组织]设计3范式第一范式: 满足列的原子性(不可拆分)联系范式-->邮箱,电话,qq 可以拆分第二范式: 数据库表中必须要有主键,能唯一的表示某条记录的列(有些表中可以没有主=键)第三范式: 一张表中存储一类信息, 在一张表中关联其他表中的数据时,只需要关联主键列即可.专业信息表专业编号(主键)专业名称学生与专业是有关系的,如何建立学生和专业表的关系.*/DROP TABLE stuCREATE  TABLE major(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20))-- 修改表  为表添加一个列  一对多 多对一ALTER TABLE student ADD majorid INT-- 外键  在一个表中外键是用来与另一个表的主键关联的
-- 主键 不能为空  唯一 检查 
-- 外键有两种情况:
-- 1.不加外键约束
--     可以任意的对表数据进行操作,即使两个表中的数据对应不上也没有问题 -- 2.添加外键约束
--  添加外键约束后,两张表操作时,不能导致外键列和主键列对应关系不成立ALTER TABLE student  ADD CONSTRAINT fk_student_major_majorid FOREIGN KEY(majorid) REFERENCES major(id)-- 删除外键约束ALTER TABLE student DROP FOREIGN KEY fk_student_major_majorid-- 学生选课   一个学生至少选择2个课程-- 课程信息表  多对对关系设计CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)  )-- 添加一个学生选课表   学生和课程关系表   放一个学生学号外键, 放一个课程外键CREATE TABLE student_course(stunumber INT,courseid INT)ALTER TABLE student_course  ADD CONSTRAINT fk_student_course_student_stunumber FOREIGN KEY(stunumber) REFERENCES student(number)
ALTER TABLE student_course  ADD CONSTRAINT fk_student_course_course_courseid FOREIGN KEY(courseid) REFERENCES course(id)

 二、关联查询

内连接(inner join)

  • 把满足了条件的两张表中的交集数据查询出来
  • 语法:

左外关联(left join) 

  • 把左表的全部元素和满足左表中的右表元素查询出来
  • 语法:

右外关联(right join) 

  • 把右表的全部元素和满足右表中的右表元素查询出来
  • 语法:

子查询 

含义:出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询。 

分类:

  • 按子查询出现的位置:
    • from后面:支持表子查询
    • where:支持标量子查询,列子查询
  • 按功能、结果集的行列数不同:
    • 标量子查询(结果集只有一行一列)
    • 列子查询(结果集只有一列多行)
    • 表子查询(结果集一般为多行多列

代码示例如下:

-- 关联查询  多表关联在一起查询
-- 学号 姓名 性别  电话 专业名称   -- 信息来自于两张表中-- 关联时没有任何的限制,会产生笛卡尔乘积现象 ,这是我们不想要的结果SELECT * FROM student,major-- 关联查询  内关联  左外关联  右外关联-- select number,name,gender,phone,name from student inner join major on majorid = idSELECT s.number,s.name,s.gender,s.phone,m.name  mnameFROM student s INNER JOIN major m ON s.majorid = m.id   -- 把满足条件关联在一起SELECT s.number,s.name,s.gender,s.phone,m.name  mname FROM student s,major m WHERE s.majorid = m.id   -- 先产生一个笛卡尔乘积  然后在条件筛选-- 左外连接   特点  即使不满足连接条件,也会把左边表中的所有数据查询出来SELECT s.number,s.name,s.gender,s.phone,m.name  mnameFROM student s LEFT JOIN major m ON s.majorid = m.id-- 右外连接  即使不满足连接条, 也要把右边表中的所有数据查询出来SELECT s.number,s.name,s.gender,s.phone,m.name  mnameFROM student s RIGHT JOIN major m ON s.majorid = m.id-- 统计每个专业下有多少学生SELECT COUNT(number),m.name  mnameFROM student s RIGHT JOIN major m ON s.majorid = m.idGROUP BY m.name

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件基础:组合逻辑电路

什么是组合逻辑电路 组合逻辑电路是由一些基本的逻辑门电路组成的,没有反馈,输出仅取决于输入。 组合逻辑电路是数字逻辑电路中一种重要的电路类型,它是由多个逻辑门(例如与门、或门、非门等)组成的电路。组合逻辑电路…

保姆级教程: GPTs接入广告到提现成功全过程真实记录

因为相信,所以看见 🌟 1月19日,在AI社群首次了解到GPTs能通过接入广告获得收益。虽然对收益的多少和提现的可行性有所疑问,但我还是立刻在我的GPTs上尝试了这一功能。这一探索的旅程,如同跨入了一个未知的新世界。我的…

live555在拉流时应对多路码流传输带宽问题的几种处理思路

处理带宽管理和调整的机制 Live555库本身并没有直接处理带宽管理和调整的机制,因为它主要是一个用于实现RTSP流媒体服务器和客户端的库,而带宽管理通常是在应用层进行处理的。但Live555支持一些基础协议,这些协议可以在应对带宽问题时进行使用…

[pytorch入门] 6. 神经网络

基本介绍 torch.nn: Containers:基本骨架Convolution Layers: 卷积层Pooling layers:池化层Non-linear Activations (weighted sum, nonlinearity):非线性激活Normalization Layers:正则化层 Container…

uniapp开发过程一些小坑

问题1、uniapp使用scroll-view的:scroll-into-view“lastChatData“跳到某个元素id时候,在app上不生效,小程序没问题 使用this.$nextTick或者 setTimeout(()>{that.lastChatData 元素id },500) 进行延后处理就可以了。 问题2:uniapp开…

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…

php低版本(7.4)配置过程中遇到的问题及基本解决手段

目前php不支持较低版本的安装,如果安装低版本必须借助第三方库shivammathur //将第三方仓库加入brewbrew tap shivammathur/php //安装PHPbrew install shivammathur/php/php7.4 可能出现的问题 像这样突然中止然后报错,一般是网络问题,或…

如何在KaLi虚拟操作系统中安装 PHPstudy

1、进入KaLi虚拟机桌面后,找到最上方一栏中的火狐浏览器图标并打开 2、在地址搜索栏中搜索网址: https://www.xp.cn 小皮面板(phpstudy) - 让天下没有难配的服务器环境! (xp.cn) 3、进入界面后选择最上端的 Linux版 板块 4、选择后下…

服务器管理平台(6)- Utils

Utils 本篇为服务器管理平台的结篇,讲述一些必要的Util,如钉钉告警、安全加密、远程登录等功能的实现 1、钉钉告警 1.1、SQL配置告警规则 逻辑磁盘容量已使用比例超过90% 超过30天未登录 字段名称字段类型解释Idint自增IDTablestring监测表名Metri…

幻兽帕鲁PalWorld服务器搭建详细教程

幻兽帕鲁PalWorld是一款由Pocketpair开发的游戏,融合了多种玩法,其独特的题材和画风吸引了很多玩家。为了更好地进行游戏体验,很多玩家选择自行搭建服务器。本文将详细介绍如何搭建幻兽帕鲁PalWorld服务器。 第一步:购买服务器 根…

瓦片地图编辑器——实现卡马克卷轴的编辑,键盘控制游戏移动和鼠标点击游戏编辑通过同一个视口实现。

左边是游戏地图编辑区,右边是地图缓冲区,解决了地图缓冲区拖动bug,成功使得缓冲区可以更新。 AWSD进行移动 鼠标左右键分别是绘制/拖动 按F1健导出为mapv3.txt F2清空数组 打印的是游戏数组 easyx开发devcpp 5.11 easyx20220922版本 #…

【日志框架】

日志打印 建议用{}占位而不是字符串拼接打日志前先判断日志级别是否可用: 先根据等级过滤规则再决定写不写;先往一个管道写了内容,但再经等级过滤丢弃,徒增开销。 日志框架 Slf4J Slf4J 不是底层日志框架,只是门面…