1. 程式人生 > >php連表查詢以及thinkphp連表查詢

php連表查詢以及thinkphp連表查詢

php連表查詢

多表的聯接查詢
 聯接查詢是指涉及兩個或兩個以上的表的查詢,聯接查詢是關係資料庫最主要的查詢。
實現方法:
1) 用WHERE子句實現多表間的聯接查詢
2) 指定聯接型別實現多表間的聯接查詢
3) 使用巢狀查詢實現多表間的聯接查詢

 

內部聯接(INNER JOIN):只有滿足條件的記錄才顯示;
左聯接(LEFT JOIN) :滿足條件的記錄+左邊不滿足條件的都顯示;
右聯接(RIGHT JOIN):滿足條件的記錄+右邊不滿足條件的都顯示;
完全聯接(FULL JOIN) :滿足條件的記錄+左、右邊不滿足條件的都顯示;

 

SQL_SELECT語句的常用格式
   SELECT [ ALL/DISTINCT] <目標列表達式>        
    FROM <[資料庫名!]表名或檢視名> 
    [[INNER/LEFT[OUTER]/[RIGHT[OUTER]/FULL[OUTER]JOIN
    [<[資料庫名!]表名或檢視名>][ON 聯接條件] ]…]
[INTO <輸出結果>]|[TO <檔名>| TO printer| TO screen]
[WHERE <條件表示式> [ AND / OR 條件表示式 ]…]
[GROUP BY<列名11>[,<列名12> …] [HAVING條件表示式]]
[ORDER BY<列名21> [ASC/DESC] [,<列名22>…][ASC/DESC]]

向資料庫表插入資料

INSERT INTO 語句用於向資料庫表新增新記錄。

語法

INSERT INTO table_name
VALUES (value1, value2,....)

您還可以規定希望在其中插入資料的列:

INSERT INTO table_name (column1, column2,...)
VALUES (value1, value2,....)

註釋:SQL 語句對大小寫不敏感。INSERT INTO 與 insert into 相同。

為了讓 PHP 執行該語句,我們必須使用 mysql_query() 函式。該函式用於向 MySQL 連線傳送查詢或命令。

4、刪除重複行
  
Select語句中使用ALL或DISTINCT選項來顯示錶中符合條件的所有行或刪除其中重複的資料行,預設為ALL。使用DISTINCT選項時,對於所有重複的資料行在Select返回的結果集合中只保留一行。

5、限制返回的行數
  
使用TOP n [PERCENT]選項限制返回的資料行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一百分數,指定返回的行數等於總行數的百分之幾。例如:  
Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable

 

6、使用 TOP 和 PERCENT 限制結果集

TOP 子句限制返回到結果集中的行數。

TOP n [PERCENT]

n 指定返回的行數。如果未指定 PERCENT,n 就是返回的行數。如果指定了 PERCENT,n 就是返回的結果集行的百分比,如下所示:

TOP 120 /*Return the top 120 rows of the result set. */
TOP 15 PERCENT /* Return the top 15% of the result set. */.

如果一個 SELECT 語句既包含 TOP 又包含 ORDER BY 子句,那麼返回的行將會從排序後的結果集中選擇。整個結果集按照指定的順序建立並且返回排好序的結果集的前 n 行。

限制結果集大小的另一種方法是在執行一個語句之前執行 SET ROWCOUNT n 語句。SET ROWCOUNT 與 TOP 的不同之處在於:

    • SET ROWCOUNT 限制適用對 ORDER BY 取值後在結果集中生成行。如果指定了 ORDER BY,SELECT 語句將在從某個已根據指定的 ORDER BY 分類進行了排序的值集中選擇 n 行後終止。

    • TOP 子句適用於指定了該子句的單個 SELECT 語句。在執行另一個 SET ROWCOUNT 語句之前,SET ROWCOUNT 會一直有效,例如執行 SET ROWCOUNT 0 將會關閉此選項。

       

(二) FROM子句
  
FROM子句指定Select語句查詢及與查詢相關的表或檢視。在FROM子句中最多可指定256個表或檢視,它們之間用逗號分隔。
  
在FROM子句同時指定多個表或檢視時,如果選擇列表中存在同名列,這時應使用物件名限定這些列所屬的表或檢視。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:

  
  Select username,citytable.cityid
  FROM usertable,citytable
  Where usertable.cityid=citytable.cityid

在FROM子句中可用以下兩種格式為表或檢視指定別名:
  表名 as 別名
  表名 別名

例如上面語句可用表的別名格式表示為:
  Select username,b.cityid
  FROM usertable a,citytable b
  Where a.cityid=b.cityid

Select不僅能從表或檢視中檢索資料,它還能夠從其它查詢語句所返回的結果集合中查詢資料。例如:

  
  Select a.au_fname+a.au_lname
  FROM authors a,titleauthor ta
  (Select title_id,title
  FROM titles
  Where ytd_sales>10000
  ) AS t
  Where a.au_id=ta.au_id
  AND ta.title_id=t.title_id

此例中,將Select返回的結果集合給予一別名t,然後再從中檢索資料。

(三) 使用Where子句設定查詢條件  
Where子句設定查詢條件,過濾掉不需要的資料行。例如下面語句查詢年齡大於20的資料: 
  Select *
  FROM usertable
  Where age>20

Where子句可包括各種條件運算子:
  
  比較運算子(大小比較):>、>=、=、<、<=、<>、!>、!<
  範圍運算子(表示式值是否在指定的範圍):BETWEEN…AND…
  NOT BETWEEN…AND…
  列表運算子(判斷表示式是否為列表中的指定項):IN (項1,項2……)
  NOT IN (項1,項2……)
  模式匹配符(判斷值是否與指定的字元通配格式相符):LIKE、NOT LIKE
  空值判斷符(判斷表示式是否為空):IS NULL、NOT IS NULL
  邏輯運算子(用於多條件的邏輯連線):NOT、AND、OR

1、範圍運算子例:age BETWEEN 10 AND 30相當於age>=10 AND age<=30  
2、列表運算子例:country IN ('Germany','China')  
3、模式匹配符例:常用於模糊查詢,它判斷列值是否與指定的字串格式相匹配。可用於char、varchar、text、ntext、datetime和smalldatetime等型別查詢。

可使用以下通配字元:
  
  百分號%:可匹配任意型別和長度的字元,如果是中文,請使用兩個百分號即%%。
  
  下劃線_:匹配單個任意字元,它常用來限制表示式的字元長度。
  
  方括號[]:指定一個字元、字串或範圍,要求所匹配物件為它們中的任一個。[^]:其取值也[] 相同,但它要求所匹配物件為指定字元以外的任一個字元。
  
例如:
  
  限制以Publishing結尾,使用LIKE '%Publishing'
  
  限制以A開頭:LIKE '[A]%'
  
  限制以A開頭外:LIKE '[^A]%'
  
4、空值判斷符例Where age IS NULL
  
5、邏輯運算子:優先順序為NOT、AND、OR

(四)查詢結果排序 
使用ORDER BY子句對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式為: 
  ORDER BY {column_name [ASC|DESC]} [,…n] 
其中ASC表示升序,為預設值,DESC為降序。ORDER BY不能按ntext、text和image資料型別進行排序。例如:
  Select *
  FROM usertable
  ORDER BY age desc,userid ASC 

另外,可以根據表示式進行排序。

二、 聯合查詢
  
UNION運算子可以將兩個或兩個以上上Select語句的查詢結果集合合併成一個結果集合顯示,即執行聯合查詢。UNION的語法格式為:

  
  select_statement
  UNION [ALL] selectstatement
  [UNION [ALL] selectstatement][…n]

 

其中selectstatement為待聯合的Select查詢語句。
  
ALL選項表示將所有行合併到結果集合中。不指定該項時,被聯合查詢結果集合中的重複行將只保留一行。
  
聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
  
在使用UNION 運算子時,應保證每個聯合查詢語句的選擇列表中有相同數量的表示式,並且每個查詢選擇表示式應具有相同的資料型別,或是可以自動將它們轉換為相同的資料型別。在自動轉換時,對於數值型別,系統將低精度的資料型別轉換為高精度的資料型別。
  
在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括號可以改變這一執行順序。例如:
  
查詢1 UNION (查詢2 UNION 查詢3)

 

索引查詢

CREATE INDEX 語句

建立一個索引

--------------------------------------------------------------------------------

注意:對於非微軟資料庫, Microsoft Jet 資料庫引擎 不支援 CREATE PROCEDURE 或 DDL 語句的使用。

--------------------------------------------------------------------------------

CREATE [ UNIQUE ] INDEX index

ON table (field [ASC|DESC][, field [ASC|DESC], ...])

[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

CREATE INDEX 語句說明:

index: 要建立的索引的名稱。

table: 將包含索引的現有表的名稱。

field :要進行索引的欄位的名稱。若要建立單欄位索引,請在表名後的括號中列出欄位名。若要建立多欄位索引,請列出要包括在索引中的每個欄位的名稱。要建立降序索引,請使用 DESC 保留字 (保留字:一種語言(如 Visual Basic)的一部分。保留字包括語句名稱、預定義函式以及資料型別、方法、運算子和物件。);否則,索引假設為升序。

create index預設建立的是非聚簇索引,索引值可以重複。如果要建立特殊的索引,則需要顯示的寫出關鍵字,如create clustered index建立聚簇索引。create unique index建立唯一索引

thinkphp3連表查詢

M('表名1')
            ->join('表名2 ON 表名1.id= ym_user.id') ->field('表名1.欄位名1,欄位名2,表名2.*') ->order('表名1欄位 or 表名2欄位 desc or asc') ->select();

解釋:

    • M方法為例項化表物件
    • join即為多表聯合查詢的關鍵連線詞,可多個新增
    • field則表示自定義個人需求查詢對應表字段
    • order為排序關鍵詞
    • desc表示按照對應欄位從大到小排序
    • asc表示按照對應欄位從小到大排序
    • select表示查詢關鍵詞 
      thinkphp5連表查詢
    • 根據個人的需求和查詢表的資料進行對應改裝即可完成多表聯合查詢的功能。  

      資料庫提供的鏈式操作方法,可以有效的提高資料存取的程式碼清晰度和開發效率,並且支援所有的CURD操作。

      使用也比較簡單,假如我們現在要查詢一個User表的滿足狀態為1的前10條記錄,並希望按照使用者的建立時間排序 ,程式碼如下:

      Db::table('think_user') ->where('status',1) ->order('create_time') ->limit(10) ->select(); 

      這裡的whereorderlimit方法就被稱之為鏈式操作方法,除了select方法必須放到最後一個外(因為select方法並不是鏈式操作方法),鏈式操作的方法呼叫順序沒有先後,例如,下面的程式碼和上面的等效:

      Db::table('think_user') ->order('create_time') ->limit(10) ->where('status',1) ->select(); 

      其實不僅僅是查詢方法可以使用連貫操作,包括所有的CURD方法都可以使用,例如:

      Db::table('think_user') ->where('id',1) ->field('id,name,email') ->find(); Db::table('think_user') ->where('status',1) ->where('id',1) ->delete(); 

      鏈式操作在完成查詢後會自動清空鏈式操作的所有傳值。簡而言之,鏈式操作的結果不會帶入後面的其它查詢。

      系統支援的鏈式操作方法有:

      連貫操作 作用 支援的引數型別
      where* 用於AND查詢 字串、陣列和物件
      whereOr* 用於OR查詢 字串、陣列和物件
      wheretime* 用於時間日期的快捷查詢 字串
      table 用於定義要操作的資料表名稱 字串和陣列
      alias 用於給當前資料表定義別名 字串
      field* 用於定義要查詢的欄位(支援欄位排除) 字串和陣列
      order* 用於對結果排序 字串和陣列
      limit 用於限制查詢結果數量 字串和數字
      page 用於查詢分頁(內部會轉換成limit) 字串和數字
      group 用於對查詢的group支援 字串
      having 用於對查詢的having支援 字串
      join* 用於對查詢的join支援 字串和陣列
      union* 用於對查詢的union支援 字串、陣列和物件
      view* 用於檢視查詢 字串、陣列
      distinct 用於查詢的distinct支援 布林值
      lock 用於資料庫的鎖機制 布林值
      cache 用於查詢快取 支援多個引數
      relation* 用於關聯查詢 字串
      with* 用於關聯預載入 字串、陣列
      bind* 用於資料繫結操作 陣列或多個引數
      comment 用於SQL註釋 字串
      force 用於資料集的強制索引 字串
      master 用於設定主伺服器讀取資料 布林值
      strict 用於設定是否嚴格檢測欄位名是否存在 布林值
      sequence 用於設定Pgsql的自增序列名 字串
      failException 用於設定沒有查詢到資料是否丟擲異常 布林值
      partition 用於設定分表資訊 陣列 字串

      所有的連貫操作都返回當前的模型例項物件(this),其中帶*標識的表示支援多次呼叫。