一.外键
1.创建被关联表(主表)
create table dep(
id int primary key auto_increment,
name varchar(20) not null,
descripe char(40) not null
);
create table test(
id int primary key auto_increment,
name varchar(20) not null,
descripe char(40) not null
);
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
age int not null,
dep_id int,
test_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
on delete cascade
on update cascade,
constraint fk_dep foreign key(test_id) references test(id)
on delete cascade
on update cascade
);
2.外键的变种
- 一对多或多对一(两表(1主表1从表))
- 多对多(三表(2主表1从表))
-一对一(两表(1主表1从表))
3.单表查询
重点中的重点:关键字的执行优先级
from
where 选择
group by 分组
having 过滤
select 查询
distinct 去重
order by 按……排序 desc:倒序 asc:正序
limit a,b 分页(a起始位置,b显示个数)
执行顺序:
1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数
①where子句中可以使用
1.比较运算符:>、=、<=、<>、!=
2.between 80 and 100 :值在80到100之间
3.in(80,90,100)值是10或20或30
4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
②group by
1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
3、为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数
小窍门:‘每’这个字后面的字段,就是我们分组的依据
4、大前提:
可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
先sql_mode='ONLY_FULL_GROUP_BY'
select A.c from (select post,max(salary)as c from employee group by post) as A;
使用分组,将查询出来的表名设为A,然后查询表A
分组之后只能查询分组的字段,如果想查询组内的其它字段的信息,必须要借助聚合函数
例:
max()
min()
avg()
sum()
count()
查询岗位名以及岗位包含的所有员工名字
select post,group_concat(name) from employee group by post;
例子:
select post,avg(salary) from employee group by post having avg(salary) > 10000;
select post,group_concat(name),count(1)
from employee
group by post having count(1)< 2;
select post,avg(salary) as A from employee group by post having A > 10000 order by A desc;
select * from employee order by age asc,id desc;
③聚合函数
max()求最大值
min()求最小值
avg()求平均值
sum() 求和
count() 求总个数
④HAVING过滤
HAVING与WHERE不一样的地方在于
!!!执行优先级从高到低:where > group by > having
1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
⑤limit 限制查询的记录数:
示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #默认初始位置为0
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条