最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)庫(kù)查詢案例分析

 更新時(shí)間:2025年08月25日 09:31:26   作者:EvanSun__  
文章系統(tǒng)講解MySQL查詢方法,涵蓋簡(jiǎn)單查詢、多表聯(lián)接(需n-1條件避免笛卡爾積)、排序、分組、子查詢(any/all關(guān)鍵字)及分頁(yè)技術(shù),結(jié)合實(shí)際案例說(shuō)明不同查詢類型的使用場(chǎng)景與注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧

數(shù)據(jù)庫(kù)的查詢

簡(jiǎn)單查詢

# 語(yǔ)法
select 字段 from 表名;
字段
	* 		   	   代表查詢?nèi)?
	字段名 	   	 代表查詢指定字段
	字段名 別名 	  	代表查詢指定字段,以別名輸出
	distinct 字段	  代表查詢指定字段并去重
#1 查詢所有員工所有信息
select * from emp;
#2 查詢?nèi)繂T工姓名和工資
select ename,sal from emp;
#3 查詢所有員工的姓名、薪資,追加別名
select ename 別名,sal 別名 from emp;
#4 查詢所有職位,并去重
select distinct job from emp;

限定查詢

在查詢時(shí)限定某些特定的條件

# 語(yǔ)法
select 字段 from 表名 [限定語(yǔ)法];
限定語(yǔ)法
	where  條件(> >= < <= !=/<> or and in(元組) between...and... ...)
#1 查詢薪資不等于3000的
select * from emp where sal <> 3000;
#2 查詢薪資大于2000,小于5000的
select * from emp where sal > 2000 and sal < 5000;
select * from emp where sal between 2000 and 5000;
#3 查詢多張表的薪資大于1000的,為表追加別名
select * from emp e where e.sal > 2000;
#4 查詢名稱中包含 S 的員工信息
select * from emp where ename like '%s%';	# like %s% 表示包含s的數(shù)據(jù),通配符 % 代表匹配所有
#5 查詢名稱中第二個(gè)子母是 M 的員工信息
select * from emp where ename like '_m%';	# like _m% 表示包含s的數(shù)據(jù),通配符 _ 代表匹配一個(gè)
#6 查詢?nèi)肼毴掌谑?1981 的員工信息
select * from emp where hiredate like '1981%';
select * from emp where hiredate between '1981-01-01' and '1981-12-31';

排序查詢

將查詢后的結(jié)果作升降序排列,如果需要對(duì)多個(gè)字段進(jìn)行排序,直接在排序條件后追加即可

# 語(yǔ)法
select 字段 from 表名 [限定語(yǔ)法] [排序語(yǔ)法];
排序語(yǔ)法
	關(guān)鍵字 order by  
	條件  asc(升序)  desc(降序)
#1 按照入職日期做降序排列
select * from emp order by hiredate desc;
#2 按照薪資做升序排列
select * from emp order by sal asc;
#3 多個(gè)限定條件:按照入職日期做降序排列,如果日期相同那么根據(jù)薪資做升序排列
select * from emp order by hiredate desc,sal asc;

多表查詢

如果我們要從多個(gè)表中查詢數(shù)據(jù)呢,要簡(jiǎn)單的將兩張表堆積在一起嗎?

select * from dept,emp;

這樣會(huì)帶來(lái)數(shù)據(jù)冗余問(wèn)題,出現(xiàn)多個(gè)重復(fù)數(shù)據(jù),這種現(xiàn)象稱之為笛卡爾效應(yīng)。

# 語(yǔ)法
# 當(dāng)兩張表有關(guān)聯(lián)字段時(shí),可以通過(guò)關(guān)聯(lián)字段聯(lián)合查詢
select 字段 from 表名1 ,表名2 where 表1_id = 表2_id;
#1 查詢所有員工的員工編號(hào)、姓名、薪資、部門(mén)編號(hào)、部門(mén)名稱
select e.empno 員工編號(hào),e.ename 員工姓名,e.sal 薪資,e.deptno 部門(mén)編號(hào),d.dname 部門(mén)名稱 from emp e,dept d where e,deptno = d.deptno;
#2 查詢所有員工編號(hào)、員工姓名、員工薪資、領(lǐng)導(dǎo)編號(hào)、領(lǐng)導(dǎo)姓名、領(lǐng)導(dǎo)薪資
逐步分析:
# Step.1 確定需要用到的表
emp e1,emp e2
# Step.2 確定需要用到的字段
e1.empno 員工編號(hào),e1.ename 員工姓名,e1.sal 員工薪資,e2.empno 領(lǐng)導(dǎo)編號(hào),e2.ename 領(lǐng)導(dǎo)姓名,e2.sal 領(lǐng)導(dǎo)薪資
# Step.3 確定需要用到的關(guān)聯(lián)條件
e1.mgr = e2.empno
# Step.4 組裝SQL
select e1.empno 員工編號(hào),e1.ename 員工姓名,e1.sal 員工薪資,e2.empno 領(lǐng)導(dǎo)編號(hào),e2.ename 領(lǐng)導(dǎo)姓名,e2.sal 領(lǐng)導(dǎo)薪資 from emp e1,emp e2 where e1.mgr = e2.empno;

# 結(jié)果發(fā)現(xiàn)上述查詢會(huì)少一個(gè)數(shù)據(jù),即大領(lǐng)導(dǎo)沒(méi)有上司就不會(huì)滿足條件,怎么辦?這就需要用到后面的連接查詢

所以當(dāng)進(jìn)行多表聯(lián)接時(shí),為了避免產(chǎn)生笛卡爾積,至少需要‌N-1個(gè)聯(lián)結(jié)條件‌(N為表數(shù)量)

  1. 兩表關(guān)聯(lián):需要1個(gè)條件。
  2. 三表關(guān)聯(lián):在前兩個(gè)表的基礎(chǔ)上,第三個(gè)表需要1個(gè)新增條件,共需2個(gè)條件。
  3. 依此類推,每增加一個(gè)表需新增1個(gè)條件。因此,關(guān)聯(lián)n個(gè)表至少需要n-1個(gè)條件。

連接查詢

# 語(yǔ)法:
select 字段 from 表名 [連接條件][限定語(yǔ)法][排序條件]
# 連接條件 向哪加入哪當(dāng)主表,主表數(shù)據(jù)不會(huì)丟失,當(dāng)主表中的某行在另一個(gè)表中沒(méi)有匹配行時(shí),則該行顯示為空值(NULL);如果表之間有匹配行,則整個(gè)結(jié)果集行包含主表的數(shù)據(jù)值。
	# 左(外)連接 左邊當(dāng)主表
	left (outer) join ... on ...
	# 右(外)連接 右邊當(dāng)主表
	right (outer) join ... on ...
	# 全連接 兩邊都是主表 (MySQL不支持)
	full join ... on ...
	# 內(nèi)連接 全部都不是主表,只檢索兩個(gè)表中匹配的行
	(inner) join ... on ...
#1 所以上面的例子我們可以這么優(yōu)化:
select e1.empno 員工編號(hào),e1.ename 員工姓名,e1.sal 員工薪資,e2.empno 領(lǐng)導(dǎo)編號(hào),e2.ename 領(lǐng)導(dǎo)姓名,e2.sal 領(lǐng)導(dǎo)薪資 from emp e1 left join emp e2 on e1.mgr = e2.empno;

全連接會(huì)先執(zhí)行 left join 遍歷左表,再執(zhí)行 right join 遍歷右表,最后將 right join 的結(jié)果直接追加到 left join 后面。注意,full join 會(huì)返回重復(fù)的行,它們會(huì)被保留,不會(huì)被刪除。

連接語(yǔ)法來(lái)自于 SQL99 語(yǔ)法,這是1999年提出的,同時(shí)還有交叉連接(cross join)、自然連接(natural join)等,其中自然連接可以自動(dòng)將兩張表的相同字段提取出來(lái)放在前面,相當(dāng)于自動(dòng)實(shí)現(xiàn)多表查詢

join 表 on 關(guān)聯(lián)條件

join 表 using (關(guān)聯(lián)字段)

分組查詢

當(dāng)需要分組的字段中出現(xiàn)了重復(fù)數(shù)據(jù),可以使用分組查詢查詢有多少種類及其數(shù)量

# 語(yǔ)法:
select 分組字段/統(tǒng)計(jì)函數(shù) from 表名 [連接條件][限定語(yǔ)法][分組查詢][排序條件]
# 分組查詢
	group by 分組字段
# 統(tǒng)計(jì)函數(shù)
	count(字段)	統(tǒng)計(jì)某一字段數(shù)量
	avg(字段)		統(tǒng)計(jì)某一字段平均值
	max(字段)		統(tǒng)計(jì)某一字段最大值
	min(字段)		統(tǒng)計(jì)某一字段最小值
	sum(字段)		統(tǒng)計(jì)某一字段的和

注意事項(xiàng):

1. 一旦出現(xiàn)分組,那么 select 后面只允許出現(xiàn)分組字段及統(tǒng)計(jì)函數(shù)
2. 統(tǒng)計(jì)函數(shù)可以單獨(dú)使用
3. 如果出現(xiàn)統(tǒng)計(jì)函數(shù)嵌套,那么在 select 后面只允許出現(xiàn)統(tǒng)計(jì)函數(shù)
4. 分組后如果還要使用條件判斷,不允許使用 where,而是改為使用 having
#1 查詢公司所有職位
select job,count(empno) from emp group by job;  # 這里的分組字段是job,一般不會(huì)用count(*)掃描全表,而是用本表中的id來(lái)統(tǒng)計(jì)
#2 查詢每個(gè)工作的平均工資
select job,count(empno),avg(sal) from emp group by job;
#3 查詢每個(gè)工作的平均工資
select emp.job,count(empno),avg(sal),dept.dname from emp left join dept on emp.deptno = dept.deptno group by emp.job;
#4 查詢平均工資高于2000的工作
select emp.job,count(empno),avg(sal),dept.dname from emp left join dept on emp.deptno = dept.deptno group by emp.job having avg(emp.sal) > 2000;

子查詢

在查詢中嵌套查詢

# 語(yǔ)法
# 類型一 where子查詢
# 當(dāng)要查詢的結(jié)果為單行單列或多行單列時(shí)
select 字段 from 表名 [where (子查詢)];
# 類型二 from子查詢
# 當(dāng)需要將查詢出來(lái)的表作為一個(gè)新表參與查詢時(shí)
select 字段 from 表名,(子查詢);
#1 查詢比SMITH工資高的員工(單行單列)
select * from emp where sal > (select sal from emp where ename = "smith");
#2 查詢與銷(xiāo)售一樣薪資的員工信息(多行單列)
select * from emp where sal in (select sal from emp where job = "SALESMAN");
#3 
select * from emp where sal > (select avg(sal) from emp);

any 關(guān)鍵字

? > any() 大于括號(hào)中的最小值

? < any() 小于括號(hào)里的最大值

? = any() 等同于 in

all關(guān)鍵字

? > all() 大于括號(hào)中的最大值

? < all() 小于括號(hào)里的最小值

? = all() ???

查詢部門(mén)編號(hào)、部門(mén)名稱、部門(mén)位置、部門(mén)人數(shù)、平均薪資的信息

逐步分析:
# Step.1 確定需要的表格
dept d,emp e
# Step.2 確定需要關(guān)聯(lián)的條件 
d.deptno = e.deptno
# Step.3 確定需要的字段
d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal)
# Step.4 確定需要的分組條件
group by e.deptno
# Step.5 組裝SQL
select d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal) from dept d left join emp e on d.deptno = e.deptno group by e.deptno;
# 或者使用from子查詢
select d.deptno,d.dname,d.loc,ifnull(temp.num,0),ifnull(temp.sal,0) from dept d left join 
(select d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal) from dept d , emp e where d.deptno = e.deptno group by e.deptno
) 
temp on d.deptno = e.deptno;

分頁(yè)查詢

為什么需要分頁(yè) 性能 頁(yè)面

# 語(yǔ)法:
select 字段 from 表名 [連接條件][限定語(yǔ)法][分組查詢][排序條件][分頁(yè)查詢];
分頁(yè)查詢
	關(guān)鍵字  limit n,m    n下標(biāo)索引,m每頁(yè)顯示條數(shù)
	n 默認(rèn)值為0,可以省略不寫(xiě),默認(rèn)給出首頁(yè)數(shù)據(jù)
#1 查詢前十條員工信息
select * from emp limit 0,10;
select * from emp limit 10;

案例一 創(chuàng)建菜單表,分一級(jí)菜單和二級(jí)菜單

# 自關(guān)聯(lián)操作
create table t_menu(
	id int(5) AUTO_INCREMENT,
    name varchar(10),
    image varchar(20),
    url varchar(20),
    pid int(5),
    constraint pk_id primary key(id),
    constraint fk_pid foreign key(pid) references t_menu(id)
) 
# 原理:二級(jí)菜單項(xiàng)的pid關(guān)聯(lián)一級(jí)菜單項(xiàng)的id,可以通過(guò)子菜單(二級(jí)菜單)的pid找到其父菜單(一級(jí)菜單)

案例二 權(quán)限管理:用戶登錄

# 找到當(dāng)前登錄的用戶的功能列表
# 本案例中數(shù)據(jù)表使用之前創(chuàng)建的5張權(quán)限管理表
select m.mid,m.mname,m.url from t_person p left join t_person_role pr on p.pid = pr.pid left join t_role r on pr.rid = r.rid left join t_role_menu rm on r.rid = rm.rid left join t_menu m on rm.mid = m.mid;

到此這篇關(guān)于Python學(xué)習(xí) -- MySQL數(shù)據(jù)庫(kù)的查詢及案例的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)庫(kù)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql?中止回滾的實(shí)現(xiàn)

    mysql?中止回滾的實(shí)現(xiàn)

    本文介紹了在MySQL中實(shí)現(xiàn)中止回滾的方法,通過(guò)使用SAVEPOINT和ROLLBACKTOSAVEPOINT,在事務(wù)中實(shí)現(xiàn)部分回滾的效果,下面就來(lái)詳細(xì)的介紹一下mysql?中止回滾的實(shí)現(xiàn),感興趣的可以了解一下
    2026-01-01
  • MYSQL刪除重復(fù)數(shù)據(jù)的簡(jiǎn)單方法

    MYSQL刪除重復(fù)數(shù)據(jù)的簡(jiǎn)單方法

    業(yè)務(wù)中遇到要從表里刪除重復(fù)數(shù)據(jù)的需求,使用了下面的方法,執(zhí)行成功,大家可以參考使用
    2013-11-11
  • MySQL數(shù)據(jù)表的常見(jiàn)約束小結(jié)

    MySQL數(shù)據(jù)表的常見(jiàn)約束小結(jié)

    在數(shù)據(jù)庫(kù)設(shè)計(jì)中,約束(Constraints)是用于確保數(shù)據(jù)的完整性、準(zhǔn)確性和一致性的規(guī)則,MySQL?提供了多種約束類型,幫助我們規(guī)范數(shù)據(jù)存儲(chǔ),本文給大家介紹了MySQL數(shù)據(jù)表的常見(jiàn)約束,需要的朋友可以參考下
    2024-12-12
  • Mysql中的多級(jí)復(fù)制方式

    Mysql中的多級(jí)復(fù)制方式

    這篇文章主要介紹了Mysql中的多級(jí)復(fù)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 解決MySQL?Varchar?類型尾部空格的問(wèn)題

    解決MySQL?Varchar?類型尾部空格的問(wèn)題

    這篇文章主要介紹了MySQL?Varchar?類型尾部空格,在這里需要注意的是?binary?排序規(guī)則的?pad?屬性為?NO?PAD,這里其實(shí)不是個(gè)例外,因?yàn)?char、varchar?和?text?類型都?xì)w類為?nonbinary,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2022-04-04
  • MySQL分支和循環(huán)結(jié)構(gòu)方式

    MySQL分支和循環(huán)結(jié)構(gòu)方式

    在MySQL中,IF函數(shù)用于根據(jù)條件返回不同的值,類似于Java的三目運(yùn)算符,CASE語(yǔ)句則提供了兩種形式:簡(jiǎn)單CASE函數(shù)和搜索CASE函數(shù),分別類似于Java中的switch-case結(jié)構(gòu)和多重if判斷,這些控制流函數(shù)在數(shù)據(jù)庫(kù)查詢和數(shù)據(jù)處理中非常有用,可以實(shí)現(xiàn)復(fù)雜的邏輯判斷
    2024-10-10
  • 淺談MySQL觸發(fā)器的原理以及使用

    淺談MySQL觸發(fā)器的原理以及使用

    這篇文章主要介紹了淺談MySQL觸發(fā)器的原理以及使用,觸發(fā)器的執(zhí)行不需要使用 CALL 語(yǔ)句來(lái)調(diào)用,也不需要手工啟動(dòng),只要一個(gè)預(yù)定義的事件發(fā)生就會(huì)被 MySQL自動(dòng)調(diào)用,需要的朋友可以參考下
    2023-05-05
  • mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法

    mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法

    這篇文章主要介紹了mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 詳解如何在阿里云上安裝mysql

    詳解如何在阿里云上安裝mysql

    mysql作為輕量級(jí)開(kāi)源數(shù)據(jù)庫(kù),在企業(yè)級(jí)的應(yīng)用中非常的廣泛。這篇文章主要介紹了詳解如何在阿里云上安裝mysql,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • MySQL圖形化管理工具Navicat安裝步驟

    MySQL圖形化管理工具Navicat安裝步驟

    大家好,本篇文章主要講的是MySQL圖形化管理工具Navicat安裝步驟,感興趣的同學(xué)趕快來(lái)看看吧,對(duì)你有幫助的話記得收藏一下哦
    2021-12-12

最新評(píng)論

越西县| 郯城县| 河间市| 黔江区| 济南市| 美姑县| 台江县| 罗城| 盐城市| 芜湖市| 阿拉善右旗| 莆田市| 安丘市| 安远县| 南康市| 左权县| 恭城| 清新县| 福建省| 玉田县| 绥阳县| 长汀县| 突泉县| 旬邑县| 铜鼓县| 秀山| 广元市| 双鸭山市| 阿坝| 新邵县| 内丘县| 岳阳县| 斗六市| 潜江市| 景谷| 威海市| 渭源县| 嫩江县| 广安市| 尚义县| 九江市|