日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【MySQL】多表联合查询、连接查询、子查询

發布時間:2023/12/14 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MySQL】多表联合查询、连接查询、子查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 【1】連接查詢
        • 內連接查詢
        • 外連接查詢
          • 左連接
          • 右連接
      • 【2】聯合查詢
      • 【3】子查詢
        • 帶in關鍵字的子查詢
        • 帶比較運算符的子查詢
        • 帶exists的子查詢
        • 帶any關鍵字的子查詢
        • 帶all關鍵字的子查詢

【1】連接查詢

連接查詢的意義: 在用戶查看數據的時候,需要顯示的數據來自多張表.

內連接查詢

內連接查詢是最常見的連接查詢,內連接查詢可以查詢兩張或兩張以上的表

內連接:[inner] join:從左表中取出每一條記錄,去右表中與所有的記錄進行匹配: 匹配必須是某個條件在左表中與右表中相同最終才會保留結果,否則不保留.

基本語法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
on表示連接條件: 條件字段就是代表相同的業務含義(如my_student.c_id和my_class.id)

當兩個表中存在相同意義的字段的時候,就可以通過該字段來連接查詢這兩個表,當該字段的值相同時就可以查出該記錄。

內連接可以沒有連接條件: 沒有on之后的內容,這個時候系統會保留所有結果。

例:

select a.id,a.name,a.sex,b.country,b.city,b.street from student a join addr b on a.addrid=b.addrid;

外連接查詢

以某張表為主,取出里面的所有記錄, 然后每條與另外一張表進行連接: 不管能不能匹配上條件,最終都會保留: 能匹配,正確保留; 不能匹配,其他表的字段都置空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】聯合查詢

聯合查詢
聯合查詢結果是將多個select語句的查詢結果合并到一塊因為在某種情況下需要將幾個select語句查詢的結果合并起來顯示。比如現在需要查詢兩個公司的所有員工的信息,這就需要從甲公司查詢所有員工信息,再從乙公司查詢所有的員工信息,然后將兩次的查詢結果進行合并。
可以使用union和union all關鍵字進行操作

語法格式如下:

select 語句1 union[union 選項] select 語句2 union|[union 選項] select 語句n

其中union選項有兩個選項可選
all:表示無論重復都輸出
distinct: 去重(整個重復)(默認的)

select *from addr union all select *from addr;

select id,addrid from addr union all select id,addrid from student;

聯合查詢只要求字段一樣, 跟數據類型和順序無關

select id,addrid,sex,score from student union all select sex,addrid,id,score from student;


聯合查詢的意義:

  • 查詢同一張表,但是需求不同 如查詢學生信息, 男生身高升序, 女生身高降序
  • 多表查詢: 多張表的結構是完全一樣的,保存的數據(結構)也是一樣的.
  • 聯合查詢order by的使用
    在聯合查詢中: order by不能直接使用(不能出現兩次),需要對查詢語句使用括號才行;

    select *from student where sex="woman" order by score union select *from student where sex="man" order by score;

    這種情況是會報錯的。因為語句中不允許出現兩個order by。

    select *from student where sex="woman" union select *from student where sex="man" order by score;

    如果是上邊這樣只出現一次他的意義就是等合并完成之后再進行排序就沒有任何意義了,因為又把前邊sex分好的類打亂了

    (select *from student where sex="woman" order by score ) union (select *from student where sex="man" order by score;)

    這種方式的目的是為了讓兩個結果集先分別order by,然后再對兩個結果集進行union。但是你會發現這種方式雖然不報錯了,但是兩個order by并沒有產生最后的效果,所以應該改成如下:

    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不能直接出現在union的子句中,但是可以出現在子句的子句中。

    【3】子查詢

    通常我們在查詢的SQL中嵌套查詢,稱為子查詢。子查詢通常會使復雜的查詢變得簡單,但是相關的子查詢要對基礎表的每一條數據都進行子查詢的動作,所以當表單中數據過大時,一定要慎重選擇

    帶in關鍵字的子查詢

    使用in關鍵字可以將原表中特定列的值與子查詢返回的結果集中的值進行比較
    如果某行的特定列的值存在,則在select語句的查詢結果中就包含這一行。

    例:查詢成績大于80的學生的所有信息,
    先在子查詢中查出成績大于80的結果集,然后將原成績表中的成績與結果集進行比較,如果存在,就輸出這條學生的記錄。

    select * from student where score in (select score from student where score>80);

    帶比較運算符的子查詢

    如果可以確認子查詢返回的結果只包含一個單值,那么可以直接使用比較運算符連接子查詢。
    經常使用的比較運算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。

    select * from student where score> (select score from scholarship where dengji=1);

    查詢獎學金等級為1的學生信息

    帶exists的子查詢

    exists: 是否存在的意思, exists子查詢就是用來判斷某些條件是否滿足(跨表),
    exists是接在where之后
    exists返回的結果只有0和1.

    例:如果存在成績大于90的人則列出整個表的記錄

    select * from student where exists (select *from student where score>90);

    帶any關鍵字的子查詢

    any關鍵字表示滿足其中的任意一個條件,使用any關鍵字時,只要滿足內層查詢語句結果的的任意一個,就可以通過該條件來執行外層查詢語句。

    select * from student where addrid<any (select addrid from addr);

    帶all關鍵字的子查詢

    all和any剛好是相反的,all關鍵字表示滿足所有結果,使用all關鍵字,要滿足內層查詢語句的所有結果,才可以通過該條件來執行外層查詢語句。

    select * from student where addrid>all (select addrid from addr);

    總結

    以上是生活随笔為你收集整理的【MySQL】多表联合查询、连接查询、子查询的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。