咱们接着上一篇的内容继续。这一篇主要回顾子查询,联合查询,复制表这三类内容。

上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询。

1.子查询

  当一个查询是另一个查询的条件时,称为子查询。但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明

  

  下面再用一条sql语句来说明他们的关系。

  

  其中在查询中又分为嵌套子查询和相关子查询,他们之间的区别就是查询是否依赖与外部的查询,嵌套子查询的执行不依赖与外部的查询,而相关子查询的执行依赖于外部查询。

 select * from Books where 价格 < (select AVG(价格) from Books)   --查询所有价格高于平均价格的书信息  

  上边的一条sql语句便是嵌套子查询,来分析他的执行过程。

  ①先执行子查询,即查询出Books表中书的平均价格,然后将结果传递给父查询,作为父查询的条件。

  ②执行父查询,返回结果。

 select * from Books as a where 价格 < (select AVG(价格) from Books as b where a.类编号=b.类编号)--查询表中大于该类图书价格平均值的图书信息

  上边一条语句便是嵌套子查询,来分析他的执行过程。

  ①先从父查询中读取一个数据,即类编号,然后将类编号传递给子查询。

  ②执行子查询,将这个类编号的书的平均价格查询出来,并将其传递给父查询。

  ③父查询判断这条数据是否满足条件,不满足就排除,满足则保留。

  ④然后父查询获取下一条数据中的类编号,重复①到③步骤,直到外层所有数据被处理完。

2.表联合查询

  SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用SQL的SELECT能执行的最重要的操作,在能够有效地使用联结前,先了解一下数据库的三个范式。

  1NF(原子性):字段不可再分,否则就不是关系型数据库。

  2NF(唯一性):有主键,非主键字段依赖于主键;或者说,一个表中只能说明一个事务。

  3NF(无依赖):主键字段不能相互依赖,不能传递依赖。

  三范式是解决了数据库的冗余问题,但是在很多业务逻辑下,必须同时查询两个或两个以上的表,这个时候就用到了表的联合(结)查询。   

  笛卡儿积( 笛卡儿积(cartesian product):由没有联结条件的表关系返回的结果为笛卡儿积。即将是第一个表中的行数乘以第二个表中的行数。

  联合查询,就是先求出所查表的笛卡尔积之后,在对笛卡儿积进行筛选。

  而连接类型又分为好几种,如下图所示。

  • (Inner) Join: 如果表中有至少一个匹配,则返回行
  • Left    Join: 即使右表中没有匹配,也从左表返回所有的行
  • Right    Join: 即使左表中没有匹配,也从右表返回所有的行
  • Full      Join: 只要其中一个表中存在匹配,就返回行
  • Cross   Join: 就是返回两个关联表的笛卡儿积

  内连接(Inner Join)是最常用的连接操作。内连接有两种不同的语法 ,一种是显示连接符号,另一种是隐式链接符号,他们的区别就是用不用Join关键字。

 

语法:select <要选字段> from <主要资料表> <join方式> <次要资料表> [on <join 规则>] --在内连接中,Join规则不相符的都会被排除:排他性
写法1:select * from A inner join B on A.name=B.name --显示连接符号
写法2:select * from A,B where A.name=B.name --隐式链接符号
--对照上图,内连接查询出a和b两表的公共集c

  外连接并不要求连接的两表的每一条记录在对方表中都一条匹配的记录,要保留所有记录的表(即使这条记录没有匹配也要保留)称为保留表,保留表在join关键字左边的连接就称为左连接,在右边就称为右连接,当两表记录都要保存时,称为全外连接。左外连接查询时,如果右表中无匹配记录, 来自于右表的所有列的值设为 NULL,右外连接,全外连接也是这种情况。

语法:select <要选字段> from <left资料表> <left|right>[outer] join <right资料表> [on <join 规则>] --在外连接中:包容性
左外连接:select * from A left (outer)join B on A.name=B.name --对照上图即左外连接查询出表a的所有集合和b中和a公共集合 a1+c
右外连接:select * from A right(outer)join B on A.name=B.name --对照上图即右外连接查询出表a的所有集合和b中和a公共集合 b1+c
全外连接:select * from A full(outer)join B on A.name=B.name --对照上图即全外连接查询出表a的所有集合和b中所有集合 a1+c+b1

3.复制表

  有时候需要将一个表的数据直接导入到一个新表中,这时候可以用select...into...from或者insert into...select,不过两者有区别。

select * into NewTable from Books        --使用这条语句时,数据库中必须原先不存在表NewTable ,若数据库中原先有此表,则会报错

insert into NewTable select * from Books --这条语句中,数据库中必须原先存在表NewTable, 若不存在,则执行报错

还有一个问题需注意:在使用复制表语句时,只会复制表的数据和结构,但是表中的主键,外键,约束,索引这些信息不会复制过来。

《SQL必知必会》学习笔记二)的更多相关文章

  1. sql分类及基本sql操作,校对规则(mysql学习笔记二)

    sql针对操作对象分为不同语言 数据操作(管理)语言 DML或者将其细分为 ( 查询  DQL 管理(增,删,改)  DML) 数据定义语言(对保存数据的格式进行定义) DDL 数据库控制语言(针对数 ...

  2. Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(二)

    Creating trace with system stored procedures Following are the stored procedures which you should kn ...

  3. 《SQL必知必会》学习笔记整理

    简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...

  4. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. SQL语法语句总结(《SQL必知必会》读书笔记)

    一.SQL语句语法 ALTER TABLE ALTER TABLE 用来更新已存在表的结构. ALTER TABLE tablename (ADD|DROP column datatype [NULL ...

  7. 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入

    文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...

  8. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  9. 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)

    不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...

随机推荐

  1. 201521123073 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  2. 201521123073 《Java程序设计》第1周学习总结

    1.本章学习总结 你对于本章知识的学习总结 1.Java中使用Scanner处理输入,需要注意如下几个地方 程序开头必须import java.util.Scanner导入Scanner类. 使用Sc ...

  3. 201521123042《Java程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. ①finally块:无论是否被捕获或执行异常一定会被执行. 在try或catch中遇到return语句时,final ...

  4. Java :BufferedWriter类和BufferedReader类的构造方法、主要方法

    BufferedWriter 和 BufferedReader 为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率比没有缓冲区的高. 一.BufferedWriter 类 构造方法:buffered ...

  5. Intellij idea使用Junit

    之前使用idea做Junit测试的时候,都是一个一个方法来写,然后在方法名@Test这样测试-.. 后来发现eclipse有直接把整个类的方法都可以抽取出来,自动生成Junit测试方法-于是在找Ide ...

  6. springmvc02

    1,创建实体类对象User 注意要导入 bean-validator.jar 包 package com.yangw.springmvc.entity; import org.hibernate.va ...

  7. Hibernate4+EhCache配置二级缓存

    本文主要讲一讲Hibernate+EhCache配置二级缓存的基本使用方法 (有关EhCache的基础介绍可参见:http://sjsky.iteye.com/blog/1288257 ) Cache ...

  8. java线程池相关知识点总结

    Android中常见到的很多通用组件一般都离不开"池"的概念,如各种图片加载库,网络请求库,即使Android的消息传递机制中的Meaasge当使用Meaasge.obtain() ...

  9. C#抓取数据、正则表达式+线程池初步运用

    去年底用 多线程+HtmlAgilityPack.dll 写了一个抓取“慧聪网” 公司信息的小程序,代码惨不忍赌.好在能抓到数据,速度也能让人忍受就很久没管了. 最近这段时间把这个小程序发给同事看着玩 ...

  10. Linux 安装 mysql 并配置

    1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6.33,通用版,linux下64位 也可 ...