【MySQL】多表查询策略(多表联查子查询)
目錄
一、MySQL多表查詢
二、準備工作
1.運行環(huán)境
2.創(chuàng)建公司表
3.創(chuàng)建員工表
三、多表查詢
(一)多表聯(lián)查—同時查詢多張表
1.聯(lián)結(jié)
2.左連接
3.右連接
4.右連接
(二)子查詢
1.SELECT子查詢
2.WHERE子查詢
3.FROM子查詢
總結(jié)
一、MySQL多表查詢
MySQL語句學習的難點和重點就在于多表查詢,同時MySQL也有諸多方法供大家選擇,不論是多表聯(lián)查(聯(lián)結(jié)表、左連接、右連接……)還是子查詢(SELECT子查詢、WHERE子查詢、FROM子查詢),掌握一種方法達到目的即可,當然其他方法也需要理解,本文將闡述完整的多表查詢方法。
首先分享下學習鏈接,大家可以在看完本文后選擇以下鏈接鞏固學習成果,我相信如果都給掌握的話,MySQL語句中80%的問題都將迎刃而解!!
視頻學習鏈接:SQL學習之道_嗶哩嗶哩_bilibili
在線編程鏈接:SQL必知必會__牛客在線編程
二、準備工作
1.運行環(huán)境
本文在MySQL在線運行網(wǎng)址操作,模擬MySQL運行,若大家有條件也可在MySQL或navicat中操作運行
2.創(chuàng)建公司表
以下是創(chuàng)建數(shù)據(jù)表、新增數(shù)據(jù)等基礎(chǔ)操作,這些語句都是固定的,這是創(chuàng)建的第一個表(company表),id為主鍵。
#創(chuàng)建數(shù)據(jù)庫,可忽略,一般用不到 CREATE DATABASE test; use test; #創(chuàng)建數(shù)據(jù)表company CREATE TABLE company (id INT PRIMARY KEY,name VARCHAR(255) NOT NULL ); #新增數(shù)據(jù) INSERT INTO company VALUES(1,'IBM'); INSERT INTO company VALUES(2,'HP'); #單表查詢數(shù)據(jù) SELECT * FROM company;運行結(jié)果:
3.創(chuàng)建員工表
創(chuàng)建第二個表(menber表),增刪改查基礎(chǔ)操作都在下邊了,希望能幫助大家加深對于基礎(chǔ)操作的理解,id為主鍵。
#創(chuàng)建數(shù)據(jù)表menber CREATE TABLE menber(id INT PRIMARY KEY,name VARCHAR(255) NOT NULL,sal DOUBLE(10,2),comid INT ); #新增數(shù)據(jù) INSERT INTO menber VALUES(101,'小李',3000,1); INSERT INTO menber VALUES(102,'小王',4000,1); INSERT INTO menber VALUES(103,'小劉',5000,2); INSERT INTO menber VALUES(104,'小孫',5000,2); INSERT INTO menber VALUES(105,'小明',7000,3); #刪除數(shù)據(jù) DELETE FROM menber WHERE comid = 3; #修改數(shù)據(jù) UPDATE menber SET sal=6000 WHERE id=104; #單表查詢數(shù)據(jù) SELECT * FROM menber;運行結(jié)果:
?注:company表和menber表中的id、name不是一回事,id和conmid是公共列
三、多表查詢
創(chuàng)建完公司表和員工表后就具備進行多表查詢的條件了,主要分為多表聯(lián)查和子查詢兩部分,也是本文的重點。
(一)多表聯(lián)查—同時查詢多張表
本人常用的是聯(lián)結(jié),左右連接、內(nèi)連接一般都能解決問題,只需要添加WHERE條件即可。
1.聯(lián)結(jié)
若查詢n張表,必須查詢指定n-1個公共列的條件
SELECT c.name 公司名, m.name 員工名,m.sal, company公司信息 FROM company c, menber m WHERE c.id = m.comid;應用:查詢IBM的員工信息
SELECT m.* FROM company c, menber m WHERE c.id = m.comid AND c.name = ‘IBM’運行結(jié)果:
拓展:笛卡爾積(A表有m條記錄,B表有n條記錄,結(jié)果m*n條)
SELECT * FROM company, menber運行結(jié)果:
2.左連接
左表是主表、左表中滿足條件的記錄會查詢出來、左表中【不滿足】條件的也會查出來,運行結(jié)果也以左表為主。
SELECT * FROM company c LEFT JOIN menber m ON c.id = m.comid運行結(jié)果:
3.右連接
右表是主表、右表中所有的記錄會查詢出來,運行結(jié)果以右表為主。
SELECT * FROM menber m RIGHT JOIN company c ON c.id = m.comid運行結(jié)果:
4.右連接
查詢的是滿足條件的記錄
SELECT * FROM menber m INNER JOIN company c ON c.id = m.comid運行結(jié)果:
(二)子查詢
把一個查詢的結(jié)果當作另一個查詢的條件,可以說是一步步解決問題,較符合邏輯。
應用:查詢小劉的公司名? #HP
1.SELECT子查詢
SELECT (SELECT name from company WHERE id =conid) FROM menber WHERE name = '小劉'邏輯:先取menber表這一列包含小劉的數(shù)據(jù),再對該行數(shù)據(jù)進行聯(lián)結(jié)
?左:menber表,右:company表
運行結(jié)果:
2.WHERE子查詢
SELECT name FROM company WHERE id = (SELECT comid FROM menber WHERE name = '小劉')WHERE子查詢相比前一個邏輯更為簡單,先在menber表中找出小劉的comid,由于menber表的comid和company的id是公共列,可直接用于company表的查詢。
運行結(jié)果:
3.FROM子查詢
用于3張表以上的連接查詢較多,有A、B、C三張表,先查詢A和B兩張表、再用查詢結(jié)果和c表連接查詢,select子查詢和where子查詢是把子查詢的結(jié)果當成【數(shù)據(jù)】,from子查詢是把查詢結(jié)果當成【表】
SELECT c.name FROM (SELECT * FROM menber WHERE name = '小劉') t1,company c WHERE t1.comid = c.id運行結(jié)果:
總結(jié)
大家如果有疑問都可以評論提出,有不足之處請大家批評指正,希望能多結(jié)識這方面的朋友,共同學習、共同進步。
總結(jié)
以上是生活随笔為你收集整理的【MySQL】多表查询策略(多表联查子查询)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【工赋开发者社区】产业互联网和工业互联网
- 下一篇: linux cmake编译源码,linu