程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

mysql進階1

編輯:MySQL綜合教程

在我們用php處理數據的時候總會遇到些比較麻煩的事情,比如:兩個二維數組,一個裝的是文章分類表內容,一個裝的是文章列表,有關聯字段,完全等值,要求在列表文章的時候同時能在標題的前面顯示欄目名稱,此時循環文章列表,在循環中再次循環欄目列表,對比關聯字段,相同的就是這篇文章所在的欄目了,取其名稱顯示,這是php的做法,如果文章比較多,或者欄目較多,比如100篇文章有100個欄目,循環的數量將是一萬次,這個時候呢其實可以用mysql自己進行計算的,這種做法是雙表聯查,基本語法如下:

Select表1.字段,表2.字段 from 表1,表2 where 表1.關聯字段=表2.關聯字段,做個測試自行建如下表:

欄目表結構menu

tid int(10)

name varchar(32)

 

文章表結構article

wid int(10)

tid int(10)

title varchar(100)

content text

執行下面語句:

 SELECT `menu`.`name`, `article`.`id`,`article`.`title` 

FROM `article`,`menu` 

WHERE `article`.`tid` = `menu`.`tid`

 

我只顯示了欄目名稱,文章的ID 和 標題 ,如果是取這個結果輸出的話。。那就省事了。一次循環就可以了。

結果如上圖。

在php運算量大的時候把一些運算交給mysql處理會大大減少php的工作量,數據量大的時候mysql會明顯快點的,除了雙表聯查,mysql還提供了另外的一種做法叫做對照查詢,語法如下:

SELECT 表1.字段, 表2字段

FROM 表1

LEFT JOIN 表2 ON 表1.關聯字段 = 表2.關聯字段

在此使用了

LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。

在此使用的原理和上面的完全不同

原理是:對照查詢,是以其中一表為基准。若是right則是表2為基准

而雙表聯查:則是按兩張表的數據能關聯上的時候。才視為符合查詢條件。

如果用 inner join 那和雙表聯查的結果基本上一致了。

如果我們做的一個商城運營到一段時間後老板想知道有多少實際交易及每個用戶的交易額,知道產生多少交易select count(*) from 表名但是知道多少個用戶交易過,就不好算了,每個用戶又分別交易多少筆呢,這個時候可以使用分組功能,關鍵字為group by拿之前的表測試下我們想知道每個欄目下分別有多少篇文章相當於每個用戶分別產生了多少筆交易,

select `tid`,count(*) from `article` GROUP BY `tid`

分組查詢,相當於把數據庫中的指定字段,相同的數據疊在一起。 這個時候使用 count 的話,返回的不是一共有多少組。而是每一組有多少條數據。

如果我們手上有幾篇文章的 id,如果我們手上有幾篇文章的 id,比如,我們現在手上有 3 6 9 三個 id

按剛才的文章表。應該怎麼查呢。 才能讓它們出現在一個結果裡。

估計有人會想到這個吧

select * from `article` where `wid`=3 or `wid`=6 or `wid` = 9

如果是這樣的話,又會存在一個新的問題,對於 PHP 來說,要寫很多 or  這個時候用in再合適不過,

in 語法格式

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

如果要查的值不是很多的話,用這種方式,是很省事的。 如果你要查的值,數據是成千上萬級的。那就是另一回事。。子查詢。

我先來做個假設,如果我們手上有幾千個會員,我只想看前20個人的交易記錄。 此時可以用對照查詢,

我們查詢用戶表的語句大概會是這樣子。

select * from `user` where `vip` = 1

比如交易表名叫 shop 購物表,兩張表都有 username 字段對應。 我們就可以用子查詢。把第一個查詢結果假設為一張表, 假定為表  vip

如果用剛才的對照查詢。語法會是這樣

select *     //返回所有字段

from `shop`  //從交易表查

right join `vip`  //以右邊,也就是 VIP表為准

on `vip`.`username` = `shop`.`username` 因為只要 vip 用戶的交易記錄。所以,左表 shop 的數據,有些是不要的。當然是以右表為准。

select * from `user` where `vip` = 1

 

右表是這條語句的查詢結果

select * 

from `shop`

right join 

  (select * from `user` where `vip` = 1) as `vip`

on `vip`.`username` = `shop`.`username`

(select * from `user` where `vip` = 1) as `vip`

把這條語句的查詢結果,視為一張表,臨時命名為 vip

這樣一來,從 shop 表查到的交易記錄。都會以 vip 這張“虛擬表”為准,選擇性輸出。

得到的結果,當然也就是所有 VIP 用戶的交易記錄了,這就是所謂的子查詢,在一條查詢語句裡面,還有另一條查詢語句。 當然,還有另外一種寫法也可以做到,不用對照查詢。

先准備好我們的子查詢語句。所有 VIP 的用戶名。

select `username` from `user` where `vip` = 1

 

select * from `shop` where `username` = '一個用戶名' 這條語句,可以從交易表裡,得到一個用戶的所有交易記錄, 如果兩條語句合並起來呢。

select * from `shop` where `username` = (select `username` from `user` where `vip` = 1)

這是子查詢的另一種用法。

這種做法,子查詢返回的結果,必須只有一個字段。

select * from `article` 

where `tid` in 

  (select `tid` from `menu` where `tid` > 1) 

在數據量大的時候。。適當的選擇這些“有點復雜”的 SQL 語句,讓處理數據“更專業”的數據庫把結果算好給我們。往往可以達到事半功倍的效果。 

抱怨一句 想當好一個合格的程序員再怎麼努力也不為過。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved