mysql进阶1

Jun 01, 2016 pm 01:13 PM
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 语句,让处理数据“更专业”的数据库把结果算好给我们。往往可以达到事半功倍的效果。 

抱怨一句 想当好一个合格的程序员再怎么努力也不为过。。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

phpmyadmin怎麼打開 phpmyadmin怎麼打開 Apr 10, 2025 pm 10:51 PM

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

navicat premium怎麼創建 navicat premium怎麼創建 Apr 09, 2025 am 07:09 AM

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

navicat怎麼新建連接mysql navicat怎麼新建連接mysql Apr 09, 2025 am 07:21 AM

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

redis怎麼使用單線程 redis怎麼使用單線程 Apr 10, 2025 pm 07:12 PM

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL:開發人員的基本技能 MySQL和SQL:開發人員的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

See all articles