SQL之连接查询

一、连接查询的分类

sql中将连接查询分成四类:

  •   内链接
  •   外连接
    •  左外连接
    • 右外连接   
  •   自然连接
  •   交叉连接

二、连接查询的分类

  数据库表如下:

  1.学生表

  

  2.老师表

  

  3.班级表

  

  表用于连接查询教学,不要纠结表的设计~

三、连接查询之内连接

概念

  内链接[inner]join,从左表中取出每一条记录,去右表中与所有记录进行匹配;
    是某个条件在左表中与右表中相同最终才会有保留结果,否则不保留。 

基本语法
  左表[inner] join 右表 on 左表.字段=右表.字段;on表示连接条件;条件字段就是代表相同的业务含义

例子

  查询sql语句如下

  SELECT
      student.s_name,
      student.c_id,
      class.id,
      class.c_name
  FROM
      student
  INNER JOIN class ON student.c_id = class.id;

  查询结果

  

  分析:从查询结果不难看出,student的c_id和class的id是连接条件,以左表student为主表,以student表中每一条记录的c_id作为右表class的id主键的查询条件去匹配相关的信息。

  

  扩展:内连接还可以使用where 代替on关键字,或者如下写法代替:

  SELECT
      student.s_name,
      student.c_id,
      class.id,
      class.c_name
  FROM
      student,
      class
  where student.c_id = class.id;

四、连接查询之外连接

概念

  外连接:outer join,以某张表为主,取出里面所有的记录,每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留;能匹配正确保留,不能匹配,其他标的字段都是空null

  外连接分为两种;是以某张表为主表;
      left join:左连接,已左表为主表;
      right join:右链接 ,以左表为主表。

基本语法

  左表left/right join 右表 on 左表.字段=右表.字段

例子

  (1)左连接

  sql语句:  

  SELECT
      student.s_name,
      student.c_id,
      class.id,
      class.c_name
  FROM
      student
  left JOIN class ON student.c_id = class.id;

  查询结果

  

  分析:左连接,以左表student为主表,每条与另外一张表进行连接,多余同学的c_id在class匹配不上,并没有这个班级,但是依旧保留下来,其他字段显示NULL。

  

  (2)右连接

  sql语句:

  SELECT
      student.s_name,
      student.c_id,
      class.id,
      class.c_name
  FROM
      student
  right JOIN class ON student.c_id = class.id;

  查询结果

  

  这里我就不再分析啦~都很好理解,不懂的看看上面的左连接自己推导一下~

五、连接查询之自然连接

概念

  自然连接;natural join,自然连接,就是自动匹配连接条件;系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段都作为条件)

  ps:   自然连接很没有用!!!实际开发中并不会用到所以了解就好了!!!

    内链接和外连接都可以模拟自然连接

    使用同名字段,合并字段
    左表 left/right/inner join 左表 using(字段名);

六、连接查询之交叉连接

概念

  交叉连接; cross join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配,匹配一定保留(没有条件匹配),而连接本身字段就会增加(保留),最终形成的结果叫做笛卡尔积。

基本语法

  左表 cross join右表;也可以携程  from 左表,右表。

例子

  sql语句:

  SELECT
      *
  FROM
     student,
        class ;

  查询结果

  

  分析:简单来说就是,左表中的每一条记录都与由表中的每一条记录匹配一遍。

  ps:  交叉连接没什么用,只是保证连接这种结构的完整性!!!

笔记就到这了,但是上面说到的都是两个表的连接查询,那么,是否可以多个表进行连接查询呢?当然是可以的。

多表连接查询

sql语句如下:

  SELECT
      student.s_name,
      student.c_id,
      class.id,
      class.c_name,
          class.t_id,
          teacher.id as tid,
          teacher.t_name
  FROM
      student
  left JOIN class ON student.c_id = class.id
  left JOIN teacher ON class.t_id = teacher.id;

查询结果:

  

分析:多表连接查询,其实就是两个表连接查询组成一个新的表,这个新的表再与第三个表进行连接查询,以此类推,不懂的,思考一下?

浅谈sql之连接查询的更多相关文章

  1. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  2. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  3. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  4. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  5. 浅谈SQL优化入门:3、利用索引

    0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...

  6. 浅谈SQL Server内部运行机制

    对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL的哪些方面是他们的挑战 或者软肋呢? 那就是 ...

  7. 浅谈SQL Server---2

    浅谈SQL Server内部运行机制 https://www.cnblogs.com/wangjiming/p/10098061.html 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说, ...

  8. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  9. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

随机推荐

  1. SpringBoot 开启debug

    项目基于gradle ,今天想断点debug一下springboot,查阅资料后,纪录一下步骤. 创建Remote 创建gradle.properities 在当前项目下创建gradle.proper ...

  2. 关于eclipse的编码注释等Code Template设置

    啥也不说直接放东西: 首先进入eclipse的preferences里的java 点击Insert variable可以自己设置需要的 1. 设置Files:点击edit, /** * <p&g ...

  3. Springboot事务使用与回滚

    Springboot中事务的使用: 1.启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的). 2.在使用事务的public(只有public支持事 ...

  4. mysql 笔记3

    --建库create database dsdb DEFAULT CHARACTER set utf8 collate utf8_general_ci;/*删除数据库drop DATABASE 数据库 ...

  5. thinkphp5设置404页面不跳转

    thinkphp5设置404页面的步骤: 1. 首先关闭调试模式,即配置application/config文件,使'app_debug' => false 2. 添加自定义404页面跳转地址, ...

  6. BZOJ3498: PA2009 Cakes(三元环)

    题意 题目链接 Sol 按照套路把边转成无向图,我们采取的策略是从权值大的向权值小的连边 然后从按权值从小到大枚举每个点,再枚举他们连出去的点\(v\) 如果\(v\)的度数\(\leqslant M ...

  7. Apache Maven 3.5.0配置安装

    1.maven 3.5 下载地址:http://maven.apache.org/download.cgi 2.下载了解压到 3.配置环境变量 4.测试看是否安装成功 5.maven配置(全局配置,用 ...

  8. Apache服务器运维笔记(3)----容器部分

    1.<IfModule>容器 <IfModule>容器作用于模块,它会首先判断模块是否载入,然后再决定是否进行处理,也就是说只有当判断结果为真时才会执行容器内的指令,相反如果为 ...

  9. git 回滚到上个版本命令以及忽略某些文件提交

    1.git回滚到上个版本 git reset --hard FETCH_HEAD 2.git忽略某些文件的提交 以前是用默认的.gitignore 然后再里面默认某些文件不提交.但是有个问题,.git ...

  10. Azure DocumentDB 正式发布

    DocumentDB 简介 一种 NoSQL JSON 数据库 Azure DocumentDB 提供完全托管的 NoSQL 数据库服务,高度可用,自动缩放,开发简易,可以加速并预测性能.它适合诸如 ...