oracle 内连接 分页显示,DQL---连接查询(内连接、外连接)、子查询、分页查询...

一、连接查询

1、连接查询建立在有相互关系的两个表间,进行两个及两个以上的表或视图的查询。

2、对n张表进行查询,至少需要n-1个连接表的条件。

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

1、指表中每行元素与其他表的每行均组合,没有连接条件。

2、假设有两张表,表A有X条数据,表B有Y条数据,则笛卡尔积查询后,会得到一张X*Y条数据的表。

三、主键、外键

1、主键与外键用于维护关系型数据库的完整性。

2、主键:非空且唯一,用于标识一张表。

3、外键:用于存放另一张表的主键,外键可以重复,也可以为null。

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

已知两张表:

表student为:

3847d51319cdd208e767beadd1fd805e.png

8efe71e97ef713616c08d2913aa8062a.png

表student_score为:

cd2591066224c04f16cfefefb82ff845.png

b1f6e743402c2cd2eeffc8c0efa64b9b.png

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

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

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

【格式:】SELECT字段名1, 字段名2,..., 字段名nFROM表1, 表2,... ,表nWHERE条件--【举例:等值连接】

SELECT *

FROMstudent stu, student_score scoWHERE stu.id =sco.id--【结果如下图:】

46b9cc5734adc28654755b34a1b882ab.png

--【举例:非等值连接】

SELECT *

FROMstudent stu, student_score scoWHERE stu.id >sco.id--【结果如下图:】

9fb5808d8ad4987d08c02177b9f92506.png

2、自然连接:

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

--【格式:】

SELECT列名1, 列名2FROM表1

NATURALJOIN表2--【举例:】

SELECT *

FROMstudent stu

NATURALJOINstudent_score--【可以将其理解为:消除了重复的列 ---sco.id】

SELECTstu.id, stu.name, sco.scoreFROMstudent stu, student_score scoWHERE stu.id = sco.id

8a27ce2fabb14c726257d084402a6837.png

3、内连接:

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

--【格式:】

SELECT列名1, 列名2FROM表1INNER JOIN表2ON(条件)--【举例:】

SELECT *

FROMstudent stuINNER JOINstudent_score scoON stu.id = sco.id

d2957d5218c230b9e270f53f7fd117b4.png

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

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

(2)内连接:2个表根据共同ID进行逐条匹配,不会出现笛卡尔乘积的现象,效率比较高,优先使用这种方法。

4、外连接

不能消除重复列,可以通过SECECT挑选字段来决定。

分为左外连接,右外连接,全外连接。

(1)左外连接:

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

--【格式:】

SELECT列名1, 列名2FROM表1LEFT OUTER JOIN表2ON(条件)--【举例:】

SELECT *

FROMstudent stuLEFT OUTER JOINstudent_score scoON stu.id = sco.id AND stu.name = 'tom'

88bfd3bdd820e272ce7e1edeb0d5c59e.png

(2)右外连接

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

--【格式:】

SELECT列名1, 列名2FROM表1RIGHT OUTER JOIN表2ON(条件)--【举例:】

SELECT *

FROMstudent stuRIGHT OUTER JOINstudent_score scoON stu.id = sco.id AND stu.name = 'tom'

44fcb9a96bcf4bfc2eceab2d50dab945.png

(3)全外连接:

全外连接是左外连接和右外连接的组合。

注:mysql中没有全外连接,可以使用UNION关键字 连接 左外连接 与 右外连接 实现。

--【格式:】

SELECT列名1, 列名2FROM表1FULL OUTER JOIN表2ON(条件)--【举例:】

SELECT *

FROMstudent stuFULL OUTER JOINstudent_score scoON stu.id = sco.id AND stu.name = 'tom'

a3f17a8536465ca2d579882865e02a69.png

五、子查询

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

2、分类:

(1)单行单列子查询:返回单行单列数据。通常写在WHERE里。

(2)多行单列子查询:返回多行单列数据。通常写在WHERE里。

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

3、单行单列子查询

【举例:】SELECTstu.nameFROMstudent stuWHERE stu.id =(SELECTsco.idFROMstudent_score scoWHERE sco.score = '98')

c796668db33b5047dce4f5b347870b3c.png

4、多行单列子查询

【举例:】SELECTstu.nameFROMstudent stuWHERE stu.id IN(SELECTsco.idFROMstudent_score scoWHERE sco.score IN ('98', '97', '96')

)

c19edb8dfdddff0d70dff35feb8575da.png

5、多行多列子查询

【举例:写在WHERE条件里】SELECT *

FROMstudent stuWHERE stu.id IN(SELECTsco.idFROMstudent_score scoWHERE sco.score IN ('98', '97', '96')

)

b773a189148a1b0044bb2c7f1f97eca1.png

【举例:写在FROM条件里,当成表来用】SELECT *

FROMstudent stu, (SELECTsco.idFROMstudent_score scoWHERE sco.score IN ('98', '97', '96')

) scoWHERE stu.id = sco.id

b72870a48822c74ad61171f0a9939b36.png

六、分页查询

1、 ROWNUM

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

SELECTROWNUM,name,idFROM student

e144e41d9e682f221f365b5a7be7991d.png

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

(1)先排序。

SELECT *

FROMstudentORDER BY id desc

87012b8292aac02f58c06809a61171a2.png

(2)再编号。

SELECT ROWNUM rw, stu.*

FROM(SELECT *

FROMstudentORDER BY id desc) stu

34b94292e93151c6b6fa7e9356d80d37.png

(3)取范围。

取范围通用套路:

从第start条开始,到第end条结束。

即从第(page-1)*pagesize + 1条开始,到第(page*pagesize)条。

其中page表示第几页,pagesize表示每页的数据。

比如第一页,每页三条记录,那么第一页显示为1 至 3条,第二页显示为4 至 6条,

同理……SELECT *

FROM(SELECT ROWNUM rw, stu.*

FROM(SELECT *

FROMstudentORDER BY id desc) stu

)WHERE rw BETWEEN 3 AND 5

bc6aaaa1445d84089bd777957737e18b.png

内容来源于网络如有侵权请私信删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值