select嵌套⼦查询,AS⽤法
1.嵌套查询(⼦查询)
嵌套查询:⼀个内层查询语句(select-from-where)块可以嵌套在另外⼀个外层查询块的where⼦句中,其中外层查询也称为⽗查询,主查询。内层查询也称⼦查询,从查询。⼦查询⼀般不使⽤order by⼦句,只能对最终查询结果进⾏排序。
另⼀种定义:在⼀个SELECT 语句的WHERE ⼦句或HAVING ⼦句中嵌套另⼀个SELECT 语句的查询称为嵌套查询,⼜称⼦查询。
嵌套查询的⼯作⽅式是:先处理内查询,由内向外处理,外层查询利⽤内层查询的结果嵌套查询不仅仅可以⽤于⽗查询select语句使⽤。还可以⽤于insert、update、delete语句或其他⼦查询中。
⼀、⼦查询的组成
1、包含标准选择列表组件的标准select查询。
2、包含⼀个或多个表或者视图名称的标准from⼦句。
3、可选的where⼦句。
4、可选的group by⼦句。
5、可选的having⼦句。
⼆、⼦查询的语法规则
1、⼦查询的select查询总是使⽤圆括号括起来。
2、不能包括compute或for.browse⼦句。
3、如果同时指定top⼦句,则可能只包括order by⼦句。
4、⼦查询最多可以嵌套到32层。个别查询可能会不⽀持32层嵌套。
5、任何可以使⽤表达式的地⽅都可以使⽤⼦查询,只要它返回的是单个值。
6、如果某个表只出现在⼦查询中⼆不出现在外部查询中,那么该表的列就⽆法包含在输出中。
三、返回⼀个值的⼦查询
当⼦查询的返回值只有⼀个时,可以使⽤⽐较运算符如=、<、>、>=、<=、!=等将富查询和⼦查询连接起来。实例如下:
3.1 简单⼦查询
select name,age
from person
where age > ( select age  from person  where name = '张三')
3.2 like嵌套查询
查询姓“张”的⽼师的个数
select count(distinct(Tname))
from Teacher
where Tname like '张%';
四、返回⼀组值的⼦查询
如果⼦查询的返回值不⽌⼀个,⽽是⼀个集合时,则不能直接使⽤⽐较运算符,可以在⽐较运算符和⼦查询之间插⼊ANY、SOME或ALL。其中等值关系可以⽤IN操作符。
4.1 in嵌套查询
in关键字⽤于where⼦句中⽤来判断查询的表达式是否在多个值的列表中。返回满⾜in列表中的满⾜条件的记录。
select name
from person
where countryid in ( select countryid
from country
where countryname = '中国');
4.2 some嵌套查询
some在sql中的逻辑运算符号,如果在⼀系列⽐较中,有些值为True,那么结果就为True。some的语法是:
  <;表达式>{ =|<>|!=|>|>=|!>|<|<=|!<}some(⼦查询) 
⽤等号和以下查询到的值⽐较,如果与其中⼀个相等,就返回
select name from person
where countryid = some ( select countryid from country   
where countryname = '中国');
4.3 all嵌套查询
all是sql中的逻辑运算符好,如果⼀系列的⽐较都为true,那么结果才能为true。
 <;表达式> { =|<>|!=|>|>=|!>|<|<=|!<} all(⼦查询)
当countryid⼤于以下返回的所有id,此结果才为True,此结果才返回
select name from person
where countryid > all ( select countryid from country 
where countryname = '中国');
4.4 exists嵌套查询
exists是sql中的逻辑运算符号。如果⼦查询有结果集返回,那么就为True。exists代表“存在”的意义,它只查满⾜条件的那些记录。⼀旦到第⼀个匹配的记录后,就马上停⽌查。
exists ⼦查询       
   其中⼦查询是⼀个⾸先的select语句,不允许有compute⼦句和into关键字。
   exists 的意思是,⼦查询是否有结果集返回。
SELECT * FROM Person
WHERE exists ( SELECT 1);
--SELECT 0 SELECT NULL 返回结果都⼀样,因为这三个⼦查询都有结果集返回,因此总是True,SELECT * FROM Person照常执⾏   
但是如果⼦查询中因为加了条件⽽没有结果集返回,则主语句就不执⾏了:
SELECT * FROM Person
WHERE exists ( SELECT * FROM Person
WHERE Person_Id = 100);  --如果不存在Person_Id的记录,则⼦查询没有结果集返回,主语句不执⾏
五、返回新数据表的⼦查询
5.1 查询“001”课程⽐“002”课程成绩⾼的所有学⽣的学号;
Select a.Sno from (select Sno,score from SC where Sno='001') a,
(select Sno,scorefrom SC where Cno='002') b
Where a.score>b.score and a.Sno=b.Sno;
2.AS使⽤
(1)查询服务Top10,  没有"as A"时报错
SELECT A.SERVICE
FROM (SELECT SERVICE_NAME AS SERVICE, COUNT(CODE) CODE_COUNT
select distinct from
FROM log_detail
GROUP BY SERVICE_NAME
ORDER BY CODE DESC LIMIT 0,10) as A
#正确写法
(2)不能把别名当作字段
SELECT userName AS a,  userAddress AS b FROM TestTableWHEREalike'%am%'
该语句执⾏是会报错,因为别名只是对字段的⼀种引⽤,不能当作字段⼀样使⽤,如果真要把别名当字段⼀样使⽤,可以如下变通:
SELECT a, b FROM(
SELECT userName AS a,  userAddress AS b FROM TestTable
) AS tempTable WHERE a like '%dd%'
该处要给内嵌的select查询指定⼀个别名,否则会报错
(3)as可以作为连接语句的操作符
先获取到tablename表中的所有记录,之后创建⼀张tablename表,结构和tablename2表相同,记录为后⾯语句的查询结果。create table tablename as select * from tablename2

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。