<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在SQL開發當中,多表聯查是絕對繞不開的一種技能。同樣的查詢結果不同的寫法其執行效率也是千差萬別。
在實際開發當中,我見過(好像還寫過~)不少又長又臭的查詢SQL,資料量一上來查個十幾分鍾那是家常便飯。
因此,深入理解SQL的多表查詢機制,少寫一些慢查詢,應該可以少挨點罵。
等值連線是在多表查詢中最基礎,也最簡單的一種,其值為所有滿足條件的笛卡爾積。
在from後面,哪個表寫在前面結果中哪個表的值就先出現,
如下:
select * from student, family where student.family_id = family.id;
等值連線查詢結果:
阿里在最新發布的Java開發手冊中強制要求,只要涉及多個表,必須在列名前加表的別名(或表名)進行限定
非等值連線是通過a表中的值在b表中的某一個範圍來進行的,能夠很好的滿足預設定好的分段統計需求。
非等值連線有兩種寫法,使用between...and...
或大於號小於號
第一種寫法:使用between...and...
select a.discipline_name, a.score, b.grade_tag from achievement a, achievement_grade b where a.score between b.lowest_score and b.highest_score;
第二種寫法:使用>=
或<=
select a.discipline_name, a.score, b.grade_tag from achievement a, achievement_grade b where a.score >= b.lowest_score and a.score <= b.highest_score;
非等值連線查詢結果:
自連線,顧名思義就是同一張表自己跟自己連線,為了區分需要給表取不同的別名。如一張成績表,需要查詢所有分數比“語文”高的資料:
分數表:
若不使用自連線,需要先通過查詢語文的分數,然後再查詢大於這個分數的資料。
具體可以按如下步驟進行查詢:
-- 先查詢語文的分數 select score from achievement where discipline_name = '語文'; -- 再查詢分數比語文分數更高的資料 select * from achievement where score > 76;
而使用自連線,則可以在一條sq語句裡完成查詢:
select a.* from achievement a, achievement b where b.discipline_name = '語文' and a.score > b.score;
自連線查詢結果:
除自連線外,其他的都叫非自連線~~~
內連線和外連線的區分本質上是另一種分類方法,如內連線就是等值連線。
行 ,這種連線稱為左(或右) 外連線。沒有匹配的行時, 結果表中相應的列為空(NULL)。
測試用學生表student和家庭表family資料如下:
學生表資料:
家庭表資料:
-- 查出student中的所有資料,不滿足的顯示為null -- 這裡student在前面 select a.* from student a left join family b on a.family_id = b.id
左外連線查詢結果:
-- 查出student中的所有資料,不滿足的顯示為null -- 這裡student在後面 select a.* from family b right join student a on b.id = a.family_id;
右外連線查詢結果:
很遺憾,MySQL不支援全外連線。
-- auto-generated definition create table student ( id int auto_increment primary key, student_id int null comment '學號', student_name varchar(40) null comment '姓名', family_id int null comment '家庭ID', create_time datetime default CURRENT_TIMESTAMP null comment '建立時間' ) comment '學生表'; create table family ( id int auto_increment primary key, family_name varchar(40) null comment '家庭名稱', family_address varchar(40) null comment '家庭地址', create_time datetime default CURRENT_TIMESTAMP null comment '建立時間' ) comment '家庭表'; create table achievement ( id int auto_increment primary key, score int null comment '分數', discipline_name varchar(40) null comment '學科名稱', student_id int null comment '學號' ) comment '成績表'; create table achievement_grade ( id int auto_increment primary key, grade_tag varchar(10) null comment '檔次', lowest_score int null comment '最低分', highest_score int null comment '最高分', create_time datetime default CURRENT_TIMESTAMP null comment '建立時間' ) comment '分數檔次表'; INSERT INTO achievement_grade (id, grade_tag, lowest_score, highest_score, create_time) VALUES (1, '不及格', 0, 60, '2022-03-02 11:44:01'); INSERT INTO achievement_grade (id, grade_tag, lowest_score, highest_score, create_time) VALUES (2, '良好', 60, 80, '2022-03-02 11:44:01'); INSERT INTO achievement_grade (id, grade_tag, lowest_score, highest_score, create_time) VALUES (3, '優秀', 80, 100, '2022-03-02 11:44:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (1, 1, '張三', 1, '2022-03-02 09:55:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (2, 2, '李四', 2, '2022-03-02 09:55:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (3, 3, '王五', 3, '2022-03-02 09:55:01'); INSERT INTO student (id, student_id, student_name, family_id, create_time) VALUES (4, 4, '高飛', null, '2022-03-02 19:45:14'); INSERT INTO family (id, family_name, family_address, create_time) VALUES (1, '張三家', '北京', '2022-03-02 09:54:13'); INSERT INTO family (id, family_name, family_address, create_time) VALUES (2, '李四家', '上海', '2022-03-02 09:54:13'); INSERT INTO family (id, family_name, family_address, create_time) VALUES (3, '王五家', '西伯利亞', '2022-03-02 09:54:13'); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (1, 76, '語文', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (2, 80, '數學', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (3, 65, '英語', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (4, 98, '地理', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (5, 77, '歷史', 1); INSERT INTO achievement (id, score, discipline_name, student_id) VALUES (6, 69, '生物', 1);
到此這篇關於MySQL多表查詢機制的文章就介紹到這了,更多相關MySQL多表查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45