1. 子查询
子查询:允许把一个查询嵌套在另一个查询当中的查询。子查询先从内部查询开始,在到外部查询,依次从里到位的顺序对代码可读性和可理解性较好,但性能比较差。
select max(score) from score where subject_id=(select id from subject where subject='语文');
//80
2. 联结查询
联结是一种机制,用来在一条SELECT语句中关联表,可以联结多个表返回一组输出。
MySQL可以联结多个表,但是联结处理有可能非常耗费资源,因此不要联结不必要的表,联结的表越多,性能下降越厉害。
1.内联结
又叫等值联结,基于两个表之间的相等测试,查询结果是左右连接的交集。
语法:
SELECT * FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.column = t2.column;
select score as 数学 from score
inner join subject on score.subject_id=subject.id
inner join student on score.student_id=student.id
where student.name='张三' AND subject.subject='数学';//70
2.外联结
1) 左外联结
以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数
语法:
SELECT * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.column = t2.column;
例:
SELECT * FROM student LEFT JOIN score ON student.id = score.student_id;
2) 右外联结
以右表为准,去左表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=右表原数据数
语法:
SELECT * FROM table1 AS t1 RIGHT JOIN table2 AS t2 ON t1.column = t2.column;
例:
SELECT * FROM score RIGHT JOIN student ON student.id = score.student_id;
3) 交叉联结
从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积。
语法:
SELECT * FROM table1 AS t1 CROSS JOIN table2 AS t2;
4) 自联结
有时需要在同一张表中进行联结条件的匹配或字段比较,可以使用自联结。
语法:
SELECT * FROM table t1, table t2 WHERE t1.column1=t2.column2;
例:
SELECT * FROM student CROSS JOIN score;
3. 组合查询
执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询。
语法:
SELECT * FROM table1 WHERE condition
UNION
SELECT * FROM table2 WHERE condition;
UNION中的每个查询必须包含相同的列、表达式或聚集函数;UNION默认从查询结果集中自动去除重复的行,如果 想返回所有匹配行,可使用UNION ALL;用UNION查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT之后。
- 有两种基本情况,其中需要使用组合查询:
在单个查询中,从不同表中返回类似结构的数据。
*对单个表执行多个查询,按照单个查询返回数据。
例:
select avg(score) from score where subject_id=(select id from subject where subject='语文')
union
select avg(score) from score ;
//70
//67.625