2_SQL

文章目录

  • SQL
    • 数据完整性
      • 实体完整性
      • 域完整性
      • 参照完整性
      • default(默认值)
      • comment(注释)
    • 多表设计
      • 一对一
      • 一对多
      • 多对多
      • 数据库三大范式
        • 第一范式:原子性
        • 第二范式:唯一性
        • 第三范式:数据的冗余
    • 多表查询
      • 连接查询
        • 交叉连接
          • inner join(内连接)
          • outer join(外连接)
      • 子查询
      • 联合查询
    • 数据库的备份与恢复
      • cmd命令行操作
      • 通过Navicat操作

SQL

数据完整性

实体完整性

列约束:MySQL可以对插入的数据进行特定的验证,只有满足条件才可以插入到数据表中,否则认为是非法插入。

主键(primary key)

  • 一个表只能有一个主键
  • 主键具有唯一性,主键不能重复
  • 主键字段的值不能为null
  • 声明字段时,用 primary key 标识
  • 主键可以由多个字段共同组成。此时需要在字段列表后声明的方法

eg:

create table test_primary(
	id int primary key,
	name varchar(255),
	address varchar(255)
);


insert into test_primary values(1,"zhangsan","beijing");

insert into test_primary values(1,"lisi","liaoning");

select * from test_primary;

出现error:
> 1062 - Duplicate entry '1' for key 'PRIMARY'
  • auto_increment(自动增长约束)

  • 一些序号,没有必须手动生成,想让mysql自动生成。

    • 自动增长必须为索引(主键或unique)

    • 只能存在一个字段为自动增长

    • 默认为1开始自动增长

eg:

create table test_autoincrement(
	id int primary key auto_increment,
	name varchar(255),
	address varchar(255)
);


insert into test_autoincrement(name, address) values ("zhangsan", "beijing");

insert into test_autoincrement(name, address) values ("lisi", "nanjing");

insert into test_autoincrement(name, address) values ("wangwu", "jilin");

-->
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | beijing |
|  2 | lisi     | nanjing |
|  3 | wangwu   | jilin   |
+----+----------+---------+
默认从1开始自动增长

自动增长是不是一定会连续?

  • 不能
  • 比如说自己手动插入了一个id = 100的数据,则下次auto_incrementid = 101开始
  • 再比如表里有unique字段,插入了一个重复的值,导致插入失败,会导致插入id不连续

域完整性

  • null/not null
    • not null:代表不允许为空,如果插入了null,则会报错
  • unique
    • 不能重复
    • 允许插入null
    • null可以重复

unique与primary key的区别和联系

  • 都不能存储重复的值
  • primary key不能存储null,unique能存储null

参照完整性

  • 外键

default(默认值)

  • 如果不指定值,则使用默认值
  • 如果指定了值,则就用指定的值

eg:

create table tab 
( create_time timestamp default current_timestamp );

-- 表示将当前时间的时间戳设为默认值。
current_date, current_time

comment(注释)

  • 给自己看的

eg:

create table test_comment(
  id int primary key auto_increment,
  name varchar(255) comment "名字",
  status int comment "0表示未付款,1表示已付款,2"
);

多表设计

一对一

  • 一对一是指两个表中的数据是一一对应的
    • 比如:人和身份证号、用户和用户详情

存储关系

  • 一对一的情况,关系可以存储在任意一张表上,只要新增一个字段。
  • 所有的一一对应的表,在逻辑上,都可以合并为一个表,但是出于效率的考虑没有合并

一对多

  • 存在表A和表B,表A中的一条数据,对应表B中的多条数据;而表B中的一条数据,对应表A中的一条数据
    • 比如:学生和班主任

存储关系

  • 关系存储在多的一方

多对多

  • 指存在表A和表B,表A中的一条数据,对应表B中的多条数据;而表B中的一条数据,对应表A中的多条数据。
    • 比如:学生和课程、订单和商品

存储关系

  • 需要额外一张表来存储之间的关系

数据库三大范式

第一范式:原子性
  • 我们存储在数据库的列,应该保持原子性。
    • 比如:地址
第二范式:唯一性
  • 每一张表,需要有一个主键
第三范式:数据的冗余
  • 数据不要冗余
  • 右边这里即存储了班主任id又存储了班主任姓名,造成了冗余在这里插入图片描述
  • 冗余的好处
    • 查询速度快
  • 冗余的坏处
    • 耗费磁盘
    • 修改的时候,要修改多张表

反范式化设计

  • 如果你的需求频繁的要根据学生找老师名
  • 查询的需求远远大于修改的需求

多表查询

-- 如果user这个表存在,就去删除
drop table if exists user;

create table user(
	id int primary key auto_increment,
	name varchar(255),
	password varchar(255)
);

连接查询

交叉连接
  • 就是求多个表的笛卡尔积
  • 交叉连接的结果没有实际的意义
    • 但是内连接和外连接都是基于交叉连接的结果去筛选的

eg:

select * from student_test cross join test_primary;

-->
+------+----------+------+---------+--------+----+----------+---------+
| id   | name     | age  | address | remark | id | name     | address |
+------+----------+------+---------+--------+----+----------+---------+
|    1 | lihua    |   20 | china   | None   |  1 | zhangsan | beijing |
|    2 | zhangsan |   18 | Asia    | None   |  1 | zhangsan | beijing |
|    3 | mike     |   21 | china   | None   |  1 | zhangsan | beijing |
|    4 | Jack     |   18 | china   | None   |  1 | zhangsan | beijing |
+------+----------+------+---------+--------+----+----------+---------+
inner join(内连接)
  • 从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息

eg:

-- 内连接只返回符合连接条件的数据
select * from student_test inner join test_primary on student_test.id = test_primary.id;

-->
+------+-------+------+---------+--------+----+----------+---------+
| id   | name  | age  | address | remark | id | name     | address |
+------+-------+------+---------+--------+----+----------+---------+
|    1 | lihua |   20 | china   | None   |  1 | zhangsan | beijing |
+------+-------+------+---------+--------+----+----------+---------+


-- 1. 一般会先取别名,给表取名
-- 2. 先用*来占位,最后需要什么数据,再通过 别名.属性名拿取
select st.name,tp.address
from student_test st inner join test_primary tp on st.id = tp.id;

-->
+-------+---------+
| name  | address |
+-------+---------+
| lihua | beijing |
+-------+---------+

outer join(外连接)
  • 左外连接:会在内连接的结果的基础之上,去和左表做并集会保留左表的全部数据

    • left outer join / left join
  • 右外连接:会在内连接的结果的基础之上,去和右表做并集会保留右表的全部数据

    • right outer join / right join
  • outer是可以省略的,可以写成left join或者right join

eg:

-- 左外连接
-- 左外连接:会保存左表的全部数据
select * from student_test st left outer join test_primary tp on st.id = tp.id;

-->
+------+----------+------+---------+--------+------+----------+---------+
| id   | name     | age  | address | remark | id   | name     | address |
+------+----------+------+---------+--------+------+----------+---------+
|    1 | lihua    |   20 | china   | None   |    1 | zhangsan | beijing |
|    2 | zhangsan |   18 | Asia    | None   | NULL | NULL     | NULL    |
|    3 | mike     |   21 | china   | None   | NULL | NULL     | NULL    |
| NULL | Jack     |   18 | china   | None   | NULL | NULL     | NULL    |
+------+----------+------+---------+--------+------+----------+---------+


-- 右外连接
-- 右外连接:会保存右表的全部数据
select * from student_test st right outer join test_primary tp on st.id = tp.id;

-->
+------+-------+------+---------+--------+----+----------+---------+
| id   | name  | age  | address | remark | id | name     | address |
+------+-------+------+---------+--------+----+----------+---------+
|    1 | lihua |   20 | china   | None   |  1 | zhangsan | beijing |
+------+-------+------+---------+--------+----+----------+---------+

每次写数据库的时候,在代码前面要加上:drop table if exists 表名;,但是修改表的时候不要运行,否则写好的数据就会清除。

inner join,left (outer) join,right (outer) join的区别

  • inner join只会保留on后面条件符合的(也可以说交集)
  • left join除了保留交集,还会保留左表的所有数据
  • right join除了保留交集,还会保留右表的所有数据

写关联查询最重要的两件事

  1. 使用什么连接
  2. 关联条件

子查询

  • 又称为嵌套查询。

  • 一个SQL语句的结果可以作为另外一个SQL语句的条件

  • 子查询很符合直觉,但是速度太慢了,能不用就尽量不要用

    • 子查询会生成临时表

eg:

-- 首先先拿到Java的id
select id from tec_cource where name='Java';
-- 然后再把这个id=1放给第二个
select * from tec_sele_cource where cource_id=1;
select * from tec_stu where id in (1,3);

---->
-- 看学生信息
select * from tec_stu where id in (
    -- 看哪些学生选了 Java
	select student_id from tec_sele_cource where cource_id=(
        -- 获取Java的id
		select id from tec_cource where name='Java'
	)
)

联合查询

  • SQL支持把多个SQL语句的结果拼装起来
  • union将两个SQL的结果,拼接起来返回
  • 两条SQL返回的列应当一致
    eg:
select * from students where class = '一班'
union
select * from students where class = '二班';

等价于
select * from students where class = ('一班', '二班');

数据库的备份与恢复

cmd命令行操作

# 备份
# 1. 打开命令行
mysqldump -uroot -p dbName(数据库的名称) > c:/path/dbName.sql(就是要存储的路径名)
-- > 表示把这个数据库输出到哪里

# 恢复
# 1. 打开命令行
# 2. 连接MySQL服务器
mysql -uroot -p

# 3. 选中数据库(假如没有合适的数据库,可以新建一个)
use dbName;
# 4. 执行文件中的SQL语句,恢复数据
source c:/path/dbName.sql

通过Navicat操作

  • 备份
    在这里插入图片描述
  • 恢复
    在这里插入图片描述

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

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

相关文章

【问题】解决c++调用exosip是报错,无法解析的外部符号 _DnsQueryConfig@24

问题描述: error LNK2019: 无法解析的外部符号 _DnsQueryConfig24,函数 _eXosip_dnsutils_naptr 中引用了该符号 DnsQueryConfig是windowAPI,可查阅msdn。 #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"Dnsapi.…

[最佳实践] conda环境内安装cuda 和 Mamba的安装

Mamba安装失败的过程中,causal-conv1d安装报错为连接超时 Mamba安装 主要故障是 pip install causal-conv1d1.2.0 安装失败 安装实践比较长,请耐心等待 解决方案 受到启发运行Mamba项目时无法直接用pip install安装causal_conv1d和mamba_ssm_pip insta…

突显借力之美:打造令人印象深刻的平面设计师简历!

作为一名平面设计师,简历不仅是展示你设计能力的重要工具,也是展示你专业素质和态度的重要参考。因此,如何写一份能让HR眼前一亮的简历已经成为每个平面设计师都需要掌握的技能。在本文中,我们将从四个方面探讨如何写好平面设计师…

如何准备2024年汉字小达人:历年考题练一练-18道选择题解析

距离2024年第11届汉字小达人比赛还有八个多月的时间,建议如果有可能都让孩子参加一下,无需报名费,如果没时间准备也可以直接上阵参赛,检验一下孩子语文字、词、成语和古诗文方面的掌握情况。一方面可以激发孩子学习语文的兴趣&…

cache基础

基本概念: cache line —— 缓存行,一般为 32B、64B 。way —— 路。set —— 组。VIPT —— Virtual Index Physical Tag。 Index来自虚拟地址。PIPT —— Physical Index Physical Tag。 Index来自物理地址。 cache 更新策略: write thr…

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

基本介绍 组基轨迹建模(Group-Based Trajectory Modeling,GBTM)(旧名称:Semiparametric mixture model) 历史:由DANIELS.NAGIN提出,发表文献《Analyzing Developmental Trajectori…

R语言简介、环境与基础语法及注释

R语言简介、环境与基础语法及注释 一、R语言1.R语言简介2.R语言官网3.R语言中国的镜像网站4.R语言下载5.R语言的历史 二、R语言环境1.Windows安装1.1 去 R 语言下载的镜像站点的列表下载1.2 选择版本进行下载1.3 点击运行1.4 一路默认,安装完毕! 2.Linux…

Golang Channel 详细原理和使用技巧

1.简介 Channel(一般简写为 chan) 管道提供了一种机制:它在两个并发执行的协程之间进行同步,并通过传递与该管道元素类型相符的值来进行通信,它是Golang在语言层面提供的goroutine间的通信方式.通过Channel在不同的 goroutine中交换数据,在goroutine之间…

yolov9训练

目录 说明 1、下载代码安装新的python环境 2、准备数据 3、修改代码 说明 本文参考该博主的文章,在已经有数据的情况,进行简单总结。需要详细版见原文链接如下:YOLOV9保姆级教程-CSDN博客 1、下载代码安装新的python环境 代码下载&…

阿里巴巴面试题:亿级商品如何存储?

嗨,各位小米粉丝们,欢迎来到小米的科技分享专栏!今天我们要聊的话题可是相当的烧脑,它来自阿里巴巴的一道面试题:亿级商品如何存储?别急,让我一一为你解密! 分库分表 当我们面对需要处理海量数据的情况时,基于 Hash 取模和一致性 Hash 实现分库分表是一个常见且有效…

【机器学习】生成对抗网络GAN

概述 生成对抗网络(Generative Adversarial Network,GAN)是一种深度学习模型架构,由生成器(Generator)和判别器(Discriminator)两部分组成,旨在通过对抗训练的方式生成逼…

【大前端】EChart 多系列柱状图绘制背景图

背景 在ECharts中,设置柱状图背景色,可通过backgroundColor设置,但仅限于单系列柱状图,所以在多系列柱状图中就需要用下面的方式设置 解决方案 1. xAxis.splitArea 如果设置的背景图的宽度占比为100%,则可以使用该方…

聊聊最近成交的一个小外贸订单

聊聊最近的一个小订单的故事吧,这个客户是个新手买家,也属于第一次在网上购物,客户在年前开始询问产品,而且当时正好是假期。 其实按照正常的处理思路来说,应该告诉客户现在是假期,大概是在什么时候恢复工…

详解点云PFH点云特征直方图原理(matlab代码实现)

原理; 原始论文下载【免费】(2008PFH)点云特征直方图原创论文,2008年资源-CSDN文库https://download.csdn.net/download/Vertira/88911005 PFH 特征描述是基于特征点(keypoint)与其邻域点的空间几何关系来编码的。如图1所示&…

深度学习_19_卷积

理论: 目前问题在于识别图片所需要的模型权重数量会比较大 一般图片像素在12M也就是一千两百万像素,要用模型对其整体识别的话,需要至少一千两百万权重,那也仅仅是线性模型,若用多层感知机的话,模型的数据…

B站自研色彩空间转换引擎

本期作者 1. 背景 色彩空间(Color Space)是一种数学模型,用于描述和表示颜色的方式。不同的色彩空间有不同的用途和特点,可以用于不同的应用,如图像处理、计算机图形、印刷、摄影等领域。它一般用于描述设备的色彩能…

javaWebssh药品进销存信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh药品进销存信息管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOM…

Unity2023.1.19_DOTS_JobSystem

Unity2023.1.19_DOTS_JobSystem 上篇我们知道了DOTS是包含Entity Component System,Job System,Burst compiler三者的。接下来看下JobSystem的工作原理和具体实现。 简介: 官方介绍说:JobSystem允许您编写简单而安全的多线程代…

【Docker】Docker:解析容器化技术的利器与在Linux中的关键作用

🍎个人博客:个人主页 🏆个人专栏:Linux ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 Docker 是什么? Docker 的作用 Docker 在 Linux 中的重要性 结语 我的其他博客 前言 随着软件开发的不断发展&…

虚拟化之CPU

一 cpu 1 如何查看内核版本:uname -r 2 如何查看操作系统的发行版本:cat /etc/redhat-release 3 计算机系统子的系统 cpu处理器memory内存storage存储network 网络Display显示 4 进程模式 用户模式(user mode)主要处理I/O的模…