MySQL 数据管理DML语言
1 外键(了解即可)
流程图描述:
MySQL代码测试:
(首先将数据库中表清空,随后输入以下操作,要严格按照语句输入,不然会报错)
方式一、在创建表的时候,增加约束(比较麻烦,也比较复杂)
-- 定义年级表:
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 定义学生表:
-- 学生表的gradeid字段需要引用年级表的gradeid
-- 1.定义外键KEY
-- 2.给这个外键添加约束(执行引用)
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`),
KEY `FK_gradeid`(`gradeid`), -- 定义外键
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`) -- 添加约束
)ENGINE=INNODB DEFAULT CHARSET=utf8
说明:上述代码核心是:
KEY `FK_gradeid`(`gradeid`), -- 定义外键
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`) -- 添加约束
运行成功后查看外键:
删除有外键关系的表的时候,必须先删除引用别人的表(从表),再删除被引用的表(主表)
方式二、创建普通的表成功后,添加外键约束
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);
-- ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 主表(被引用字段);
成功执行~
以上的操作都是物理外键,数据库级别的外键,不建议使用!(避免数据库过多造成困扰)
最佳实践:
- 数据库就是单纯的表,只用来存数据,只有行(数据)和列(数据)
- 如果想使用多张表的数据,使用外键(程序使用)
2 DML语言(全部记住)
数据库存在意义:数据存储和数据管理
DML语言:数据操作语言
- INSERT 插入
- UPDATE 修改
- DELETE 删除
2.1 添加(INSERT)
(说明:以下代码执行环境为两个表:grade+student,且无外键!)
代码测试:
-- 如果不写表的字段,插入语句就会一一匹配,所以写插入语句,必须保证数据与字段一一对应!
-- 向年级表中插入数据
INSERT INTO `grade`(`gradename`) VALUES('大一')
-- 插入多个字段
INSERT INTO `grade`(`gradename`)
VALUES('大二'),('大三'),('大四');
-- 向学生表中插入数据
INSERT INTO `student` (`name`,`pwd`,`gender`,`gradeid`) VALUES ('张三','aaaaaa','男',4);
-- 插入多个字段
INSERT INTO `student` (`name`,`pwd`,`gender`,`gradeid`)
VALUES ('王五','111111','男',3),('张三','aaaaaa','男',2),('李四','bbbbbb','男',1);
语法:INSERT INTO 表名([字段名1][字段2][字段3]...) VALUES('值1','值2','值3',...);
注意事项:
- 字段和字段之间必须使用 英文逗号 隔开
- 字段可以省略,但是后面的数值必须与字段一一对应
- 可以同时插入多条数据,VALUES后面的值需要使用
VALUES(),(),...
2.2 修改(UPDATE)
代码测试:
-- 修改学生姓名、邮箱
UPDATE `student` SET `name`='Demut',`email` = '123456@qq.com' WHERE id = 1;
-- 不指定条件的情况下,默认全部更改!
-- 注意:以下语句谨慎执行!
UPDATE `student` SET `name` = '长江七号';
运行结果:
语法:
UPDATE 表名 SET column_name = value,[column_name = value],... WHERE [条件]
条件:WHERE字句运算符 id等于/大于/某一区间
操作符返回布尔值。
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
>= | 大于等于 | 5>=6 | true |
<= | 小于等于 | 5<=6 | true |
BETWEEN … AND … | 闭区间 | [2, 5] | |
AND | 我和你&& | 5>1 AND 1<2 | false |
OR | 我或你|| | 5>1 OR 1<2 | true |
-- 通过多个条件定位数据
UPDATE `student` SET `name`='长江七号' WHERE `name` = '张三' AND `gender` = '男';
注意:
- column_name 是数据库的列,尽量带上``
- 条件:筛选的条件,如果没有指定,则会修改所有的列
- value,是一个具体的值,也可以是一个变量
- 多个设置的属性之间使用英文逗号隔开
2.3 删除(DELETE)
DELETE命令
语法:DELETE FROM 表名 [WHERE 条件]
-- 删除指定数据数据
DELETE FROM `student` WHERE id=2;
-- 删除数据 (注意,以下代码谨慎执行,会全部删掉!)
DELETE FROM `student`
运行结果:
TRUNCATE 命令~删库跑路
作用:完全清空一个数据库表,表的结构和索引约束不会变!
-- 清空student表
TRUNCATE `student`
DELETE的TRUNCATE区别:
-
相同点:都能删除数据,都不会删除表结构
-
不同点:
- TRUNCATE 重新设置自增列,计数器会归零
- TRUNCATE 不会影响事务
-
以下代码可自行测试:
-- 测试DELETE和TRUNCATE区别 CREATE TABLE `test`( `id` INT(4) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `test`(`name`) VALUES('1'),('2'),('3') DELETE FROM `test` -- 不会影响自增 TRUNCATE TABLE `test` -- 自增会归零
补充说明:DELETE删除的问题
,重启数据库,现象
- InnoDB 自增列会从1开始(存在内存中,断电即失)
- MyISAM 继续从上一个自增量开始(存在文件中,不会丢失)
写在最后
Instead, speaking the truth in love, we will grow to become in every respect the mature body of him who is the head, that is, Christ. (Ephesians 4:15)
To Demut!