sql语句的⼦查询
⼦查询⼜叫嵌套查询,总结⼀下⼦查询的各种操作和处理,以便于记忆和熟练的运⽤。
概念:什么是⼦查询?
⼦查询就是将⼀个查询语句嵌套在另⼀个查询语句中,内层语句的查询结果,可以作为外层查询语句的条件,本⽂重点讲解的是放在where 或者having关键词之后的情况,当然不仅限这种情形。
⼦查询分为⼀下三种情况(这⾥只总结运⽤较多的三种)
⼀、列⼦查询(多⾏⼦查询,即⼦查询的结果集是多⾏单列),位置放在where和having之后。
包含⼀下⼏种常见的情形:
1、使⽤【not】in 的⼦查询
2、使⽤⽐较运算符的⼦查询(=、> 、 >=、 <=、 <>、 !=、 <=>)
3、使⽤[not] exists 的⼦查询
4、使⽤any some 或者 all 的⼦查询,具体如右图:
操作浮含义
IN/NOT IN等于列表中的任意⼀个
ANY|SOME和⼦查询返回的某⼀个值⽐较
ALL和⼦查询返回的所有值⽐较
运算符 |关键字any some all
> >=最⼩值最⼩值最⼤值
< <=最⼤值最⼤值最⼩值
=任意值任意值
<> !=任意值
(仅⽰例)
select id ,username from student where score >=any(select level from scholarship);⼤于等于任意⼀个,即取最⼩值
select id ,username from student where score >=some(select level from scholarship)同上
select id ,username from student where score >=all(select level from scholarship)⼤于等于所有的,就是⼤于等于⾥⾯最⼤的那个
其他情况参考这个⽰例
⼆、标量⼦查询
标量⼦查询的⼦结果集是单⾏单列,并且⼦查询条件⼀般放在where或者having的后⾯,要注意放在()内,且不加“;”。
举例说明⼀下:
select * from employees
where salary >(
select salary from employees where
last_name='Abel'
);
select department_id ,min(salary) from employees
group by department_id
having min(salary) >(
select min(salay)
from employees where department_id =50
);
三、⾏⼦查询(结果集是⼀⾏多列或者多⾏多列,⽤法较少,不做推荐)
举例说明:
select * from employees
where (employee_id ,salary )=(
select min(employee_id),max(salary)
from employees
);
当然⽤之前的⽅法也是可以解决的:
select * from empioyees
sql语句查询不包含where employee_id=(
select min(employee_id) from employees
)
and
salary=(
select max(salary) from employees
)
;
当然⼦查询还有⼀些其他的⽤法,⽐如下⾯的在创建表格时的运⽤。
将查询结果写⼊到数据表格中
insert table [column_name,.......] select column_name,....... from table;
创建数据表的同时将查询结果写⼊到数据表中
create table if not exists table_name [create_definition,......] select_statement
ps:这⾥需要注意的是,新建表格的字段要与查询的字段保持⼀致,才可以按照对应的字段⽣成数据,如果不⼀致,会在原来的基础上⽣成新的字段。
create table test2 (id tinyint unsigned auto_increment key ,num tinyint unsigned ) select id ,level from scholarship ;
+------+----+-------+
| num | id | level |
+------+----+-------+
| NULL | 1 | 90 |
| NULL | 2 | 80 |
| NULL | 3 | 70 |
+------+----+-------+
这样就多出了⼀个level字段或者说num字段没有⽤上,如果我们把num字段改成level就能⽣成合适的表格内容了。
+----+-------+
| id | level |
+----+-------+
| 1 | 90 |
| 2 | 80 |
| 3 | 70 |
+----+-------+
另外还有⼀些⼦查询语句是放在select下⾯的,举⼀个例⼦说明⼀下:
select d.*,(
select count(*)
from employees e
where e.department=d.department
)
from departments d;
select (
select department_name from departments d
join employees e
on d.department_id =e.department_id
) from departments d;
还有⼀部分是放在from后⾯的,⼀般from后⾯跟着的是表格,这⾥相当于把⼦查询的结果集当成是表格来处理,不再做⽰例了,有兴趣的可以百度⼀下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论