目录
[1. 多表查询](#1. 多表查询)
[1.1 内连接](#1.1 内连接)
[1.2 左外连接,右外连接](#1.2 左外连接,右外连接)
[1.3 外键约束](#1.3 外键约束)
[2. 子查询](#2. 子查询)
[3. 开窗函数](#3. 开窗函数)
1. 多表查询
制作测试数据
sql
drop table if exists tb_class ;
create table tb_class(
class_id int primary key,
class_name varchar(20)
)engine=innodb default charset=utf8;
drop table if exists tb_students;
create table tb_students(
id int primary key,
student_name varchar(20),
class_id int,
age int
)engine=innodb default charset=utf8;
insert into tb_class values (1,"1班"),(2,"2班"),(3,"3班"),(4,"4班"),(5,"5班");
insert into tb_students values (1, "小明", 1, 18),(2, "小刚", 6, 17),(3, "小红", 3, 22);
1.1 内连接
表A inner join 表B on 关联条件
查询两个表中符合条件的共有记录
sql
select
student_name,
class_name
from tb_class c
inner join tb_students s
on c.class_id = s.class_id ;
或:
python
select
student_name,
class_name
from tb_class c
inner join tb_students s
where c.class_id = s.class_id ;
1.2 左外连接,右外连接
左外连接查询(语法左边数据表就是主表):查询结果会保留主表中的所有数据,然后去右边中进行匹配,如果有与之匹配结果就显示,如果没有与其匹配的结果,则右表关联字段都为null
右外连接同理
sql
select
student_name,
class_name
from tb_class c
left join tb_students s
on c.class_id = s.class_id ;
1.3 外键约束
先建立外键约束 => 才能插入数据
添加外键约束语法:
alter table 表名 add foreign key(外键) references 表名(主键) on DELETE cascade on UPDATE cascade;
这样一来主键中的数据修改删除,所关联的外键也随之修改删除
通过show create table 表名;可以查看外键约束名,并可以通过alter table 表名 drop foreign key 外键约束名;来删除外键。
事务、外键都只能使用InnoDB引擎,否则无法使用事务与外键功能。
2. 子查询
在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询。
主查询和子查询的关系:
-
子查询是嵌入到主查询中
-
子查询是辅助主查询的,要么充当条件,要么充当数据源(数据表)
-
子查询是可以独立存在的语句,是一条完整的 select 语句
需求:查询年龄大于平均年龄的所有学生:
sql
select * from tb_student where age > (select avg(age) from tb_student);
需求:查询年龄最小的学生:
sql
select * from tb_students where age = (select min(age) from tb_students);
3. 开窗函数
聚合函数执行完毕后,只返回一个汇总的数据结果。如果想保留所有字段以及所有记录,我们可以使用窗口函数来实现数据查询与分析工作。
语法:
select
*,
开窗函数() over(partition by 分组字段 order by 排序字段),
...
from 表名;
partition by :相当于分组group by
- rank()排名函数:有并列且排名序号不连续
- dense_rank()函数:有并列且序号连续
- row_number()函数:不并列且永远都是连续的