标签:mysql
多表查询:
实现多表查询是要实现表连接:
交叉连接:(笛卡尔乘积)
例子:select * from student,courses;
自然连接:(内连接)
自然连接例子:
select * from students,course where student,courses where student.cid1=courses.cid;
表的别名:
select s.name,c.cname from student as s,course as c where s.cid1=c.cid
外连接:(左外连接、右外连接)
左外连接:。。。。。left join。。。。。on。。。。
左外连接例子:select s.name,c.cname from student as s left join courses as c on s.cid1=c.cid;查看student表中学习课程的人,如果有没有选学课程的人显示null
右外连接:。。。。。right join。。。。on。。。。
右外连接例子:select s.name,c.cname from student as s right join courses as c on s.cid1=c.cid; 查看courses表中课程被某人学习的显示所学的人,没有的就显示null。
注意:在使用外连接的时候在指定条件,不再使用where而是使用on来指定条件。
自连接:
自连接的例子:select s.name as stu,c.name as teacher from students as s,student as c where s.sid=c.tid;
子查询:
例子:查找所有同学中年龄大于平均年龄的同学:
select name from student where age > (select avg(age) from students); 在子查询中子查询只能是单值。
(2)在IN中使用子查询:
例子:显示老师年龄和学生年龄一样的同学:
select name from student where age in(select age from tutors);
(3)以查询结果为表再次查询:
显示查询出的表中年龄大于等于20的人:
例子:select name,age from (select name,age from student)as t where t.age>=20;
把两个查询的结果集合起来:
(select name,age from student) union (select tname,age from tutors) ;
联合查询:union
练习:挑选出courses表中没有被students中的cid2学习的课程的课程名称:
mysql> select CID,Cname from courses where CID not in( select distinct CID2 from students where CID2 is not null);
挑选出没有教授任何课程的老师:
mysql>select TID,Tname from tutors where TID NOT IN(SELECT Tid from courses);
挑出students表中CID1有两个或两个以上 同学学习了的同一门课程的课程名称:
msyql> select CID,Cname from courses where CID IN(select CID1 from students group by CID1 HAVING COUNT(CID1)>=2);
显示每一位老师及其所教授的课程;没有老师教授的课程的保持为null:
mysql> select b.Tname, a.Cname from tutors as b left join courses as a on a.TID=b.TID;
显示每一位老师及其所教授的课程,没有老师教授的课程将其老师显示为空:
mysql> select b.Tname, a.Cname from tutors as b right join courses as a on a.TID=b.TID;
显示每位同学CID1课程的课程名及其讲授了相关课程的老师的名称:
mysql> select name,Cname,Tname from students,courses,tutors where students.CID1=courses.CID AND courses.TID=tutors.TID;
视图:
视图就是存储下来的select语句;
基于基表的查询结果。
创建视图:create view
帮助:help create view
创建视图例子:create view sct as (select name,Cname,Tname from students,courses,tutors where students.CID1=courses.CID AND courses.TID=tutors.TID);
show tables 可以看到视图也被当做表展现出来了。
注意:一般情况下是不允许往视图中插入数据的。
show table status\G 查看表的状态可以区分出视图和基表的区别。
删除视图:drop view view_name
删除视图的帮助命令:help drop view
查看视图是怎么创建出来的命令
show create view view_name
show create view view_name\G
物化视图:就是因为我们创建的视图是一次select查询结果,所以当select语句查询的结果非常大的时候,在对视图进行二次查询,就会造成服务器缓存消耗非常的大。所以我们可以把这样的视图给保存下来这样来减少缓存的消耗。这样的好处是把查询的结果直接保存下来下次不用select语句了。坏处在于当基表更新了怎么办。 因此对于那些不是经常更新且数据量很大的表建议使用物化视图,对于那些更新比较快的不建议使用物化视图。 mysql不支持物化视图!
注意:查看表示怎么创建的(也就是创建的语句)命令: show create table tb_name
本文出自 “wangconggao” 博客,请务必保留此出处http://wangconggao.blog.51cto.com/3253868/1579684
标签:mysql
原文地址:http://wangconggao.blog.51cto.com/3253868/1579684