Day 16 : PHP - 如何在phpMyAdmin里用SQL的语法做资料库的查询?

如标题,这篇想和大家聊聊如何用SQL的语法做资料库的查询
请注意,SQL的函数皆为「全大写的英文字母

以下资料表和范例是我之前练习过的题目,看起来有点复杂,但其实用法很固定,其格式也大同小异

首先,这里有三张资料表,由上到下依序为employeesmemberstransactions

employees:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088P7EXu2lQnB.png

members:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088Yz4IW8a22r.png

transactions:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088rHUwZSImnT.png

现在我们点击上方的「SQL」,会看到一个输入程序的执行框,在此输入完按执行即可
https://ithelp.ithome.com.tw/upload/images/20210930/20141088epXIuW3yoA.png


现在,我们会使用以上三张资料表的资料做「查询」,并且透过以下六个范例来解释SQL的语法架构
每次查询完都会跑出一张「新的资料表」,至於跑出什麽内容,全看你的语法怎麽下

Ex 1:
首先,你会看到SELECTFROM
SELECT是用来「取得」资料表里的资料,其写的名称即为新资料表的栏位名称
FROM则表示要从「哪个」资料表里取得资料

这里SELECT为*,FROM为employees,表示将从employees这张资料表里,查询「全部栏位」的资料
https://ithelp.ithome.com.tw/upload/images/20210930/20141088QvjZERqFLy.png

所以它印出的新资料表会和「原本」的资料表employees一样:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088WdIR7rNOr1.png


Ex 2:
这里我们把栏位名称分别打出来
但请注意(salary*12) as annual_salary这行,意思是,对资料表employees的salary这个栏位*12倍,并将结果存在annual_salary这个栏位里
https://ithelp.ithome.com.tw/upload/images/20210930/20141088VxPrdJWm5g.png

所以annual_salary这个栏位的资料会等於salary*12倍
https://ithelp.ithome.com.tw/upload/images/20210930/20141088XlIoeWOLn4.png


Ex 3:
这里多了WHEREORDER BY
WHERE的後面写的是「欲查询的条件」有哪些
ORDER BY则表示要从哪个栏位的资料去做「排序」,预设为「由小排到大」,如果在栏位名称後面加上DESC,则表示「由大排到小」

这里WHERE为(age<=30) AND (position IN (‘主管’, ’职员’)),表示将从employees这张资料表里的栏位age小於等於30的资料,且在栏位position里是主管or职员的资料,因为是AND,故需「两者皆符合」才印出
ORDER BY salary DESC则表示依照salary这个栏位的资料,依序由大排到小
https://ithelp.ithome.com.tw/upload/images/20210930/20141088QBN7BID7ZD.png

所以它印出的结果只有position是主管、职员,且age小於等於30的资料
https://ithelp.ithome.com.tw/upload/images/20210930/20141088stvAKchAd5.png


Ex 4:
这里我们FROM了两张资料表,分别是transactionsmembers
请注意看SELECT的members.name as name,意思是,「新资料表」的栏位name的资料是从资料表members里的栏位name获得的,其余「皆」是从资料表transactions里获得的

所以,如果想「指定」哪张资料表的哪个栏位,只要加上.就好,ex: members.name

这里WHERE表示transTime须为’2020-03-17 21:36:18’transaction.transMid = members.mid,才将其印出
ORDER BY则指定依members.mid这个栏位的资料,依序由大排到小
https://ithelp.ithome.com.tw/upload/images/20210930/20141088NErWcNIPVZ.png

所以它印出的transTIme的资料皆为2020-03-17 21:36:18
https://ithelp.ithome.com.tw/upload/images/20210930/20141088hDBQETLRAY.png


Ex 5:
这里多了EXTRACT()
EXTRACT()函数是用来取出日期or时间中的特定部分,语法为:EXTRACT(欲取得的部分 as 栏位名称),在「欲取得的部分」需全部为「大写的英文字母

这里分别要取出transactions里的栏位transTime的year、month、day,所以在EXTRACT()里的「欲取得的部分」则依序填入YEARMONTHDAY,再分别指向「新资料表」的栏位year、month、day

因为transactions这张资料表里的栏位transMid里有编号1、2、3、4,而members里的栏位mid只有编号1、2、3,所以在WHERE须加上transactions.transMid = members.mid,以防印出在栏位transMid为「编号4」的资料
https://ithelp.ithome.com.tw/upload/images/20210930/20141088lKywq0JY3I.png

这里可以看到tNo里没有s141016s141017,因为它们在栏位transMid的编号为4
https://ithelp.ithome.com.tw/upload/images/20210930/20141088ipmfPX4w8Z.png


Ex 6:
这里多了COUNT()GROUP BY
COUNT()是计算此资料在资料表里出现的次数
GROUP BY为「群组指令」,那种算平均值最大最小值总和……等需整个栏位做比较的,都需要用GROUP BY「指定」栏位名称

这里我们要计算在资料表members里的陈阿龙吴阿珠陈阿明在资料表transactions里出现的次数为何,所以在WHERE要下transactions.transMid = members.mid

GROUP BY指定计算资料表transactions里的栏位transMid
ORDER BY先从新资料表里的栏位count由大排到小,再从栏位name由大排到小
https://ithelp.ithome.com.tw/upload/images/20210930/20141088vlLtUdS5SC.png

结果如下图所示:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088T2fbfRaB7A.png


以上就是今天的介绍

看起来有点复杂,但SQL的查询其实就环绕着SELECTFROMWHEREORDER BYGROUP BY
如果你能搞懂以上六个范例的语法架构,那你对SQL的查询语法架构大致上就没问题了,只是需要依照其他题目的要求去换函数做使用

如果对以上用法还不太清楚,可以去看一下我贴的参考资料喔!
里面对SQL的查询语法有很详尽的解说


参考资料:
http://mirlab.org/jang/books/asp/sql01.asp?title=18-3%20%A8%CF%A5%CE%20SQL%20%A8%D3%C0%CB%B5%F8%B8%EA%AE%C6


<<:  Day18 简易资料库RealmSwift小实作5

>>:  Day 18【Opensea.js】我的这把刀可是涂满了毒药的毒刃

JavaScript学习日记 : Day7 - 函数(二)

ES6出现的Arrow function,看起来简短许多,但却充满许多陷阱(限制),所以充份了解箭头...

Delphi 列举(筛选)子目录下符合档案【附例】

Purpose:运用’回呼函数Callback’,列举(筛选)子目录下符合档案 Enviro:Del...

[Day 14]现在真的履历导向比较好吗(前端篇)

挑战目标: MockNative Camp 最近不止工作还有很多事情要处理,今天只能先暂停一次。 之...

Day 26 - Filter 使用方式

其实威尔猪本来没打算写 Filter,因为总觉得在一般情形下不太常会用到,但又觉得这好像也算是 T...

[Lesson6] Fragment

首先新增一个Fragment,名称为BlankFragment 再新增一个Package,名称为me...