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();
這里的
where
、order
和limit
方法就被稱之為鏈式操作方法,除了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),其中帶*標識的表示支持多次調用。