mysql高級查詢技巧一二

原帖地址:http://www.cnblogs.com/phpinfo/archive/2013/01/07/2848483.html

在第二個項目中由於組長一開始數據庫設計的時候沒有照顧到功能的實現,所以後期的功能邏輯出現了很大的難度,不過倒也鍛鍊了自己的數據庫查詢技巧,這裏總結一下數據查詢的一些知識

1,關聯查詢

  關聯查詢分爲內連接(inner join或者join)只返回兩個表中連接字段相等的行

            內連接連接兩表的例子:

                select * from 表1 inner join 表2 on 表1.字段號=表2.字段號

            內連接連接三表的例子:

                select * from (表1 inner join 表2 on 表1.字段號=表2.字段號) inner join 表3 on

                                            表1.字段號=表3.字段號

            內連接四表的例子:

                select * from ((表1 inner join 表2 on 表1.字段號=表2.字段號)inner join 表3 on

                      表1.字段號=表3.字段號)inner join 表4 on 表1.字段號=表4.字段號

            類似查詢最好使用數字字段,其查詢的字段必須是主鍵,自動增長類型。否則很難成功,內連接還

             可以增加where字句來縮小範圍

 

        左連接(left join)返回左表中所有記錄和右表中連接字段相等的記錄

            如果兩個表中字段並不完全一一對應,想要那些沒有對應的字段也顯示出來就可以使用左連接和

            右連接查詢,一個是包括左邊所有,一個是包括右邊所有罷了

            左連接兩表的例子:

                select * from 表1 left join 表2 on 表.字段號=表2.字段號;

            左連接三表查詢的例子:

                select * from 表1 left join 表2 on 表1.字段號=表2.字段號 left join 表3 on

                        表2.字段號=表3.字段號

        右連接(right join)返回右表中所有記錄和左表中連接字段相等的記錄,語法與左連接同,這裏就不再舉例。另外還有全連接,是將左右兩表中沒有相關性的記錄都選出來。

        自連接左連接右連接還可以用於同一張表中,稱爲自連接,這中用法一般用於表中有層級關係的數據,例如部門表,有部門id,部門名稱,上級部門id。爲了查詢部門名稱和

            所有上級部門名稱,可以這樣查詢

                select 部門名,上級部門名 from 部門表 別名1 left join 部門表 別名2

                            on 別名1.部門id=別名2.上級部門id

2,嵌套查詢

  在一個SELECT 語句的WHERE 子句或HAVING 子句中嵌套另一個SELECT 語句的查詢稱爲嵌套查詢,被嵌套的稱爲子查詢,子查詢還可以嵌套。

        簡單嵌套查詢的例子:

                 select 單價表.客戶, 單價表.產品名, 單價表.單價 from 單價表  where 單價表.產品名 

                    = (select  產品表.產品名 from 產品表 where 產品表.產品ID =  "102-5000")  

                  查詢得到單價表裏滿足產品名爲產品表裏產品ID爲“102-5000”的產品的相關信息

        帶in字句的嵌套查詢:

                 select 僱員表.僱員編號, 僱員表.姓名, 僱員表.職位, 僱員表.薪水 from 僱員表 

                          where 薪水 in (select  薪水 from  僱員表 where 姓名='張三')  

                 查詢得到僱員表裏滿足薪水符合姓名爲張三的薪水的所有僱員的相關信息,比如

                 in(1000,1500,2000)表示薪水=1000或1500或2000的情況。注:此語句完成的查詢薪水和張三相等的職員

        帶any的嵌套查詢:

                 select 僱員表.僱員編號,僱員表.姓名, 僱員表.職務, 僱員表.薪水 from 僱員表 

                      where 薪水> any (select 薪水 from 僱員表 where 職務=‘工程師’)

                  查詢得到薪水比職務爲工程師的薪水要高的職員信息。例如子查詢結果爲(2000,1500,1000)

 3,分組查詢

   在select 語句中可以使用group by 子句將行劃分成較小的組,然後,使用聚組函數返回每一個組的彙總信息,另外,可以使用having子句 限制返回的結果集。
   在帶有group by 子句的查詢語句中,在select 列表中指定的列要麼是group by 子句中指定的列,要麼包含聚組函數 where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚組函數
      select max(sal),job emp group by job; 
   查詢語句的select 和group by ,having 子句是聚組函數唯一出現的地方,在where 子句中不能使用聚組函數。 
      select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno; 

   在使用group by 時,有一個規則需要遵守,即出現在select列表中的字段,如果沒有在組函數中,那麼必須出現在group by 子句中。(select中的字段不可以單獨出現,必須出現在group語句中或者在組函數中。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章