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

news2024/11/15 4:25:11

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.coloradmin.cn/o/1534536.html

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

相关文章

24计算机考研调剂 | (研究所)北京微电子技术研究所

北京微电子技术研究所2024年考研调剂信息 调剂信息 一、招生专业 二、调剂对象 统考科目为思想政治理论、英语&#xff08;一&#xff09;、数学&#xff08;一&#xff09;&#xff1b;本科为电子科学与技术、微电子学、集成电路设计、电子信息工程、通信工程、计算机科学与…

有关Theano和PyTensor库

根据Github里面的介绍&#xff0c;PyTensor是源于Theano&#xff0c; Theano目前应该已经不再开发了&#xff0c;更新都是很多年前。 因此PyTensor在背景介绍中说 PyTensor is a fork of Aesara, which is a fork of Theano. Theano和PyTensor都是计算相关的库&#xff0c;可以…

报数游戏-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第39讲。 报数游戏&#xf…

VMware 替代专题 | 浅析 VMware 与 SmartX 超融合 I/O 路径差异及其影响

不同的超融合软件&#xff0c;其读写机制有一定的差异性&#xff0c;I/O 路径也不尽相同&#xff0c;这使得他们在 I/O 读写效率以及资源占用上都有不同的表现。有兴趣着手构建超融合基础架构的用户&#xff0c;可能会希望了解更多关于 I/O 路径的细节&#xff0c;从而在实施之…

智能商品计划系统:鞋服品牌的未来价值引擎

在数字化浪潮席卷全球的今天&#xff0c;智能商品计划系统正成为鞋服品牌转型升级的重要引擎。那么&#xff0c;什么是智能商品计划系统&#xff1f;它又能给鞋服品牌带来怎样的价值&#xff1f;本文将深入探讨这一话题&#xff0c;为鞋服品牌企业指引方向。 智能商品计划系统…

京东云开发者:DDD 学习与感悟 —— 向屎山冲锋

原文地址:https://mp.weixin.qq.com/s/Hvq1ttBopbxypatVcKcLiA 软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此&#xff0c;软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计…

使用QGIS将shp数据导入到数据库

QGIS将shp数据导入到数据库步骤&#xff1a; 1、在QGIS中查看携带地理坐标的数据&#xff0c;可以右键查看数据的属性数据源&#xff0c;可以修改数据使用的编码&#xff08;防止乱码&#xff09;&#xff0c;如下图 2、选择数据右键Export导出&#xff0c;在导出的页面可以选…

Springboot+vue的高校教师科研管理系统+数据库+报告+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的高校教师科研管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

09 事务和连接池

文章目录 properties文件连接池service层实现类dao层实现类dao层实现类 连接池类: 创建线程池静态常量&#xff0c;用于放连接。 创建Properties静态常量&#xff0c;用于解析properties文件 静态代码块中&#xff0c;解析properties文件&#xff0c;将解析结果用于创建连接池 …

innovus中path group 的策略和应用(下)

BPG&#xff08;basic path group&#xff09;和PG&#xff08;path group&#xff09;的异同 INVS默认使用了BPG&#xff0c;但是基于SDC理论下PG&#xff08;path group&#xff09;也是天然存在&#xff0c;两者在数据库里边有各自存在的方式&#xff0c;也可以共融共生中&…

100个openharmony开源demo:1.日历

准备用开发者手机写100个开源的demo不知道能不能实现&#xff0c;日拱一卒&#xff0c;期待蜕变。 第一个demo&#xff1a;日历&#xff0c;借鉴了网上的日历算法&#xff0c;自己用arkts写了界面和点击事件&#xff0c;各位可根据此demo写自己的日历选择器等组件。 1.目录结…

【JAVA笔记】IDEA配置本地Maven

文章目录 1 配置本地Maven1.1 Maven下载1.2 Maven安装与配置1.2.1 安装1.2.2 配置1.2.2.1 环境配置1.2.2.2 本地仓库配置 2 IDEA设置本地Maven 1 配置本地Maven 1.1 Maven下载 官网&#xff1a;http://maven.apache.org/下载地址&#xff1a;http://maven.apache.org/downloa…

SinoDB客户端工具dbaccess

类似Oracle的客户端工具sqlplus&#xff0c;Mysql的客户端工具mysql&#xff0c;SinoDB数据库也有自带的命令行客户端工具dbaccess。 dbaccess 识别用户输入&#xff0c;将用户输入的 SQL 语句打包发送给 SinoDB 数据库服务器执行&#xff0c;然后接收服务器的执行结果&#xf…

windows上打开redis服务闪退问题处理

方法1&#xff1a;在windows上面打开redis服务时&#xff0c;弹窗闪退可能是6379端口占用&#xff0c;可以用以下命令查看&#xff1a; netstat -aon | findstr 6379 如果端口被占用可以用这个命令解决&#xff1a; taskkill /f /pid 进程号 方法2&#xff1a; 可以使用…

Java特性之设计模式【装饰器模式】

一、装饰器模式 概述 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装 装饰器模式通过将对象包装在装饰器类中&#xff0c;以…

数据泄露问题怎么解决?迅软DSE加密软件助您守护重要信息

企业信息泄露的危害 企业数据泄露事件不仅给企业带来了经济损失和声誉损害&#xff0c;还可能导致用户个人信息的泄露&#xff0c;引起社会广泛关注。 因此&#xff0c;企业需要采取更加严格的数据保护措施&#xff0c;使用数据加密系统以防范潜在的数据泄露风险。同时&#…

Vue.js前端开发零基础教学(三)

目录 2.6 计算属性 2.7侦听器 2.8 样式绑定 2.8.1 绑定class属性 2.8.2 绑定style属性 2.9 阶段案例——学习计划表 2.6 计算属性 概念&#xff1a;Vue提供了计算属性来描述依赖响应式数据的复杂逻辑。 计算属性可以实时监听数据的变化&#xff0c;返回一个计算…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

智慧商显安卓主板MT8788_联发科MTK平台多媒体广告一体机方案

MT8788高性能智能主板&#xff0c;支持Android 9.0操作系统&#xff0c;支持双屏异显功能;MT8788是基于12nm工艺制程四核A73四核A53架构的八核心CPU,主频高达2.0GHz,拥有超强的通用计算性能。 MT8788主板采用10层二阶超高密度PCB板,集成了4G、百兆以太网、2.4G/5G 双频WiFi、蓝…

C# xaml框架以及Java的ORM介绍

c#有ASP.Net,.NET以及EF Core这几个重要的运行时和框架.分别用于web,应用以及数据库的ORM. 目前跨平台的有Avalonia UI,.Net MAUI以及Uno Platform,至于WPF等本身不是跨平台的,但可以依靠其他库实现跨平台.这里面Avalonia应该是认为bug比较少的. 当然目前最火的跨平台解决方案…