本文已参与「新人创作礼」活动,一起开启掘金创作之路
第一节:插入数据
1.1 VALUES的方式添加
使用这种语法一次只能向表中插入一条数据。
-- INSERT INTO 表名 VALUES (value1,value2,....);#值得顺序必须与表中的值顺序相同
-- INSERT INTO 表名(column1 [, column2, …, columnn]) VALUES (value1 [,value2, …, valuen]);
#为表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。
1.2 *插入多条数据
-- INSERT INTO table_name VALUES (value1 [,value2, …, valuen]), (value1 [,value2, …, valuen]), ……(value1 [,value2, …, valuen]);
-- INSERT INTO table_name(column1 [, column2, …, columnn]) VALUES (value1 [,value2, …, valuen]), (value1 [,value2, …, valuen]), ……(value1 [,value2, …, valuen]);
总结:一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中 效率更高。
1.3 插入select语句
INSERT INTO 目标表名 (tar_column1 [, tar_column2, …, tar_columnn]) SELECT (src_column1 [, src_column2, …, src_columnn]) FROM 源表名 [WHERE condition]
第二节:更新数据
update更新数据*
语法:UPDATE 表名 SET 字段1=值, 字段2=值[WHERE 条件];
举例:update info set name=’张三’;#所有表中的name都改为张三。
Where:update info set name=’张三’ where id=3;#id为3的名字张三。
第三节:删除数据
语法:DELETE FROM table_name [WHERE ];
table_name指定要执行删除操作的表;“[WHERE ]”为可选参数,指定删除条件,如果没有WHERE子句,DELETE语句将删除表中的所有记录。
语法2:truncate table table_name;
Truncate 与delete相似都是删除数据,删除部分数据用delete,清空表用truncate。
truncate和delete的区别
1、事务:truncate是不可以rollback的,但是delete是可以rollback的;
原因:truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,可以rollback
2、效果:truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引
3、 truncate 不能触发任何Delete触发器。
4、delete 删除可以返回行数
第四节:约束
4.1 为什么要使用约束
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
--实体完整性 :例如,同一个表中,不能存在两条完全相同无法区分的记录
--域完整性 :例如:年龄范围0-120,性别范围“男/女”
--引用完整性 :例如:员工所在部门,在部门表中要能找到这个部门
--用户自定义完整性 :例如:用户名唯一、密码不能为空等
-- SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
#查询表中所有的约束。
4.2 非空约束
限定某个字段/某列的值不允许为空,关键词:NOT NULL。
语法:CREATE TABLE 表名称(
字段名 数据类型,
字段名 数据类型 NOT NULL,
字段名 数据类型 NOT NULL
);
alter table 表名称 modify 字段名 数据类型 not null;#建表后
alter table 表名称 modify 字段名 数据类型 NULL;#删除非空约束
注意:空字符串''不等于NULL,0也不等于NULL。
4.3 唯一性约束
用来限制某个字段/某列的值不能重复。关键字:UNIQUE。
-- 同一个表可以有多个唯一约束。
-- 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
-- 唯一性约束允许列值为空。
-- 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
-- MySQL会给唯一约束的列上默认创建一个唯一索引。
建表时:
create table 表名称(
字段名 数据类型,
字段名 数据类型 unique,
字段名 数据类型 unique key,
字段名 数据类型
);
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique key(字段名)
建表后:
#方式1:alter table 表名称 add unique key(字段列表);
#方式2:alter table 表名称 modify 字段名 字段类型 unique;
4.4 复合唯一约束
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
unique key(字段列表)
#字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的
);
4.5 删除唯一约束
-- 删除唯一约束只能通过删除唯一索引的方式删除。
-- 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
-- show index from 表名称; 查看表的索引
-- ALTER TABLE USER DROP INDEX uk_name_pwd;
4.6 主键约束
关键词:primary key,用来唯一标识表中的一行记录。(主键约束相当于唯一约束+非空约束不能重复也不可以为空)
添加主键:
create table temp(
id int primary key, #primary key 主键
name varchar(20)
);
复合主键举例:
create table student(
sid int,
cid int,
score int,
primary key(sid,cid) #复合主键 ,可以更多的字段
);
增加主键约束: ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);
#字段列表可以是一个字段,也可以是多个字段,如果是多 个字段的话,是复合主键
删除主键约束: alter table 表名称 drop primary key;
#不需要指定主键名称,一个表只有一个主键
4.7 自增列
关键词:AUTO_INCREMENT。
-- 一个表最多只能有一个自增长列
-- 自增长列约束的列必须是键列(主键列,唯一键列)
-- 自增约束的列的数据类型必须是整数类型
添加语法:
create table temp(
id int primary key AUTO_INCREMENT, #primary key 主键,AUTO_INCREMENT自增长,
name varchar(20)
);
修改自增长:
alter table 表名称 modify 字段名 数据类型 auto_increment;
删除自增长:
alter table 表名称 modify 字段名 数据类型; #去掉auto_increment相当于删除
4.8 外键约束(了解)
关键词:FOREIGN KEY,限定某个表的某个字段的引用完整性。主表(父表):被引用的表,被参考的表从表(子表):引用别人的表,参考别人的表。
举例:
create table user( #主表
userid int primary key,
...
...
);
create table info( #学生信息表
Id int primary key,
name varchar(255),
...
Userid int
foreign key (userid) references user(userid) #在从表中指定外键约束
);
说明:
(1)主表user必须先创建成功,然后才能创建info表(主键或唯一约束的列),指定外键成功。
(2)删除表时,先删除从表info,再删除主表user。
(3)从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。
已创建表,添加外键:
ALTER TABLE emp1 ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);
举例:ALTER TABLE info ADD [CONSTRAINT info_userid_fk] FOREIGN KEY(userid) REFERENCES info(userid);
删除外键:
alter table +表名 + drop foreign key +外键名字
外键总结:
-- 添加了外键约束后,主表的修改和删除数据受约束
-- 添加了外键约束后,从表的添加和修改数据受约束
-- 在从表上建立外键,要求主表必须存在
-- 删除主表时,要求从表从表先删除,或将从表中外键引用该主表的关系先删除
一:外键约束的限制
建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。
例如:在员工表中不可能添加一个员工信息,它的部门的值在部门表中找不到。
不建外键约束,你的操作(创建表、删除表、添加、修改、删除)不受限制,要保证数据的 引用完整性 ,只能依靠程序员的编程素养。
二:建外键成本高
在 MySQL 里,外键约束是有成本的,需要消耗系统资源。对于大并发的 SQL 操作,有可能会不适合。比如大型网站的中央数据库,可能会 因为外键约束的系统开销而变得非常慢 。
所以设计表可以不带外键约束,但逻辑层面需要保持一致。
三:阿里开发规范
阿里开发规范 【 强制 】不得使用外键与级联,一切外键概念必须在应用层解决。
说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于 单 机低并发 ,不适合 分布式 、 高并发集群 ;
级联更新是强阻塞,存在数据库 更新风暴 的风险;外键影响数据库的 插入速度 。
4.9 default约束
关键词:DEFAULT,给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
语法:
create table 表名称(
字段名 数据类型 primary key,
字段名 数据类型 unique key not null,
字段名 数据类型 unique key,
字段名 数据类型 not null default 默认值,
);
说明:默认值约束一般不在唯一键和主键列上加。
总结:*
1) 建表时需要加not null default,让值不会出现null。
2) Null 值比较特殊不好比较,碰到运算符,通常返回null。