一、连接查询

  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. 如何获取JVM堆转储文件

    堆转储是诊断与内存相关的问题(例如内存泄漏缓慢,垃圾回收问题和 java.lang.OutOfMemoryError.它们也是优化内存消耗的重要工具. 有很多很不错的的工具,例如Eclipse MAT ...

  2. JAVA集合框架(一)-综述

    目录 什么是java集合框架 使用类型安全的容器 集合框架简图 集合类库主要接口简述 Collection接口方法概览 什么是java集合框架 其实就是java类库提供的一套相当完整的各种数据结构的实 ...

  3. Mysql - 开发技巧(二)

    本文中的涉及到的表在https://github.com/YangBaohust/my_sql中 本文衔接Mysql - 巧用join来优化sql(https://www.cnblogs.com/dd ...

  4. 转:C# String为值类型还是引用类型

    关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确.希望能给大家带来点帮助,如果有错误请指出. 来看下面例子: //值类型 int a ...

  5. Add an Item to the New Action 在新建按钮中增加一个条目

    In this lesson, you will learn how to add an item to the New Action (NewObjectViewController.NewObje ...

  6. jQuery从零开始(一)

    1.jQuery是什么? 轻量级的工具库,类库. Jquery可以写的很少的代码,干的很多的事情. 2.学习心态,常用的功能 jQuery只是一个工具,它的实现原理还是js.以练习为主,多看多练. 常 ...

  7. GitHub访问速度慢的一种优化方法

    GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名GitHub. 由于GitHub是一个国外网站,在国内访问速度如何呢? 我们通过浏览器访问下ht ...

  8. MyBatis之接口绑定方案及多参数传递

    1.说明   所谓的MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql.在SS ...

  9. SQL查询--索引

    索引概念和作用 索引是建立在表上的可选对象,目的是为了提高查询速度. 如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以 ...

  10. mongodb重点知识总结

    Mongodb总结 一.NoSQL型数据库介绍 NoSQL,泛指非关系型的数据库.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题.NoSQL(NoSQL ...