MySQL高級查詢示例詳細(xì)介紹
1.左關(guān)聯(lián)
MySQL中的左關(guān)聯(lián)(Left Join)是一種基于共同列的連接操作,
它將左側(cè)表中的所有行與右側(cè)表中匹配的行結(jié)合在一起,
如果右側(cè)表中沒有匹配的行,則結(jié)果集中右側(cè)表中的所有列將顯示為NULL。
左側(cè)表是指在關(guān)鍵字LEFT JOIN中出現(xiàn)在關(guān)鍵字左側(cè)的表。
下面是一個使用MySQL的LEFT JOIN進(jìn)行連接操作的簡單示例:
假設(shè)我們有兩個表,一個是學(xué)校表(school),包含學(xué)校的ID和名稱:
另一個是年級表(grade),包含年級的ID、學(xué)校ID和年級名稱:
編程目標(biāo):我們可以使用以下代碼來獲取所有學(xué)校及其年級信息:
SELECT school.school_name as "學(xué)校名稱", grade.grade_name as "年級名稱" FROM school LEFT JOIN grade ON school.id = grade.school_id;
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,其中包含所有學(xué)校及其年級信息,
如果學(xué)校沒有年級,則年級名稱將顯示為NULL。
左關(guān)聯(lián)操作確保我們可以獲取所有學(xué)校的信息,即使它們沒有年級數(shù)據(jù)。
2.右關(guān)聯(lián)
MySQL中的右關(guān)聯(lián)(Right Join)是一種基于共同列的連接操作,
它將右側(cè)表中的所有行與左側(cè)表中匹配的行結(jié)合在一起,
如果左側(cè)表中沒有匹配的行,則結(jié)果集中左側(cè)表中的所有列將顯示為NULL。
右側(cè)表是指在關(guān)鍵字RIGHT JOIN中出現(xiàn)在關(guān)鍵字右側(cè)的表。
右關(guān)聯(lián)與左關(guān)聯(lián)的區(qū)別在于哪個表是主表和次要表,
即右關(guān)聯(lián)的主表是右側(cè)表,次要表是左側(cè)表,
而左關(guān)聯(lián)的主表是左側(cè)表,次要表是右側(cè)表。
假設(shè)有兩個表,一個是學(xué)校表(school),包含學(xué)校的ID和名稱,
另一個是年級表(grade),包含年級的ID、學(xué)校ID和年級名稱。
編程目標(biāo):我們可以使用以下代碼來獲取所有學(xué)校及其年級信息:
select school.school_name as "學(xué)校名稱", grade.grade_name as "年級名稱" from school right join grade on school.id = grade.school_id;
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,其中包含所有年級及其所屬學(xué)校信息,
如果年級沒有對應(yīng)的學(xué)校信息,則學(xué)校名稱將顯示為NULL。
右關(guān)聯(lián)操作確保我們可以獲取所有年級的信息,即使它們沒有對應(yīng)的學(xué)校數(shù)據(jù)。
注意:右關(guān)聯(lián)和左關(guān)聯(lián)的區(qū)別在于哪個表是主表和次要表,即
右關(guān)聯(lián)的主表是年級表,次要表是學(xué)校表,
而左關(guān)聯(lián)的主表是學(xué)校表,次要表是年級表。
3.子查詢
MySQL中的子查詢(Subquery)是一種在SELECT語句中使用的嵌套查詢,用于從另一個查詢的結(jié)果集中檢索數(shù)據(jù)。子查詢可以用作WHERE或HAVING語句中的條件,或者用作SELECT語句中的列。子查詢可以返回單個值、一列值或一組行。
現(xiàn)在,我們假設(shè)有兩個表,
一個是學(xué)校表(school),包含學(xué)校的ID和名稱,
另一個是年級表(grade),包含年級的ID、學(xué)校ID和年級名稱。
編程目標(biāo):以下是一個使用子查詢的示例,用于檢索包含特定年級名稱的學(xué)校列表:
SELECT school_name FROM school WHERE id IN ( SELECT school_id FROM grade WHERE grade_name = '三年級' );
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,其中包含所有包含名為"三年級"的年級的學(xué)校的名稱。
子查詢用于獲取包含特定年級的學(xué)校ID,
主查詢用于從學(xué)校表中檢索對應(yīng)的學(xué)校名稱。
另一個示例是使用子查詢和聚合函數(shù)檢索每個學(xué)校的年級數(shù)。
例如,以下查詢使用子查詢和COUNT函數(shù)從"年級表"中獲取每個學(xué)校的年級數(shù),
并將其與"學(xué)校表"中的學(xué)校名稱一起返回:
SELECT school.school_name, (SELECT COUNT(*) FROM grade WHERE grade.school_id = school.school_id) as grade_count FROM school;
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,
其中包含每個學(xué)校的名稱和年級數(shù)。
子查詢在內(nèi)部查詢中使用COUNT函數(shù)從年級表中檢索與學(xué)校ID匹配的行數(shù)。
主查詢用于從學(xué)校表中檢索學(xué)校名稱,并將子查詢返回的年級數(shù)作為附加列一起返回。
4.聯(lián)合查詢
MySQL中的聯(lián)合查詢(UNION)用于將多個SELECT語句的結(jié)果組合成一個結(jié)果集。
每個SELECT語句必須具有相同的列數(shù)和相似的數(shù)據(jù)類型,
而聯(lián)合查詢將自動對結(jié)果進(jìn)行排序和去重。
可以使用UNION ALL來保留重復(fù)的行。
假設(shè)有兩個表,一個是學(xué)校表(school),包含學(xué)校的ID和名稱,
另一個是年級表(grade),包含年級的ID、學(xué)校ID和年級名稱。
以下是一個使用UNION查詢的示例,用于檢索所有學(xué)校的名稱和所有年級的名稱,這些學(xué)校和年級存儲在不同的表中:
SELECT school_name FROM school UNION SELECT grade_name FROM grade;
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,其中包含所有學(xué)校的名稱和所有年級的名稱。UNION操作將自動對結(jié)果集進(jìn)行去重,并按名稱排序。
如果要將學(xué)校和年級的名稱分開,可以使用別名將兩個SELECT語句的結(jié)果列重命名:
SELECT school_name, NULL AS grade_name FROM school UNION SELECT NULL AS school_name, grade_name FROM grade;
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,其中包含學(xué)校名稱和年級名稱的兩個列。
注意,由于兩個表中的名稱列位于不同的位置,因此必須使用NULL作為占位符,以確保SELECT語句中的列數(shù)相同。
5.分組查詢
MySQL中的分組查詢(GROUP BY)用于將查詢結(jié)果按照一個或多個列進(jìn)行分組,并對每個分組應(yīng)用聚合函數(shù)。GROUP BY子句必須跟在SELECT語句之后,并指定要分組的列名稱。
假設(shè)有兩個表,一個是學(xué)校表(school),包含學(xué)校的ID和名稱,
另一個是年級表(grade),包含年級的ID、學(xué)校ID和年級名稱。
以下是一個使用分組查詢的示例,用于檢索每個學(xué)校的年級數(shù):
SELECT school_name, COUNT(g.id) AS grade_count FROM school s LEFT JOIN grade g ON s.id = g.school_id GROUP BY s.id;
運(yùn)行結(jié)果:
這將返回一個結(jié)果集,其中包含每個學(xué)校的名稱和年級數(shù)。
在這個查詢中,使用LEFT JOIN將兩個表連接起來,并使用GROUP BY子句按學(xué)校ID分組。
注意,在GROUP BY子句中使用了學(xué)校表的ID列,而不是名稱列。
使用COUNT函數(shù)計算每個學(xué)校的年級數(shù)。
到此這篇關(guān)于MySQL高級查詢示例詳細(xì)介紹的文章就介紹到這了,更多相關(guān)MySQL高級查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql通過@變量實(shí)現(xiàn)遞歸詳細(xì)實(shí)例
眾所周知目前的mysql版本中并不支持直接的遞歸查詢,下面這篇文章主要給大家介紹了關(guān)于mysql通過@變量實(shí)現(xiàn)遞歸的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06解決bash: mysql: command not found 的方法
解決bash: mysql: command not found 的方法,需要的朋友可以參考一下2013-03-03MySQL獲取binlog的開始時間和結(jié)束時間(最新方法)
這篇文章主要介紹了MySQL如何獲取binlog的開始時間和結(jié)束時間,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05MySQL之select、distinct、limit的使用
這篇文章主要介紹了MySQL之select、distinct、limit的使用,下面文章圍繞select、distinct、limit的相關(guān)資料展開聚集內(nèi)容,需要的朋友可以參考一下2021-11-11