高级查询:
多表联查:
多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询。
笛卡尔积:相乘
内联:
多张表公共的部分
方式1: select * from 表1,表2 where 表1.主键=表2.外键
方式2:
select * from 表1 inner join 表2 on 表1.XXX=表2.XXX
外联:
左外联:
select * from 表1 left join 表2 on 表1.XXX=表2.XXX
右外联:
select * from 表1 right join 表2 on 表1.XXX=表2.XXX
UNION :
查询两张表的并集 连接查询 或 并集查询
查询时,的字段个数必须相等
语法:
select A.field1 as f1, A.field2 as f2 from A union (select B.field3 as f1, field4 as f2 from B) order by 字段 desc/asc
注意: 1列名不一致时,会以第一张表的表头为准,并对其栏目。 2会将重复的行过滤掉。 3如果查询的表的列数量不相等时,会报错。 4在每个子句中的排序是没有意义的,mysql在进行合并的时候会忽略掉。 5如果子句中的排序和limit进行结合是有意义的。 6可以对合并后的整表进行排序。
注意:如果不去重复 用 UNION ALL
子查询:
1.where子查询又叫内部查询
eg:查询每个班下id 最大的学生(where子查询)
SELECT stu WHERE stuid IN ( SELECT MAX(stuid) FROM student GROUP BY classno ) id,stuname, classno FROM student
2 from型子查询:
把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。 临时表要使用一个别名。
3 exists型子查询: 把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。
4 any, some, all子查询:
(1) any 子查询 表示满足其中任意一个条件 假设any内部的查询语句返回的结果个数是三个, 如:result1,result2,result3,那么, select ...from ... where a > any(...); ->相当于: select ...from ... where a > result1 or a > result2 or a > result3; some 是 any的别名,所以用法是一样的,可以替代使用 子查询
(2)all 子查询 表示满足其中所有条件条件,ALL关键字与any关键字类似,只不过上面的or改成and。 假设any内部的查询语句返回的结果个数是三个, select ...from ... where a > all(...); -> select ...from ... where a > result1 and a > result2 and a > result3
case when then end语句
Case具有两种格式。
简单Case函数和Case搜索函数。