您的位置:首页 > 数据库 > MySQL

mysql_高级查询

2017-09-16 10:22 260 查看

1、嵌套子查询和相关子查询

子查询:
1、一个询语句中还包含其他查询。其中包含其他查询的查询叫父查询,被包含的查询叫子查询。
2、子查询也可以和UPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句 。
3、子查询中可以再包含子查询,即允许多层嵌套。
select * from student  where age>(select age from student where stuname='张宏');
嵌套子查询:非相关子查询。
1、使用比较运算符的子查询
###注意:将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个(单值)
select * from student  where age>(select age from student where stuname='张宏');
2、使用[not]  in 子查询   范围子查询。当子查询返回多值时,使用这种方式
select * from  student  where  student  where  stuid in (select stuid  from grade where  courseid=1);
3、any all 子查询
#查询其他系中比信息系任意一个学生入学成绩低的学生信息
select stuname,ingrade from student where class<>'信息系' and   ingrade< any (select max(ingrade) from student where class='信息系');
#查询其他系中比信息系所有学生数学成绩低的学生信息
select stuname,ingrade from student where class<>'信息系' and  ingrade< all (select min(ingrade) from student where class='信息系');
关联子查询:exists存在性查询


2、通过在子查询中使用EXISTS子句,可以对子查询中的行是否存在进行检查

###使用关联字查询  EXISTS ,会对外层用loop逐条查询,每次查询都睡去查看对应的exists语句。
* 非关联子查询中子查询只会执行一次返回结果集
* 关联子查询存在性判断exists中子查询会重复执行,外层查询有多少条记录,内层子查询就要执行多少次,判断存在性。
select stuname from student where exists(select 1);


3、多表联接查询

1、内联接

select s.stuid, s.stuname,g.courseid,g.grade,c.coursename
from student s,grade g,course c
where s.stuid = g.stuid and c.courseid=g.courseid and g.grade>=90
order by g.grade,g.courseid limit 5,5;


2、外联接

select s.stuid, s.stuname,g.courseid,g.grade
from student s left join grade g
on s.stuid = g.stuid where g.grade>90;


3、自联接

select e1.empno,e1.mgr,e2.ename from emp e1, emp e2
where e1.mgr = e2.empno;


4、交叉联接:笛卡尔积

select * from student,grade;


5、使用表的别名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql