三、1 外键(了解)
方式一,在创建表的时候,增加约束,(麻烦,比较复杂)
-- 年级表(主表)
CREATE TABLE IF NOT EXISTS`grade`(
`gradeid` INT (10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR (50) NOT NULL COMMENT'年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 1、学生表的gradeid字段 要去引用年级表的gradeid
-- 2、定义外键key
-- 3、给这个外键添加约束(执行引用) references 引用
-- 学生表(从表)
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 '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' 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`),-- 当前的key(student表的gradeid)绑定引用的key(grade表的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`)
-- 当前的key(student表的gradeid)绑定引用的key(grade表的gradeid字段)
注:
删除有外键关系的表时,必须要先删除表中有引用别人的表(从表,代码中为student表),再删除被引用的表(主表,代码中为grade表)。
方式二、创建表成功后,添加外键约束
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
-- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列)REFERENCES 引用表(具体字段)
以上操作都是物理外键,数据库级别的外键,一般不建议使用(避免数据库过多,造成困扰,了解即可)
==最佳实践==
·数据库就是单纯的表,只用来存放数据,只有行(数据)和列(字段)
·我们想使用多张表的数据,或者想使用外键(程序去实现)
三、2 DML语言(全部记住)
数据库意义:数据存储,数据管理
DML语言:数据操作语言
·insert(添加,插入)
·updata(更新,修改)
·delete(删除)
三、3 添加(insert)
-- 插入语句(添加)
-- INSERT INTO 表名([字段名1,字段2,字段3])valuse('值1'),('值2'),('值3'),...
INSERT INTO `grade`(`gradename`)VALUES('大三'),('大二')
grade为表名 gradename为字段名VALUES 后面接需要添加的值(大三) , (大二)其中用英文逗号隔开
-- 由于主键自增可以省略主键(如果不写表的字段名,就会一一匹配,所有值必须对应写出)
eg:
INSERT INTO `grade`VALUES(4,'高三'),(5,'高二')
-- 一般写插入语句,一定要数据和字段一一对应!
-- 插入多个字段
INSERT INTO `grade`(`gradename`)VALUES('大三'),('大二')
语法:insert into 表名 ([字段1,字段2,字段三])values('值1'),('值2'),('值3'),..
注意事项:
1、字段和字段之间使用英文逗号隔开
2、字段是可以省略的,但是后面的值必须要一一对应,不能少
3、可以同时插入多条数据库,VALUES后面的值,需要使用英文逗号隔开即可
VALUES(),()...
三、4 修改(update)
update 修改谁(条件) set 原来的值 = 新值
-- 修改学员名字,带有条件的
UPDATE `student` SET `name`='小强' WHERE id = 8
UPDATE `student` SET `pwd`='890' WHERE NAME = '小强'
-- 修改id为8的name为小强
-- 修改学院名,不带条件,默认把所有的name都改为修改后的名字
UPDATE `student` SET `name`='aqiang'
-- 修改多个属性,逗号隔开(英文逗号)
UPDATE `student` SET `name`='小强',`sex`='男',`email`='123@qq.com' WHERE id=8
语法:
UPDATE 表名 SET column_name(列明) = value(新值),[column_name(列明) = value(新值)],column_name(列明) = value(新值)... where [条件]
条件:where子句 运算符 id等于某个值,大于某个值,在某个区间内修改
操作符 | 含义 | 范围 | 结果 |
= | 等于 | 指定位置 (eg: id=8) | id = 8的位置修改 |
<>或!= | 不等于 | 除指定位置 (eg: id!=8) | id不等于8的位置修改 |
> | 大于 | 大于指定的位置 (eg: id>8) | id大于8的位置修改 |
< | 小于 | 小于指定的位置 (eg: id<8) | id小于8的位置修改 |
<= | 小于等于 | 大于等于指定的位置 (eg: id<=8) | id小于等于8的位置修改 |
>= | 大于等于 | 小于等于指定的位置 (eg: id>=8) | id大于等于8的位置修改 |
between...and.. | 在某个范围之间 | 在某两个指定位置之间 (eg: id between 2 and 5) | id在2~5之间的位置修改 |
and | 和 | 两个不同的指定位置同时成立 (eg: `sex`='男' and `name`='小强') | sex为男且name为小强的位置修改 |
or | 或 | 两个不同的指定位置满足一个 (eg: `sex`='男' or `name`='小强') | sex为男或name为小强的位置修改 |
注意:
·column_name(列名)是数据库的列,尽量带上 ` `
·条件,筛选的条件,如果没有指定,则会修改所有的列
·value,可以是一个具体的值,也可以是一个变量
·多个设置的属性之间,使用英文逗号隔开
三、5 删除(delete和truncate)
delete语法:
(也可以删除表,但不会归零自增)
delete from 表名 [where 条件] (删除其中一项)
delete from 表名(删除表)
DELETE FROM `student` WHERE id = 1
truncate语法:
作用是完全清空一张数据库表,表的结构和索引约束不会变。
(归零自增)
TRUNCATE TABLE 表名
delete和truncate的区别
相同点:都能删除数据,都不会删除表结构
不同点:·truncate 重新设置自增列,计数器归零
·truncate 不会影响事物
(了解)delete删除问题,重启数据库时,会出现的现象
·InnoDB 自增列会从1开始(存在内存中,断电即失)
·MyISAM 继续从上一个自增量开始(存在文件中的,不会丢失)