1.数据类型的约束 2.默认值的约束 3.非空的约束
外键: 从表的公共字段 外键约束用来保证引用的完整性, 主外键的名字可以不一样, 但是数据类型必须一样. 特点: 1.主表中不存在的记录, 从表中不能插入 2.从表中存在记录, 主表中不能先删除 3.必须先删除从表, 再删除主表
将E-R图转成表,自己玩. 如果表中没有适合的字段做主键怎么破 答:自己加一个就是喽 #用户和板块之间的关系 1.某个用户是摸个板块的版主 2.普通用在摸个板块中发表帖子或评论(你发表的帖子或评论属于某个板块) #用户和帖子之间的关系 1.用户发表的帖子 2.你评论了某个帖子(间接关系) #用户和评论(回帖) 1.用户发表了评论 2.用户发表的帖子被某某用户给评论 3.用户发表的评论被另一个用户评论了 #帖子和版块之间的关系 1.用户发表的帖子属于那个大版块 2.用户发表评论,评论的帖子属于某个大板块
注意:地址到底可不可以再分, 那么需要看你有没有这个需求
第二范式是约束普通字段和主键字段
第三范式的约束是非主键之间的
需求分析: 假如某建筑公司要设计一个数据库.公司的业务规则如下: 1.公司承担多个工程项目,每一个项目要有:工程号,工程名称,施工人员. 2.公司有多名职工,每一名职工都有:职工号,姓名,性别,职务等 3.公司按照工时和小时工资率支付工资,小时的工资率由职务决定(例如,技术人员的小时工资率与工程师不同)
工程号 | 工程名称 |
---|---|
0001 | 一带一路工程 |
0002 | 拯救日本沉没 |
职工号 | 姓名 |
001 | 张三 |
002 | 李四 |
职务 | 小时工资率 |
桥梁工程师 | 100 |
大陆架测量师 | 20000 |
工程号 | 职工号 |
0001 | 001 |
0002 | 002 |
学号stu | 姓名 | 语文成绩 | 数学成绩 | 总分 |
---|---|---|---|---|
1 | 小明 | 100 | 120 | 220 |
语文和数学成绩确定了,总分就确定了,我在把总分作为一个表.
学号 | 姓名 |
---|---|
1 | 小明 |
学号 | 语文 | 数学 |
---|---|---|
1 | 100 | 120 |
select *,sum(yuwen+mathh) from student left join student1 on student.id=student1.id where student.id=1; # :注意此类查询必须分组后,或者限定条件后查询 # 或者如下: select student.id,student.name,student1.yuwen+student1.mathh as '总分' from student join student1 on student.id=student1.id;
性能和规范我们优先选择性能.
select 字段(结果集) from 表名(数据源) [where 条件] [group by 分组][having 条件][order by 排序 asc|desc][limit限制 s,n]
create table stuinfo( sid int auto_increment primary key comment'学号(主键)', sname varchar(255) comment'学生名字', sex enum('男','女') comment'性别', age tinyint comment'年龄', city varchar(64) comment'地级市' )engine=innodb; create table stumarks( stuno int primary key comment'学号(主键)', ch tinyint comment'语文成绩', math tinyint comment'数学成绩' )engine=innodb; insert into stuinfo values(null,'大恒',2,18,'宿州'),(null,'小京',1,20,'北京'),(null,'小强',1,22,'北京'),(null,'小力',1,20,'天津'),(null,'小丽',2,21,'重庆'),(null,'小芳',2,20,'天津'); insert into stumarks values(1,88,99),(2,89,100),(3,67,76),(4,50,59),(5,100,99),(6,96,91);
select 查询也可以用来做计算 select unix_timestamp(); --显示系统时间戳 select rand();--显示随机数
from后面跟的是什么是数据源(也就是表) 数据源可以有多张表,返回的是笛卡尔积.
dual表不是一个实实在在存在的表,它是为了保证select语句的完整性的.
where子句在数据源进行筛选; select * from stuinfo where sex=1;
- 筛选数据为空或不为空 select * from stumarks where ch is null or math is null;
筛选指定范围内的数据 select * from stumarks where ch between 75 and 100; select * from stumarks where ch>=75 and ch<=100;
+ - * / % ++ --
> < >= <= (<> !=)不等于
and 与 or 或 not 非
sum() #求和 avg() #求平均值 max() #最大值 min() #最小值 count() #统计
_ #匹配一个字符 % #匹配所有
select * from stuinfo where sname like '_明'; select * from stuinfo where sname like '%佰%';
将查询的结果分组显示,分组的目的在于方便统计. select sid,group_concat(sname),sex,age,city from stuinfo group by city; #每个结果只显示一个 select stuno,ch,math,(ch+math) as score from stumarks group by score; #group_concat()可以将同一组的字段连接在一起 mysql> select sid,group_concat(sname),sex,age,city from stuinfo group by city; +-----+---------------------+------+------+------+ | sid | group_concat(sname) | sex | age | city | +-----+---------------------+------+------+------+ | 1 | 小明 | | 18 | 上海 | | 2 | 小刚,小强 | | 20 | 北京 | | 4 | 尹佰力,小芳 | | 20 | 天津 | | 5 | 小丽 | | 21 | 重庆 | +-----+---------------------+------+------+------+ 4 rows in set (0.00 sec) #安数字分组,会按照升序排列 select * from stuinfo group by age; #多列分组 select sid,group_concat(sname),sex,age,city from stuinfo group by sex,city;
MySQL 5.7.5和up实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们! 点这里解决。
#在统计的基础上在统计一次 #group_concat() select sid,group_concat(sname),sex,age,city from stuinfo group by sex,city with rollup;
where:设置查询的条件,字段必须是存在的 having: 设置查询的条件,条件字段必须在结果集中; #having 的查询效率要高于where select * from stuinfo where age>20; #正确 select * from stuinfo having age>20; #正确 select sname from stuinfo where age>20; #正确 select sname from stuinfo having age>20; #错误,原因age不在结果集中(没有查询age这个字段) select sname,age from stuinfo having age>20; #正确
用书数据排序的 select * from stuinfo order by age asc; #asc 可以不写 ,它是默认值 select * from stuinfo order by age desc;#降序排列
limit 起始位置,显示长度 select * from stuinfo limit 3; #第一个不写默认从1开始 select * from stuinfo limit 2,3;
all :和 * 是一个意思,表示查询所有的 distinct: 去除重复的数据 select all from stuinfo; select distinct city from stuinfo;
CREATE TABLE `stuinfoo` ( `sid` int(11) NOT NULL AUTO_INCREMENT , `sname` varchar(255) DEFAULT NULL, `sex` enum('男','女') DEFAULT NULL , `age` tinyint(4) DEFAULT NULL , `city` varchar(64) DEFAULT NULL , PRIMARY KEY (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4; #选择一个表中的数据插入到另一个表中(两个表结构要一致) insert into stuinfoo select * from stuinfo;
作用:在插入数据的时候,如果这个数据已经存在或不满足唯一约束的条件就执行更新; insert into stuinfo values(2,'小月',2,18,'重庆') on duplicate key update sname='小月',sex=2;