前言
随着互联网的消沉和内卷,供远大于求的市场现状,面试的要求也是越来越离谱,简单的增删改查已经不满足公司的日益膨胀的选拔标准,所以做个笔记,方便经常复习。
一、关联查询
当需要两张及以上的表格进行数据查询时,就需要建立两个表格某些字段的关联关系(如果不建立这种关联,那么一个表的每一条字段都会与另外表格的所有字段进行组合,产生笛卡尔积,一些没用的查询记录)
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、单行子查询
单行比较操作符
子查询的结果始终只有一行
#查询大于平均年龄的学生信息
SELECT * FROM students
WHERE age > (SELECT AVG(age) FROM students);
4、多行子查询
多行比较操作符
多行子查询,就是子查询的结果有多个
#从学生表中查询所有课程编号对应的课程名字
SELECT course_name FROM classes
WHERE id IN(SELECT cid FROM students);
如有不足,欢迎补充 ~