DML 数据操作语言
语句和数据类型
三个语句:
1、INSERT 语句:功能,将数据插入到表中,结果,表中数据量增加了,以行为单位,行数 增加了
实际功能:注册,加入购物车,下订单,上车扫码...
2、UPDATE 语句:更新修改数据:功能,将表中的数据进行修改,结果:数据量不变,但 是内容发生了变化
实际功能:修改地址,修改密码
3、DELETE 语句:删除数据的语句,功能:将表中不需要的数据删除,数据量变少,以行为 单位
实际功能:清空购物车
数据类型:
每个列下面的数据是什么样的,都是有类型限制的。常见的数据类型:字符串、日 期类型、数值类型。
字符串类型:
- CHAR(n) 字符类型:固定长度的字符类型,列存储的字符串的长度是固定的, 如果长度不够,会自动补齐空格,最多可以存放 255个字符,优势:存储效率高
例如: CHAR(10) -- 表示固定存储10个字符的字符串
abcde -- > 存储的数据 abcde补足5个空格
- VARCHAR(n) 字符类型,可变长度的字符类型,最多可以存放65535个字符, 优势:节省空间
例如:VARCHAR(10) -- 最多可以存放10个字符的字符串
abcde -- 》abcde
abcdefg -- > abcdefg
实际中:有一些固定长度的信息存储,建议使用 CHAR 类型,效率高,例如:身 份证号,手机号,性别
那些不是固定长度的信息存储,建议使用 VARCHAR 类型:地址,姓名, 签名,留言等等
CHAR 类型的字符在检索的时候要比 VARCHAR 类型快很多
日期类型:
DATE: 日期 '2022-07-09'
TIME: 时间 '10:00:00'
DATETIME :日期时间 '2022-07-09 10:00:00'
时间函数:
NOW() -- 获取现在的时间
SYSDATE() -- 取系统当前的时间
区别:NOW() 在执行的时候获取的是执行命令开始的实间, SYSDATE() 在函 数执行的过程中获取的动态时间值
SELECT NOW(),SYSDATE() FROM DUAL; -- 执行过快,看不出区别来, 让语句执行若干秒,延迟取时间sleep(n);
SELECT NOW(),SLEEP(3),NOW() FROM DUAL;
SELECT SYSDATE(),SLEEP(3),SYSDATE() FROM DUAL;
数值类型:整数和小数
整型: INT() : 指定的是显示宽度,不是表示存储的大小,默认就是10
小数: 浮点型 FLOAT/DOUBLE (单精度/双精度,精确的程度不一样)
例如:CREATE TABLE t112(id1 INT(5),id2 FLOAT(5,3));
SELECT * FROM t112;
INSERT INTO t112 VALUES(24524523452452,3453.2452345); -- bug 列的精度不够,存储的是错误的,应该报错,存储的是自认为范围内最大。
int 类型超出范围,需要修改代码
INSERT INTO t112 VALUES(245,53.2452345)
-- float(5,3) # 单精度浮点型,总位数 5位,小数位 3位,整数位 5-3=2位
INSERT 插入语句
要点:
1、往哪个表插入数据 :表名
2、往哪些列插入数据:列名
3、插入的数据是什么,具体的值:values
语法:
INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...) ; --值的数量和类型要和前面的列对应
如果给表中所有的列都插入数据,可以简写
INSERT INTO 表名 VALUES(值1,值2,...) ; -- 值的数量和类型要和表中初始列的数量和类型一一对应
例如:
给用户信息表插入一个用户信息:用户编号 10089,用户名 sunsun,手机号 13876542345
INSERT INTO user_tab(user_id,phone,user_name) VALUES(10089,13876542345,'sunsun');
INSERT INTO user_tab VALUES(10092,'sunsun23',NULL,13876542345,'null','2022-07-19');
备注:
1、插入的值的类型和列的类型要一致
2、插入的值的数量和列的数量要一样多
3、凡是含有特定含有的关键字信息:比如 列名, NULL 等等,不需要加引号,加了就变成了普通字符串,失去原有的含义,但是查询条件中搜索值,插入语句中 VALUES 值,凡是字符类型,都要加单引号。
DELETE 删除语句
要点:
1、删除哪个表中的数据:表名
2、删除哪些行的数据:查询条件
语法:DELETE FROM 表名 [WHERE 查询条件];
例如:
删除表 user_tab中user_name列里姓名中包含sun23的所有内容“删除行”
DELETE FROM user_tab WHERE user_name LIKE '%sun23%';
删除表t112的所有内容“删除所有行”
DELETE FROM t112;
备注:
如果不加查询条件,删除的就是整个表中的数据,工作中,先查询,后删除,并且删除 之前要备份。
UPDATE更新/修改语句
要点:
1、修改哪个表中的数据:表名
2、修改哪个列的数据,把数据改成什么:列名,新的值
3、修改哪些行:where 查询条件
语法:
UPDATE 表名 SET 列名=新的值,列名2=新的值,... WHERE 查询条件;
例如:把用户表中sunsun相关的用户姓名改成 " 孙孙",手机号改为空值
SELECT * FROM user_tab WHERE user_name LIKE '%sun%';
UPDATE user_tab SET user_name='孙孙',phone=NULL WHERE user_name LIKE '%孙孙%';
备注:
= 的两种用法:
1、在查询条件中, = 表示精确查询的运算符, = 不可以和 NULL 一起使用;
2、在update 语句中, SET 之后, = 表示赋值,可以和 NULL 一起使用。
事务
概念:
一组数据操作构成事务,一旦开始执行一条DML 语句,就会自动开启事务,后面的数据操作都进入这个事务,
在Oracle 数据库中,事务不会自动结束,需要手动结束 COMMIT ; 在提交之前,操作可以回滚 ROLLBACK 。
但是mysql 中默认事务是自动提交的,并且mysql 中每一个数据操作语句都被当成独立的事务,即每次只需DML语句都会自动提交结束事务,没有回滚的可能。
查看mysql 中事务提交的方式(自动提交和手动提交):
show variables like 'autocommit'; -- on 表示自动提交开启,值1,off 表示自动提交关系,值 0
set autocommit=0; 更改mysql中事务的提交方式,0是手动提交,需要手动输入运行commit, 1是自动提交。
例如:
往emp 表中插入2个员工信息,职工编号为4位 ,hiredate 使用函数或者确定的日期
INSERT INTO emp VALUES(1001,'HHH',NULL,NULL,NOW(),5000,NULL,20);
COMMIT;
回滚:
手动提交模式下,一个事务开启后,没有COMMIT 之前(提交之前),操作可以回滚,回退到事务开始之前 ROLLBACK 。
例如:
set autocommit=0
UPDATE emp SET ename='娃哈哈' WHERE empno=1001;
DELETE FROM emp WHERE ename='scott';
ROLLBACK; -- 全部回滚,回退到事务开始之前
保存点:
可以实现部分回滚,必须是在手动提交模式下进行。
例如:
1、查看表中数据
SELECT * FROM user_tab; -- 不打开事务,非DML语句
2、执行DML 语句,自动会打开一个事务,后面的DML 语句都进入该事务
INSERT INTO user_tab VALUES(12345,'sunsun123',NULL,NULL,'123@126.com','2000-03-09');
3、定义保存点,名字 s1
SAVEPOINT s1;
4、再执行一条或者多条数据操作语句,这些操作数据也会进入到事务当中
INSERT INTO user_tab VALUES(12346,'sunsun234',NULL,NULL,'123@126.com','2000-03-09');
DELETE FROM user_tab WHERE user_id=10094;
5、 回滚数据(可以直接回滚到事务开始之前,或者是回到到保存点)
ROLLBACK TO SAVEPOINT s1; -- 回滚到保存点之前
ROLLBACK ; 直接回滚到事务开始之前。
6、最终,一定要进行事务提交
COMMIT;