※食用指南:文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记,前期笔记整理比较粗糙,没有数据库呈现效果图,主要目的自存为主,记录完整的学习过程。(图片超级多,慎看!)
【中字】SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!
https://www.bilibili.com/video/BV1UE41147KC/?spm_id_from=333.1007.0.0&vd_source=b287f1f4a1fa54cc438e31a0f87ef4e2
第三章:插入、更新、删除
1、COLUMN ATTRIBUTES——列属性:插入、更新、删除数据
若字符为5:VARCHAR(50),只显示5字符;CHAR(50)填补多45个空字符,达到50字符
2、INSERTING A SINGLE ROW——插入单行
如果INSERT INTO指定修改,则VALUES补充信息即可
可以修改排序,上下都需修改
3、INSERTING MULTIPLE ROWS——插入多行
4、INSERTING HIERARCHICAL ROWS——插入分层行
如何插入一笔订单以及它对应的所有项目
亲子关系:一笔实际订单可以有一个或多个订单项目
order是母表,order_items是子表,order中的一行可以在里有order_items一子或者多子
根据customer_id、order_date、status,这三个进行填写,order_id自行生成序列
利用现有的顾客,下一个新的订单,设置好一个新的订单
①顾客id中选一个生成一个新的订单
②获取新生成订单的id
LAST_INSERT_ID(),内置函数
5、CREATING A COPY OF A TABLE——创建表复制
如何从一张表复制数据到另外一张表
创建复制表:orders arvhive(订单存档)
没有PK主键,也没有AI自动递增列,需要重新赋值
截断表(删除表中多有行)
只复制表中一部分数据到orders arvhiver例如19年前的订单
无需提供名列,给查询的每一列都赋值
使用选择语句作为插入语句中的子查询
练习:
创建invoices_archive,不要client_id,要client_name,只要支付过的发票
①将两个表连接在一起
②选择想要展示的列
③只返回有支付的发票or付款记录大于0
④把现在的查询,用作CREATE TABLE AS语句的子查询
※如果再次执行,出现错误,因为表已存在:Drop Table
6、UPDATING A SINGLE ROW——更新单行
假设记录payment_total、payment_date信息的系统出现了问题,支付10,对其进行更新
、
①UPDATE语句锁定要更新的表格
②SET指定一列或者多列的新值
③WHERE识别记录或者需要被更新的记录
假设更新了错误的记录,应该更改的是发票3
①将发票1恢复到初始值
payment_total默认值为0.00、payment_date默认值为NULL
可以把payment_total改成DEFAULT
②更新发票3,假设在due_date支付了invoice_total的50%
payment_total被修改了小数点后没有数字
7、UPDATING MULTIPLE ROWS——更新多行
与UPDATING A SINGLE ROW一样,但需修改WHERE
client_id3有多张发票,写一段更新所有该顾客的发票
————————————————————————————————————
如果执行会错误提示,因为默认情况下MySQL Workbench会在安全更新模式下运行,它只让你更新一条;如果使用别的MySQL客户端或者用应用程序代码写这段,都没问题
取消勾选Safe Update(防止意外更新或者删除了一些表记录)
现需要重新连接MySQL instance,关闭重启后在执行
————————————————————————————————————
也可运用IN运算更新client_id3、client_id4
所有WHERE子句运算都可以使用,严格来说WHERE是可选的,如果跟新整个表则无需写
练习:
8、USING SUBQUERIES IN UPDATES——在UPDATES中用子查询
如上,更改client3的数据,如果没有这位客户的id,只有名字怎么处理
*子查询是另一段SQL语句里的选择语句
如果查询执行多名客户怎么办
假设想更新所有位于NY、CA的客户发票
①写出想修改的
②因为子查询返回多条记录,不能再使用‘=’,改用IN
③更新了所有state是NY、CA的客户的发票
最好在执行UPDATE语句前,先执行查询,确认更新什么记录
假如没有子查询,还可以查询到会被更新的记录
假设更新所有payment_date是NULL的发票
①执行整个UPDATE语句前,先执行查询
②在连接到UPDATE语句下
练习:
为超过3000积分的客户更新comments,超过3000的客户为金牌客户,找到他们的订单
只选择customer_id,用这个选择语句,作为UPDATE语句的一段子查询
返回多行使用IN
一起缩进按Tab键
9、DELETING ROWS——删除行
如果没有WHERE,则会删除整个invoices表 (危!从入门到删库跑路)
假如先删除invoices_id=1de发票
也可以用子查询,假如想删掉客户M有works的所有发票
①找到该客户
②知道了该客户的client_id,可以用在查找条件里
‘Myworks’=clients表中的client_id=2,所以删除了
10、RESTORING THE DATABASES——恢复数据库
找到脚本所在位置,打开databases,点击执行,然后刷新Schems,进行覆盖。
(我似乎无法执行,也怕影响后面做题,先搁置一下)
————TBC