经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
DQL---连接查询(内连接、外连接)、子查询、分页查询
来源:cnblogs  作者:累成一条狗  时间:2019/7/2 8:52:02  对本文有异议

一、连接查询

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

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

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

三、主键、外键

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

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

已知两张表:
表student为:

 

表student_score为:

 

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

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

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

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

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

 

2、自然连接:

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

  1. --【格式:】
  2. SELECT 列名1 列名2
  3. FROM 1
  4. NATURAL JOIN 2
  5. --【举例:】
  6. SELECT *
  7. FROM student stu
  8. NATURAL JOIN student_score
  9. --【可以将其理解为:消除了重复的列 ---sco.id
  10. SELECT stu.id, stu.name, sco.score
  11. FROM student stu, student_score sco
  12. WHERE stu.id = sco.id

 

3、内连接:

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

  1. --【格式:】
  2. SELECT 列名1 列名2
  3. FROM 1
  4. INNER JOIN 2
  5. ON (条件)
  6. --【举例:】
  7. SELECT *
  8. FROM student stu
  9. INNER JOIN student_score sco
  10. ON stu.id = sco.id

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

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

 

4、外连接

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

  1. --【格式:】
  2. SELECT 列名1 列名2
  3. FROM 1
  4. LEFT OUTER JOIN 2
  5. ON (条件)
  6. --【举例:】
  7. SELECT *
  8. FROM student stu
  9. LEFT OUTER JOIN student_score sco
  10. ON stu.id = sco.id AND stu.name = 'tom'

 

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

  1. --【格式:】
  2. SELECT 列名1 列名2
  3. FROM 1
  4. RIGHT OUTER JOIN 2
  5. ON (条件)
  6. --【举例:】
  7. SELECT *
  8. FROM student stu
  9. RIGHT OUTER JOIN student_score sco
  10. ON stu.id = sco.id AND stu.name = 'tom'

 

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

  1. --【格式:】
  2. SELECT 列名1 列名2
  3. FROM 1
  4. FULL OUTER JOIN 2
  5. ON (条件)
  6. --【举例:】
  7. SELECT *
  8. FROM student stu
  9. FULL OUTER JOIN student_score sco
  10. ON stu.id = sco.id AND stu.name = 'tom'

 

五、子查询

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

2、分类:

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

3、单行单列子查询

  1. 【举例:】
  2. SELECT stu.name
  3. FROM student stu
  4. WHERE stu.id = (
  5. SELECT sco.id
  6. FROM student_score sco
  7. WHERE sco.score = '98'
  8. )

 

4、多行单列子查询

  1. 【举例:】
  2. SELECT stu.name
  3. FROM student stu
  4. WHERE stu.id IN (
  5. SELECT sco.id
  6. FROM student_score sco
  7. WHERE sco.score IN ('98', '97', '96')
  8. )


5、多行多列子查询

  1. 【举例:写在WHERE条件里】
  2. SELECT *
  3. FROM student stu
  4. WHERE stu.id IN (
  5. SELECT sco.id
  6. FROM student_score sco
  7. WHERE sco.score IN ('98', '97', '96')
  8. )

  1. 【举例:写在FROM条件里,当成表来用】
  2. SELECT *
  3. FROM student stu, (
  4. SELECT sco.id
  5. FROM student_score sco
  6. WHERE sco.score IN ('98', '97', '96')
  7. ) sco
  8. WHERE stu.id = sco.id

 

六、分页查询

1、 ROWNUM

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

  1. SELECT ROWNUM,name,id
  2. FROM student

 

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

  (1)先排序。

  1. SELECT *
  2. FROM student
  3. ORDER BY id desc

 

  (2)再编号。

  1. SELECT ROWNUM rw, stu.*
  2. FROM (
  3. SELECT *
  4. FROM student
  5. ORDER BY id desc
  6. ) stu

 

  (3)取范围。

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

 

原文链接:http://www.cnblogs.com/l-y-h/p/11116469.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号