MySQL3_外键及查询
文章目录
- MySQL_外键及查询
- 1.数据的完整性
- (1).保证实体的完整
- (2).保证域的完整性
- (3).引用的完整性
- (4).自定义完整性
- 2.外键
- 3.实体之间的关系
- (1).一对一:主键关系
- (2)一对多|多对一
- (3)多对多
- 4.数据库的设计
- 5.数据的规范
- (1)第一范式
- (2)第二范式
- (3)第三范式
- 6.规范化和性能
- 7.查询语句
- 语句位置顺序
- (1)字段表达式
- (2)from子句
- (3)dual(肚哦)表
- (4)where子句
- (5)运算符
- (6)聚合函数
- (7)通配符
- (8)模糊查询
- 8.分组查询
- 9.回溯统计
- 10.having(条件)
- 11.order by
- 12.limit
- 13.插入语句的其它用法
MySQL_外键及查询
1.数据的完整性
1.实体的完整性,一条记录,就是一个实体,如果记录无法区分,则失去了实体的完整性
2.域完整性:如果有两个字段无法区分,则失去了域完整性
3.引用的完整性:两个表的对应记录不完整,则失去了引用完整性
4.自定义完整性:自己定义的一套规则
(1).保证实体的完整
1.主键的约束(primary key)
2.自动增长的列(auto_increment)
3.唯一键(unique)
(2).保证域的完整性
1.数据类型的约束
2.默认值(default)
3.非空约束(not null)
(3).引用的完整性
应用外键(foreign key)
(4).自定义完整性
1.存储过程(相当于python中的自定义函数)
2.触发器
2.外键
外键:从表的公共字段
外键的约束主要是用来保证引用的完整性的,主外键的名字可以不一样,但是数据类型可以一样.
#特点
1.主表中不存在的记录,从表中不能插入
2.从表已存在的记录,主表中不能删除
3.先删除从表,再删除主表
#学生表
create table stuinfo(id int primary key auto_increment,name char(32) not null
);insert into stuinfo set name='孙正';
insert into stuinfo(name) values('周鹏'),('李');
insert into stuinfo set name='李嘉';#成绩表#foreign key(本表的外键) references 主表(关联字段)#foreign key(stuno) references stuinfo(id)#cascade 联动操作
create table score(nid int primary key auto_increment,stuno int ,ch float,math float#foreign key(stuno) references stuinfo(id) on delete cascade on update cascade
);insert into score values(null,1,100,100),(null,2,100,100),(null,3,100,100),(null,4,100,100);#两种串联的操作:
1.set null: 让一个字段设置为NUll
2.cascade : 跟着主表的变化而变化#添加外键
alter table score add foreign key(stuno) references stuinfo(id) on delete cascade on update cascade;
#添加外键,并指定外键的名称
alter table score add CONSTRAINT `stuno` FOREIGN KEY (`stuno`) REFERENCES `stuinfo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;#删除外键
#score_ibfk_1 外键的名字,外键可以有多个
alter table score drop foreign key score_ibfk_1;#外键只能在innodb的引擎上使用
3.实体之间的关系
实体的关系:
1.一对一
2.一对多
3.多对一
4.多对多
(1).一对一:主键关系
stuinfo
stuno(学号) | name(姓名) |
---|---|
1 | 王健林 |
2 | 许家印 |
stuno(期末考试) | score |
---|---|
1 | 100 |
2 | 120 |
(2)一对多|多对一
user
uid | account | pwd | |
---|---|---|---|
1 | admin | 123456 | 123@qq.com |
2 | root | 123456 | 126@126.com |
order(订单)
oid(订单的编号) | uid | gid | create_at |
---|---|---|---|
201904037000001 | 1 | 7000 | 2019/04/03 |
201904047000001 | 1 | 7000 | 2019/04/04 |
(3)多对多
user
uid | account | pwd | |
---|---|---|---|
1 | admin | 123456 | 123@qq.com |
2 | root | 123456 | 126@126.com |
address
address | uid | mobile | name |
---|---|---|---|
上海徐汇区1208弄A小区3栋1608 | 1 | 13555555555 | 马云 |
上海徐汇区1208弄A小区3栋1608 | 1 | 13666666666 | 雷军 |
上海徐汇区1208弄B小区3栋1608 | 1 | 13777777777 | 吴军 |
上海徐汇区1208弄B小区3栋1608 | 1 | 13888888888 | 李斌 |
上海徐汇区1208弄A小区3栋1608 | 2 | 13555555555 | 马云 |
上海徐汇区1208弄A小区3栋1608 | 2 | 13666666666 | 雷军 |
4.数据库的设计
公司要做一个项目,首先项目管理获得需求,知道项目是什么类型的,然后产品经理负责产品的规划,设计原型UI将需求的草图给UI,UI可以绘制E-R图,或者是DB自己构建E-R图DB自己根据E-R图设计数据库,建立表,设定关联度.码农看到E-R图可以干嘛,我们根据E-R图上的需求写代码
- E-R图
E-R图是描述实体和实体之间的关系的语法:
1.矩形代表实体
2.椭圆形代表实体拥有的属性
3.菱形代表实体之间的关系
博客的E-R图:
#用户和板块之间的关系
1.某个用户是版主,版主管理板块
2.普通用户和版块之间没有直接的关系,用户发帖或者用户评论间接的和版块之间形成关系#用户和帖子之间的关系
1.用户发表了帖子
2.用户评论了某个帖子#用户和评论之间的关系
1.用户发表了评论
2.用户发表了帖子,被其他人评论了
3.如果有二级评论,你的评论被人喷了#帖子和版块之间的关系
帖子属于版块
5.数据的规范
(1)第一范式
第一范式:确保每一列原子化(不可分割)
(2)第二范式
第二范式:,基于第一范式,一张表只能描述一件事情,非主键字段必须依赖主键字段(不论在什么情况下主键都是唯一的)
(3)第三范式
第三范式:基于第二范式,消除传递依赖(一个主键字段可以确定其它的信息)
6.规范化和性能
高考成绩查询系统:高并发
不符合三范式
stuno(考号) | 姓名 | 语文 | 数学 | 总分 |
---|---|---|---|---|
1 | 小明 | 130 | 120 | 250 |
select * from gaokao where stuno=1;
规范化:
stuno(考号) | 姓名 |
---|---|
1 | 小明 |
2 | 小强 |
stuno(考号) | 语文 | 数学 |
---|---|---|
1 | 130 | 120 |
select *,ch+math as score from A left join B on A.stuno = B.stuno where A.stuno = 1;
总结:性能的完备良好的时候,选择规范化;性能不足,优先考虑性能
7.查询语句
所有的查询都依赖统计分析:
语句位置顺序
select 字段(结果集) from 表名(数据源)
[where 条件]
[group by 分组]
[having 条件]
[order by 排序 asc|desc]
[limit 限制 m,n];
create table stuinfo(sid int primary key auto_increment comment'学号(主键)',sname varchar(32) not null comment'姓名',sex enum('男','女','不详') default '不详',age tinyint unsigned not null comment'年龄',city varchar(64) comment'地级市'
);create table score(stuno int not null comment'学号',python float,java float
);insert into stuinfo values(null,'挺正',1,18,'重庆'),(null,'李野',1,60,'北京'),(null,'劲宇',1,81,'深圳'),(null,'杨幂',1,18,'重庆'),(null,'赵薇',1,20,'北京'),(null,'迪丽热巴',1,18,'深圳');insert into score values(1,88,99),(2,78,100),(3,30,60),(4,100,99),(5,70,69),(6,100,0);
(1)字段表达式
select 既可以做查询,也可以做输出select now(); #显示当前时间
select rand(); #随机数
select unix_timestamp(); # 显示Unix时间戳
(2)from子句
from 后面是数据源
数据源可以写多个,返回的是一个笛卡尔积
select * from A,B,C;
(3)dual(肚哦)表
dual是一个语法,是一个关键字dual表示为了保证select完整性的select now() from dual;
(4)where子句
where是做条件查询,只返回结果为True的数据select * from stuinfo where age <50;
- is null | is not null
where条件使用的比较运算符select * from score where java is null;
select * from score where java is not null; #返回不为空的所有结果
- between | not between
#between是where一个查询方式
#查询某一个范围
select * from stuinfo where age between 18 and 20;select * from stuinfo where age>=18 and age<=20;
(5)运算符
- 算术运算符
+ - * / % ++ --
- 比较运算符
= > < >= <= != <>
- 逻辑运算符
and 与
or 或
not 非
(6)聚合函数
max() #最大值
min() #最小值
sum() #求和
avg() #平均值
count() #计数#聚合函数使用在结果集上
(7)通配符
_ #一次只匹配一个字符
% #一次匹配任意数量的字符#在模糊查询的时候使用
(8)模糊查询
关键字:like
#like写在where后面select * from stuinfo where sname like '_丽__';select * from stuinfo where sname like '%丽%';
8.分组查询
将查询的结果分类显示,为了方便统计
group by,如果有where要放在where的后面select * from stuinfo group by sex;#mysql57默认不支持group by
#修改配置文件
#vim /etc/my.cnf#sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONselect count(sid) from stuinfo group by sex;#在group将需要的结果拼接
select group_concat(sid) from stuinfo group by sex;#添加where语句
select group_concat(sid) from stuinfo where age>20 group by sex ;
9.回溯统计
在统计的基础上,在做一次统计
with rollup
添加在group by之后select count(sid) from stuinfo group by sex with rollup;
10.having(条件)
select * from stuinfo where age>=20;
select * from stuinfo having age>=20;select sid from stuinfo where age>=20;
select sid from stuinfo having age>=20; #错误select * from stuinfo where age>=20 having city='北京';
select * from stuinfo where age>=20 and city='北京';select * from stuinfo having sum(age>=20);
select * from stuinfo where max(age); #错误select * from stuinfo group by sex where age >=20; #错误的
select * from stuinfo group by age having age >=20; where:条件的查询,where后面不能加上聚合函数,只能写在.数据源的后面
having:条件查询,having条件字段必须要在结果集中,having可以写在group by的后面
11.order by
order by 写在 groupby后面 ,如果有having也要写在having的后面
#主要作用是排序
#拍讯分为升序asc 降序desc,默认asc(可以不写)select * from stuinfo order by age;
select * from stuinfo order by age desc;
12.limit
#主要作用,限制数据的显示数量,limit位置放在最后select * from stuinfo limit 3; #显示前三行#从索引为0开始,向后取3行
select * from stuinfo limit 0,3;
#从索引为3的开始,向后取3条
select * from stuinfo limit 3,3;select * from stuinfo where city='北京' order by age desc limit 3; #distinct去除相同的字段值
#我们需要查询数据表中一共有哪些那些地方的人注册了
select distinct city from stuinfo;
select city from stuinfo group by city;
13.插入语句的其它用法
#拷贝数据
insert....select.....
#复制表
create table stuinfo1 like stuinfo;insert into stuinfo1 select * from stuinfo;#插入重复值
on duplicate key update....#如果主键已经存在,则不能覆盖
insert into stuinfo values(1,'tom',1,18,'大阪');#如果不存在直接插入,如果存在则更新
insert into stuinfo values(7,'tom',1,18,'大阪') on duplicate key update sname='tom',city='大阪';
MySQL3_外键及查询相关推荐
- postgreSQL外键引用查询 查询外键被那些表占用
根据一个表名,查询所有外键引用它的表,以及那些外键的列名 key_column_usage(系统列信息表), pg_constraint(系统所有约束表) SELECT x.table_name,x. ...
- mysql外键约束查询语句_MySQL数据库 : 查询语句,连接查询及外键约束
查询指定字段 select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行) select distinct 字段1,字段2.. ...
- mysql外键关联查询_MySQL外键约束和多表联查
一.创建外键 #测试数据表 # 教师表,主表 CREATE TABLE teacher( id INT PRIMARY KEY AUTO_INCREMENT, name varchar(20), ag ...
- oracle 外键子查询,外键、联合查询、子查询
1.外键: 增加外键 创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段) 在新增表之后增加外键:修改表结构,使用alter ta ...
- Mysql外键与查询关键字
今日内容概要 1 > 自增特性 2 > 约束条件之外键 2.1 > 外键简介 2.2 > 外键关系 2.2.1 > 一对多 2.2.2 > 多对多 2.2.3 &g ...
- MySQL无法创建外键、查询外键的属性
MySQL存储引擎--MyISAM与InnoDB区别 - 上善若水,水善利万物而不争. - CSDN博客 http://blog.csdn.net/xifeijian/article/details ...
- 如何在oracle中查询所有用户表的表名、主键名称、索引、外键等
使用select * from user_tables 可以查询出所有的用户表. 查所有用户的表在all_tables 主键名称.外键在all_constraints 索引在all_i ...
- sqlalchemy外键和relationship查询
前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:"学 ...
- 如何在oracle中查询所有用户表的表名、主键名称、索引、外键等 - Oracle 基础和管理_files...
1.查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_indexes i where t.ind ...
- 怎么查看oracle数据库表的主键,Oracle中查看所有的表,用户表,列名,主键,外键...
在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...
最新文章
- 干货丨不确定性原理——人工智能的哲学基础
- 专业音频如何把电平转换成dbu_这是我见过最细致的音频系统增益设置指南,跟着学起来!...
- python类型转换异常捕捉_Java中的异常
- LeetCode 232. 用栈实现队列(双栈法-队列)
- CodeSmith实用技巧(九):重载Render方法来控制输出
- 小米11系列备货量多,得益于骁龙888首发独占期
- Oracle/MySQL decimal/int/number 转字符串
- python 邮箱验证_在Django中进行用户注册和邮箱验证的方法
- 贪心算法三个经典例题
- 【附源码】计算机毕业设计SSM小区宠物管理系统
- 项目管理常用文档表格模板一
- 史上最全正则表达式语法,文末附常用表达式!
- 吴文俊应用计算机进行几何定理的证明,吴文俊先生的吴方法怎么用?如何用吴方法证明几何定理?...
- python lime_本地可解释模型不可知的解释– LIME in Python
- 怎么画学计算机的男孩形象,怎么一步一步教大班幼儿画自己的画像:小男孩简笔画(步骤图解)...
- java.sql.SQLSyntaxErrorException: Table ‘H_PERSION‘ doesn‘t exist
- 不明觉厉!用了近10年,才有人读懂这篇论文
- 4.0 第三十三章 XML
- 微信小程序进度条组件自定义数字_微信小程序之圆形进度条(自定义组件)
- linux平台的字典,Linux系统中安装CLI的字典sdcv