mysql分页内连接id_DQL---连接查询(内连接、外连接)、子查询、分页查询

本文详细介绍了MySQL中的连接查询,包括等值连接、自然连接、内连接和外连接,强调了内外连接的区别。此外,还讲解了笛卡尔积、主键和外键的概念。同时,探讨了子查询的分类和应用。最后,讨论了分页查询的基本步骤,如使用ROWNUM进行分页。
摘要由CSDN通过智能技术生成

一、连接查询

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

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

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

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

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

三、主键、外键

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

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

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

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

已知两张表:

表student为:

934ac5f7c770a23f60060ef994ec641e.png

5a10717e3d61eea97fcc8d0ab36c739c.png

表student_score为:

277acd1a723a2acd559bc9f98b52f6d3.png

ed9bc6d3b3e8dad2a0d202b9d6b1e1cf.png

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

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

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

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

SELECT *

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

9ac0370a1dd2202d5d73ce71d8cbd819.png

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

SELECT *

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

60d41c37c17101c9c1a3f8689fd24cac.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

c63eb9419c3a5061b1c0920cde77eaaa.png

3、内连接:

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

--【格式:】

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

SELECT *

FROMstudent stuINNER JOINstudent_score scoON stu.id = sco.id

ef34c1abaefd8a3258b6f088dafcfe09.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'

f9168360965da6a0d1ae3854d816a3a6.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'

37fce16225cdfaf60f0f170dcef3a8ff.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'

a1af10d229f9e20610cfb3b63551d92d.png

五、子查询

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

2、分类:

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

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

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

3、单行单列子查询

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

e1863d44bc9fdce349e98f3024847eab.png

4、多行单列子查询

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

)

74320235fbb156ccd16ff8758337b898.png

5、多行多列子查询

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

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

)

a139a6f67f239c7988f94f7a975225a9.png

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

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

) scoWHERE stu.id = sco.id

1d28ef9ddc9d16c5ef183b670ba6fe0d.png

六、分页查询

1、 ROWNUM

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

SELECTROWNUM,name,idFROM student

4fe8466e0e5e01d651c22f8b1adff50d.png

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

(1)先排序。

SELECT *

FROMstudentORDER BY id desc

a87114259fecdf5f0d58525d6a5aa051.png

(2)再编号。

SELECT ROWNUM rw, stu.*

FROM(SELECT *

FROMstudentORDER BY id desc) stu

6a898f93d2657b9606645baa1257770b.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

27c1a8593102cfbb73b6ad2203cdf873.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值