一、连接查询

  1、连接查询建立在有相互关系的两个表间,进行两个及两个以上的表或视图的查询。
  2、对n张表进行查询,至少需要n-1个连接表的条件。

二、笛卡尔积(容易造成数据库宕机)

  1、指表中每行元素与其他表的每行均组合,没有连接条件。
  2、假设有两张表,表A有X条数据,表B有Y条数据,则笛卡尔积查询后,会得到一张X*Y条数据的表。

三、主键、外键

  1、主键与外键用于维护关系型数据库的完整性。
  2、主键:非空且唯一,用于标识一张表。
  3、外键:用于存放另一张表的主键,外键可以重复,也可以为null。

四、等值连接、自然连接、内连接、外连接

已知两张表:
表student为:

表student_score为:

1、等值连接、非等值连接:

  非等值连接一般用于给定条件进行连接,写在WHERE语句中,只要符合了where条件,就可以连接。

  等值连接指的是where连接条件相等时的连接。

【格式:】
SELECT 字段名1, 字段名2,..., 字段名n
FROM 表1, 表2,... ,表n
WHERE 条件 --【举例:等值连接】
SELECT *
FROM student stu, student_score sco
WHERE stu.id = sco.id
--【结果如下图:】

--【举例:非等值连接】
SELECT *
FROM student stu, student_score sco
WHERE stu.id > sco.id
--【结果如下图:】

2、自然连接:

  是一种特殊的等值连接,要求两表之间具有重复的列,在等值连接的基础上(对相同的列进行 = 比较)去掉重复的列。

--【格式:】
SELECT 列名1, 列名2
FROM 表1
NATURAL JOIN 表2 --【举例:】
SELECT *
FROM student stu
NATURAL JOIN student_score --【可以将其理解为:消除了重复的列 ---sco.id】
SELECT stu.id, stu.name, sco.score
FROM student stu, student_score sco
WHERE stu.id = sco.id

3、内连接:

  不能消除重复列,可以通过SECECT挑选字段来决定。基本与等值连接相同,使用ON来指定条件。

--【格式:】
SELECT 列名1, 列名2
FROM 表1
INNER JOIN 表2
ON (条件) --【举例:】
SELECT *
FROM student stu
INNER JOIN student_score sco
ON stu.id = sco.id

注:内连接与等值连接的区别:

  (1)等值连接:2个表会先进行笛卡尔乘积运算,生成一个新表格,占据在电脑内存里,当表的数据量很大时,很耗内存,这种方法效率比较低,尽量不用。
  (2)内连接:2个表根据共同ID进行逐条匹配,不会出现笛卡尔乘积的现象,效率比较高,优先使用这种方法。

4、外连接

  不能消除重复列,可以通过SECECT挑选字段来决定。
  分为左外连接,右外连接,全外连接。
  (1)左外连接:
    以第一个关系为主,在第二个关系中找到满足条件的元素,并把他们连接起来,如果没有对应的元素,则在相应位置上的值为null。

--【格式:】
SELECT 列名1, 列名2
FROM 表1
LEFT OUTER JOIN 表2
ON (条件) --【举例:】
SELECT *
FROM student stu
LEFT OUTER JOIN student_score sco
ON stu.id = sco.id AND stu.name = 'tom'

  (2)右外连接
    和左外连接类似,以第二个关系为主,在第一个关系中找到满足条件的元素,并把他们连接起来,如果没有对应的元素,则在相应位置上的值为null

--【格式:】
SELECT 列名1, 列名2
FROM 表1
RIGHT OUTER JOIN 表2
ON (条件) --【举例:】
SELECT *
FROM student stu
RIGHT OUTER JOIN student_score sco
ON stu.id = sco.id AND stu.name = 'tom'

  (3)全外连接:
    全外连接是左外连接和右外连接的组合。
  注:mysql中没有全外连接,可以使用UNION关键字 连接 左外连接 与 右外连接 实现。

--【格式:】
SELECT 列名1, 列名2
FROM 表1
FULL OUTER JOIN 表2
ON (条件) --【举例:】
SELECT *
FROM student stu
FULL OUTER JOIN student_score sco
ON stu.id = sco.id AND stu.name = 'tom'

五、子查询

1、子查询指的是当前查询建立在另一个查询的结果上。

2、分类:

    (1)单行单列子查询:返回单行单列数据。通常写在WHERE里。
    (2)多行单列子查询:返回多行单列数据。通常写在WHERE里。
    (3)多行多列子查询:返回多行多列数据。通常写在FROM里,当成一个表来使用。 

3、单行单列子查询

【举例:】
SELECT stu.name
FROM student stu
WHERE stu.id = (
SELECT sco.id
FROM student_score sco
WHERE sco.score = ''
)

4、多行单列子查询

【举例:】
SELECT stu.name
FROM student stu
WHERE stu.id IN (
SELECT sco.id
FROM student_score sco
WHERE sco.score IN ('', '', '')
)

5、多行多列子查询

【举例:写在WHERE条件里】
SELECT *
FROM student stu
WHERE stu.id IN (
SELECT sco.id
FROM student_score sco
WHERE sco.score IN ('', '', '')
)

【举例:写在FROM条件里,当成表来用】
SELECT *
FROM student stu, (
SELECT sco.id
FROM student_score sco
WHERE sco.score IN ('', '', '')
) sco
WHERE stu.id = sco.id

六、分页查询

1、 ROWNUM

  ROWNUM被称为伪列,实际上是不存在的列,用于返回标识行数据顺序的数字,自1开始,每次确定数据后自动加1。

SELECT ROWNUM,name,id
FROM student

2、分页步骤(相比于mysql会略显复杂一些)

  (1)先排序。

SELECT *
FROM student
ORDER BY id desc

  (2)再编号。

SELECT ROWNUM rw, stu.*
FROM (
SELECT *
FROM student
ORDER BY id desc
) stu

  (3)取范围。

取范围通用套路:
从第start条开始,到第end条结束。
即从第(page -1)*pagesize + 1条开始,到第(page*pagesize)条。
其中page表示第几页,pagesize表示每页的数据。 比如第一页,每页三条记录,那么第一页显示为 1 至 3 条,第二页显示为4 至 6条,
同理…… SELECT *
FROM (
SELECT ROWNUM rw, stu.*
FROM (
SELECT *
FROM student
ORDER BY id desc
) stu
)
WHERE rw BETWEEN 3 AND 5

DQL---连接查询(内连接、外连接)、子查询、分页查询的更多相关文章

  1. 转 SQL连接查询语句(内、外、交叉和合并查询)

    转 http://blog.csdn.net/u010011371/article/details/50596535 1.内连接 (INNER JOIN) 内连接也称自然连接,它是根据两个或多个表中的 ...

  2. 【cl】多表查询(内、外连接)

    交叉连接(cross join):该连接产生的结果集笛卡尔积 a有7行,b有8行    a的第一行与b的每一行进行连接,就有8条a得第一行 7*8=56条 select a.real_name,s.u ...

  3. Oracle内链接+外连接详解

    inner join(内连接) 内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据.也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表 ...

  4. 【SQL】多表查询中的 外连接 ,on,where

    先简单粗暴给个结论,多表连结查询中,on比where更早起作用,系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行匹配过滤,where后语句为真,则能查询出来,而通过外连接 ...

  5. 关于数据库的左,右,内,外连接,Union和Union all---------笔记

    1.左连接 select a.filed1,a.filed2,b.filed1 from a (左表) left join b(右表) on a.commonfiled = b.commonfiled ...

  6. Orcle数据库 表的 内置函数 内链接 外连接 相关练习题

  7. EntityFramework 使用Linq处理内连接(inner join)、外链接(left/right outer join)、多表查询

    场景:在实际的项目中使用EntityFramework都会遇到使用Ef处理连接查询的问题,这里做一些小例子如何通过Linq语法处理内连接(inner join).外连接(left/right oute ...

  8. SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)

    SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...

  9. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  10. 图解MySQL 内连接、外连接、左连接、右连接、全连接

    用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...

随机推荐

  1. 这几个 Chrome 的 Tab 增强插件你都用上了吗?

    1.OneTab:将无数 Tab 合并在一个页面 很多时候我们在一个窗口打开太多的tab,每一个tab太小不容易管理,这时候使用OneTab能够把所有tab收起放在一个页面,点击就可打开该tab,非常 ...

  2. Java每日一面(Part1:计算机网络)[19/11/02]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.TCP的滑动窗口 1.1 RTT和RTO的区别 ​ RTT:发送一个数据包到收到对应的ACK,所花费的时间 ​ RTO:重传时间间隔,TCP在发 ...

  3. JavaScript的概念,引入,基本数据类型

    08.05自我总结 JavaScript 一.概念 JavaScript(下文我们会用简称JS来代替)是脚本编程语言,JS语言开发的文件是以.js为后缀,通过在html文件中引入该js文件来控制htm ...

  4. vue-svgicon基本使用

    在项目开发中,经常会用到svg图标,之前用的都是vue-svg-icon,最近在npm中搜索svg图标解析插件,发现vue-svgicon用的相对较多,对比以下,vue-svgicon用法较为灵活,方 ...

  5. JS基础语法----Math对象

        推荐查看MDN----在线的帮助文档 实例对象: 通过构造函数创建出来,实例化的对象 静态对象: 不需要创建,直接就是一个对象,方法(静态方法)直接通过这个对象名字调用 实例方法必须通过实例对 ...

  6. JS基础语法---预解析

    预解析:就是在解析代码之前   1. 预解析做什么事? 把变量的声明提前了----提前到当前所在的作用域的最上面 函数的声明也会被提前---提前到当前所在的作用域的最上面   举例: function ...

  7. jQuery中$()函数的7种用法汇总

    前言 jQuery对象是一个类数组的对象,含有连续的整形属性以及一系列的jQuery方法.它把所有的操作都包装在一个jQuery()函数中,形成了统一(也是惟一)的操作入口.其中我们用的非常频繁的一个 ...

  8. iOS----------iPhone导出手机所有短信

    第一步:手机连接到itunes  选择本电脑备份   备份的时候不要加密  然后立即备份 第二步:前往文件夹,找到itunes的备份路径~/Library/Application Support/Mo ...

  9. C#&.Net干货分享- iTextSharp导出数据源到PDF

    namespace Frame.ITextSharp{    /// <summary>    /// iTextSharp导出数据源到PDF    /// </summary> ...

  10. 转载 could not find a getter for ... in class ... 异常的原因解析

    可能原因如下: 1.真的没有写getter方法(发生几率:1%) 2.*.hmb.xml文件中的属性名和pojo不一致(*.hbm.xml和*.java没衔接好,不一致),字段属性没有正确配置,比如, ...