尚硅谷SQL|数据库的创建,修改与删除

DDL:创建和管理表

DDL所有的操作都要慎重,尤其是删除,清空等。

创建数据库--->确认字段--->创建数据表---->插入数据

创建数据库

1.创建数据库:推荐使用方式3

#创建数据库
#方式1,使用的是默认字符集
create database mytest1;
show CREATE DATABASE mytest1;#此语句查看数据库信息
#方式2,显示指明字符集
create database mytest2 character set 'gbk';
show CREATE DATABASE mytest2;
#方式3 如果要创建的数据库已经存在,则创建不成功
create database if not exists mytest2 character set 'utf8';#创建失败,字符集仍为gbk
SHOW CREATE DATABASE mytest2;

show databases;

2.管理数据库

写的过程中要注意DATABASES 和DATABASE的区别。

查看指定的表,数据库时都用的是DATABASE,罗列数据库或者表是用的是DATABASES和TABLES;

#管理数据库
#查看当前连接的数据库有哪些
show databases;
#切换数据库
use atguigudb;
#查看当前数据库中保存的数据表
show tables;
#查看当前使用的数据库
select database() from dual;
#查看指定数据库下保存的数据表
show tables from atguigudb;

#更改数据库字符集
alter database mytest2 character set 'utf8';
show create database mytest2;

#删除数据库
drop database if exists mytest1;
show databases;

 创建表

3.创建表

创建表主要有两种方式,一种是从零开始创建字段,一种是基于现有的表。

方式2可以将各种查询的结果创建为一张新的表。

还要注意DATE日期类型和DATA不要搞混。

查看表结构的语句:

DESC 表名;

SHOW CREATE TABLE 表名;

#2.如何创建数据表
use mytest2;
show create database mytest2;
#方式1:'白手起家'
create table if not exists myemp1(
id int,
emp_name varchar(15),#使用VARCHAR必须指明其长度
hire_date date
);
desc myemp1;#查看表结构
show create table myemp1;
#方式2:基于现有的表创建
use atguigudb;
create table myemp2
as
select employee_id,last_name,salary
from employees;

#复制数据创建表
create table employee_copy
as
select *
from employees;
show tables;
select*
from employee_copy;

#不复制数据只复制字段创建表
create table employee_copy2
as 
select *
from employees
limit 0,0;
show create table employee_copy2;
desc employee_copy2;
select *
from employee_copy2;

4.管理表

#管理表

#3修改表 -- >alter table
desc myemp2;
#3.1添加字段
alter table myemp2
add salary double(10,2);
alter table myemp2
add phone_number varchar(20) first;
alter table myemp2
add email varchar(20) after phone_number;
#3.2修改字段
alter table myemp2
modify phone_number varchar(30) default '123456';
desc myemp2;
#3.3重命名字段
alter table myemp2
change salary monthly_salary double(10,2);
desc myemp2;

alter table myemp2
change email my_email Varchar(40);
#3.4删除字段
alter table myemp2
drop column phne_number;
#4.重命名表
rename table myemp2 to myemp22;
show tables;
#删除表
drop table if exists myemp22;
drop table if exists employee_copy2;
#清空表
truncate table employee_copy;

DCL中:

COMMIT: 提交数据,永久保存,数据不可以回滚

ROLLBACK:数据可以回滚到最近的一次COMMIT之后

TRUNCATE TABLE 和 DELETE FROM:

相同点:都可以实现对表中所有数据的删除,同时保留表结构

不同点:

TRUNCATE TABLE:一旦执行此操作,表数据清除,数据不可以回滚

DELETE FROM : 一旦执行此操作,表数据可以全部清除。数据可以实现回滚

DDL 和DML的说明:

DDL的操作一旦执行,就不可回滚。

DML的操作默认情况下一旦执行不可回滚。但是在执行DML之前,执行了 set autocommit = false,则执行的DML操作可以实现回滚。

#演示DELETE FROM
COMMIT;
SELECT *
FROM myemp3;
SET autocommit = FALSE;
DELETE FROM myemp3;

SELECT *
FROM myemp3;
ROLLBACK;

MySQL8.0新特性—DDL原子化

案例: 假设数据库中只有表book1,在执行DROP TABLE book1,book2的时候显然不成功,此时会执行回滚操作,查看表,book1依然存在。

牵扯到事务的概念。事务是一个整体,要么都做了,要么把已经做的回滚回去。

DML操作

添加数据

添加数据有三种方式,要注意字段顺序和添加顺序一致,以及在第三种方式时要注意查询表的字段大小和新表设置的字段大小容量是否一致合理。

有些未指明字段,添加时是null空值

insert into emp1
values(1,'Tom','2000-2-1',3400.25);
insert into emp1(id,hire_date,salary,`name`)
values(2,'2000-8-21',6700,'Jerry');
insert into emp1(id,salary,`name`)
values(3,9000,'Ellie');
insert into emp1(id,`name`,salary)
values(5,'Jim',5000),(6,'Sam',6700);

insert into emp1(id,`name`,hire_date,salary)
select employee_id,last_name,hire_date,salary
from employees
where department_id in(70,60);

更新数据

修改数据可能不成功,可能是由于约束条件限制

UPDATE emp1
SET hire_date=CURDATE()
WHERE id=6;#不添加筛选条件时可以批量修改

删除数据

DML操作默认情况下,执行完后都会自动提交数据。

如果希望执行完后不自动提交数据,则需要使用 SET autocommit  = false;

COMMIT;
SET autocommit=FALSE;
DELETE FROM emp1
WHERE id<7;
ROLLBACK;

练习

#查询书名达到10个字符,不包含空格
select name
from books
where 10<= CHAR_LENGTH(REPLACE(NAME,' ',''));

#统计每一种note的库存量,并合计总量
select ifnull(note,'合计库存总量') as note,sum(num)
from books
group by note with rollup;

#8. 将userid为Bbiri的user表和my_employees表的记录全部删除
DELETE 
FROM my_employees e
JOIN users u
ON e.userid =u.userid
WHERE m.userid ='Bbiri';

MySQL数据类型

属性:CHARACTER SET 'utf8';

不仅可以指明数据库的字符集,也可以指明表的字符集,字段的字符集。

不指明时默认向上指明字符集:比如字段名默认用表的字符集,表默认用数据库的,数据库还没指明就默认用MySQL配置文件的字符集(show variables like 'character_%');

CREATE TABLE pet(
`name` VARCHAR(20) character set'utf8',
`owner` VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth YEAR,
death YEAR
)character set'utf8';

约束(constraint)

问题1:为什么需要约束

为了保证数据的完整性,需要对表数据进行额外的限制。从以下四个方面考虑:

  • 实体完整性。表中不能存在两个完全相同,无法区分的记录
  • 域完整性。性别范围"男/女"
  • 引用完整性。员工所在部门要能在部门表中找到
  • 用户自定义完整性。比如用户名唯一

问题2:约束的分类

  • 约束的字段的个数:单列约束  / 多列约束
  • 约束的作用范围:列级约束 / 表级约束
  • 约束的功能:{
    • not null非空约束
    • unique 唯一性约束
    • primary key 主键约束
    • foreign key 外键约束
    • check 检查约束
    • default默认值约束
    • }

添加约束 :在创建表时添加约束;alter table增加约束;alter table时删除约束

查看表中约束:

select * from information_schema.`TABLE_CONSTRAINTS`
where table_name = 'employees';

NOT NULL(非空约束)

创建实例:

#方式1
create table test1(
id int not null,
last_name varchar(15) not null,
email varchar(25),
salary decimal(10,2)
);
desc test1;

#方式2
alter table test1
modify email varchar(25) not NULL;

效果:可以看到 NULL的id和last_name字段为NO

UNIUE(唯一性约束)

1)添加唯一性约束:

#方式1
CREATE TABLE test2(
id INT UNIQUE, #UNIQUE列级约束
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2),
CONSTRAINT uq_test2_email UNIQUE(email)#UNIQUE表级约束
);
#方式2
ALTER TABLE test2
ADD CONSTRAINT uq_test2_salary UNIQUE(salary);
#方式3
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;
#复合的唯一性约束
create table user(
id int,
`name` varchar(15),
`password` varchar(20),
#表级约束
Constraint uq_user_name_pwd UNIQUE(`name`,`password`)
);

在创建唯一约束时,如果不给唯一约束命名,就默认和列名相同。

可以向声明在UNIQUE的字段上添加NULL值,而且可以多次添加NUULL值

复合的唯一性是指,两个字段都完全一样是才算做相同,只要其中一个有区别就不算相同并可以添加成功。

2)删除唯一性约束:

添加唯一约束会创建唯一索引;

删除唯一约束只能通过唯一索引;

删除时需要指定唯一索引名,唯一索引名和唯一约束名一样;

如果创建唯一索引时没有指定名称:单列时默认与列名相同;组合列与小括号第一个字段名相同。

ALTER TABLE test2
DROP INDEX email;

PRIMARY KEY(主键约束)

主键约束相当于唯一约束+非空约束的组合。

一个表中最多只能有一个逐渐约束,创建表就需要提供一个主键。

联合在一起只要和别的不相同就行,但只要有一个是NULL就添加不成功

创建主键约束:

CREATE TABLE test3(
id INT PRIMARY KEY,#列级约束
last_name VARCHAR(15),
salary DECIMAL,
email VARCHAR(25)
);

CREATE TABLE test3(
id int,
name varchar(15),
password varchar(20),
primary(name,password)#表级约束
);

CREATE TABLE test6(
id INT
);
ALTER TABLE test 6
ADD PRIMARY KEY(id);

删除逐渐约束:主键名永远是Primary,实际开发中根本不会做。

ALTER TABLE  test6
DROP PRIMARY KEY;

AUTO_INCREMENT

特点和要求:

  • 只能作用在键列(主键列,唯一键列)
  • 一个表只能由一个自增长
#自增长列
CREATE TABLE test7(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);
INSERT INTO test7(last_name)
VALUES('Tom');

自增变量的持久化

mysql8.0将计数器放入到重做日志当中,每次计数器发生改变都会写入重做日志,如果数据库重启,InnoDB就会根据重做日志中的信息来初始化计数器的内存值。

FOREIGN KEY外键约束

从表(也可以称为子表)中添加的值必须是主表(父表)中已经存在的值。

规则:外键列必须引用主表的主键或唯一约束的列

添加外键约束


#在CREATE TABLE添加
#先创建主表
create table dept1(
dept_id int primary key,
dept_name varchar(15)
);
#再创建从表
create table emp1(
id int primary key auto_increment,
emp_name varchar(15),
department_id int,

constraint fk_emp1_dept_id foreign key(department_id) references dept1(dept_id)
);

使用外键实例:

添加数据:先添加父表,后添加子表

删除数据:先删除子表。后删除父表。

#主表添加数据
insert into dept1
value(1,'IT');
#子表添加数据
insert into emp1
values(1001,'Tom',1);

#删除数据
DELETE FROM emp1
WHERE id=1001;
DELETE FROM dept1
WHERE dept_id=1;

约束等级

Cascade方式:删除/修改父表,同步删除/修改子表记录

Set null方式:删除/修改父表,子表匹配记录列设为null

No action方式:子表中有记录,父表不允许任何操作

Restrict:同 No action

对于外键约束 最好采用" on update cascade on delete restrict ".

删除外键约束:

ALTER TABLE emp1
DROP FOREIGN KEY fk_emp1_dept_id;
#再手动删除外键约束对应的普通索引(按照外键约束名去删)
SHOW INDEX FROM emp1;
ALTER TABLE emp1
DROP INDEX fk_emp1_dept_id;

CHECK约束

代码实例:

CREATE TABLE test10(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) CHECK(salary>2000)
);

DEFAULT默认值

CREATE TABLE test10(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) DEFAULT 2000
);

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

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

相关文章

Matlab|【免费】基于半不变量的概率潮流计算

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要内容是基于半不变量法的概率潮流&#xff0c;包含蒙特卡洛模拟法、半不变量法&#xff0b;Gram-Charlier级数展开以及半不变量法Cornish-Fisher级数展开三种方法以及效果对比&#xff0c;模型考虑了…

Android学习使用GitLab(保姆级)

实习生入职第一课 学习使用GitLab&#xff0c;熟悉Git版本控制工具 下面是我的学习笔记&#xff0c;希望能帮助到需要的人&#xff01; 目录 一、注册你的GitLab账号 二、安装Git 三、在Android studio中配置Git 四、GitLab账户配置SSH Keys 五、GitLab账号创建项目 六…

Qt/C++监控推流设备推流/延迟极低/实时性极高/rtsp/rtmp推流/hls/flv/webrtc拉流/调整分辨率降低带宽

一、前言 算下来这个推流的项目作品写了有四年多了&#xff0c;最初第一个版本只有文件点播的功能&#xff0c;用的纯QTcpSocket通信实现&#xff0c;属于比较简单的功能。由于文件点播只支持文件形式的推流&#xff0c;不支持网络流或者本地设备采集&#xff0c;所以迫切需要…

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

ChatGPT提示词方法的原理

关于提示词&#xff0c;我之前的一些文章可以参考&#xff1a; 【AIGC】AI作图最全提示词prompt集合&#xff08;收藏级&#xff09;https://giszz.blog.csdn.net/article/details/134815245?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDExL…

如何在Mac中删除照片?这里有详细步骤

前言 本文介绍如何从Mac中删除照片,以释放硬盘空间或更好地组织文件和文件夹。 如何使用废纸篓删除Mac上的图片 在Mac上删除图片的最简单方法之一是使用废纸篓功能。学习只需几秒钟。下面是如何删除单个图片以及如何在Mac上删除多个图片,以及一些关键和有用的提示,以使该…

Matlab|考虑可再生能源消纳的电热综合能源系统日前经济调度模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 下载链接 1 主要内容 本程序参考文献《考虑可再生能源消纳的建筑综合能源系统日前经济调度模型》模型&#xff0c;建立了电热综合能源系统优化调度模型&#xff0c;包括燃气轮机、燃气锅炉、余热…

195基于matlab的凸轮机构GUI界面

基于matlab的凸轮机构GUI界面 &#xff0c; 凸轮设计与仿真 绘制不同的凸轮轮廓曲线 &#xff0c;凸轮机构运动参数包括推程运动角&#xff0c;回程运动角&#xff0c;远休止角&#xff0c;近休止角。运动方式&#xff0c;运动规律。运动仿真过程可视化。内容齐全详尽。用GUI打…

Docker 哲学 - 容器操作 -cp

1、拷贝 容器绑定的 volume的 数据&#xff0c;到指定目录 2、匿名挂载 volume 只定义一个数据咋在容器内的path&#xff0c;docker自动生成一个 sha256 的key作为 volume 名字。这个 sha256 跟 commitID 一致都是唯一的所以 &#xff0c;docker利用这个机制&#xff0c;可以…

【C++ 08】vector 顺序表的常见基本操作

文章目录 前言&#x1f308; Ⅰ vector 类对象的定义1. 定义格式2. vector 对象的构造 &#x1f308; Ⅱ vector 类对象的容量&#x1f308; Ⅲ vector 类对象的访问&#x1f308; Ⅳ vector 类对象的修改&#x1f308; Ⅴ vector 定义二维数组 前言 vector 介绍 vector 是一…

julia语言中的决策树

决策树&#xff08;Decision Tree&#xff09;是一种基本的分类与回归方法&#xff0c;它呈现出一种树形结构&#xff0c;可以直观地展示决策的过程和结果。在决策树中&#xff0c;每个内部节点表示一个属性上的判断条件&#xff0c;每个分支代表一个可能的属性值&#xff0c;每…

使用IDEA进行Scala编程相关安装步骤

一、相关安装包&#xff08;jdk最好用1.8版本&#xff0c;其他不做要求&#xff09; IDEA安装包 jdk-8u101-windows-x64.exe scala-2.12.19 二、安装顺序 在安装IDEA之前&#xff0c;首先要安装好java和scala环境&#xff0c;以便后续配置 三、jdk和scala安装要求 1.jdk安…

【论文阅读】DiffSpeaker: Speech-Driven 3D Facial Animation with Diffusion Transformer

DiffSpeaker: 使用扩散Transformer进行语音驱动的3D面部动画 code&#xff1a;GitHub - theEricMa/DiffSpeaker: This is the official repository for DiffSpeaker: Speech-Driven 3D Facial Animation with Diffusion Transformer paper&#xff1a;https://arxiv.org/pdf/…

【Kubernetes】k8s删除master节点后重新加入集群

目录 前言一、思路二、实战1.安装etcdctl指令2.重置旧节点的k8s3.旧节点的的 etcd 从 etcd 集群删除4.在 master03 上&#xff0c;创建存放证书目录5.把其他控制节点的证书拷贝到 master01 上6.把 master03 加入到集群7.验证 master03 是否加入到 k8s 集群&#xff0c;检查业务…

Docker 安装 LogStash

关于LogStash Logstash&#xff0c;作为Elastic Stack家族中的核心成员之一&#xff0c;是一个功能强大的开源数据收集引擎。它专长于从各种来源动态地获取、解析、转换和丰富数据&#xff0c;并将这些结构化或非结构化的数据高效地传输到诸如Elasticsearch等存储系统中进行集…

【LabVIEW FPGA入门】浮点数类型支持

如今&#xff0c;使用浮点运算来设计嵌入式系统的需求变得越来越普遍。随着 FPGA 因其固有的大规模并行性而在浮点性能方面继续超越微处理器&#xff0c;这种情况正在加剧。线性代数和数字信号处理 (DSP) 等高级算法可以受益于浮点数据类型的高动态范围精度。LabVIEW FPGA 通过…

【全开源】JAVA语聊大厅+陪玩系统语音聊天APP系统源码

我们技术使用后台服务 springbootmybatisplusmysql用户端 uniapp&#xff08;vue语法&#xff09;管理后台 vueelementUi 一、功能介绍 动态列表、发布动态、精准分类 创建语聊房间、房间玩法、违规公示、聊天显示 赠送礼物、上麦功能、房间管理、礼物中心、我的接单 我的技…

大话设计模式——8.原型模式(Prototype Pattern)

1.介绍 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。属于创建型模式。 UML图&#xff1a; 1&#xff09;浅拷贝&#xff1a; 指创建一个新的对象&#xff0c;然后将原始对象的字段值复制到新对象中。如果字段是基本类型&#xff0c;直接复制…

将FastSAM中的TextPrompt迁移到MobileSAM中

本博文简单介绍了SAM、FastSAM与MobileSAM,主要关注于TextPrompt功能的使用。从性能上看MobileSAM是最实用的,但其没有提供TextPrompt功能,故而参考FastSAM中的实现,在MobileSAM中嵌入TextPrompt类。并将TextPrompt能力嵌入到MobileSAM官方项目提供的gradio.py部署代码中,…

阿里云下载安装centos

这里以centos7.x版本下载安装为例 : 网址 : 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 点击centos : 再点击下载地址 : 找到 7/ 并点击 : 找到isos/并点击 : 点击x86_64 : 找到4.4G的文件点击下载 ; 点击创建新的虚拟机 , 然后选择典型 &#xff0c; 然后点击下一…
最新文章