MySQL进阶--字段约束,表的设计关系,连接查询,高级查询,子查询
一:字段约束
主键约束:primary key
针对主键,提供了一种自增长机制,关键字是 auto_increment
整合是:primary key auto_increment
非空约束:not null
唯一约束:unique
默认约束:default
标准语法-----gender varchar(5) default "男",
如果想要选取默认值,可以忽略此字段的赋值,或者为该字段赋值为null
如果想要改变默认约束字段的值,就手动赋值,进行覆盖
外键约束:foreign key
标准语法(比如学生表关联老师表)---
(声明一个字段,去连接另一张表的主键,此字段和需要连接的表的主键字段一致)
tid int,
(外键约束设置)
/*
*foreign key(tid) 当前表中的tid字段作为了外键
*references 关联,参照
*teacher(tid) 当前表中的外键关联的是teacher表中的tid字段
*/
foreign key(tid) references teacher(tid)
外键的特点:
a.外键必须关联另一张表的主键
b.外键的值必须要有对应值
c.外键的值可以为空
d.一张表可以由多个外键
e.一般外键的名称与关联主键的名称一致
二:表的设计关系
表关系有三种:一对一 ,一对多,多对多
(表关系的设计必须使用到外键)
一对一关系的设计方式:
两张表 A B,分别添加主键,选取任意一张表,设置外键关联另一张表的主键,而且作为外键的是当前这张表的主键:主键连主键
一对多关系的设计方式:
一方的表称为主表,多方的表称为从表,在从表中设置一个外键,去关联主表的主键。(就比如学生和教师表,在学生表中设置外键 一个老师可以对应多个学生,所以多方的表是学生,称为从表)
多对多关系的设计方式:
两张表A,B,分别添加主键,此时创建一张中间表C,在C中设置两个外键,分别关联A B表的主键。借助中间表C,可以实现A B的多对多关系。
三:连接查询
内连接总结
- 内连接中,前后表书写的顺序不会影响结果集中的数据,先写哪个表都可以!
- 以后推荐使用显式内连接!
inner join单词的意思就是内连接,所以sql的语义更强,可读性更强
on后面书写连接条件、where后面书写筛选条件,条件的分类更加明确
显式出现的时间要比隐式晚,所以选用先进的、较新的语法
3. 内连接只能获取到多表去除错误数据(连接条件的作用)后的公共数据,也就是取交集!!!
外连接总结
- 外连接可以依附于某一张表进行查询,该表中的数据都可以获取,如果不满足连接条件,另一张表中的数据全部补null
- 外连接因为表的位置不一样,会影响sql语句的执行语义,会改变依附的查询表,所以前后的顺序不能发生改变,与内连接完全不一样
- 左外与右外其实本质上是一致的!把关键字left join换成right join,再将表的位置一调换,结果没有区别!
四:高级查询
1-分页查询:
1:关键字:limit
a. limit 参数:参数代表获取的数据量,默认从第一条开始获取
select * from 表名 limit 7;
b. limit 参数1,参数2 : 参数1代表获取数据的开始位置,索引(索引是从0开始的)
参数2代表获取的数据量
select * from 表名 limit 3,4;
2:分页解决的问题:
a.解决了服务器擦讯数据的压力
b.解决了页面显示数据的压力
2-排序:
语法:order by 字段 排序规则
排序规则有两种:升序 asc 降序desc 默认是asc
如果存在多个排序条件,使用逗号隔开
3-分组:
1:分组查询的关键字:group by 字段名
2:什么时候需要用到分组查询:
当需求中出现了关键字 每个 每组时,此时就需要按照每个,每组后面的字段进行分组,获取数据
3:分组查询的原理:
先对数据进行分组,再对分组的数据使用聚合函数进行汇总。分组查询与聚合函数的使用是密不可分的。
4.案例代码
5:where和having的区别
a.having在分组后才能使用,where在分组前使用
b.where是从原始表中寻找条件,having是在分组后的临时表中寻找条件
c.where关键字出现在group by 之前,having出现在group by 之后
d.如果条件中有聚合函数作为运算内容,那么只能出现在having中,不能写在where中(具体参考最后一个案例代码)
4-聚合函数:
能够获取到单一的数据
max(字段) 求最大值
min(字段) 求最小值
sum(字段) 求和
avg(字段) 求平均数
count(字段) 获取该字段下非空值的个数
5-查询语句的关键字书写顺序是怎样的?
select
字段列表
from
表名
where 分组前的条件
group by 分组字段
having 分组后的条件
order by 排序
limit 分页
五:子查询
查询语句中又有另外一个查询语句,一个查询语句的结果作为了另一个查询语句的条件,这种称为子查询
一个查询语句的返回结果集的表现形式有几种?
单行单列----单一数据:聚合函数的查询
多行多列-----select * from student;
单行多列-----select * from student where tid =1;
单列多行-----select tname from student;