第四章 高级查询(二)
(1)通过在子查询中使用EXISTS子句,可以对子查询中的行是否存在进行检查。子查询可以出现在表达式出现的如何位置
(2)子查询语句可以嵌套在SQL语句中任何表达式出现的位置。
一、EXISTS子查询
1.使用EXISTS语句判断该数据库对象是否存在:
DROP TABLE IF EXISTS temp;
2. EXISTS作为WHERE语句的子查询:
SELECT .....FROM 表名 WHERE EXISTS(子查询);
3. EXISTS关键字后面的参数是一个任意的子查询,如果该子查询有返回行。则EXISTS子查询的结果为true,此时再执行外层查询语句。如果子查询有没返回行。则EXISTS子查询的结果为false,此时不再执行外层查询语句。
二、NOT EXISTS子查询
EXISTS和IN一样,同样允许添加NOT关键字实现取返操作,NOT EXISTS表示不存在。
三、子查询注意事项
1)子查询可以嵌套在SQL语句中任何表达式出现的位置
在SELECTE语句中,子查询可以被嵌套在SELECT语句的列、表和查询条件中,即SELECT子句、FROM子句、WHERE子句、GROUP BY子句和HAVING子句。
2)只出现在子查询中而没有出现在父查询中的的表不能包含在输出列中
多层嵌套子查询的最终数据集只包含父查询的SELECT子句中出现的字段,而子查询的输出结果通常会作为其外层子查询数据源或用于数据判断匹配
高级查询:
一:多表连接
1.select Info.Code,Info.Name,Nation.Name from Info,Nation where Info.Nation = Nation.Code 查几张表就就输出几张表,查那个条件就输出那个条件 列的查询
select * from Info,Nation 全部输出4x4
2.join连接
select * from Info join Nation on Info.Nation = Nation.Code 筛选输出数据
二:多表联合
select * from Info where Code='p001'union select * from Info where Nation='n001' union 联合 行的查询
三:子查询(无关子查询)
select * from Info where Nation = (select Code from Nation where Name='汉族') 两个查询 一个查询的结果当做另一个查询的条件 查一个 =
select * from Info where Nation in (select Code from Nation where Name='汉族' or Name='苗族')
in(在里面)not in (在不里面)任意一个都可以 作为两个查询结果的链接 查两个in
四:子查询(相关子查询)
select * from Car a where a.Oil <(select avg(Oil) from Car b where b.Brand = a.Brand)
把外子查询定义一个a 里面的表定义成b 外层表看油耗 里层求油耗的平均值(每一个数据都走一遍)