二十、更新和删除数据
还是有图片确实,这个好点(待更新)
https://zcw.notion.site/MySQL-524a8f3ceb2d427ba53cc82d924c438a
update
UPDATE user set address = 'NLP' WHERE id IN (6, 7);
DELETE
DELETE from user WHERE id = 8;
DELETE不需要列名或通配符。DELETE删除整行而不是删除列
为了删除指定的列,请使用UPDATE语句:
如果省略了WHERE子句,则UPDATE或DELETE将被应用到表中所有的行。换句话说,如果执行UPDATE而不带WHERE子句,则表中每个行都将用新值更新。
二十一、创建和操纵表
create Table
表的主键可以在创建表时用**PRIMARY KEY
**关键字指定。这里,列cust_id指定作为主键列。
如果你仅想在一个表不存在时创建它,应该在表名后给出
IF NOT EXISTS
。
NULL
不要把NULL值与空串相混淆。NULL值是没有值,它不是空串。如果指定’'(两个单引号,其间没有字符),这在NOT NULL列中是允许的。空串是一个有效的值,它不是无值。NULL值用关键字NULL而不是空串指定。
AUTO_INCREMENT
AUTO_INCREMENT
告诉MySQL,本列每当增加一行时自动增量。每次执行一个INSERT操作时,MySQL自动对该列增量(从而才有这个关键字 AUTO_INCREMENT ),给该列赋予下一个可用的值。这样给每个行分配一个唯一的cust_id,从而可以用作主键值。
-
指定默认值
-
引擎类型
-
类型
- InnoDB
- MEMORY
- MyISAM
ENGINE=InnoDB
该引擎具体创建表,而在你使用SELECT语句或进行其他数据库处理时,该引擎在内部处理你的请求。多数时候,此引擎都隐藏在DBMS内,不需要过多关注它。
但MySQL与其他DBMS不一样,它具有多种引擎。它打包多个引擎,这些引擎都隐藏在MySQL服务器内,全都能执行CREATE TABLE和SELECT等命令。
如果省略ENGINE=语句,则使用默认引擎(很可能是MyISAM),多数SQL语句都会默认使用它。但并不是所有语句都默认使用它,这就是为什么ENGINE=语句很重要的原因(也就是为什么本书的样列表中使用两种引擎的原因)。
- 更新表
用ALTER TABLE
添加:ADD
删除:DROP
ALTER TABLE `user1` ADD 数字 CHAR(10) DEFAULT(10); -- 默认为10
ALTER TABLE `user1` DROP 数字;
小心使用ALTER TABLE 使用ALTER TABLE要极为小心,应该在进行改动前做一个完整的备份(模式和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,可能不能删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。
- 删除表
DROP TABLE 表名
删除表没有确认,也不能撤销,执行这条语句将永久删除该表。
- 重命名
RENAME TABLE
二十二、使用视图
我们已经看到了视图应用的一个例子。下面是视图的一些常见应用。
-
重用SQL语句。
-
简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必
知道它的基本查询细节。 -
使用表的组成部分而不是整个表。
-
保护数据。可以给用户授予表的特定部分的访问权限而不是整个
表的访问权限。 -
更改数据格式和表示。视图可返回与底层表的表示和格式不同的
数据。 -
CREATE VIEW
-
show create view viewname
-
drop view viewname
利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
- 更新视图
更新一个视图将更新其基表(可以回忆一下,视图本身没有数据)。如果你对视图增加或删除行,实际上是对其基表增加或删除行。
但是,并非所有视图都是可更新的。基本上可以说,如果MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
分组(使用GROUP BY和HAVING);
联结;
子查询;
并;
聚集函数(Min()、Count()、Sum()等)
DISTINCT;
导出(计算)列
二十三、存储过程
PROCEDURE
CREATE PROCEDURE phonePro()
BEGIN
SELECT avg(phone) as phoneAvg
FROM user1;
END;
- 调用:
CALL phonePro();
其效果等同于
SELECT avg(phone) phonrAvg FROM user1;
- 删除存储:
DROP PROCEDURE phonePro;
仅当存在时删除 如果指定的过程不存在,则DROP PROCEDURE将产生一个错误。当过程存在想删除它时(如果过程不存在也不产生错误)可使用
DROP PROCEDURE IF EXISTS
。
其中:
DECIMAL(M, D)
如果m被省略了,那么m的值默认为10,
如果d被省略了,那么d的值默认为0.
举例表示:
1、decimal(5,2) 所指代的范围是-999.99~999.99 数字的最大位数是5位,小数点右侧是2位,即有两位小数。
2、decimal(7,6)所指代的范围是-9.999999~9.999999 数字的最大位数是7位,小数点右侧是6位,即有六位小数。
字的位数和所占字节数,有以下对应表:
小数点左侧位数
数据结构所占的字节数
1–2 1
3–4 2
5–6 3
7–9 4举例表示:
decimal(18,9)
小数位左右各为9位数,此数据所占以上表格即为4字节整数位,4字节小数位;
decimal(20,6)
整数位为14位,小数位位6位,此数据需要4个字节给整数位的9位和3字节给另外的5位整数,另外小数位需要3个字节,总共是4+3+3 = 10个字节。
decimal不能够存储以“+”、“-”和“0”开头的数据,如果是“+”开头默认存为正数,而“-”开头则不存储
具体的对decimal的定义,可以在mysql源码中的strings/decimal.c文件中的decimal2bin()函数查看。
————————————————
版权声明:本文为CSDN博主「liaowenxiong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liaowenxiong/article/details/120378170
注意:传入了onumber,输出了ototal
DROP PROCEDURE chengji; // 一定要事先清除同名的PROCEDURE
CREATE PROCEDURE chengji (
IN number INT,
OUT res DECIMAL(5, 2)
)
BEGIN
SELECT id * 2
from `user1`
where id = number
INTO res;
END;
CALL chengji(7, @res);
SELECT @res; // 结果:14
检查存储过程
为显示用来创建一个存储过程的CREATE语句,使用SHOW CREATE PROCEDURE 名称
语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znfc8yJT-1670173681620)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/029ddd6e-31a1-4a7a-8b3c-3dc3325485f2/Untitled.png)]
二十四、游标
使用简单的SELECT语句,例如,没有办法得到第一行、下一行或前10行,也不存在每次一行
地处理所有行的简单方法(相对于成批地处理它们)。
有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。
不像多数DBMS,MySQL游标只能用于存储过程(和函数)。
DECLARE
命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。
定义游标:
打开游标:
用OPEN CURSOR
语句来打开
关闭游标:
CLOSE CURSOR