SQL的增删改查CRUD练习知识点(day27)

1 学习目标

  1. 重点掌握插入单条记录的语法
  2. 了解全表插入记录的语法
  3. 重点掌握修改记录的语法
  4. 重点掌握删除记录的语法
  5. 重点掌握主键约束、外键约束
  6. 了解检查约束、非空约束、唯一约束

2 数据类型

  • MySQL支持多种数据类型,大致可以分类三类:数值、日期和字符串。

2.1 数值类型

2.1.1 分类

类型特点
tinyint1字节
smallint2字节
int4字节
bigint8字节
float4字节,单精度
double8字节,双精度
decimal(m,n)定点数,固定长度的小数位,
decimal(6,4)表示整数位2位,小数位4位,一共6位,
字节量: m+2

2.1.2 例子

USE db2;
CREATE TABLE tb6(a INT(5),b DOUBLE(6, 4),c DECIMAL(6, 4)
) CHARSET = utf8;INSERT INTO tb6 
VALUES(5, 45.2345, 56.3456);

2.2 字符串类型

2.2.1 分类

类型描述
char定长字符串,最长不能超过255个字符,char(6)则表示定长6个字符,
超过6位,可能出错,也可能截断,不足6位,在后面添加空格
varchar变长字符串,最大65535个字节,varchar(6)如果指定的最大长度,
在255个字节内,在前面会加1个字节,表示字符串的字节长度最大长度大于255,
在前面加2个字节,表示字符串的字节长度
char和varchar区别:char效率高varchar效率低,读取时,先读取长度值,再取字符串
text65535个字节
latin1 - 字符数量:65535
gbk - 65535/2 个字符
utf8 - 65535/3 个字符

2.2.2 例子

USE db2;
CREATE TABLE tb7(a CHAR(6),b VARCHAR(6),c TEXT
) CHARSET = utf8;INSERT INTO tb7 
VALUES ('abcdef', 'abc', 'asdfasdfasfwewefw');SELECT * 
FROM tb7;

2.3 日期类型

2.3.1 分类

类型描述
datetime年月日时分秒
date年月日
time时分秒
timestamp时间戳:时间范围,只到2038年第一个timestamp字段,
会在修改这行数据时,自动修改成系统当前时间

2.3.2 例子

USE db2;
CREATE TABLE tb8(a DATETIME,b DATE,c TIME,d TIMESTAMP
) CHARSET = utf8;INSERT INTO tb8(a, b, c) 
VALUES (NOW(), NOW(), NOW());#查询该表内容
SELECT * 
FROM tb8;

3 插入数据

  • 在数据库中的一个表中增添数据并不是随意的,我们之前在创建表的时候规定过表中可以容纳几列数据,每列数据的类型,我们要根据可以容纳几列数据,每列数据的类型来进行新增数据的操作。
  • 在创建表的初期所决定的数据类型是决定整张表数据类型的基础 ,新增数据的基础是创建表的时候所决定的数据类型。

3.1 前期准备

  • 使用db2库
USE db2;
  • 查看库中person表结构
DESC person;

3.2 语法

3.2.1 全表插入单条记录

  • 单行的输入数据,把表中一行全部填满,全列输入的意思就是把表中所有字段全部填满。
3.2.1.1 格式
  • 插入的值的顺序需要和表中的字段顺序一致
INSERT INTO 表名 
VALUES(值1,值2);
3.2.1.2例子
  • 向person表中插入一条记录,name为tom,age为18
INSERT INTO person 
VALUES("tom",18);#查询表中记录
SELECT * 
FROM person;

3.2.2 指定字段插入单条记录

3.2.2.1 格式
INSERT INTO 表名(字段1名,字段2名) 
VALUES(值1,值2);
3.2.2.2 例子
  • 向person表中插入一条记录,name为jerry,age不传值
INSERT INTO person (name) 
VALUES ("jerry");#查询表中记录
SELECT * 
FROM person;

3.2.3 全表插入格式

3.2.3.1 格式
INSERT INTO 表名 
VALUES(值1,值2),(值1,值2),(值1,值2);
3.2.3.2 例子
  • 向person表中插入两条记录,分别是name为lucy,age为21的记录和name为lily,age为22的记录
INSERT INTO person 
VALUES("lucy",21),("lily",22);#查询表中记录
SELECT * 
FROM person;

3.2.4 指定字段插入格式

3.2.4.1 格式
INSERT INTO 表名 (字段1名,字段2名) 
VALUES(值1,值2),(值1,值2);
3.2.4.2 例子
  • 向person表中插入三条记录,分别是name为danny,name为hanmeimei,name为lilei的记录
INSERT INTO person (NAME) 
VALUES("danny"),("hanmeimei"),("lilei");#查询表中记录
SELECT * 
FROM person;

4 修改数据

4.1 数据准备

  • 为了方便修改内容,我们提前向person表中插入新的记录
INSERT INTO person 
VALUES('刘备',40),('关羽',30),('悟空',20),('八戒',10),('张学友',5);#查询表中记录
SELECT * 
FROM person;

4.2 格式

UPDATE 表名 
SET 字段名=值,字段名=值 
WHERE 条件;

4.3 例子

①将name为刘备的记录的age属性,修改为88

UPDATE person 
SET age = 88 
WHERE name = "刘备";#查询表中记录
SELECT *
FROM person;

②将age为5的记录的name属性,修改为黎明

UPDATE person 
SET name = "黎明" 
WHERE age = 5;#查询表中记录
SELECT * 
FROM person;

③将name为关羽的记录的name属性修改为张飞,age属性修改为18

UPDATE person 
SET name = "张飞",age = 18 
WHERE name = "关羽";#查询表中记录
SELECT * 
FROM person;

5 删除数据

5.1 格式

DELETE FROM 表名 
WHERE 条件;

5.2 例子

①删除name为张飞的记录

DELETE FROM person 
WHERE name = "张飞";#查询表中记录
SELECT * 
FROM person;

②删除age小于30的记录,也就是删除年龄小于30岁的记录

DELETE FROM person 
WHERE age < 30;#查询表中记录
SELECT * 
FROM person;

③删除整张表的记录

但是由于idea担心我们删除整张表的操作太过于危险,会有提示,点击Execute执行即可

image-20221109171131870

DELETE FROM person;#查询表中记录
SELECT * 
FROM person;

6 约束

6.1 约束的概念

  • 约束是作用于表中列上的规则,用于限制加入表的数据。

  • 约束的存在保证了数据库中数据的正确性、有效性和完整性。

6.2 约束的分类

约束名称描述关键字
非空约束保证列中所有的数值不能有null值NOT NULL
唯一约束保证列中所有数据各不相同UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
检查约束保证列中的值满足某一条件CHECK
外键约束外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性FOREIGN KEY

6.3 主键约束

6.3.1 概念

  • 主键 : 表示数据唯一性的字段称为主键
  • 约束 : 创建表时,给表字段添加的限制条件
  • 主键约束 : 限制主键的值唯一且非空

6.3.2 特点

  • 主键字段,尽量不使用业务数据

    比如这张学生表,本身学号就可以具备主键的功能了,但是学号本身也是业务数据,所以我们建议创建新的id作为主键

id(PK)学号姓名...
1201319200009张三
2201319200010李四
3...
  • 应使用无意义数据作为主键

    • 随机产生的字符串

      比如这张人员表,主键就是一串随机生成的字符串

    id(PK)身份证号姓名...
    tyhe34y53453453d123412341234张三
    46745eh35u65uj54456745674567李四
    • 自动增加的数字

      比如这张电信计费表,主键就是自动增加的数字

    id(PK)手机号金额...
    112341234123456
    256785678567886

6.3.3 添加主键约束语法

  • 新建表时,添加主键约束
CREATE TABLE 表名(列名 数据类型 PRIMARY KEY,......
); 

6.3.4 例子

USE db2;
CREATE TABLE tb1 (id INT PRIMARY KEY,NAME VARCHAR(50)
) CHARSET=utf8;DESC tb1;INSERT INTO tb1 VALUES(1,'a'), (2,'b'),(3,'c');
INSERT INTO tb1 VALUES (1,"d"); 
INSERT INTO tb1 VALUES(NULL, 'd');

6.4 自增主键

  • 整数主键字段,可以设置成自动增加

6.4.1 添加自增主键语法

CREATE TABLE 表名(列名 数据类型 PRIMARY KEY AUTO_INCREMENT,......
); 

6.4.2 例子

USE db2;
CREATE TABLE tb2(id   INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
) CHARSET = utf8;INSERT INTO tb2(NAME)VALUES ('张三'),('李四'),('王五');
INSERT INTO tb2 VALUES (NULL, '赵六');
SELECT * FROM tb2;

6.5 非空约束

6.5.1 概念

  • 保证列中所有的数值不能有null值

6.5.2 添加非空约束语法

CREATE TABLE 表名(列名 数据类型 NOT NULL,......
);

6.5.3 例子

USE db2;
CREATE TABLE tb3(id   INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20) NOT NULL
) CHARSET = utf8;INSERT INTO tb3(name) VALUES ('a');
INSERT INTO tb3(name) VALUES (NULL);

6.6 唯一约束

6.6.1 概念

  • 唯一:唯一性,可以为空,但是只能有一个

6.6.2 添加唯一约束语法

CREATE TABLE 表名(列名 数据类型 UNIQUE,......
);

6.6.3 例子

USE db2;
CREATE TABLE tb4(id   INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) UNIQUE
) CHARSET = utf8;INSERT INTO tb4(name)VALUES ('a'),('b');
INSERT INTO tb4(name)VALUES ('a');

6.7 检查约束

6.7.1 概念

  • 检查:对该列数据的范围,格式的限制
  • 但是MySQL8.0版本以下没有实现检查约束

6.7.2 添加检查约束语法

CREATE TABLE 表名(......,CHECK (字段条件表达式)
); 

6.7.3 例子

USE db2;
CREATE TABLE tb5(age INT,gender CHAR(1),CHECK (age >= 7 AND age <= 60),CHECK (gender IN ('M', 'F'))
);INSERT INTO tb5 VALUES (18,'M');
INSERT INTO tb5 VALUES (1,'A');

6.8 外键约束

6.8.1 概念

  • 约束一个字段的取值,只能从指定的主键字段中取值

image-20221114154440848

6.8.2 特点

  • 取消被引用的主键,必须先取消外键
  • 被引用的主键数据,不能删除,必须先删除子数据,或修改子数据
  • 删除主表,必须先取消外键引用,或先删除子表
  • 外键会降低效率
  • 高压力系统中,一般不添加外键约束

6.8.3 创建外键约束语法

CREATE TABLE 表名(......,FOREIGN KEY(外键列名) REFERENCES 表名(主键列名)
); 

6.8.4 例子

USE db2;
CREATE TABLE banji(id   INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
) CHARSET = utf8;CREATE TABLE xuesheng(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),ban_id INT,FOREIGN KEY (ban_id) REFERENCES banji (id)
) CHARSET = utf8;INSERT INTO banji(name) VALUES('A'),('B');
INSERT INTO xuesheng(name,ban_id)VALUES('张三',1),('李四',2),('王五',1);
INSERT INTO xuesheng(name,ban_id)VALUES('aaa',99);

7 常见问题

image-20230215133739424

  • 翻译过来为录入了错误的整数值,字符串"tom",插入到了age列,也就是类型不匹配,需要调整插入的值的顺序

image-20230215134155610

  • 遇到上面报错的时候一定是属性和字段不对应的问题!!要么找不到属性,要么找不到数据库的字段!!

7.1 中文问题

7.1.1 模拟问题

  1. 准备一个名为db3的库,注意不指定编码
CREATE DATABASE db3;
  1. 使用db3库
USE db3;
  1. 在库中创建一张person表,表中字段为name和age
CREATE TABLE person(name VARCHAR(50),age INT
);
  1. 此时插入一条携带中文的记录
INSERT INTO person VALUES("刘德华",50);
  1. 那么此时插入语句执行时,这条记录会出现报错

image-20221109164829363

7.1.2 问题原因

  • 如果我们创建库时,没有指定编码,那么数据库会使用默认的latin1作为编码,所以创建的表就会是latin1的表,那么此时我们插入中文的客户端默认会使用utf8的编码,那么就会发生编码冲突的问题
  1. 输执行如下命令,查看建表语句
SHOW CREATE DATABASE db3;
  1. 可知数据库db3的编码为latin1

image-20221109165049114

  1. 再次输入命令查看建表语句
SHOW CREATE TABLE person;
  1. 可知数据表的编码为latin1

image-20221109165122285

  1. 而客户端默认的编码是gbk,所以我们如果可以将库表的编码都设置为gbk就可以解决这个问题了

7.1.3 解决方案

  • 直接删除db3库,重新创建库,指定编码
#修改数据库整体编码
SET NAMES utf8;#删除db3数据库
DROP DATABASE db3;#创建db3数据库,指定编码为utf8
CREATE DATABASE db3 CHARSET utf8;#使用db3库
USE db3;#创建数据表person
CREATE TABLE person(name VARCHAR(50),age INT
);#插入一条记录
INSERT INTO person 
VALUES("刘德华",50);#查询表中记录
SELECT * 
FROM person;

8 总结

  • 插入数据的语法是什么?

    INSERT INTO 表名 VALUES(值1,值2);

  • 修改数据的语法是什么?

    UPDATE 表名 SET 字段名=值,字段名=值 WHERE 条件;

  • 删除数据的语法是什么?

    DELETE FROM 表名 WHERE 条件;

  • 一张表中的id通常使用什么约束?

    id一般都是唯一且不能重复的,所以可以使用主键约束,而主键是一行数据的唯一标识,要求非空且唯一

  • 一张表的一个字段不允许为空,如何处理?

    如果一张表中的字段要求不能为空,可以将该字段设置为非空约束,保证列中所有的数值不能有null值

  • 什么是唯一约束?

    保证列中所有数据各不相同

  • 什么是检查约束?

    保证列中的值满足某一条件

  • 什么是外键约束?

    外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

上一篇文章:SQL的高级查询练习知识点下(day26)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/141806035下一篇文章: 数据库事务知识点(day28)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/141845763

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

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

相关文章

【Maven】Maven 下载安装教程(超详细)(day30)

1 学习目标 了解Spring了解SpringBoot重点掌握创建SpringBoot项目重点掌握聚合项目的创建了解Spring基于XML方法进行IOC和依赖注入了解Maven的概念重点掌握使用Maven构建项目重点掌握使用Maven进行依赖引入 2 Maven 2.1 概述 Maven是跨平台的项目管理工具。作为Apache组织中…

Python(一)-快速入门

第一个入门实例 print(hello python) 注释 #:单行注释""" """:多行注释 # 这是单行注释 # 输出一个喜欢读的课外书 print("我最喜欢读 追风筝的人")print("----------------------------")"""这是多…

Python爱心射线

系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

2024年录屏神器大盘点,轻松捕捉屏幕精彩

现在讲解一些操作越来越便捷了&#xff0c;我 一般都是用录屏工具来边录制操作边讲解&#xff0c;这样可以更方便对方了解操作步骤。这次我就分享几款免费录屏工具一起来试试吧。 1.福晰录屏软件 链接&#xff1a;www.foxitsoftware.cn/REC/ 对于初次尝试录屏的新手来说&…

每天五分钟玩转深度学习框架PyTorch:获取神经网络模型的参数

本文重点 当我们定义好神经网络之后,这个网络是由多个网络层构成的,每层都有参数,我们如何才能获取到这些参数呢?我们将再下面介绍几个方法来获取神经网络的模型参数,此文我们是为了学习第6步(优化器)。 获取所有参数Parameters from torch import nn net=nn.Sequent…

Java | Leetcode Java题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution {public int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;} else if (n % 4 1) {ans 2;n / 2;} else {if (n 3) {ans 2;n 1;} else {ans 2;n n / 2 1;}}}return ans;} }

UE5引擎工具链知识点

当我们提到“引擎工具链的开发”时&#xff0c;通常指的是为游戏开发或其他类型的软件开发创建一系列工具和技术栈的过程。这包括但不限于游戏引擎本身&#xff08;如Unity或Unreal Engine&#xff09;&#xff0c;以及围绕这些引擎构建的各种工具和服务&#xff0c;比如用于构…

CTFHub技能树-Git泄漏-Index

目录 一、Git索引&#xff08;Index&#xff09;的基本概念 二、解题过程 主旨&#xff1a;使用git泄漏恢复源代码 方法一&#xff1a;使用GitHack手动恢复 方法二&#xff1a;直接使用Git_Extract获取网站源代码拿去flag 当前大量开发人员使用git进行版本控制&#xff0c…

新书宣传:《量子安全:信息保护新纪元》

《量子安全&#xff1a;信息保护新纪元》 前言本书的看点本书的目录结语 前言 你好&#xff01; 这是我第一次发布类广告的博文&#xff0c;目的也很单纯&#xff0c;希望以作者的身份介绍一下自己出版的图书——《量子安全&#xff1a;信息保护新纪元》。此书于2024年7月出版…

【鸿蒙】HarmonyOS NEXT星河入门到实战1-开发环境准备

目录 一、达成目标 二、鸿蒙开发环境准备 2.1 开发者工作下载 2.2 解压安装 2.3 运行配置安装node.js和SDK 2.4 开始创建第一个项目 2.5 预览 2.5.1 预览遇到的问题&#xff08;报错&#xff09; 2.5.2 修改内容查看预览 三、备用下载地址&#xff08;如果下载是4.X版…

会声会影2024发布了没有? 会声会影2024更新哪些内容?

嘿&#xff0c;亲爱的的朋友们&#xff0c;今天我要跟大家安利一款让我彻底沉迷、不能自拔的神器 —— 会声会影2024&#xff01;如果你还在为视频编辑头疼&#xff0c;那么准备好迎接你的救星吧&#xff01; 会声会影2024是一款功能全面的视频编辑软件&#xff0c;它不仅能帮你…

基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,系统包含GUI操作界面&#xff0c;系统支持对文字,灰度图,彩色图,语音进行加解密。 2.测试软件版本以及…

人工智能在C/C++中的应用

随着技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们日常生活中不可或缺的一部分。从智能手机的语音助手到自动驾驶汽车&#xff0c;AI的应用无处不在。在众多编程语言中&#xff0c;C和C因其高性能和灵活性&#xff0c;成为实现复杂AI算法的理想选…

分类预测|基于雪消融优化BP神经网络的数据分类预测Matlab程序SAO-BP 多特征输入多类别输出 含基础程序

分类预测|基于雪消融优化BP神经网络的数据分类预测Matlab程序SAO-BP 多特征输入多类别输出 含基础程序 文章目录 一、基本原理二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 SAO-BP模型结合了雪消融优化算法&#xff08;SAO&#xff09;和BP神经网络。以下是详细…

Linux中使用node xxx.js启动进程后终端关闭进程会自动关闭的解决方案

原标题&#xff1a;在Linux中想要运行一个node程序&#xff0c;但随着终端关闭&#xff0c;其node进程会自动关闭的解决方案&#xff1a; 使用nohup 运行命令&#xff0c;其中的app.js是你要运行的js output.log是运行日志 nohup node app.js > output.log 2>&1 &…

一. rpc基本学习

1. 什么是rpc&#xff0c;为什么有了http还要rpc 我们常说的http&#xff0c;应该是说的http1&#xff0c;http只是应用层的一个协议 Rpc是一种调用方式&#xff0c;全称叫远程过程调用&#xff0c;对应本地调用&#xff0c;rpc是一种调用方式&#xff0c;不是一种协议 更具体…

Marin说PCB之在CST软件中如何搭建两端子电容器--02

上回书到说到李相赫同学在导入一颗新的两端子电容器物料的时候&#xff0c;发现其阻抗频率特性曲线太反常了&#xff1a; 和之前的Murata家的GRT033D70E105ME18这个物料放在一起比对一下&#xff1a; 上编文章中有一句话我不知道诸位道友们是否还有印象啊&#xff1f; Murata家…

断点回归模型

断点回归&#xff08;Regression Discontinuity Design, RDD&#xff09;是一种准实验设计方法&#xff0c;用于评估政策或其他干预措施的效果。这种方法利用了一个清晰的阈值或“断点”&#xff0c;在这个阈值上&#xff0c;处理状态&#xff08;例如是否接受某种干预&#xf…

2-2 opencv实战进阶系列 多边形识别

目录 一、不说废话&#xff0c;先上现象 二、前言 三、思路讲解 step1&#xff1a;用阈值编辑器对图像进行处理。 step2&#xff1a;应用阈值进行二值化 step3&#xff1a;轮廓查找 step4&#xff1a; 显示文字 四、完整代码贴出 五、现象展示 六、结语 一、不说废话&…