子查询
MySQL中的子查询(Subquery)是嵌套在其他SQL查询中的查询。子查询可以出现在SELECT、FROM或WHERE子句中,并用于返回将被用于外部查询的数据。子查询的结果可以是一个单一的值、一行、一列或多行多列的数据集。
单行单列查询
实例
#查询比齐雷老师工资高的有哪些
SELECT name FROM teacher WHERE salary>(SELECT salary FROM teacher WHERE name='齐雷');
//注意需要写(查询语句) 查询齐雷工资的就是子查询
注意子查询需要用()括起来
聚合函数 查询结果集只有一个值
实例
#查询哪些老师工资高于平均水平
SELECT name,salary FROM teacher WHREE salary> (SELECT AVG(salary) FROM teacher );
多行单列查询
子查询的查询的结果集有多个值
进行等值判断是要配合: IN 或 NOT IN 使用
如果 进行关系的计算
ANY 用于在查询中筛选符合特定条件的任意一个数据
ALL 它通常用于指定某个操作应适用于所有相关的行或值。
>ANY 即只要大于多行数据任意一个就行 (>最小值)
<ANY 即只要小于多行数据任意一个就行 (<最大值)
>ALL 即必须全部大于所有值 (>最大值)
<ALL 即必须全部小于所有值(<最小值)
实例
#查看与'祝雷'和李费水同班的同学有哪些
# 这边是符合其中之一就行 ANY
SELECT name,age,gender,class_id FROM student WHERE class_id IN (SELECT class_id FROM student WHERE name IN ('祝雷','李费水'))
#查看比教科目2和教科目4老师工资都高的老师都有谁
多行单子列进行关系运算
SELECT name,salary FROM teacher WHERE salary>ALL(SELECT MAX(salary) FROM teacher WHERE subject_id IN(2,4));
更改数据
#将同李伟老师的科目的老师工资加500
UPDATE teacher SET salary=salary+500 WHERE subject_id=(SELECT subject_id FROM teacher WHERE name='李伟');
#将李伟的工资改成和李建明一样
UPDATE teacher SET salary =(SELECT salary FROM teacher WHERE name='李建明') WHERE name ='李伟';
删除数据
#删除同李明老师教同一科目的所有老师
DELETE FROM teacher WHERE subject_id =(SELECT subject_id FROM teacher WHERE name='李明')
联表查询
联表查询在关系型数据库中非常常见,用于从多个表中检索相关数据
内连接
在SQL中, JOIN关键字默认执行的是内连接。内连接返回两个表中满足连接条件的记录。如果不明确指定连接类型, JOIN 就相当于 INNER JOIN。
SELECT
-- 选择要显示的列,可以是来自一个表的列,也可以是两个表通过JOIN操作关联后的列
table1.column1,
table1.column2,
table2.columnA,
table2.columnB
FROM
-- 第一个表名
table1
INNER JOIN
-- 第二个表名
table2
ON
-- 指定JOIN条件,即两个表中用于匹配的列
table1.matching_column = table2.matching_column
WHERE
-- 可选的WHERE子句,用于进一步过滤结果
some_condition;
实例
#查询教语文老师的名字(这边teacher表有老师姓名和subject表要科目名称)
SELECT teacher.name,subject.name FROM teacher JOIN subject ON teacher.subject_id = subject.id WHERE subject.name='语文';
SELECT teacher.name,subject.name FROM subject JOIN teacher ON subject.id = teacher.subject_id WHERE subject.name='语文';
注意如果两个表中都要字段需要加对应的表名
否则 会报字段名模糊