码迷,mamicode.com
首页 > 数据库 > 详细

mysql多表查询

时间:2014-11-19 18:56:58      阅读:249      评论:0      收藏:0      [点我收藏+]

标签: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多表查询

标签:mysql

原文地址:http://wangconggao.blog.51cto.com/3253868/1579684

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!