频道栏目
首页 > 资讯 > MySQL > 正文

MySQL学习之数据完整性/外键/表之间的关系/数据库的设计/数据库的规范化/MySQL高级语句讲解

18-07-03        来源:[db:作者]  
收藏   我要投稿

1.数据的完整性

这里写图片描述

1.数据类型的约束
2.默认值的约束
3.非空的约束

(3)保证引用的完整性

外键: 从表的公共字段
外键约束用来保证引用的完整性, 主外键的名字可以不一样, 但是数据类型必须一样.

特点:
1.主表中不存在的记录, 从表中不能插入
2.从表中存在记录, 主表中不能先删除
3.必须先删除从表, 再删除主表

(1)创建外键

将E-R图转成表,自己玩.

如果表中没有适合的字段做主键怎么破

答:自己加一个就是喽

#用户和板块之间的关系
1.某个用户是摸个板块的版主
2.普通用在摸个板块中发表帖子或评论(你发表的帖子或评论属于某个板块)
#用户和帖子之间的关系
1.用户发表的帖子
2.你评论了某个帖子(间接关系)
#用户和评论(回帖)
1.用户发表了评论
2.用户发表的帖子被某某用户给评论
3.用户发表的评论被另一个用户评论了
#帖子和版块之间的关系
1.用户发表的帖子属于那个大版块
2.用户发表评论,评论的帖子属于某个大板块

4.数据的规范化

(1)第一范式

第一范式:确保每一列的数据原子化(不可在分割)

这里写图片描述

注意:地址到底可不可以再分, 那么需要看你有没有这个需求

(2)第二范式

第二范式:非主键字段必须依赖主键字段(一个表只描述一件事情)

这里写图片描述

第二范式是约束普通字段和主键字段

(3)第三范式

第三范式:在非主键字段中, 一个字段确认了, 其他字段也确认称为传递依赖

这里写图片描述

第三范式的约束是非主键之间的

5.数据库设计

需求分析:
假如某建筑公司要设计一个数据库.公司的业务规则如下:
1.公司承担多个工程项目,每一个项目要有:工程号,工程名称,施工人员.
2.公司有多名职工,每一名职工都有:职工号,姓名,性别,职务等
3.公司按照工时和小时工资率支付工资,小时的工资率由职务决定(例如,技术人员的小时工资率与工程师不同)

这里写图片描述

工程号 工程名称
0001 一带一路工程
0002 拯救日本沉没
职工号 姓名
   
001 张三
002 李四
职务 小时工资率
   
桥梁工程师 100
大陆架测量师 20000
工程号 职工号
   
0001 001
0002 002

6.规范化和性能的关系

学号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;

性能和规范我们优先选择性能.

7.查询语句

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);

(1)字段表达式

select 查询也可以用来做计算

select unix_timestamp(); --显示系统时间戳

select rand();--显示随机数

(2)from字句

from后面跟的是什么是数据源(也就是表)
数据源可以有多张表,返回的是笛卡尔积.

(3)dual表

dual表不是一个实实在在存在的表,它是为了保证select语句的完整性的.

(4)where字句

where子句在数据源进行筛选;

select * from stuinfo where sex=1;

(5)is null| is not null

- 筛选数据为空或不为空

select * from stumarks where ch is null or math is null;

(6)between| not between

筛选指定范围内的数据
select * from stumarks where ch between 75 and 100;
select * from stumarks where ch>=75 and ch<=100;

(7)运算符

a.算数运算符

+ - * / % ++ --

b.比较运算符

> < >= <=  (<> !=)不等于

c.逻辑运算符

and 与
or  或
not 非

(8)聚合函数

sum()  #求和
avg()  #求平均值
max()  #最大值
min()  #最小值
count() #统计 

(9)通配符

_  #匹配一个字符

%  #匹配所有

(10)模糊查询(like)

select * from stuinfo where sname like '_明';
select * from stuinfo where sname like '%佰%';

(11)分组查询 group by

将查询的结果分组显示,分组的目的在于方便统计.

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就会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们! 点这里解决。

(12)回溯统计(了解)

#在统计的基础上在统计一次
#group_concat()
select sid,group_concat(sname),sex,age,city from stuinfo group by sex,city with rollup;

(13)having条件

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; #正确

(14)order by排序[asc|desc]

用书数据排序的

select * from stuinfo order by age asc; #asc 可以不写 ,它是默认值
select * from stuinfo order by age desc;#降序排列

(15)limit(限制)

limit  起始位置,显示长度
select * from stuinfo limit 3; #第一个不写默认从1开始
select * from stuinfo limit 2,3;

(16)查询语句中的选项

all :和 * 是一个意思,表示查询所有的
distinct: 去除重复的数据

select all from stuinfo;
select distinct city from stuinfo;

(17)insert…select…

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;

(18)on duplicate key update

作用:在插入数据的时候,如果这个数据已经存在或不满足唯一约束的条件就执行更新;

insert into stuinfo values(2,'小月',2,18,'重庆') on duplicate key update sname='小月',sex=2;
相关TAG标签
上一篇:InnoDB下的多版本并行控制(MVCC)实例讲解
下一篇:windows系统下搭建wordpress的步骤教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站