SQL数据表的操作(DML)

此文档是数据分析课程中的数据库第一阶段课程知识点的复习文档,本阶段课程目标是通过实战练习巩固常用的SQL语句,基于工作需要和个人实际,DML相关知识点仅需要熟悉和了解基本概念和常用的语法

复习时间:2024年8月9日

文档总结:2024年8月10日

复习时长:一天

课程环境:

  • win10系统
  • mysql community 8.0.23.0
  • Navicat Premium 12.0.29

本次课程作业主要涉及的知识点:

  1. 数据表设计的基本规范
  2. 数据表的常用操作
  3. 数据表的创建
  4. 数据表的查看(查看表结构)
  5. 数据表的删除(删除表和删除表的内容)
  6. 数据表结构的修改(修改表名称、添加新列、修改表中列的数据类型或长度、修改列名、删除列)
  7. 数据表数据的修改
  8. 数据表的约束

关于DML的复习总结:

1、关于数据表设计的注意点:

创建数据库时,数据库名及后期表名都应当遵守MySQL的标识符命名规则:

  • 由字母、数字、下划线组成,
  • 第一个字符必须是字母或下划线(数字不能用在开头)
  • 不能是MySQL的关键字
  • 不要取中文名
  1. 一个数据库中可以n个表,表中又有字段(列),在建表的时候就需要定义好字段(指定字段 属性,比如字段数据类型+字段长度等)
  2. 对已有表做更改既复杂又不统一,理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动
  3. 数据库名、表名和字段名,建议统一使用小写字母,避免出现不必要的问题

在阿里巴巴JAVA开发手册的 MySql 建表规约里提到:

【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

通俗的说就是,MySQL 在 Windows 系统下不区分大小写,但在 Linux 系统下默认区分大小写。因此,数据库名、表名和字段名,都不允许出现任何大写字母,避免节外生枝。

 一般建议统一使用小写字母,并且 InnoDB 引擎在其内部都是以小写字母方式来存储数据库名和表名的,这样可以有效的防止 MySQL 产生大小写问题

2、如何防止误删有用的表

  • 强制实施有关规则,防止删除与其他表相关联的表,在实施这些规则时,如果对某个表发布一条DROP TABLE语句,且该表是某个关系的组成部分,则DBMS将阻止这条语句执行,直到该关系被删除为止。
  • 在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确

3、关于drop和delete使用场景

  • 删除结构性的东西,用drop(比如删除一个数据库或者数据表)
  • 删除内容性的东西,用delete(比如删除某个表里的具体内容(结构不删,delete之后,数据类型等结构信息还会保留))

4、关于delete和truncate删除的区别

区别deletetruncate
底层实现

有多少条记录,就执行多少次删除操作

先删除整张表,然后再重新创建一张一模一样的表

插入数据的断点开始数

delete删除后,如果再插入,标识列从断点开始

truncate删除后,如果再插入,标识列从1开始

是否可以添加筛选条件

delete可以添加筛选条件

truncate不可以添加筛选条件

效率

delete效率较低

truncate效率较高

返回值

delete可以返回受影响的行数

truncate没有返回值

是否可以回滚

delete可以回滚

truncate不可以回滚

5、关于插入语句的注意事项

  1. 要求值的类型和字段的类型要一致或兼容
  2. 字段的个数和顺序不一定与原始表中的字段个数和顺序一致,但必须保证值和字段一一对应
  3. 值的数据大小,必须在字段指定的长度范围内
  4. varchar char date类型的值必须使用单引号包裹
  5. 假如表中有可以为null的字段,如果要插入空值,可以字段和值都都忽略不写,或者写字段,值插入null
  6. 如果插入指定字段的值,必须要上写列名

 6、常用约束的简单总结

create table 表名(
	字段名 字段类型 not null, -- 非空
	字段名 字段类型 primary key, -- 主键
	字段名 字段类型 unique, -- 唯一
	字段名 字段类型 default 值,-- 默认
	constraint 约束名 foreign key(设置外键的字段名) references 主表(被引用列)
)
约束作用

主键primary key

1、唯一的标识表里的每一条记录;

2、主键字段既不能为空,也不能重复

3、一个表中至多一个主键

非空not null

字段不能为空

唯一unique

1、字段取值不能重复,但可以为空

2、一个表可以有多个唯一约束

3、对null不做唯一的判断(设置唯一约束的列是允许有空值的)

默认值default

1、没有给该字段赋值时,它使用默认值;

2、如果给该字段赋值了,就使用实际赋的值;

外键foreign key

1、设置了外键约束字段的取值跟主键之间就有一个参照关系,即从表的外键的取值要参照主键的取值

2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求

3、主表的被引用列要求是一个key(一般就是主键)

4、向从表中插入的数据,必须先在主表存在

一阶段复习重点关注:

  • DML语句相关操作的关键字掌握,主要是掌握表结构的创建(create)与删除(drop),掌握表内容的插入(insert)与更新(update),其他关键字仅做了解即可
  • 表约束的概念掌握,目标是能够了解常用的约束,包括:约束的类型、约束之间的关联与差异、约束的语法结构

复习过程中的薄弱点与易错点:

1、update语句不熟练,特别是单条数据插入与多条数据的插入,脱离文档常写常错,以下是常用的insert写法:

-- 方式1: 插入全部字段, 将所有字段名都写出来
insert into 表名(字段1,字段2,……,字段n)  
        values(值1,值2,……,值n);
-- 方式2:插入全部字段,不写字段名
insert into 表名 
    values(值1,值2,……,值n);
-- 方式3:插入指定字段的值
insert into 表名(指定的字段名) 
      values(对应字段的值);
-- 插入语句支持查询
insert into 表名
查询语句;

2、约束,特别是外键约束不够熟练,不熟悉基本的语法结构:

设置外键约束的语法:

constraint 约束名 foreign key(列名) references 参照的表名(参照的列名)

本阶段文档总结情况:

第一部分:表的创建,关键字:create

1、创建表,关键字:create

create table [if not exists] 表名(
    字段名 字段类型 [约束,非必要],
    字段名 字段类型 [约束,非必要]
)

【if exists】的作用:存在就删除,不存在不处理

如果数据库里没有对应的表(比如删除之后,再次执行了删除语句,此时数据库里已经没有这张表了)会有报错提示:Unknown table

说明1:

为避免这种报错,可以在删除语句里加上:if exists

说明2:

如果不加if exists,当库名不存在时,运行报错也是一种必要的提示

2、通过复制表结构创建表,关键字:like

create table 新表名 like 旧表名;

复制表结构创建表一种快捷创建表的方式

快速创建一个表结构相同的表,通过复制表结构实现

与表结构相同,是指:表中的字段名一样,字段对应的数据类型一样,但不考虑表里具体的数据

第二部分:查看表,关键字:show/desc

1、查看当前数据库中的所有表名

show tables; 

2、查看数据表的结构

通过查看表结构,验证创建的新表是否与之前的表具有相同的结构:可以通过 desc 新表名实现

desc 表名;
数据表和数据库查看结构的语法是类似的
需求关键字数据库数据表
查看结构desc 库名/表名;desc 库名;desc 表名;
查看有哪些show 库名/表名;show databases;show tables;
查看SQL语句show create 库名/表名;show create 库名;show create 表名;

第三部分:表的删除,关键字:drop

1、删除表(从数据库中永久删除某一张表)

drop table 表名;

2、判断表是否存在, 存在的话就删除,不存在就不执行

drop table if exists 表名;

第四部分:表结构的修改,关键字:alter

1、修改表名,关键字:rename

alter table 旧表名 rename to 新表名;

2、向表中添加新列,关键字:add

alter table 表名 add 字段名称 字段类型;

3、修改表中列的数据类型,关键字:modify

alter table 表名 modify 字段名称 字段类型;

4、修改表中列的名称/字段的长度,关键字:change

alter table 表名 change 旧列名 新列名 类型(长度); 

5、删除表中的列,关键字:drop

alter table 表名 drop 列名;

第五部分:表内容的修改,关键字:增insert、删delete、改update

1、插入数据,关键字:insert

插入数据的三种方式

方式1: 插入全部字段, 将所有字段名都写出来

insert into 表名(字段名,...) values(值,...);

insert into student(sname,sgender,sbrithday,clsid) 
values("金毛狮王","男","1960-09-06",1)
	 ,("杨逍","男","1970-06-06",2)
	 ,("灭绝师太","女","2003-10-19",3);

方式2:插入全部字段,不写字段名

insert into 表名 values(值1,值2,……,值n);

INSERT into classes VALUES(1,"超越班"),(2,"火箭班"),(3,"先驱班")

方式3:插入指定字段的值

insert into 表名(指定的字段名)  values(对应字段的值);

insert into student(sname) values("张三");

2、删除表中的数据,关键字:delete/truncate

语法格式1:删除表中所有数据

delete from 表名

delete from student;

语法格式2: 指定条件 删除数据

delete from 表名 [where 字段名 = 值]

delete from student where sname = "杨逍";
删除表中的所有数据的两种做法对比
删除方法说明
delete from 表名;有多少条记录,就执行多少次删除操作,效率低,不推荐
truncate table 表名;先删除整张表, 然后再重新创建一张一模一样的表,效率高,推荐
-- 有多少条记录,就执行多少次删除操作,效率低,不推荐
delete from 表名;
-- 先删除整张表, 然后再重新创建一张一模一样的表,效率高,推荐
truncate table 表名;

当一个表中条数非常多,又要做删除动作的时候,如果用delete会很慢,那我们可以使用 truncate方法;

 truncate table student;

3、更改单表数据,关键字update

1)如果不加更新条件,则表里所有的记录都会更新

2)如果加了更新条件,则只有满足条件的记录会更新

语法格式1:不带条件的修改

update 表名 set 字段 = 值;

案例:不带条件修改,将所有的性别改为女(慎用!!)

-- 案例:不带条件修改,将所有的性别改为女(慎用!!)
update student set sgender = "女" ;

语法格式2:带条件的修改

update 表名 set 字段 = 值 [where 条件表达式:字段名 = 值 ]

案例:带条件的修改,将sid 为3的学生,性别改为男

-- 案例:带条件的修改,将sid 为3的学生,性别改为男
update student set sgender = "男" 
where sid = 3;

语法格式3:带条件一次修改多个列

update 表名 set 字段1 = 值1,字段2=值2 [where 条件表达式:字段名 = 值 ]

案例:一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京

-- 案例:一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京
update student 
set age = 20 ,address ="北京"
where sid = 2;

4、更改多表数据,关键字update+表连接

update 表1 别名 
	left|right|inner join 表2 别名 
	on 连接条件  
	set 字段1=值1,字段2=值2 
where 筛选条件;

第六部分:表的约束

建表的时候通常伴随着约束,约束指的是对表里的字段取值的一系列的规则限制条件

约束的目的在于对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性. 违反约束的不正确数据将无法插入到表中

约束的创建一般是在创建表时建立,语法如下:

create table 表名(
	字段名 字段类型 not null, -- 非空
	字段名 字段类型 primary key, -- 主键
	字段名 字段类型 unique, -- 唯一
	字段名 字段类型 default 值,-- 默认
	constraint 约束名 foreign key(设置外键的字段名) references 主表(被引用列)
)
-- 创建主表
creat etable student(
sid int primarykey,
sname varchar(20) not null,
score float default 0,
semail varchar(50) unique);
-- 在表中插入数据
insert into student values(1,'zs',80,'zs@163.com');

1、主键约束,关键字:primary key

主键指的是主关键字,它是表里的一个或多个字段,它的值可以唯一的标识表里的每一条记录。

如果对某个字段设置了主键约束,那么这个字段既不能为空,也不能重复。

一个表至多有一个主键

哪些字段可以作为主键 ?

1、主键约束是使用最频繁的约束

2、通常针对业务去设计主键,在设计数据表时,一般情况下,都会要求表中设置一个主键

3、主键是给数据库和程序使用的,跟最终的客户无关,所以主键没有意义没有关系,只要能够保证不重复就好, 比如身份证号列就可以作为主键

4、如果没有和业务关联太大的可以设计为主键的列的话,我们在进行数据库设计的时 候往往人为加一列作为主键列,习惯上起名为xxid

主键的自增

注: 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成 主键字段的值

关键字: AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)--了解

添加主键

alter table 表名 add【 constraint 约束名】 primary key(字段名);

删除主键

alter table 表名 drop primary key;

案例:创建表teacher,tid为主键并自增

-- 案例:创建表teacher,tid为主键并自增
create table teachers(
	 tid int auto_increment
	,primary key(tid)
	,tname varchar(32)
)

案例:由于sid设置了主键约束,以下数据无法插入

-- 数据无法插入,因为主键不能为空
insert into student values(null,'ls',80,'ls@163.com');

2、非空约束,关键字:not null

添加非空

alter table 表名 modify column 字段名 字段类型 not null;

删除非空

alter table 表名 modify column 字段名 字段类型;

3、唯一约束,关键字:unique

添加唯一

alter table 表名 add【 constraint 约束名】 unique(字段名);

删除唯一

alter table 表名 drop index 索引名;

4、默认值约束,关键字:default

添加默认

alter table 表名 modify column 字段名 字段类型 default 值;

删除默认

alter table 表名 modify column 字段名 字段类型 ;

5、外键约束,关键字:foreign key

1.如果某个字段,它在一张表里是主键,然后它又出现在另外一张表里,那么可以在另外一张表里对它设置外键约束。一旦设立了该约束,那么设置了外键约束字段的取值跟主键之间就有一个参照关系,即外键的取值要参照主键的取值。

2.使用外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性

3.外键约束经常和主键约束一起使用,用来确保数据的一致性

添加外键

alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列);

删除外键

alter table 表名 drop foreign key 约束名;

注意:添加数据时, 应该先添加主表中的数据

案例:有两张表,学生表和院系表,结构如下:

如果在学生表中插入一条记录,系号为D58,由于D58不在系表中,那么D58的这条记录的插入语句就会报错,从而避免脏数据的产生

-- 由于外键约束,以下数据将无法插入:
-- 由于D58不在系表中,那么D58的这条记录的插入语句就会报错,从而避免脏数据的产生
INSERT into student value(10004,"孙悟空","男","1992-01-01","D58");

注意:删除数据时,应该先删除从表中的数据;

错误做法:

-- 删除数据时,应该先删除从表中的数据
-- 报错cannot delete or update a parent row:a foreign key constraint fails
-- 报错原因:不能删除主表的这条数据,因为在从表中有对这条数据的引用
delete from student where sid = 3;

由于从表中引用了主表数据,主表中的数据不能直接删除,需要先删从表,再删主表;

6、自增长列(了解,掌握主键自增长设置即可)

自增长的特点:

1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1

2、一个表至多有一个自增长列

3、自增长列只能支持数值型

4、自增长列必须为一个key

自增长的使用:

一、创建表时设置自增长列

create table 表名(
字段名 字段类型 约束 auto_increment
);

二、修改表时设置自增长列

alter table 表 modify column 字段名 字段类型 约束 auto_increment;

三、删除自增长列

alter table 表 modify column 字段名 字段类型 约束;

课程参考内容

视频教程:尚硅谷数据库基础教程(李玉婷老师)、拉勾教育Mysql数据分析实战(应癫老师)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值