Mosh--Mysql 学习笔记(四)DML 数据库的操作

课程是国外Mosh Hamedani 的付费Mysql课程。 该课程干货满满,没有废话。并且授课方式目的性强,适合各个基础的学生。 课程在B站有搬运,大家动动手就可以找到~~ 希望能帮助到各位同学

第四章 Database managment language

本章介绍 数据库的操作,包含

  • 行操作
  • 表操作
第一节 列的属性

本节介绍 sql中 表示表属性的一些关键字
varchar: variable character 可变字符,根据实际字符长短调整大小,参数为最大长度。
PK:主键
NN:非空
UQ:唯一
BIN:二进制
AI:自增

第二节 插入行

我们先观察customers表的属性
Mosh--Mysql 学习笔记(四)DML 数据库的操作_第1张图片

  1. 方式一:默认值,默认值需要给表所有属性赋值
insert into customers
values(default,'john','smith','1991-01-01','110','haha Road','suining','sichuan');
  1. 方式二: 指定值(列),只需要给被指定的列赋值,其他未指定的值mysql会根据其属性自动赋值,比如自增列。
insert into customers( first_name,last_name,birth_date,address,city,state)
values('quantum','jar','1996-06-30','here','there','there again')

若正确插入~,mysql在控制台显示,有一行受影响。

第二节 插入多行
insert into shippers(name)
values('顺丰'),('韵达'),('天天');
章节练习

向products表中插入3行数据

首先我们观察表的属性

Mosh--Mysql 学习笔记(四)DML 数据库的操作_第2张图片
id 是自增的,不用管
unit_price 是 decimal (4,2) 意思是最大长度为4位(包含小数),小数为2位,超过精读会被截断

insert into products(name,quantity_in_stock,unit_price)
values('product1',50,99.23),//正确

values('product1',50,100.23)//报错 单价超过范围
第三节 插入有层次关系的行 hierachical rows
  • 之前的例子都是在单一的表中插入数据,如何一次性向多张表插入数据呢(有层次关系的表)?

这里用插入一个订单来解释什么是有层次关系的表,(实际上是父子关系)。

当向orders中插入一个新order时,我们知道订单的具体物品和顾客是以编号的形势分别对应在order_items和customers表中。

如图示:
Mosh--Mysql 学习笔记(四)DML 数据库的操作_第3张图片
这里介绍一个函数

  • last_insert_id() 获取上一个插入值的ID
insert into orders(customer_id,order_date,status)
values(1,'2020-06-30',1);//这里完成订单的插入,顾客是已经有的1号,order_id为自增,所以我们调用last_insert_id 来获取该值

insert into order_items
values(last_insert_id(),1,1,2.50);
  • 实际上插入hierachical rows 就是编写不同的DML语句来实现的,(编者注)是不是用事物来编写比较好?
第四节 复制表
create table order_archived as 
select * from orders

请注意这里实际上是把 select * from orders 返回的结果集作为参数传递给了order_archived,常规的方法是:

create table table_name (
id int 列属性1 列属性2//这里为列添加了属性
.....
)

所以复制得到的表中虽然数据一样,但是会没有主键,非空,自增等属性,需要自己手动添加!!!!

  • 使用子查询的方式可以筛选想要复制的内容
insert into order_archived 
select * from orders
where order_date >= '2020-01-01';//选择2020年之后的订单
章节练习

用 create table as…语法创建一个新表 paid_invoices ,表中需要有cliend的name,只包含付过款的invoice。


select * from //这里偷懒了,这里把需要的列写出来就行了。
invoices i 
join clients c 
on i.client_id = c.client_id
where i.payment_date is not null
第四节 更新行
  • 关键字 update, set
update invoices
set payment_date = '2020--07-14' ,payment_total = 10
where invoice_id =1;
第五节 更新多行

第六节 子查询

设想一个例子,我们在前端提供了一个用户名的输入框,这个框需要一个用户的名字,我们通过比对数据库来得到这个用户的id,并使用这个id来操作数据。


update invoices
set payment_total = invoice_total *0.5,
payment_date = due_date
where client_id = 
(Select client_id
from clients
where name ='Myworks')//括号内就是子查询

in short: 子查询就是父查询利用子查询的返回值进一步查询。】

第七节 删除行
  • 关键字 delete from
delete from invoices
where invoice_id = 1;

DML结束

你可能感兴趣的:(数据库,mysql,数据库)