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

news2024/12/27 11:40:12

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值

  • 什么是唯一约束?

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

  • 什么是检查约束?

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

  • 什么是外键约束?

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

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

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

相关文章

【JavaEE初阶】多线程(3)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程状态 线程安全 代码示例 解释 总结原因 解决方案-->加锁 t1和t2都加锁 且 同一个锁对象 t1和t2中只有一个加锁了 t1和t2都加锁,但锁对象不同 加锁 与线程等待…

我给孩子请了个AI老师,省掉了1999元的报名费

大家好&#xff0c;我是凡人。 最近老婆想给儿子在线报个书法班&#xff0c;要价1999元&#xff0c;本来是个好事情&#xff0c;但一向勤俭持家的我&#xff0c;怎能让她花这个冤枉钱&#xff0c;经过我三七二十一个小时的上网&#xff0c;还真让我找出一套利用AI学习的万能命…

图片无损放大编辑PhotoZoom Pro 9.0.4多版本软件2024年最新安装包下载含安装教程

PhotoZoom Pro 9.0.4是一款非常流行的图像放大软件&#xff0c;它可以让你将低分辨率的图像放大到高分辨率的尺寸&#xff0c;同时保持高质量的图像细节和清晰度。 PhotoZoom Pro 9.0.4采用了一种称为S-Spline技术的算法&#xff0c;这是一种能够保持图像细节的高级插值算法。…

Web3 详解

1. 使用 Web3 库 Web3 是一个 JavaScript 库&#xff0c;可用于通过 RPC 通信与以太坊节点通信。 Web3 的工作方式是&#xff0c;公开已通过 RPC 启用的方法&#xff0c;这允许开发利用 Web3 库的用户界面&#xff0c;以便与部署在区块链上的合约进行交互。 一旦 Geth JavaScri…

25届计算机专业选题推荐-基于python的线上拍卖会管理系统【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的线上拍卖会管理…

Window下编译OpenJDK17

本文详细介绍Window下如何编译OpenJDK17&#xff0c;包含源码路径&#xff0c;各工具下载地址&#xff0c;严格按照文章中的步骤来操作&#xff0c;你将获得一个由自己亲手编译出的jdk。 一、下载OpenJDK17源码 下载地址&#xff1a;GitHub - openjdk/jdk at jdk-1735 说明&a…

碰撞检测 | 详解矩形AABB与OBB碰撞检测算法(附ROS C++可视化)

引言 在复杂的人工智能系统和机器人应用中,碰撞检测(Collision Detection)作为一项基础技术,扮演着至关重要的角色。无论是在自动驾驶车辆中防止车祸的发生,还是在机器人导航中避免障碍物,碰撞检测的精度和效率都直接决定了系统的可靠性和安全性。在游戏开发、虚拟现实、…

USART—串口通讯

USART—串口通讯 大纲 串口通讯协议简介STM32 的 USART 简介USART 功能框图USART 初始化结构体详解 具体案例 串口通讯协议简介 物理层 串口通讯的物理层有很多标准及变种&#xff0c;我们主要讲解 RS-232 标准&#xff0c;RS-232 标准主要规定了信号的用途、通讯接口以及…

SpringCache之本地缓存

针对不同的缓存技术&#xff0c;需要实现不同的cacheManager&#xff0c;Spring定义了如下的cacheManger实现。 CacheManger 描述 SimpleCacheManager 使用简单的Collection来存储缓存&#xff0c;主要用于测试 ConcurrentMapCacheManager 使用ConcurrentMap作为缓存技术&…

spring揭秘20-spring事务02-编程式事务与声明式事务管理

文章目录 【README】【1】编程式事务管理【1.1】使用PlatformTransactionManager进行编程式事务管理【1.2】使用TransactionTemplate进行编程式事务管理【1.3】基于Savepoint的嵌套事务 【2】声明式事务管理【2.1】基于xml的声明式事务【2.1.1】使用ProxyFactory&#xff08;Pr…

【基础篇】应届毕业生必备:机器学习面试题指南【1】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

【软件工程】软件开发模型

三、瀑布模型 四、几种软件开发模型的主要特点 题目 判断题 选择题 小结

房贷计算及比较

本博客主要介绍&#xff1a; 1. 等额本金计算公式 2. 等额本息计算公式 3. 对比两种还款方式 4. 本示例:贷款金额为35万&#xff0c; 期限12年&#xff0c;年利率4.9% 等额本金计算 import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.sans-s…

day1 QT

作业 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口大小this->resize(1025,533);//固定窗口大小this->setFixedSize(1025,533);//设置窗口背景色,设置弧度//this->setStyleSheet("background-image:url(E:/…

JS_数据类型

一、JS的数据类型 数值类型 数值类型统一为 number,不区分整数和浮点数 字符串类型 字符串类型为 string 和JAVA中的String相似,JS中不严格区分单双引号,都可以用于表示字符串 布尔类型 布尔类型为boolean 和Java中的boolean相似,但是在JS的if语句中,非空字符串会被转换为…

SuperMap iManger 单个镜像更新流程

1. 下载镜像 docker pull registry.cn-beijing.aliyuncs.com/supermap/common-dashboard-api:11.1.1-240802-amd64 label 没区分架构&#xff0c;在 x64 环境 pull arm64 镜像 通过 --platformarm64 参数可以实现 docker pull mariadb:10.5.26 --platformarm64 # 指定拉取ar…

【重学 MySQL】十九、位运算符的使用

【重学 MySQL】十九、位运算符的使用 示例检查权限添加权限移除权限 在 MySQL 中&#xff0c;位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用&#xff0c;比如权限管理、状态标记等。 &…

20240909 每日AI必读资讯

重磅&#xff01;TIME揭榜2024全球AI 100人&#xff1a;奥特曼、黄仁勋、姚期智、王小川等上榜 - TIME正式揭晓了第二届100位最具影响力AI人物名单&#xff01;「领导者」榜单中&#xff0c;有我们耳熟能详的OpenAI CEO Sam Altman、英伟达CEO黄仁勋。而字节跳动联合创始人兼C…

数据结构(邓俊辉)学习笔记】排序 7——希尔排序:Shell 序列 + 输入敏感性

文章目录 1.邮资问题2. 定理K3.逆序对 1.邮资问题 此前曾经讲到希尔排序在对矩阵逐列排序时所使用的算法本身未必需要十分高效&#xff0c;而更重要的是应该具有输入敏感的特性&#xff0c;因此我们更倾向于使用插入排序。那么背后的具体原因又当如何解释呢&#xff1f;这里的…

ubuntu16.04 vim使用中文出现乱编文档处理

问题现象 vim 编译文件时出现乱码问题 解决方法 1. 中文语言包安装: apt-get install language-pack-zh-hans 2. 配置环境变量:echo "export LC_ALLzh_CN.UTF-8" >>/etc/bash.bashrc 3. 修改当前环境的字符集 /etc/default/locale cat /etc/default/locale…