MySQL查詢進(jìn)階操作從函數(shù)到表連接的使用
前言
書接上文,今天學(xué)習(xí)查詢的進(jìn)階操作,包括函數(shù)、分組、分頁(yè)、子查詢和表連接。內(nèi)容比較實(shí)用,建議收藏或者訂閱專欄方便學(xué)習(xí)和復(fù)習(xí)。
一、MySQL函數(shù)的使用
- mysql中內(nèi)置了很多函數(shù),每個(gè)函數(shù)都代表一個(gè)特定功能
1、單行函數(shù)
- 特點(diǎn):每行數(shù)據(jù)都會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的結(jié)果
表中有多少行,就會(huì)有多少行的結(jié)果
- 位置:
select
之后,from
之前 或作為篩選條件
1.concat(…,列名,…,列名)
用來(lái)拼接多列的值
例如:以firstname+lastname的形式顯示所有員工的姓名
select concat(first_name,last_name) as 全名 from employees
2.mod(值1,值2)
求值1和值2的取余結(jié)果 ,相當(dāng)于數(shù)學(xué)運(yùn)算中的 %(值1%值2)
- 標(biāo)準(zhǔn)SQL規(guī)范中不存在%取余的寫法,所以取余操作應(yīng)該使用mod()
- 例如:
select mod(10,3) from dual
注: dual
為虛擬表,作用為使當(dāng)前SQL符合語(yǔ)法規(guī)范,不寫時(shí)會(huì)做自動(dòng)填充
3.length(列名|數(shù)據(jù))
獲取長(zhǎng)度
查詢所有firstname長(zhǎng)度>6的員工信息
select * from employees where length(first_name)>6
4.now() | sysdate()
獲取系統(tǒng)當(dāng)前時(shí)間
select now() select SYSDATE() select now() from dual
2、多行函數(shù)(組函數(shù))
- 以組為單位獲取結(jié)果,一組得到一個(gè)結(jié)果
- 如果未手動(dòng)進(jìn)行分組,則默認(rèn)整張表為一組
1.sum(列名)
求某一列的總和
2.avg(列名)
求某一列的平均值
3.max(列名)
求某一列的最大值
4.min(列名)
求某一列的最小值
5.count(列名)
求某一列值的個(gè)數(shù)(非空)
示例:
-- 組函數(shù)操作salary select SUM(salary) 總和,AVG(salary) 平均值,MAX(salary) 最大值,min(salary) 最小值,COUNT(salary) 非空值的數(shù)量 from employees -- 計(jì)算表中績(jī)效列不為空的員工數(shù)量 select COUNT(commission_pct) from employees -- 求表中的行數(shù) select COUNT(*) from employees select COUNT(employee_id) from employees
二、MySQL的分組
在MySQL中一個(gè)組就是一個(gè)操作單位
1.簡(jiǎn)單分組
select 列名 from 表名 group by 列名
以部門為單位求每個(gè)部門的平均薪資
select department_id,AVG(salary) 平均薪資 from employees group by department_id
2.where + 分組
-- 查詢部門id為10、20、30的部門的平均薪資、 select department_id,AVG(salary) 平均薪資 from employees where department_id in(10,20,30) -- 先篩選 GROUP BY department_id -- 后分組查詢
3.having + 分組
select department_id,AVG(salary) 平均薪資 from employees group by department_id -- 先分組 having department_id in(10,20,30) -- 后篩選
4.分組中 where 和 having 的區(qū)別
- where是在分組前執(zhí)行,having是在分組后執(zhí)行
- where不能在分組時(shí)使用組函數(shù),但是having可以
- 當(dāng)兩者都可使用時(shí),優(yōu)先使用where,效率更高
三、分頁(yè)以及查詢關(guān)鍵字的執(zhí)行順序
1.limit:用來(lái)限制顯示的查詢結(jié)果條數(shù),通常用于分頁(yè)查詢
select 列名 from 表名 limit 顯示的起始下標(biāo),顯示條數(shù)
查詢所有員工數(shù)據(jù)的前十條
select * from employees limit 0,10 select * from employees limit 10 下標(biāo)為0時(shí)可以省略
下標(biāo)為0時(shí)可以省略
- 當(dāng)limit和其他查詢關(guān)鍵字聯(lián)用時(shí),limit一定最后執(zhí)行
查詢的執(zhí)行順序:
語(yǔ)法順序 執(zhí)行順序 select 5 from 1 where 2 group by 3 having 4 order by 6 limit 7
四、子查詢
- 當(dāng)一個(gè)SQL需要借助于另一個(gè)SQL的執(zhí)行結(jié)果,在當(dāng)前SQL中嵌套另一個(gè)SQL,該寫法稱為子查詢
1、where子查詢
1.1、單值子查詢
嵌套的子SQL只會(huì)返回一行一列的結(jié)果
-- 查詢員工id為100的員工的部門id select department_id from employees where employee_id=100 -- 子查詢::查詢員工id為100的員工所在的部門信息 select * from departments where department_id=(select department_id from employees where employee_id=100)
- 優(yōu)先執(zhí)行內(nèi)層SQL,再執(zhí)行外層SQL
- 子SQL需寫入小括號(hào)
1.2、多值子查詢 嵌套的子SQL會(huì)返回多個(gè)結(jié)果
--查詢firstname中包含s的員工所在的部門信息 select * from departments where department_id in(select department_id from employees where first_name like '%s%')
2、from子查詢
將子SQL的查詢結(jié)果臨時(shí)看做一張表進(jìn)行后續(xù)操作
-- 獲取薪資最高的前十個(gè)員工的平均薪資 -- 先獲取薪資最高的前十名員工的薪資 select salary from employees ORDER BY salary desc LIMIT 10 -- 子查詢:再根據(jù)子SQL的查詢結(jié)果臨時(shí)通過(guò)別名構(gòu)建一張數(shù)據(jù)表進(jìn)行查詢 select avg(salary) from (select salary from employees ORDER BY salary desc LIMIT 10) as e
五、表連接
- 當(dāng)查詢結(jié)果需要從多張表中獲取時(shí),則需要將多張表連接起來(lái)進(jìn)行查新操作
表連接的前提:
- 多張表之間必須存在關(guān)聯(lián)關(guān)系(外鍵)
- 外鍵通常連接的是另一張表的主鍵
- 在進(jìn)行表連接時(shí)作為連接條件使用
1、內(nèi)連接
語(yǔ)法:
select 表1.列名,表2.列名,... from 表1 inner join 表2 on 連接條件
- 特點(diǎn):對(duì)兩張表同時(shí)進(jìn)行約束,只有當(dāng)所有表都符合連接條件,才會(huì)顯示信息
- 使用:
inner
可省
2、(左)外連接
語(yǔ)法:
select 表1.列名,表2.列名,... from 表1(左表) left outer join 表2(右表) on 連接條件
- 特點(diǎn):只對(duì)右表做約束,左表中的數(shù)據(jù)都會(huì)顯示,右表中只有符合連接條件的才會(huì)顯示
- 使用:
outer
可省 - 左外連接和右外連接就是
left
和right
的不同,位置不同,通常用左外連接 - 使用:
-- 查詢所有的員工信息及符合連接條件的部門信息 select e.*,d.* from employees e LEFT JOIN departments d ON e.department_id=d.department_id
全外連接:
- 將兩個(gè)查詢結(jié)果進(jìn)行合并顯示
查詢語(yǔ)句1 union
查詢語(yǔ)句2
- 使用:
-- 內(nèi)連接 select e.*,d.* from employees e inner join departments d on e.department_id=d.department_id union -- 對(duì)內(nèi)連接和左連接的查詢結(jié)果進(jìn)行合并 -- 左連接 select e.*,d.* from employees e LEFT JOIN departments d ON e.department_id=d.department_id
union
會(huì)對(duì)合并結(jié)果進(jìn)行去重union all
不會(huì)對(duì)結(jié)果去重- 特點(diǎn):合并雙方都不做約束
- 合并雙方的查詢結(jié)果字段的個(gè)數(shù)、順序必須一致
實(shí)際開(kāi)發(fā)中,使用頻率較高的是內(nèi)連接和左外連接
3、自連接
- 概念:是特殊的表連接,參與連接的是同一張表
具體使用:
表中的某兩個(gè)字段之間存在關(guān)聯(lián)關(guān)系
-- 查詢:?jiǎn)T工id、員工姓名-firstname、直接領(lǐng)導(dǎo)的id、直接領(lǐng)導(dǎo)的姓名 select e1.employee_id 員工id,e1.first_name 員工姓名,e2.employee_id 領(lǐng)導(dǎo)id,e2.first_name 領(lǐng)導(dǎo)姓名 from employees e1 LEFT JOIN employees e2-- e1代表獲取員工信息的表,e2代表獲取領(lǐng)導(dǎo)信息的表 ON e1.manager_id=e2.employee_id -- 把兩個(gè)有關(guān)聯(lián)關(guān)系的字段作為連接條件
判斷同一字段,作為連接條件
-- 查詢工資相同的員工信息 select e1.employee_id 員工1的id,e1.salary 員工1的工資,e2.employee_id 員工2的id,e2.salary 員工2的工資 from employees e1 LEFT JOIN employees e2 on e1.salary=e2.salary -- 連接條件 where e1.employee_id<e2.employee_id -- 防止判斷的雙方是同一個(gè)人,并去重
到此這篇關(guān)于MySQL查詢進(jìn)階從函數(shù)到表連接的使用的文章就介紹到這了,更多相關(guān)MySQL函數(shù)表連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql實(shí)現(xiàn)定時(shí)備份的詳細(xì)圖文教程
這篇文章主要給大家介紹了關(guān)于mysql實(shí)現(xiàn)定時(shí)備份的詳細(xì)圖文教程,我們都知道數(shù)據(jù)是無(wú)價(jià),如果不對(duì)數(shù)據(jù)進(jìn)行備份,相當(dāng)是讓數(shù)據(jù)在裸跑,一旦服務(wù)器出問(wèn)題,只有哭的份了,需要的朋友可以參考下2023-07-07MySQL系列之十五 MySQL常用配置和性能壓力測(cè)試
今天給大家?guī)?lái)一篇教程關(guān)于MySQL常用配置和性能壓力測(cè)試的知識(shí),文中配置參數(shù)以32內(nèi)存的服務(wù)器為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-07-07MySQL獲取binlog的開(kāi)始時(shí)間和結(jié)束時(shí)間(最新方法)
這篇文章主要介紹了MySQL如何獲取binlog的開(kāi)始時(shí)間和結(jié)束時(shí)間,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05MySQL日期數(shù)據(jù)類型、時(shí)間類型使用總結(jié)
MySQL日期數(shù)據(jù)類型、MySQL時(shí)間類型使用總結(jié),需要的朋友可以參考下。2010-06-06通過(guò)MySQL慢查詢優(yōu)化MySQL性能的方法講解
今天小編就為大家分享一篇關(guān)于通過(guò)MySQL慢查詢優(yōu)化MySQL性能的方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03windows 安裝解壓版 mysql5.7.28 winx64的詳細(xì)教程
這篇文章主要介紹了windows 安裝解壓版 mysql5.7.28 winx64的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12mysql如何去掉某個(gè)字段中的第一個(gè)出現(xiàn)的字符串
這篇文章主要介紹了mysql如何去掉某個(gè)字段中的第一個(gè)出現(xiàn)的字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07