MySQL多表聯(lián)合查詢、連接查詢、子查詢的實(shí)現(xiàn)
【1】連接查詢
連接查詢的意義: 在用戶查看數(shù)據(jù)的時候,需要顯示的數(shù)據(jù)來自多張表.
內(nèi)連接查詢
內(nèi)連接查詢是最常見的連接查詢,內(nèi)連接查詢可以查詢兩張或兩張以上的表
內(nèi)連接:[inner] join:從左表中取出每一條記錄,去右表中與所有的記錄進(jìn)行匹配: 匹配必須是某個條件在左表中與右表中相同最終才會保留結(jié)果,否則不保留.
基本語法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;on表示連接條件: 條件字段就是代表相同的業(yè)務(wù)含義(如my_student.c_id和my_class.id)
當(dāng)兩個表中存在相同意義的字段的時候,就可以通過該字段來連接查詢這兩個表,當(dāng)該字段的值相同時就可以查出該記錄。
內(nèi)連接可以沒有連接條件: 沒有on之后的內(nèi)容,這個時候系統(tǒng)會保留所有結(jié)果。
例:
select a.id,a.name,a.sex,b.country,b.city,b.street from student a join addr b on a.addrid=b.addrid;
外連接查詢
以某張表為主,取出里面的所有記錄, 然后每條與另外一張表進(jìn)行連接: 不管能不能匹配上條件,最終都會保留: 能匹配,正確保留; 不能匹配,其他表的字段都置空NULL。
左連接
left join: 左外連接(左連接), 以左表為主表基本語法: from 左表 left join 右表 on 左表.字段 = 右表.字段;
左表不管能不能匹配上條件,最終都會保留:能匹配,正確的保留; 若不能匹配,右表的字段都置NULL。
例:
select a.id,a.name,a.addrid,b.country,b.city from student a left join addr b on a.addrid=b.addrid;
右連接
right join: 右外連接(右連接), 以右表為主表基本語法: from 左表 right join 右表 on 左表.字段 = 右表.字段;右表不管能不能匹配上條件,最終都會保留:能匹配,正確的保留; 若不能匹配,左表的字段都置NULL。
例:
select a.id,a.name,a.addrid,b.country,b.city from student a right join addr b on a.addrid=b.addrid;
【2】聯(lián)合查詢
聯(lián)合查詢聯(lián)合查詢結(jié)果是將多個select語句的查詢結(jié)果合并到一塊因?yàn)樵谀撤N情況下需要將幾個select語句查詢的結(jié)果合并起來顯示。比如現(xiàn)在需要查詢兩個公司的所有員工的信息,這就需要從甲公司查詢所有員工信息,再從乙公司查詢所有的員工信息,然后將兩次的查詢結(jié)果進(jìn)行合并。可以使用union和union all關(guān)鍵字進(jìn)行操作
語法格式如下:
select 語句1 union[union 選項(xiàng)] select 語句2 union|[union 選項(xiàng)] select 語句n
其中union選項(xiàng)有兩個選項(xiàng)可選
- all:表示無論重復(fù)都輸出
- distinct: 去重(整個重復(fù))(默認(rèn)的)
select *from addr union all select *from addr;
select id,addrid from addr union all select id,addrid from student;
聯(lián)合查詢只要求字段一樣, 跟數(shù)據(jù)類型和順序無關(guān)
select id,addrid,sex,score from student union all select sex,addrid,id,score from student;
聯(lián)合查詢的意義:
- 查詢同一張表,但是需求不同 如查詢學(xué)生信息, 男生身高升序, 女生身高降序
- 多表查詢: 多張表的結(jié)構(gòu)是完全一樣的,保存的數(shù)據(jù)(結(jié)構(gòu))也是一樣的.
聯(lián)合查詢order by的使用
在聯(lián)合查詢中: order by不能直接使用(不能出現(xiàn)兩次),需要對查詢語句使用括號才行;
select *from student where sex="woman" order by score union select *from student where sex="man" order by score;
這種情況是會報(bào)錯的。因?yàn)檎Z句中不允許出現(xiàn)兩個order by。
select *from student where sex="woman" union select *from student where sex="man" order by score;
如果是上邊這樣只出現(xiàn)一次他的意義就是等合并完成之后再進(jìn)行排序就沒有任何意義了,因?yàn)橛职亚斑卻ex分好的類打亂了
(select *from student where sex="woman" order by score ) union (select *from student where sex="man" order by score;)
這種方式的目的是為了讓兩個結(jié)果集先分別order by,然后再對兩個結(jié)果集進(jìn)行union。但是你會發(fā)現(xiàn)這種方式雖然不報(bào)錯了,但是兩個order by并沒有產(chǎn)生最后的效果,所以應(yīng)該改成如下:
select *from (select *from student where sex="woman" order by score)student union select *from (select *from student where sex="man" order by score)student ;
也就是說,order by不能直接出現(xiàn)在union的子句中,但是可以出現(xiàn)在子句的子句中。
【3】子查詢
通常我們在查詢的SQL中嵌套查詢,稱為子查詢。子查詢通常會使復(fù)雜的查詢變得簡單,但是相關(guān)的子查詢要對基礎(chǔ)表的每一條數(shù)據(jù)都進(jìn)行子查詢的動作,所以當(dāng)表單中數(shù)據(jù)過大時,一定要慎重選擇
帶in關(guān)鍵字的子查詢
使用in關(guān)鍵字可以將原表中特定列的值與子查詢返回的結(jié)果集中的值進(jìn)行比較如果某行的特定列的值存在,則在select語句的查詢結(jié)果中就包含這一行。
例:查詢成績大于80的學(xué)生的所有信息,先在子查詢中查出成績大于80的結(jié)果集,然后將原成績表中的成績與結(jié)果集進(jìn)行比較,如果存在,就輸出這條學(xué)生的記錄。
select * from student where score in (select score from student where score>80);
帶比較運(yùn)算符的子查詢
如果可以確認(rèn)子查詢返回的結(jié)果只包含一個單值,那么可以直接使用比較運(yùn)算符連接子查詢。經(jīng)常使用的比較運(yùn)算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。
select * from student where score> (select score from scholarship where dengji=1);
查詢獎學(xué)金等級為1的學(xué)生信息
帶exists的子查詢
exists: 是否存在的意思, exists子查詢就是用來判斷某些條件是否滿足(跨表),exists是接在where之后exists返回的結(jié)果只有0和1.
例:如果存在成績大于90的人則列出整個表的記錄
select * from student where exists (select *from student where score>90);
帶any關(guān)鍵字的子查詢
any關(guān)鍵字表示滿足其中的任意一個條件,使用any關(guān)鍵字時,只要滿足內(nèi)層查詢語句結(jié)果的的任意一個,就可以通過該條件來執(zhí)行外層查詢語句。
select * from student where addrid<any (select addrid from addr);
帶all關(guān)鍵字的子查詢
all和any剛好是相反的,all關(guān)鍵字表示滿足所有結(jié)果,使用all關(guān)鍵字,要滿足內(nèi)層查詢語句的所有結(jié)果,才可以通過該條件來執(zhí)行外層查詢語句。
select * from student where addrid>all (select addrid from addr);
到此這篇關(guān)于MySQL多表聯(lián)合查詢、連接查詢、子查詢的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL多表聯(lián)合查詢、連接查詢、子查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL內(nèi)存使用率高且不釋放問題排查與總結(jié)
這篇文章主要給大家介紹了MySQL內(nèi)存使用率高且不釋放問題排查與總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下2024-09-09windows10+mysql8.0.11zip安裝教程詳解
這篇文章主要介紹了windows10+mysql8.0.11zip安裝教程詳解,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05一文學(xué)習(xí)MySQL?意向共享鎖、意向排他鎖、死鎖
這篇文章主要介紹了MySQL?意向共享鎖、意向排他鎖、死鎖,包括InnoDB表級鎖,意向共享鎖和意向排他鎖及操作方法,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03mysql 開發(fā)技巧之JOIN 更新和數(shù)據(jù)查重/去重
這篇文章主要介紹了mysql 開發(fā)技巧之JOIN 更新和數(shù)據(jù)查重/去重的相關(guān)資料,需要的朋友可以參考下2016-09-09