1. 程式人生 > >MySQL(九)之數據表的查詢詳解(SELECT語法)二

MySQL(九)之數據表的查詢詳解(SELECT語法)二

clas reg 3.2 查詢語句 我們 lin where 過濾 情況

上一篇講了比較簡單的單表查詢以及MySQL的組函數,這一篇給大家分享一點比較難得知識了,關於多表查詢,子查詢,左連接,外連接等等。希望大家能都得到幫助!

在開始之前因為要多表查詢,所以搭建好環境:

  1)創建數據表suppliers

  前面已經有一張表是book表,我們在建立一張suppliers(供應商)表和前面的book表對應。

  也就是說 讓book中s_id字段值指向suppliers的主鍵值,創建一個外鍵約束關系。

  技術分享

  其實這裏並沒有達到真正的外鍵約束關系,只是模擬,讓fruits中的s_id中的值 能匹配到 suppliers 中的主鍵值,通過手動添加這種數據,來達到這種關系。

  反正是死數據,也不在添加別的數據,就不用建立外鍵約束關系了,這裏要搞清楚。

  2)插入數據

   技術分享

一、多表查詢

  1.1、取別名

    1)為表取別名

      因為是對兩張表進行查詢了,那麽每次寫表名的話就有點麻煩,所以用一個簡單別名來代表表名

      格式:表名 AS 別名

    2)為字段取別名

      給字段名取別名的原因是有些字段名是為了顯示更加清楚

      舉例:select b_price as ‘價格‘ from book;

      技術分享

  1.2、普通雙表查詢

    需求:查詢書的編號、書的名字、書的批發商編號、書的批發商名字

    分析:看下要求,就知道要查詢兩張表,如果需要查詢兩張表,那麽兩張表的關系必定是外鍵關系,或者類似於外鍵關系(類似於也就是說兩張表並沒有真正加外鍵約束,

       但是其特點和外鍵是一樣的,就像上面我們手動創建的兩張表一樣,雖然沒有設置外鍵關聯關系,但是其特性跟外鍵關系是一樣的。)    

select b.b_id,b.b_name,s.s_id,s.s_name from book as b,suppliers as s where b.s_id=s.s_id;

      技術分享

      註意:第一個執行的是FROM,所以上面為表取別名,在語句的任何地方的可以使用

  1.3、內連接查詢

    了解了上面的兩張表基本的連接查詢後,內連接查詢就很簡單了,因為內連接跟上面的作用是一樣的,唯一的區別就是語法的不一樣。

    格式:表名 INNER JOIN 表名 ON 連接條件

      需求::查詢書的編號、書的名字、書的批發商編號、書的批發商名字(這個和上面的一樣,我們看一下語法上有什麽不一樣的)

      select b.b_id,b.b_price,s.s_id,s.s_name from book as b inner join suppliers as s on b.s_id=s.s_id;

      技術分享

    其實還有一種自然連接:涉及到的兩張表都是同一張表。

      舉例:查看書id為g2的供應商供應的其他書?

       select b2.b_id,b2.b_name from book as b1 inner join book as b2 on b1.s_id=b2.s_id and b1.b_id=‘g2‘;

       技術分享

      分析:把book表分開看成是兩張完全一樣的表,在b1表中找到b_id=‘g2‘的s_id,然後到b2這張表中去查找和該s_id相等的記錄,也就查詢出來了問題所需要的結果。

          還有另一種方法,不用內連接查詢,通過子查詢也可以做到,下面會講解,這裏先給出答案,到時可以回過頭來看看這個題。

         select b_id,b_name from book where s_id=(select s_id from book where b_id=‘g2‘); 

        技術分享結果和上面的一樣

  1.4、外連接查詢

    內連接是將符合查詢條件(符合連接條件)的行返回,也就是相關聯的行就返回

    外連接除了返回相關聯的行之外,將沒有關聯的行也會顯示出來

    為什麽需要將不沒關聯的行也顯示出來呢?這就要根據不同的業務需求了,就比如,order和customers,顧客可以有訂單也可以沒訂單,現在需要知道所有顧客的下單情況,而我們不能夠只查詢出有訂單的用戶,

    而把沒訂單的用戶丟在一邊不顯示,這個就跟我們的業務需求不相符了,有人說,既然知道了有訂單的顧客,通過單表查詢出來不包含這些有訂單顧客,不就能達到我們的要求嗎,這樣是可以,但是很麻煩,如何能夠將其一起顯示並且不那麽麻煩呢?為了解決這個問題,就有了外連接查詢這個東西了。

  1.4.1、左外連接

    格式: 表名 LEFT JOIN 表名 ON 條件;

    返回包括左表中的所有記錄右表中連接字段相等的記錄,通俗點講,就是除了顯示相關聯的行,還會將左表中的所有記錄行度顯示出來。

    簡單的說:連接兩張表,查詢結果包含左邊表的所有數據以及右邊表和左邊表有關系的數據

      實例:為了演示我們的效果我們給suppliers添加兩條數據

      技術分享

    select s.s_id,s.s_name,b.b_id,b.b_name

        from suppliers as s left join book as b

        on s.s_id=b.s_id;

    技術分享

    分析:suppliers表是在LEFT JOIN的左邊,所以將其中所有記錄度顯示出來了,有關聯項的,也有沒有關聯項的。這就是左外連接的意思,將左邊的表所有記錄都顯示出來(前提是按照我們所需要的字段,

          也就是SELECT 後面所選擇的字段)。如果將suppliers表放LEFT JOIN的右邊,那麽就不會在顯示80和90這兩條記錄了。來看看

      技術分享

  1.4.2、右外連接

    格式: 表名 RIGHT JOIN 表名 ON 條件

    返回包括右表中的所有記錄和右表中連接字段相等的記錄。其實跟左外連接差不多,就是將右邊的表給全部顯示出來

    技術分享

  1.5、復合條件查詢

    在連接查詢(內連接、外連接)的過程中,通過添加過濾條件,限制查詢的結果,使查詢的結果更加準確,通俗點講,就是將連接查詢時的條件更加細化。

    1)在book和suppliers表中使用INNER JOIN語法查詢suppliers表中s_id為70的供應商的供貨信息?

      select s.s_id,s.s_name,b.b_id,b.b_name

         from book as b inner join suppliers as s

        on s.s_id=b.s_id and s.s_id=70;

      技術分享

    2)在fruits表和suppliers表之間,使用INNER JOIN語法進行內連接查詢,並對查詢結果進行排序

      select s.s_id,s.s_name,b.b_id,b.b_name

         from book as b inner join suppliers as s

         on s.s_id=b.s_id order by b.s_id; //對b.s_id進行升序。默認的是ASC,所以不用寫。

      技術分享

二、子查詢

  子查詢,將查詢一張表得到的結果來充當另一個查詢的條件,這樣嵌套的查詢就稱為子查詢。

  搭建環境:

    表tb1:技術分享 表tb2:技術分享

  2.1、帶ANY、SOME、ALL關鍵字的子查詢

    技術分享

    1)ANY關鍵字接在一個比較操作符的後面,表示若與子查詢返回的任何值比較為TRUE,則返回TRUE,通俗點講,只要滿足任意一個條件,就返回TRUE

      SOME關鍵字和ANY關鍵字的用法一樣,作用也相同

      實例:select num1 from tb1 where num1> any(select num2 from tb2);  //這裏就是將在tb2表中查詢的結果放在前一個查詢語句中充當條件參數。只要num1大於其結果中的任意一個數,那麽就算匹配。

      技術分享

    2)ALL關鍵字表示需要同時滿足所有條件

     select num1 from tb1 where num1> all(select num2 from tb2); //num1需要大於所有的查詢結果才算匹配 

        技術分享

  2.2、帶EXISTS關鍵字查詢

    EXISTS關鍵字後面的參數是任意一個子查詢,如果子查詢有返回記錄行,則為TRUE,外層查詢語句將會進行查詢,如果子查詢沒有返回任何記錄行,則為FALSE,外層查詢語句將不會進行查詢。

    技術分享

  2.3、帶比較運算符的子查詢

    除了使用關鍵字ALL、ANY、SOME等之外,還可以使用普通的比較運算符。來進行比較。比如我們上面講解內連接查詢的時候,就用過子查詢語句,並且還是用的=這個比較運算符。

三、合並查詢

  3.1、UNION關鍵字

   合並結果集,將多個結果集拼接在一起。合並的時候只關註列數相同,不關註數據類型。但是在沒有特殊需求的情況下最好不要將數據類型不同的列進行合並

    當數據類型不同的情況下進行合並時,合並之後列的數據類型是varchar類型。在合並的時候會消除重復的行,不消除重復的行,可使用union all。

   利用UNION關鍵字,可以將查詢出的結果合並到一張結果集中,也就是通過UNION關鍵字將多條SELECT語句連接起來,註意,合並結果集,只是增加了表中的記錄,並不是將表中的字段增加,僅僅是將記錄行合並到一起。其顯示的字段應該是相同的,不然不能合並

  3.2、UNION[ALL]的使用

     UNION:不使用關鍵字ALL,執行的時候會刪除重復的記錄,所有返回的行度是唯一的,

     UNION ALL:不刪除重復航也不對結果進行自動排序。

      格式:

         SELECT 字段名,... FROM 表名

         UNION[ALL]

         SELECT 字段名,... FROM 表名

  3.3、實例

      1)查詢書價小於50,查詢s_id為50或70的書的信息,使用union

      技術分享

      使用UNION,而不用UNION ALL的話,重復的記錄就會被刪除掉。

四、使用正則表達式查詢

  使用REGEXP關鍵字來指定正則表達式,畫一張表格,就能將下面所有的度覆蓋掉。

  技術分享

  1)查詢一特定字符開頭或字符串開頭的記錄

    select * from book where b_name REGEXP ‘^j‘; //以j開頭的記錄

      技術分享

    註意:唯一的差別就在正則表達式不一樣,一般使用這種模糊查詢,使用MySQL中的‘_‘和‘%‘就已經足夠了。

  2)查詢以特定字符或字符串結尾的記錄

  3)用符號"."來替代字符串中的任意一個字符

  4)使用"*"和"+"來匹配多個字符

  5)匹配指定字符串

  6)匹配指定字符中的任意一個

  7)匹配指定字符以外的字符

  8)使用{n,}或者{n,m}來指定字符串連續出現的次數

覺得不錯的大佬點個“”推薦“”哦!

MySQL(九)之數據表的查詢詳解(SELECT語法)二