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

數(shù)據(jù)庫的查詢
簡單查詢
# 語法 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;
限定查詢
在查詢時限定某些特定的條件
# 語法 select 字段 from 表名 [限定語法]; 限定語法 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 查詢名稱中第二個子母是 M 的員工信息 select * from emp where ename like '_m%'; # like _m% 表示包含s的數(shù)據(jù),通配符 _ 代表匹配一個 #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é)果作升降序排列,如果需要對多個字段進(jìn)行排序,直接在排序條件后追加即可
# 語法 select 字段 from 表名 [限定語法] [排序語法]; 排序語法 關(guān)鍵字 order by 條件 asc(升序) desc(降序)
#1 按照入職日期做降序排列 select * from emp order by hiredate desc; #2 按照薪資做升序排列 select * from emp order by sal asc; #3 多個限定條件:按照入職日期做降序排列,如果日期相同那么根據(jù)薪資做升序排列 select * from emp order by hiredate desc,sal asc;
多表查詢
如果我們要從多個表中查詢數(shù)據(jù)呢,要簡單的將兩張表堆積在一起嗎?
select * from dept,emp;
這樣會帶來數(shù)據(jù)冗余問題,出現(xiàn)多個重復(fù)數(shù)據(jù),這種現(xiàn)象稱之為笛卡爾效應(yīng)。
# 語法 # 當(dāng)兩張表有關(guān)聯(lián)字段時,可以通過關(guān)聯(lián)字段聯(lián)合查詢 select 字段 from 表名1 ,表名2 where 表1_id = 表2_id;
#1 查詢所有員工的員工編號、姓名、薪資、部門編號、部門名稱 select e.empno 員工編號,e.ename 員工姓名,e.sal 薪資,e.deptno 部門編號,d.dname 部門名稱 from emp e,dept d where e,deptno = d.deptno;
#2 查詢所有員工編號、員工姓名、員工薪資、領(lǐng)導(dǎo)編號、領(lǐng)導(dǎo)姓名、領(lǐng)導(dǎo)薪資 逐步分析: # Step.1 確定需要用到的表 emp e1,emp e2 # Step.2 確定需要用到的字段 e1.empno 員工編號,e1.ename 員工姓名,e1.sal 員工薪資,e2.empno 領(lǐng)導(dǎ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 員工編號,e1.ename 員工姓名,e1.sal 員工薪資,e2.empno 領(lǐng)導(dǎ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)上述查詢會少一個數(shù)據(jù),即大領(lǐng)導(dǎo)沒有上司就不會滿足條件,怎么辦?這就需要用到后面的連接查詢
所以當(dāng)進(jìn)行多表聯(lián)接時,為了避免產(chǎn)生笛卡爾積,至少需要N-1個聯(lián)結(jié)條件(N為表數(shù)量)
- 兩表關(guān)聯(lián):需要1個條件。
- 三表關(guān)聯(lián):在前兩個表的基礎(chǔ)上,第三個表需要1個新增條件,共需2個條件。
- 依此類推,每增加一個表需新增1個條件。因此,關(guān)聯(lián)n個表至少需要n-1個條件。
連接查詢
# 語法: select 字段 from 表名 [連接條件][限定語法][排序條件] # 連接條件 向哪加入哪當(dāng)主表,主表數(shù)據(jù)不會丟失,當(dāng)主表中的某行在另一個表中沒有匹配行時,則該行顯示為空值(NULL);如果表之間有匹配行,則整個結(jié)果集行包含主表的數(shù)據(jù)值。 # 左(外)連接 左邊當(dāng)主表 left (outer) join ... on ... # 右(外)連接 右邊當(dāng)主表 right (outer) join ... on ... # 全連接 兩邊都是主表 (MySQL不支持) full join ... on ... # 內(nèi)連接 全部都不是主表,只檢索兩個表中匹配的行 (inner) join ... on ...
#1 所以上面的例子我們可以這么優(yōu)化: select e1.empno 員工編號,e1.ename 員工姓名,e1.sal 員工薪資,e2.empno 領(lǐng)導(dǎ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;
全連接會先執(zhí)行 left join 遍歷左表,再執(zhí)行 right join 遍歷右表,最后將 right join 的結(jié)果直接追加到 left join 后面。注意,full join 會返回重復(fù)的行,它們會被保留,不會被刪除。
連接語法來自于 SQL99 語法,這是1999年提出的,同時還有交叉連接(cross join)、自然連接(natural join)等,其中自然連接可以自動將兩張表的相同字段提取出來放在前面,相當(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ù)量
# 語法: select 分組字段/統(tǒng)計(jì)函數(shù) from 表名 [連接條件][限定語法][分組查詢][排序條件] # 分組查詢 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,一般不會用count(*)掃描全表,而是用本表中的id來統(tǒng)計(jì) #2 查詢每個工作的平均工資 select job,count(empno),avg(sal) from emp group by job; #3 查詢每個工作的平均工資 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;
子查詢
在查詢中嵌套查詢
# 語法 # 類型一 where子查詢 # 當(dāng)要查詢的結(jié)果為單行單列或多行單列時 select 字段 from 表名 [where (子查詢)]; # 類型二 from子查詢 # 當(dāng)需要將查詢出來的表作為一個新表參與查詢時 select 字段 from 表名,(子查詢);
#1 查詢比SMITH工資高的員工(單行單列) select * from emp where sal > (select sal from emp where ename = "smith"); #2 查詢與銷售一樣薪資的員工信息(多行單列) 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() 大于括號中的最小值
? < any() 小于括號里的最大值
? = any() 等同于 in
all關(guān)鍵字
? > all() 大于括號中的最大值
? < all() 小于括號里的最小值
? = all() ???
查詢部門編號、部門名稱、部門位置、部門人數(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;
分頁查詢
為什么需要分頁 性能 頁面
# 語法: select 字段 from 表名 [連接條件][限定語法][分組查詢][排序條件][分頁查詢]; 分頁查詢 關(guān)鍵字 limit n,m n下標(biāo)索引,m每頁顯示條數(shù) n 默認(rèn)值為0,可以省略不寫,默認(rèn)給出首頁數(shù)據(jù)
#1 查詢前十條員工信息 select * from emp limit 0,10; select * from emp limit 10;
案例一 創(chuàng)建菜單表,分一級菜單和二級菜單
# 自關(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)
)
# 原理:二級菜單項(xiàng)的pid關(guān)聯(lián)一級菜單項(xiàng)的id,可以通過子菜單(二級菜單)的pid找到其父菜單(一級菜單)案例二 權(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ù)庫的查詢及案例的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)庫查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL數(shù)據(jù)庫約束和多表查詢實(shí)例代碼
- MySQL數(shù)據(jù)庫中表的查詢實(shí)例(單表和多表)
- Python中使用pymysql連接MySQL數(shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢
- MySQL查詢數(shù)據(jù)庫所有表名以及表結(jié)構(gòu)其注釋(小白專用)
- MySQL數(shù)據(jù)庫中如何查詢近一年的數(shù)據(jù)
- mysql數(shù)據(jù)庫SQL子查詢(史上最詳細(xì))
- Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小
- MYSQL數(shù)據(jù)庫查詢按日期分組統(tǒng)計(jì)詳細(xì)代碼
- MySQL數(shù)據(jù)庫多表聯(lián)合查詢代碼示例
相關(guān)文章
MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題
本文主要介紹了MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決
這篇文章主要介紹了MySQL中出現(xiàn)lock?wait?timeout?exceeded問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
教你使用VS?Code的MySQL擴(kuò)展管理數(shù)據(jù)庫的方法
這篇文章主要介紹了使用VS?Code的MySQL擴(kuò)展管理數(shù)據(jù)庫,在本文告訴你如何用VS?Code的擴(kuò)展程序管理MySQL數(shù)據(jù)庫,包括連接到MySQL、新建數(shù)據(jù)庫和表、修改字段定義、簡單的查詢方法以及導(dǎo)入導(dǎo)出,需要的朋友可以參考下2022-01-01
mysql 行列動態(tài)轉(zhuǎn)換的實(shí)現(xiàn)(列聯(lián)表,交叉表)
下面小編就為大家?guī)硪黄猰ysql 行列動態(tài)轉(zhuǎn)換的實(shí)現(xiàn)(列聯(lián)表,交叉表)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
MySQL數(shù)據(jù)庫實(shí)現(xiàn)MMM高可用群集架構(gòu)
這篇文章主要介紹了MySQL數(shù)據(jù)庫實(shí)現(xiàn)MMM高可用群集架構(gòu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
MySQL數(shù)據(jù)庫INNODB表損壞修復(fù)處理過程分享
突然收到MySQL報(bào)警,從庫的數(shù)據(jù)庫掛了,一直在不停的重啟,打開錯誤日志,發(fā)現(xiàn)有張表壞了。innodb表損壞不能通過repair table 等修復(fù)myisam的命令操作?,F(xiàn)在記錄下解決過程2013-08-08

