前言

随着互联网的消沉和内卷,供远大于求的市场现状,面试的要求也是越来越离谱,简单的增删改查已经不满足公司的日益膨胀的选拔标准,所以做个笔记,方便经常复习。


一、关联查询

当需要两张及以上的表格进行数据查询时,就需要建立两个表格某些字段的关联关系(如果不建立这种关联,那么一个表的每一条字段都会与另外表格的所有字段进行组合,产生笛卡尔积,一些没用的查询记录)

1、等值连接

通过一个表的字段等于另外一个表的字段建立关联关系,用等号连接,进行查询的过程

select * from 表1,表2 [where 过滤条件];

select name  from emp a , user b where  a.empno=b.userno;

2、非等值连接

也就是不用等号进行字段关联,而使用其他符号如:<=,>,>=, BETWEEN、IN, NOT

# 查询所有员工的lsalary和level

SELECT e.name, e.salary, e.level  FROM employees e,job j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;


3、内连接
合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

关键字[inner] join on, 其中 inner可省略,查询效果同等值连接

select * from 表1 inner join 表2 [on 过滤条件][where 过滤条件]

select * from 表1 join 表2 [on 过滤条件][where 过滤条件];

select name  inner join  emp a , user b on  a.empno=b.userno;

3、外连接

既返回满足关联条件的数据,也返回不满足条件的,就是外连接

外连接需要区分主表和从表,因为查询只显示主表所有数据以及从表符合关联条件的数据,从表的不符合条件的数据显示为空

左(外)连接:查询出左表中的所有数据和右表中的关联数据

右(外)连接:查询出右表中的所有数据和左表中的关联数据

左外连接: 表A left [outer] join 表B on 关联条件。 表A是驱动表,表B是从表 右外连接 表A right [outer] join 表B on 关联条件 表B是驱动表,表A是从表 全外连接: 两张表的数据不管满不满足条件,都做显示。 表A full [outer] join 表B on 关联条件 PS:mysql 不支持全外连接

4、自连接
使用自己的表连接自己的表。

数据的来源是同一个表,这样的表内的多个字段要存有关系。我们要使用表别名来虚拟出两个表

from emp a join emp b on a.name=b.empno;

二、子查询

有时候需要通过多次查询,也就是嵌套查询,把一条查询语句当作另外一条语句的条件进行查询,就要使用子查询,外层语句又被称为父查询或者主查询。

(1)子查询要包含在括号内
(2)将子查询放在比较条件的右侧
(3)单行操作符对应单行子查询,多行操作符对应多行子查询

其中子查询语句可以在 :

1)子查询可以在where子句中
2)子查询可以在from子句中
3)子查询可以在having子句中
4)子查询可以在select字句中,相当于外连接的另外一种写法。

子查询分类

按内层查询与外层查询是否有关联分为:  关联子查询、非关联子查询

按内查询的结果返回一条还是多条记录分为:单行子查询、多行子查询

1、非关联查询

子查询的结果只执行一次,且作为外部主查询的条件进行查询

SELECT * 
FROM purchase_info 
WHERE purchase_quantity > (SELECT AVG(purchase_quantity) 
                           FROM purchase_info);



#子查询SELECT AVG(purchase_quantity) FROM purchase_info结果唯一,就可以比较大小

2、关联查询

子查询的结果被执行多次,每次由外到内进行查询,如此循环的方式

SELECT * 
FROM purchase_info 
WHERE purchase_quantity > (SELECT AVG(purchase_quantity) 
                           FROM purchase_info 
                           GROUP BY category);


#根据类别计算的平均数有好几个,所以需要指定比较的具体对象,指定字段


SELECT * 
FROM purchase_info AS a 
WHERE purchase_quantity > (SELECT AVG(purchase_quantity) 
                           FROM purchase_info AS b 
                           WHERE a.category = b.category 
                           GROUP BY category);


#将a.category = b.category进行关联,只比较相同类别

3、单行子查询

单行比较操作符

MySQL自关联表查询并排序 mysql 关联查询 子查询 过程_子查询

子查询的结果始终只有一行

#查询大于平均年龄的学生信息

SELECT *  FROM students 
WHERE age > (SELECT AVG(age) FROM students);

4、多行子查询

多行比较操作符

MySQL自关联表查询并排序 mysql 关联查询 子查询 过程_子查询_02

多行子查询,就是子查询的结果有多个

#从学生表中查询所有课程编号对应的课程名字

SELECT course_name  FROM classes 
WHERE id IN(SELECT cid FROM students);


如有不足,欢迎补充 ~