[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关
1DML数据操作语言,增加删除改数据
插入数据INSERT
插入添加数据,两种方法
方式1:VALUES添加数据
#准备工作
USE atguigudb;
CREATE TABLE IF NOT EXISTS emp1(
id INT,
`name` VARCHAR(15),
hire_data DATE,
salary DOUBLE(10,2));
SELECT * FROM emp1
INSERT INTO emp1
VALUES (1,'tom','2000-12-21',3400)
#如果没有声明字段,就必须按照表的字段的先后顺序添加,不能乱来
这个方法好不好呢,当然是不好的,我们必须清楚知道表的字段内容.
所以我们可以再表名后面用括号声明字段
INSERT INTO emp1(id,`name`,hire_data,salary)#这里我们就可以添加一个括号声明字段
VALUES (1,'tom','2000-12-21',3400)
说明:没有进行赋值的字段的值为null,如果有约束可能就会出错
如何插入多条记录:
INSERT INTO emp1(id,NAME ,salary)
VALUES (2,'tom2',34000),(3,'toem2',34000)#我们可以把我们要插入的数据用,隔开,这样效率比用一对INSERT效率会高不少
#方式2将查询结果插入到表中
INSERT INTO emp1(id,NAME ,salary)
SELECT employee_id,last_name,salary FROM employees WHERE department_id in (20,30)#字段一定要和表一一对应
我们发现类型和我们的表的类型是不太一致,如果把小的范围放到大的范围是可以的,但是如果大的范围插入小的范围是有可能报错的.如果要用这个方法去添加这个范围和长度一定要先看一下,添加的表的数据范围一定要小于我们表的范围.是否出错,主要是看是否出现太长的值
还有就是VALUES关键词是可以写成VALUE的不影响,但是VALUES是标准写法
更新数据(修改数据)UPDATE
UPDATE….SET …..WHERE
我们希望把id等于5的hiredate改成当前的日期.
我们一般都会有WHERE的条件,因为如果不进行条件限制,那么字段全部的值都会被调整为当前的日期,或其他值
UPDATE emp1 SET hire_date=curdate().WHERE id=1
是可以实现批量修改数据的.我们要改哪些数据呢,看WHERE就行
#同时修改一条数据的多个字段
UPDATE emp1 SET hire_data=CURDATE(),salary=5000 WHERE id=3
#同时修改一条数据的多个字段
修改名字包含’a’的工作+100
UPDATE emp1 SET salary=salary+100 WHERE id like ‘’
修改数据时可能会存在不成功的情况的,(可能由于约束的影响造成的)
比如我们约束要求部门必须存在部门表中,如果部门没有100那么就会失败.
#删除数据只能一条一条的删DELECT FROM…… WHERE
DELETE FROM emp1 WHERE ID=1
删除数据时也可能会存在不成功的情况的,(也可能由于约束的影响造成的)
比如我们要删除50号部门,但是我们50号部门还有员工,我们约束员工是必须在部门表里有50号部门.那么除非部门里的员工都拆了,才能瞒住我们的外键约束.
小结:DML操作默认情况喜爱执行后会自动提交数据,如果希望执行之后不自动提交数据,需要使用SET autocommit=FALSE
使用频率上DML是非常频繁的,比如我们删除购物车的数据,那么久要DELECTE添加就要INSERT,查询的就更多了
mysql8.0的新特性,计算列
计算列就是根据其他列计算得来,那么就叫计算列比如a列的值是1b列的值是2,c列为a+b,c的值就是a+b..比如我们sql查询的时候要对10万条记录的6个字段进行计算或者连接,每条记录都要计算之后才能得到,因为要临时运算,所以结果就会比较复杂.那么我们如果有计算列就可以直接查询列.
我们可以造表的时候就添加我们的计算列.
CREATE TABLE test1(
A int,
B int,
C int GENERATED ALWAYS AS (a+b) VIRTUAL#字段c就是我们的计算列
)#这里可以不添加GENERATED ALWAYS,C int (a+b) VIRTUAL,也可行,virtual代表实时计算,不物理存储在数据库中
#我们再插入一个数据
INSERT INTO test1(a,b)
VALUES(1,2)
我们可以发现c自动就有值了
我们来修改一下A和B的值
UPDATE test1 SET a=5,b=6 WHERE A=1
SELECT * FROM test1
这是一个非常好的特性,大家就可以在工作环境中使用了.
阿里巴巴开发手册内容拓展:
mysql字段命名规范
1(强制)表名和字段名必须用小写字母和数字,禁止出现数字开头,禁止两个下划线中间只出现数字,数据库中字段名的修改代价很大,不能进行预发布,所以字段名需要慎重考虑:
2(强制)禁止使用保留字(关键词,函数名)比如desc,range,match,delayed等
3(强制)表必须有3个字段:id;gmt_create,gmt_modified,第一个是主键id,类型为BIGINT UNSIGNED,单表时自增,步长为1. gmt_create,gmt_modified,都是DATETIME类型,前者是创建时间,主动添加,后者更新时被动添加
4(推荐)表的命名最好是遵循”业务名称_表的应用”,
ALIPAY_test.for
5(推荐)库名与应用名尽量一致..
(参考)合适的字符储存长度,不但节省数据库表空间,(这个好理解,短的空间肯定少,储存空间也小),节省索引储存,更重要的是提升检索速度.(数据页内存只能加载16k,可以存放的数量是和你储存的大小有关系的,所以要注意这一点,)
无符号值可以避免误存负数,扩大了表示范围
如何理解清空表.删除表需要谨慎: