`
名白毅
  • 浏览: 5757 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多表查询、左右链接等

阅读更多
   前阵子由于工作需要简单复习了下SQL,现在把之前写的总结发到这里。很基础的东西,出现错误欢迎指正。
一, 表结构:
create table USER_ID
(
 ID number(10),
 name varchar2(255),
 age number(3),
 telephone number(11),
 birthday varchar2(8)
);

create table school
(
  school_id number(10),
  name varchar2(255),
  address varchar2(255),
  level1 number(1),
  is_985 varchar2(1),
  createdate date
);

create table student
(
  ID number(10),
  student_id number(10),
  school_id number(10),
  enter_date date
);

create table course
(
 school_id number(10),
 course_id number(10),
 course_name varchar2(255),
 teacher varchar2(255)
);

create table grade_core
(
 school_id number(10),
 course_id number(10),
 student_id number(10),
 grade_core number(10),
 term varchar2(10)
)

二, 题目及sql:
1、 要求输出:学生号,学生名,年龄,课程名称,分数,学期;
Select student.student_id,User_id.Name,user_id.age,course.course_name,grade_core.grade_core,grade_core.term
from User_Id,student,grade_core,course
where User_Id.id=student.id
    and student.student_id=grade_core.student_id
    and grade_core.course_id=course.course_id
and course.school_id=student.school_id

其中:grade_core.student_id不是唯一的,所以加上了最后一个and

左链接:
select us.ID,g.STUDENT_ID,us.NAME,us.age,g.COURSE_NAME,g.GRADE_CORE,g.TERM
from grade_core g

left join COURSE c
on g.COURSE_ID=c.COURSE_ID

left join student st
on st.STUDENT_ID=g.STUDENT_ID
and st.SCHOOL_ID=g.SCHOOL_ID

left join user_id us
on st.ID=us.ID


2求liming第一学期的平均成绩,
   select avg(grade_core.grade_core) 
               from user_id,student,grade_core
               where user_id.id=student.id
               and student.school_id=grade_core.school_id
               and grade_core.term=1
               and user_id.name='liming'

    left:select avg(g.grade_core)
       from grade_core g 
       left join student stu
       on stu.student_id=g.student_id
       left join user_id us
       on us.id=stu.id
       where g.term=1
       and us.name='liming'
       

3求清华所有的学生数
       select count(student.id)
       from student,school
       where school.name='清华'
       and student.school_id=school.school_id

4、求每个人每个学期的平均成绩
select avg(g.grade_core)
        from grade_core g,student s,user_id u
        group by g.student_id,g.term


左连接,右链接的理解。
select * from grade_core g
left join student st
on g.SCHOOL_ID = st.school_id
and g.Student_id=st.student_id
and g.STUDENT_ID=22201—左链接的这一条,如果有的话,一定就会出现这个结果?
where id='102';
 

select * from grade_core g
left join student st
on g.SCHOOL_ID = st.school_id
and g.Student_id=st.student_id
where g.STUDENT_ID=22201—求此条件与上面左链接的交集?
and id='102'
 

感受一下这两个有什么区别


select * from grade_core g
left join student st
on g.SCHOOL_ID = st.school_id
and g.Student_id=st.student_id
and g.STUDENT_ID=22201;
上句更常写成:
select * from grade_core g
left join student st
on g.SCHOOL_ID = st.school_id
and g.Student_id=st.student_id
 and st.STUDENT_ID=22201


 

select * from grade_core g
left join student st
on g.SCHOOL_ID = st.school_id
and g.Student_id=st.student_id
where g.STUDENT_ID=22201
 

可以先拆分成这样看看结果有什么不一样
首先,select * 会把左链接的两表所有字段都查出来,链接、形成一个中间表。
Left join on 后边的and 通过限制表的链接过程,只对中间表的右表起限制,但不影响左表;而where后边的and则是对链接后形成的中间表起限制作用。


以后写关联的时候,尽量使用left join比较直观,方便梳理逻辑,一点点的查看关联是否正确。where X=X,作关联,是inner join的形式,取的是交集,不能满足所有的业务统计需求。


今天有时间的话,看一下,left join,right join,inner join,full join,cross join五种关联关系
Full join :返回左右链接的的并集。
Cross join: 返回笛卡尔积,返回两个表中所有可能的行组合。
create table grade_core_lsj
(
 course_id number(10) ,
 student_id number(10), primary key (course_id,student_id),
 school_id number(10) not null,
 grade_core number(10)not null,
 term varchar2(10)not null,
 student_name varchar(20)
)
分享到:
评论

相关推荐

    SQL多表连接查询实例分析(详细图文)

    新建两张表:表1:student 截图如下:表2:course 截图如下:(此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)一、外连接外连接可分为:左连接...

    全国省市区三级sql表,可以左右连接查询,.sql文件下载

    数据表的设计,id,name,pid,tp, id--该记录的ID name--该区域的名字,可以是省名字,市名字,区名字。 pid--父区域的ID tp--类型,1=>一级分类(国家),2=>二级(省),3=>三级(县) --------------------------- 这个...

    计算机后端-PHP视频教程. php与mysql加强- 07. php加强24-左右连接查询.wmv

    计算机后端-PHP视频教程. php与mysql加强- 07. php加强24-左右连接查询.wmv

    八桂大地便民查询工具 v1.0.rar

    17、搜索引擎反向链接(通过本工具可以快速查询各大搜索引擎对网站的反向连接数量!) 18、查询手机号码归属地(查询手机号码的归属地及其手机号类型。) 19、SEO综合查询(SEO综合查询。) 20 、PR值查询(PR值...

    草根站长工具箱 v10.1.rar

    页面模拟抓取,密度查询,各种加密,ICO在线制作,LOGO在线制作,多功能计数器,各国语言翻译等,增加外链:免费在线快速提高网站暴光率,明显增加网站外部连接(不作弊)。快速提高百度,YAHOO,GOOGLE等排名,网页...

    路路通手机版时刻表java版[无需GPRS连接] 2010.04.15

    路路通手机版时刻表java版[无需GPRS连接] 2010.04.15最新版 1、携带最方便--弥补携带成本时刻表的不足,无携带负担。 2、数据最准确--数据来源准确,随列车微调图更新及时,包括临时客车及浮动票价。 3、软件...

    将SQL数据表转成Access表

    将SQL里面的表的字段 查询出来并导出生成到Access里面! 用的是笨方法: 1:将SQL数据表读出到DataTable 2:初始OLE连接,将Access数据连接建好 3:给Access加InsertCommand,并给其数据表添加值 4:直接Update(dtmp...

    Toad 使用快速入门

    支持同时连接到多个数据库,同时对多个数据库进行操作  允许编辑SQL,PLSQL,JAVA,HTML和文本 使用书签功能,可以在大量SQL语句里,快速定位某个语句所在位置  SQL Editor本身具有强大的编辑功能,非常...

    sql查询优化规则

    sql查询优化规则,左右连接,执行计划使用,以提高查询效率

    python中使用mysql数据连接

    打开数据库连接,正常显示中文标签,正常显示负号,使用 execute() 方法执行 SQL 查询

    sql内连接、外连接

    sql内连接、外连接,左右联合查询。通过一些简单的例子,最后发现其实联合查询很简单的^ ^

    JS跑马灯.网站首页的图片左右滑动.连接数据库,从数据库中获得图片.JS跑马灯.RAR

    JS跑马灯.网站首页的图片左右滑动.连接数据库,从数据库中获得图片. 有,ADO.NET的连接功能.

    mysql数据库的基本操作语法

    视图就是一个表或多个表的查询结果,它是一张虚拟的表,因为它并不能存储数据。 视图的作用、优点: 限制对数据的访问 让复杂查询变得简单 提供数据的独立性 可以完成对相同数据的不同显示 创建、修改视图 create or...

    2009最新U盘主控芯片查询

    ChipGenius是一款USB设备芯片型号检测工具,可以自动查询U盘、MP3/MP4、读卡器、移动硬盘等一切USB设备的主控芯片型号、制造商、品牌、并提供相关资料下载地址。当然也可以查询USB设备的VID/PID信息、设备名称、接口...

    站长工具源码 v2.0 PHP版.rar

    )17、搜索引擎反向链接(通过本工具可以快速查询各大搜索引擎对网站的反向连接数量!)18、查询手机号码归属地(查询手机号码的归属地及其手机号类型。)19、SEO综合查询(SEO综合查询。)20 、PR值查询(PR值全称...

    z5站长工具 v2.0.rar

    17、搜索引擎反向链接(通过本工具可以快速查询各大搜索引擎对网站的反向连接数量!) 18、查询手机号码归属地(查询手机号码的归属地及其手机号类型。) 19、SEO综合查询(SEO综合查询。) 20 、PR值查询(PR值...

    站长工具完整无错版 v2.6.rar

    17、搜索引擎反向链接(通过本工具可以快速查询各大搜索引擎对网站的反向连接数量!) 18、查询手机号码归属地(查询手机号码的归属地及其手机号类型。) 19、SEO综合查询(SEO综合查询。) 20 、PR值查询(PR值...

Global site tag (gtag.js) - Google Analytics