最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

MySQL數(shù)據(jù)庫基礎(chǔ)(三):多表查詢,子查詢,開窗函數(shù)

2023-07-07 16:15 作者:程序員四次元ポケット  | 我要投稿

十一、多表查詢(重點(diǎn)、難點(diǎn))

表與表之間的關(guān)系

在SQL語句中,數(shù)據(jù)表與數(shù)據(jù)表之間,如果存在關(guān)系,一般一共有3種情況:

① 一對(duì)一關(guān)系(高級(jí))

比如有A、B兩張表,A表中的每一條數(shù)據(jù),在B表中有一條唯一的數(shù)據(jù)與之對(duì)應(yīng)。

用戶表user

用戶詳情表user_items

我們把用戶表與用戶詳情表之間的關(guān)系就稱之為一對(duì)一關(guān)系。

② 一對(duì)多關(guān)系(重點(diǎn))

比如有A、B兩張表,A表中的每一條數(shù)據(jù),在B表中都有多條數(shù)據(jù)與之對(duì)應(yīng),我們把這種關(guān)系就稱之為一對(duì)多關(guān)系?

產(chǎn)品分類表

產(chǎn)品信息表

我們把產(chǎn)品分類表與產(chǎn)品表之間的關(guān)系就稱之為一對(duì)多關(guān)系。

③ 多對(duì)多關(guān)系(高級(jí))

用戶表

權(quán)限表

雖然從以上圖解來看,兩者之間好像沒有任何聯(lián)系,但是兩者之間其實(shí)是有關(guān)系的,這種關(guān)系需要通過一張臨時(shí)表進(jìn)行呈現(xiàn)。

每個(gè)用戶,應(yīng)該有對(duì)應(yīng)的權(quán)限,admin賬號(hào)可以做增刪改查,itheima賬號(hào)可以做查詢

反過來

每個(gè)權(quán)限都應(yīng)該對(duì)應(yīng)多個(gè)用戶,查詢權(quán)限 => admin/itheima

中間表 :用戶_權(quán)限表

交叉連接(了解)

沒有意義,但是它是所有連接的基礎(chǔ)。其功能就是將表1和表2中的每一條數(shù)據(jù)進(jìn)行連接。

結(jié)果:

字段數(shù) = 表1字段 + 表2的字段

記錄數(shù) = 表1中的總數(shù)量 * 表2中的總數(shù)量(笛卡爾積)



1、內(nèi)連接

☆ 連接查詢的介紹

連接查詢可以實(shí)現(xiàn)多個(gè)表的查詢,當(dāng)查詢的字段數(shù)據(jù)來自不同的表就可以使用連接查詢來完成。 連接查詢可以分為:

  1. 內(nèi)連接查詢

  2. 左外連接查詢

  3. 右外連接查詢

  4. 自連接查詢(自己查詢自己)

☆ 內(nèi)連接查詢

查詢兩個(gè)表中符合條件的共有記錄

內(nèi)連接查詢語法格式:


select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2

說明:

  • inner join 就是內(nèi)連接查詢關(guān)鍵字

  • on 就是連接查詢條件

例1:使用內(nèi)連接查詢學(xué)生表與班級(jí)表:



☆ 小結(jié)

  • 內(nèi)連接使用inner join .. on .., on 表示兩個(gè)表的連接查詢條件

  • 內(nèi)連接根據(jù)連接查詢條件取出兩個(gè)表的 “交集”

2、左外連接

☆ 左連接查詢

以左表為主根據(jù)條件查詢右表數(shù)據(jù),如果根據(jù)條件查詢右表數(shù)據(jù)不存在使用null值填充

左連接查詢語法格式:


select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2

說明:

  • left join 就是左連接查詢關(guān)鍵字

  • on 就是連接查詢條件

  • 表1 是左表

  • 表2 是右表

例1:使用左連接查詢學(xué)生表與班級(jí)表:



☆ 小結(jié)

  • 左連接使用left join .. on .., on 表示兩個(gè)表的連接查詢條件

  • 左連接以左表為主根據(jù)條件查詢右表數(shù)據(jù),右表數(shù)據(jù)不存在使用null值填充。

3、右外連接

☆ 右連接查詢

以右表為主根據(jù)條件查詢左表數(shù)據(jù),如果根據(jù)條件查詢左表數(shù)據(jù)不存在使用null值填充

右連接查詢語法格式:


select 字段 from 表1 right join 表2 on 表1.字段1 = 表2.字段2

說明:

  • right join 就是右連接查詢關(guān)鍵字

  • on 就是連接查詢條件

  • 表1 是左表

  • 表2 是右表

例1:使用右連接查詢學(xué)生表與班級(jí)表:



☆ 小結(jié)

  • 右連接使用right join .. on .., on 表示兩個(gè)表的連接查詢條件

  • 右連接以右表為主根據(jù)條件查詢左表數(shù)據(jù),左表數(shù)據(jù)不存在使用null值填充。

4、自連接查詢(擴(kuò)展)

自連接查詢:數(shù)據(jù)表自己連接自己,前提:連接操作時(shí)必須為數(shù)據(jù)表定義別名!

左表和右表是同一個(gè)表,根據(jù)連接查詢條件查詢兩個(gè)表中的數(shù)據(jù)。

兩個(gè)實(shí)際的工作場(chǎng)景,求省市區(qū)信息,求分類導(dǎo)航信息

地域:area

pid 全稱 parent id(父級(jí)ID編號(hào)),如果pid值為null代表本身就是父級(jí),如果pid是一個(gè)具體的數(shù)值,則代表其屬于子級(jí)

例1:查詢省的名稱為“廣東省”的所有城市

創(chuàng)建areas表:



執(zhí)行sql文件給areas表導(dǎo)入數(shù)據(jù):


自連接查詢的用法:


說明:

  • 自連接查詢必須對(duì)表起別名

☆ 小結(jié)

  • 自連接查詢就是把一張表模擬成左右兩張表,然后進(jìn)行連表查詢。

  • 自連接就是一種特殊的連接方式,連接的表還是本身這張表

十二、子查詢(三步走)

1、子查詢(嵌套查詢)的介紹

在一個(gè) select 語句中,嵌入了另外一個(gè) select 語句, 那么被嵌入的 select 語句稱之為子查詢語句,外部那個(gè)select語句則稱為主查詢.

主查詢和子查詢的關(guān)系:

  1. 子查詢是嵌入到主查詢中

  2. 子查詢是輔助主查詢的,要么充當(dāng)條件,要么充當(dāng)數(shù)據(jù)源(數(shù)據(jù)表)

  3. 子查詢是可以獨(dú)立存在的語句,是一條完整的 select 語句

2、子查詢的使用

例1. 查詢學(xué)生表中大于平均年齡的所有學(xué)生:

需求:查詢年齡 > 平均年齡的所有學(xué)生

前提:

① 獲取班級(jí)的平均年齡值

② 查詢表中的所有記錄,判斷哪個(gè)同學(xué) > 平均年齡值 第一步:寫子查詢


第二步:寫主查詢


第三步:第一步和第二步進(jìn)行合并


例2. 查詢tb_goods產(chǎn)品表中具有分類信息的產(chǎn)品

需求:查詢產(chǎn)品表中具有分類信息的產(chǎn)品(沒有與之對(duì)應(yīng)分類信息的產(chǎn)品不顯示)

前提:① 查詢分類表中,到底有哪些分類(獲取cid編號(hào))

② 到產(chǎn)品表中進(jìn)行判斷,判斷這個(gè)商品的cid編號(hào)與①中的是否相等 第一步:編寫子查詢


第二步:編寫主查詢


第三步:把主查詢和子查詢合并


例3. 查找年齡最小且成績最低的學(xué)生:

第一步:獲取年齡最小值和成績最小值


第二步:查詢所有學(xué)員信息(主查詢)


第三步:把第一步和第二步合并



注:數(shù)據(jù)表中必須有這樣一條記錄,否則可能查詢不到結(jié)果,重點(diǎn)練習(xí)子查詢返回多個(gè)結(jié)果情況。

3、小結(jié)

子查詢是一個(gè)完整的SQL語句,子查詢被嵌入到一對(duì)小括號(hào)里面 掌握子查詢編寫三步走

十三、外鍵約束(擴(kuò)展)

主鍵:primary key

外鍵:foreign key(應(yīng)用場(chǎng)景:在兩表或多表關(guān)聯(lián)的時(shí)候設(shè)置的,用于標(biāo)志兩個(gè)表之間的關(guān)聯(lián)關(guān)系)


① 主鍵約束primary key

② 默認(rèn)值約束default

③ 非空約束not null

④ 唯一約束unique key

⑤ 外鍵約束foreign key

原則:在一張表中,其是主鍵。但是在另外一張表中,其是從鍵(非主鍵),但是這個(gè)字段是兩張表的關(guān)聯(lián)字段。

1、外鍵約束作用

外鍵約束:對(duì)外鍵字段的值進(jìn)行更新和插入時(shí)會(huì)和引用表中字段的數(shù)據(jù)進(jìn)行驗(yàn)證,數(shù)據(jù)如果不合法則更新和插入會(huì)失敗,保證數(shù)據(jù)的有效性。

dage表:

xiaodi表:

外鍵設(shè)計(jì)原則:保證兩張表的關(guān)聯(lián)關(guān)系,保證數(shù)據(jù)的一致性。在選擇時(shí),一般在一個(gè)表中時(shí)關(guān)聯(lián)字段,在另外一個(gè)表中是主鍵,則這個(gè)字段建議設(shè)置為外鍵。

2、對(duì)于已經(jīng)存在的字段添加外鍵約束



3、在創(chuàng)建數(shù)據(jù)表時(shí)設(shè)置外鍵約束



4、刪除外鍵約束



十四、索引[了解]

① 編寫SQL ② SQL優(yōu)化(查詢數(shù)據(jù)把查詢時(shí)間縮短)

TB級(jí)別,10s => 0.01s

1、索引概述

索引作用: 快速檢索數(shù)據(jù)(提高查詢效率),InnoDB引擎其底層主要是使用B+ Tree結(jié)構(gòu)

2、普通索引使用

主鍵就是一個(gè)索引,比如百萬條數(shù)據(jù),沒有主鍵索引,查詢可能需要3-5s,如果我們添加了主鍵索引且剛好,要查詢的字段就是主鍵,則可以縮短到零點(diǎn)零幾秒。

備注:主鍵、外鍵、唯一鍵其實(shí)也是索引

  • 創(chuàng)建索引: create index index_cname on category(cname); create index index_cname on category(cname(20));

  • 修改表添加索引: alter table category add index index_cname(cname(20));

  • 查詢索引: show index from category;

  • 刪除索引: drop index index_cname on category;

  • 查看所有庫或者表的索引:



3、唯一索引使用

  • 創(chuàng)建索引



  • 刪除索引


擴(kuò)展:性能監(jiān)測(cè)



4、索引使用注意

  • 索引不是越多越好. 索引使用應(yīng)該注意以下問題:

  • 磁盤空間消耗

  • 創(chuàng)建索引和維護(hù)索引的時(shí)間消耗

  • 經(jīng)常增刪改數(shù)據(jù),索引需要?jiǎng)討B(tài)維護(hù),效率低下。

  • 不經(jīng)常查詢的字段不需要?jiǎng)?chuàng)建索引

  • 大部分值相同的字段不需要?jiǎng)?chuàng)建索引

  • 擴(kuò)展:

  • 開啟mysql時(shí)間檢測(cè): set profiling=1;

  • 查看sql語句執(zhí)行時(shí)間: show profiles;

十五、開窗函數(shù)(mysql 8.0后新的)

1、數(shù)據(jù)準(zhǔn)備


2、開窗函數(shù)使用

  • 格式:

  • partition by :相當(dāng)于分組group by

  • order by :相當(dāng)于前面的order by

  • 使用:


MySQL數(shù)據(jù)庫基礎(chǔ)(三):多表查詢,子查詢,開窗函數(shù)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
玉林市| 买车| 永寿县| 大理市| 山阴县| 丹阳市| 连城县| 灌阳县| 三原县| 河东区| 天台县| 安西县| 桃园市| 北辰区| 兴化市| 和政县| 安阳市| 电白县| 雅江县| 东明县| 龙州县| 清远市| 镇江市| 呼图壁县| 普安县| 通江县| 铁岭市| 丰台区| 浦县| 酒泉市| 出国| 开平市| 南康市| 广汉市| 那曲县| 曲水县| 大同市| 安徽省| 治县。| 驻马店市| 康乐县|