MySQL多表數(shù)據(jù)記錄查詢?cè)斀?/h1>
更新時(shí)間:2016年08月25日 17:11:39 作者:ZJDWHD
這篇文章主要為大家詳細(xì)介紹了MySQL多表數(shù)據(jù)記錄查詢操作,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下
在實(shí)際應(yīng)用中,經(jīng)常需要實(shí)現(xiàn)在一個(gè)查詢語(yǔ)句中顯示多張表的數(shù)據(jù),這就是所謂的多表數(shù)據(jù)記錄連接查詢,簡(jiǎn)稱(chēng)來(lái)年將誒查詢。
在具體實(shí)現(xiàn)連接查詢操作時(shí),首先將兩個(gè)或兩個(gè)以上的表按照某個(gè)條件連接起來(lái),然后再查詢到所要求的數(shù)據(jù)記錄。連接查詢分為內(nèi)連接查詢和外連接查詢。
在具體應(yīng)用中,如果需要實(shí)現(xiàn)多表數(shù)據(jù)記錄查詢,一般不使用連接查詢,因?yàn)樵摬僮餍时容^低。于是MySQL又提供 了連接查詢的替代操作,子查詢操作。
1.關(guān)系數(shù)據(jù)操作:
在連接查詢中,首先需要對(duì)兩張或兩張以上的表進(jìn)行連接操作。連接操作是關(guān)系數(shù)據(jù)操作中專(zhuān)門(mén)用于數(shù)據(jù)操作的關(guān)系運(yùn)算。
1.1 并(UNION):
在SQL語(yǔ)言中存在一種關(guān)系數(shù)據(jù)操作,叫做并操作?!安ⅰ本褪前丫哂邢嗤侄螖?shù)目和字段類(lèi)型的表合并到一起。通過(guò)并操作將兩張表的數(shù)據(jù)記錄合并到一起,合并后的字段數(shù)為 表1的字段數(shù)或者表2的字段數(shù);合并后的總記錄數(shù)為:表1的記錄數(shù) + 表2的記錄數(shù) - 表1和表2 重復(fù)的記錄數(shù)。
1.2 笛卡爾積(CARTESIAN PRODUCT):
在SQL語(yǔ)言中存在一種關(guān)系數(shù)據(jù)操作,叫做笛卡爾積操作。笛卡爾就是沒(méi)有連接條件,表中的數(shù)據(jù)任意的組合。笛卡爾積的字段數(shù)為 表1的字段數(shù) + 表2的字段數(shù)。笛卡爾積的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù)。
1.3 內(nèi)連接(INNER JOIN):
為了便于操作,專(zhuān)門(mén)提供了一種針對(duì)數(shù)據(jù)庫(kù)操作的運(yùn)算—連接(JOIN)。所謂連接就是在表關(guān)系的笛卡爾積數(shù)據(jù)記錄中,按照相應(yīng)字段值的比較條件進(jìn)行選擇生成一個(gè)新的關(guān)系。連接又分為內(nèi)連接(INNER JOIN)、外連接(OUTER JOIN)、交叉連接(CROSS JOIN)。
所謂內(nèi)連接,就是在表關(guān)系的笛卡爾積數(shù)據(jù)中,保留表關(guān)系中所有匹配的數(shù)據(jù)記錄,舍棄不匹配的數(shù)據(jù)記錄。按照匹配的條件可以分成自然連接、等值連接和不等連接。
1.3.1 自然連接(NATURAL JOIN):
自然連接就是在表關(guān)系的笛卡爾積中,首先根據(jù)表關(guān)系中相同名稱(chēng)的字段自動(dòng)進(jìn)行記錄匹配,然后去掉重復(fù)的字段。
通過(guò)自然連接后,新關(guān)系的字段數(shù)為:表1字段數(shù) + 表2字段數(shù) - 表1和表2中的重復(fù)字段數(shù)。自然連接后新關(guān)系的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù) - 表1和表2相同字段的值不相等記錄數(shù)。
自然連接又如下特點(diǎn):
1. 在具體執(zhí)行自然連接時(shí),會(huì)自動(dòng)判斷相同名稱(chēng)的字段,然后進(jìn)行數(shù)據(jù)值的匹配。
2. 在執(zhí)行完自然連接的新關(guān)系中,雖然可以指定包含哪些字段,但是不能指定執(zhí)行過(guò)程中的匹配條件,即哪些字段的值進(jìn)行匹配。
3. 在執(zhí)行自然連接的新關(guān)系中,執(zhí)行過(guò)程中所匹配的字段名只有一個(gè),即會(huì)去掉重復(fù)字段。
1.3.2 等值連接:
所謂等值連接操作就是表關(guān)系的笛卡爾積中,選擇所匹配字段值相等的數(shù)據(jù)記錄。
通過(guò)等值連接后,新關(guān)系的字段數(shù)為:表1字段數(shù) + 表2字段數(shù)。等值連接后新關(guān)系的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù) - 表1和表2相同字段的值不相等記錄數(shù)。
與自然連接相比,等值連接操作需要在執(zhí)行過(guò)程中用“=”指定匹配條件,在新關(guān)系中不會(huì)去掉重復(fù)字段。
1.3.3 不等連接:
所謂不等連接操作就是表關(guān)系的笛卡爾積中,選擇所匹配字段值不相等的數(shù)據(jù)記錄。
通過(guò)不等連接后,新關(guān)系的字段數(shù)為:表1字段數(shù) + 表2字段數(shù)。等值連接后新關(guān)系的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù) - 表1和表2相同字段的值相等的記錄數(shù)。
與自然連接相比,等值連接操作需要在執(zhí)行過(guò)程中用“!=”指定匹配條件,在新關(guān)系中不會(huì)去掉重復(fù)字段。
1.4 外連接(OUTER JOIN):
所謂外連接(OUTER JOIN),就是在表關(guān)系的笛卡爾積數(shù)據(jù)記錄中,不僅保留表關(guān)系中所有匹配的數(shù)據(jù)記錄,而且還會(huì)保留部分不匹配的數(shù)據(jù)記錄。按照保留不不匹配條件數(shù)據(jù)記錄來(lái)源可以分為:左外連接、右外連接、全外連接。
1.4.1 左外連接:
所謂左外連接操作就是表關(guān)系的笛卡爾積中,除了選擇相匹配的數(shù)據(jù)記錄,還包含關(guān)聯(lián)左邊表中不匹配的數(shù)據(jù)記錄。
通過(guò)左外連接后,新關(guān)系的字段數(shù)為:左表字段數(shù) + 右表字段數(shù)。左外連接后新關(guān)系的記錄數(shù)為:左表的記錄數(shù) * 右表的記錄數(shù) - 左表和右表相同字段的值不相等的記錄數(shù) + 左表中未匹配的記錄數(shù)。
1.4.2 右外連接:
所謂右外連接操作就是表關(guān)系的笛卡爾積中,除了選擇相匹配的數(shù)據(jù)記錄,還包含關(guān)聯(lián)右邊表中不匹配的數(shù)據(jù)記錄。
通過(guò)右外連接后,新關(guān)系的字段數(shù)為:左表字段數(shù) + 右表字段數(shù)。右外連接后新關(guān)系的記錄數(shù)為:左表的記錄數(shù) * 右表的記錄數(shù) - 左表和右表相同字段的值不相等的記錄數(shù) + 右表中未匹配的記錄數(shù)。
1.4.3 全外連接:
所謂右外連接操作就是表關(guān)系的笛卡爾積中,除了選擇相匹配的數(shù)據(jù)記錄,還包含關(guān)聯(lián)左右兩邊表中不匹配的數(shù)據(jù)記錄。
通過(guò)全外連接后,新關(guān)系的字段數(shù)為:左表字段數(shù) + 右表字段數(shù)。全外連接后新關(guān)系的記錄數(shù)為:左表的記錄數(shù) * 右表的記錄數(shù) - 左表和右表相同字段的值不相等的記錄數(shù) + 左表未匹配的記錄數(shù) + 右表中未匹配的記錄數(shù)。
2.內(nèi)連接查詢:
在MySQL中實(shí)現(xiàn)連接查詢有兩種語(yǔ)法:
1. 在from子句中利用逗號(hào)區(qū)分多個(gè)表,在where子句中通過(guò)邏輯表達(dá)式來(lái)實(shí)現(xiàn)匹配條件,從而實(shí)現(xiàn)表的連接。
2. ANSI連接語(yǔ)法形式,在from子句中使用“join on”關(guān)鍵字,而連接條件寫(xiě)在關(guān)鍵字on子句中。推薦使用第二種方式。
按照匹配條件,內(nèi)連接查詢可以分為兩類(lèi):等值連接;不等連接。
內(nèi)連接查詢語(yǔ)法為:
select field1, field2 ...fieldn
from join_tablename1 inner join join_tablename2 [inner join join_tablename]
on join_condition
//參數(shù)filedn 表示所要查詢的字段名稱(chēng),來(lái)源于所連接的表join_tablename1 和 join_tablename2,關(guān)鍵字inner join表進(jìn)行內(nèi)連接,join_condition表示進(jìn)行匹配的條件。
2.1 自連接:
內(nèi)連接查詢中存在一種特殊的等值連接—自連接。所謂自連接就是指表與其自身進(jìn)行連接。
示例(查詢每個(gè)雇員的姓名、職位、領(lǐng)導(dǎo)姓名):
mysql> select e.ename,e.job,l.ename from t_employee e inner join t_employee l on e.MGR=l.empno;
+---------+----------+-------+
| ename | job | ename |
+---------+----------+-------+
| SCOTT | ANALYST | JONES |
| FORD | ANALYST | JONES |
| ALLEN | SALESMAN | BLAKE |
| MARD | SALESMAN | BLAKE |
| MARRTIN | SALESMAN | BLAKE |
| TURNER | SALESMAN | BLAKE |
| JAMES | CLEAR | BLAKE |
| MILLER | CLEAR | CLARK |
| ADAMS | CLEAR | SCOTT |
| JONES | MANAGER | KING |
| BLAKE | MANAGER | KING |
| CLARK | MANAGER | KING |
| SMITH | CLEAR | FORD |
+---------+----------+-------+
13 rows in set (0.00 sec)
2.2等值連接:
內(nèi)連接查詢中的等值連接,就是在關(guān)鍵字on后的匹配條件中通過(guò)等于關(guān)系運(yùn)算符“=”來(lái)實(shí)現(xiàn)等值條件。
示例:
mysql> select e.empno,e.ename,e.job,d.dname,d.loc from t_employee e inner join t_dept d on e.deptno=d.deptno;
+-------+---------+-----------+------------+----------+
| empno | ename | job | dname | loc |
+-------+---------+-----------+------------+----------+
| 7788 | SCOTT | ANALYST | ACCOUNTING | NEW YORK |
| 7839 | KING | PRESIDENT | ACCOUNTING | NEW YORK |
| 7934 | MILLER | CLEAR | ACCOUNTING | NEW YORK |
| 7369 | SMITH | CLEAR | RESEARCH | DALLAS |
| 7499 | ALLEN | SALESMAN | RESEARCH | DALLAS |
| 7566 | JONES | MANAGER | RESEARCH | DALLAS |
| 7782 | CLARK | MANAGER | RESEARCH | DALLAS |
| 7876 | ADAMS | CLEAR | RESEARCH | DALLAS |
| 7902 | FORD | ANALYST | RESEARCH | DALLAS |
| 7521 | MARD | SALESMAN | SALES | CHICAGO |
| 7654 | MARRTIN | SALESMAN | SALES | CHICAGO |
| 7698 | BLAKE | MANAGER | SALES | CHICAGO |
| 7844 | TURNER | SALESMAN | SALES | CHICAGO |
| 7900 | JAMES | CLEAR | SALES | CHICAGO |
+-------+---------+-----------+------------+----------+
14 rows in set (0.00 sec)
2.3不等連接:
內(nèi)連接查詢中的不等連接,就是在關(guān)鍵字on后的匹配條件中通過(guò)除了等于關(guān)系運(yùn)算符來(lái)實(shí)現(xiàn)不等條件外,可以使用的關(guān)系運(yùn)算符包含> >= < <= !=
示例:
mysql> select e.ename employeename, e.job,l.ename loadername from t_employee e inner join t_employee l on e.mgr=l.empno
and e.empno>l.empno;
+--------------+----------+------------+
| employeename | job | loadername |
+--------------+----------+------------+
| SCOTT | ANALYST | JONES |
| FORD | ANALYST | JONES |
| TURNER | SALESMAN | BLAKE |
| JAMES | CLEAR | BLAKE |
| MILLER | CLEAR | CLARK |
| ADAMS | CLEAR | SCOTT |
+--------------+----------+------------+
6 rows in set (0.00 sec)
3.外連接查詢:
外連接查詢會(huì)返回所操作表中至少一個(gè)表的所有數(shù)據(jù)。外連接分為三類(lèi):左外連接、右外連接、全外連接
語(yǔ)法為:
select field1, field2, ...fieldn
from join_tablename1 left|rigth|full [outer] join join_tablename2
on join_condition
3.1左外連接:
外連接查詢中的左外連接,就是指新關(guān)系中執(zhí)行匹配條件時(shí),以關(guān)鍵字left join 左邊的表為參考。
示例:
mysql> select e.ename employeename, e.job job,l.ename leadername from t_employee e left join t_employee l on e.mgr=l.empno;
+--------------+-----------+------------+
| employeename | job | leadername |
+--------------+-----------+------------+
| SMITH | CLEAR | FORD |
| ALLEN | SALESMAN | BLAKE |
| MARD | SALESMAN | BLAKE |
| JONES | MANAGER | KING |
| MARRTIN | SALESMAN | BLAKE |
| BLAKE | MANAGER | KING |
| CLARK | MANAGER | KING |
| SCOTT | ANALYST | JONES |
| KING | PRESIDENT | NULL |
| TURNER | SALESMAN | BLAKE |
| ADAMS | CLEAR | SCOTT |
| JAMES | CLEAR | BLAKE |
| FORD | ANALYST | JONES |
| MILLER | CLEAR | CLARK |
+--------------+-----------+------------+
14 rows in set (0.00 sec)
3.2右外連接:
外連接查詢中的右外連接,就是指新關(guān)系中執(zhí)行匹配條件時(shí),以關(guān)鍵字right join 右邊的表為參考。
4.合并查詢數(shù)據(jù)記錄:
在MySQL中通過(guò)關(guān)鍵字UNION來(lái)實(shí)現(xiàn)并操作,即可以通過(guò)其將多個(gè)select語(yǔ)句的查詢結(jié)果合并在一起組成新的關(guān)系。
1. 關(guān)鍵字union的合并操作
關(guān)鍵字union會(huì)把查詢結(jié)果集直接合并在一起,同時(shí)將會(huì)去掉重復(fù)數(shù)據(jù)記錄。
2. 關(guān)鍵字union all的合并操作
關(guān)鍵字union all會(huì)把查詢結(jié)果集直接合并在一起。
語(yǔ)法為:
select field1, field2, ...fieldn
from tablename1
union | union all
select field1, field2, ...fieldn
from tablename2
union | union all
select field1, field2, ...fieldn
from tablename3
......
5.子查詢:
在MySQL中雖然可以通過(guò)連接查詢實(shí)現(xiàn)多表查詢數(shù)據(jù)記錄,但卻不建議使用。這是因?yàn)檫B接查詢的性能很差。因此出現(xiàn)了連接查詢的替代者子查詢。推薦使用子查詢來(lái)實(shí)現(xiàn)多表查詢數(shù)據(jù)記錄。
5.1 為什么使用子查詢:
在日常開(kāi)發(fā)中,經(jīng)常接觸到查詢多表數(shù)據(jù)記錄操作,例如查詢部門(mén)表t_dept和雇員表t_employee表的數(shù)據(jù)記錄。對(duì)于新手,直接使用select * from t_dept t,t_employee e where t.deptno=e.deptno;這條sql語(yǔ)句在執(zhí)行時(shí),首先會(huì)對(duì)兩個(gè)表進(jìn)行笛卡爾積操作,然后在選取符合匹配條件的數(shù)據(jù)記錄。如果兩張表的數(shù)據(jù)量較大,則在進(jìn)行笛卡爾積操作時(shí)會(huì)造成死機(jī)。有經(jīng)驗(yàn)的開(kāi)發(fā)者通常會(huì)首先用統(tǒng)計(jì)函數(shù)查看操作表笛卡爾積后的數(shù)據(jù)記錄數(shù),然后再進(jìn)行多表查詢。因此多表查詢一般會(huì)經(jīng)過(guò)如下步驟:
1. 通過(guò)統(tǒng)計(jì)函數(shù)count(1)查詢所關(guān)聯(lián)表笛卡爾積后的數(shù)據(jù)的記錄數(shù)。然后再進(jìn)行多表查詢。
2. 如果查詢到的數(shù)據(jù)記錄數(shù)mysql可以接受,然后再進(jìn)行多表查詢,否則就應(yīng)該考慮通過(guò)其他方式來(lái)實(shí)現(xiàn)。
如果笛卡爾積后的數(shù)據(jù)遠(yuǎn)遠(yuǎn)大于mysql軟件可以接受的范圍,為了解決多表查詢,mysql提供了子查詢來(lái)實(shí)現(xiàn)多表查詢。
所謂子查詢,就是指在一個(gè)查詢中嵌套了其他若干查詢,即在一個(gè)select 查詢語(yǔ)句的where或from子句中包含另一個(gè)select查詢語(yǔ)句。在查詢語(yǔ)句中,外層select查詢語(yǔ)句稱(chēng)為主查詢,where子句中select查詢語(yǔ)句被稱(chēng)為子查詢,也被稱(chēng)為嵌套查詢。
通過(guò)子查詢可以實(shí)現(xiàn)多表查詢,該查詢語(yǔ)句中可能包含in,any,all,exists等關(guān)鍵字。除此之外還可能包含比較運(yùn)算符。理論上子查詢可以出現(xiàn)在查詢語(yǔ)句的任何位置,但在實(shí)際開(kāi)發(fā)中,子查詢經(jīng)常出現(xiàn)在where或from子句中。
where子句中的子查詢,該位置處的子查詢一般返回單行單列、多行多列、單行多列數(shù)據(jù)記錄。
from子句中的子查詢,該位置處的子查詢一般返回多行多列數(shù)據(jù)記錄,可以當(dāng)作一張臨時(shí)表。
5.2 返回結(jié)果為單行單列和單行多列子查詢:
當(dāng)子查詢的返回結(jié)果為單行蛋類(lèi)數(shù)據(jù)記錄時(shí),該子查詢語(yǔ)句一般在主查詢語(yǔ)句的where子句中,通常會(huì)包含比較運(yùn)算符(> < = != 等)
5.2.1 單行單列子查詢:
示例(工資比Smith高的全部雇員信息):
mysql> select * from t_employee where sal > (select sal from t_employee where ename='smith');
+-------+---------+-----------+------+------------+---------+---------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+---------+-----------+------+------------+---------+---------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 | 20 |
| 7521 | MARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-03-12 | 2975.00 | NULL | 20 |
| 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-03-12 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 0000-00-00 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLEAR | 7782 | 1981-03-12 | 1300.00 | NULL | 10 |
+-------+---------+-----------+------+------------+---------+---------+--------+
13 rows in set (0.00 sec)
5.2.2 單行多列子查詢:
where子句中的子查詢除了是返回單行單列的數(shù)據(jù)記錄外,還可以是返回多行多列的數(shù)據(jù)記錄,不過(guò)這種子查詢很少出現(xiàn)。
示例(工資和職位和Smith一樣的全部雇員):
mysql> select ename,job,sal from t_employee where (sal,job)=(select sal,job from t_employee where ename='smith');
+-------+-------+--------+
| ename | job | sal |
+-------+-------+--------+
| SMITH | CLEAR | 800.00 |
+-------+-------+--------+
1 row in set (0.00 sec)
5.3 返回結(jié)果為多行單列子查詢:
當(dāng)子查詢的返回結(jié)果為多行單列數(shù)據(jù)記錄時(shí),該子查詢語(yǔ)句一般會(huì)在主查詢語(yǔ)句的where子句中出現(xiàn),通常會(huì)包含IN ANY ALL EXISTS等關(guān)鍵字。
5.3.1 帶有關(guān)鍵字in的子查詢:
當(dāng)主查詢的條件在子查詢的查詢結(jié)果中時(shí),可以通過(guò)關(guān)鍵字in來(lái)進(jìn)行判斷。相反,如果想實(shí)現(xiàn)主查詢的條件不在子查詢的查詢結(jié)果中時(shí),可以通過(guò)關(guān)鍵字not in來(lái)進(jìn)行判斷。
示例:
mysql> select * from t_employee where deptno in(select deptno from t_dept);
+-------+---------+-----------+------+------------+---------+---------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+---------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLEAR | 7902 | 1981-03-12 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 | 20 |
| 7521 | MARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-03-12 | 2975.00 | NULL | 20 |
| 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-03-12 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 0000-00-00 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLEAR | 7782 | 1981-03-12 | 1300.00 | NULL | 10 |
+-------+---------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
5.3.2 帶有關(guān)鍵字any的子查詢:
關(guān)鍵字any:主查詢的條件為滿足子查詢的查詢結(jié)果中任意一條數(shù)據(jù)記錄,該關(guān)鍵字有三種匹配方式;
1. =any:其功能與關(guān)鍵字in一樣
2. > any(>=any):只要大于(大于等于)子查詢中最小的一個(gè)即可。
3. < any(<=any):只要小于(小于等于)子查詢中最大的一個(gè)即可。
示例(查詢雇員工資不低于職位為manager的工資):
mysql> select ename,sal from t_employee where sal>any(select sal from t_employee where job='manager');
+---------+---------+
| ename | sal |
+---------+---------+
| JONES | 2975.00 |
| MARRTIN | 2850.00 |
| BLAKE | 2850.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+---------+---------+
6 rows in set (0.00 sec)
5.3.3 帶有關(guān)鍵字all的子查詢:
關(guān)鍵字all用來(lái)表示主查詢的條件為滿足子查詢返回查詢結(jié)果中所有數(shù)據(jù)記錄,有兩種匹配方式:
1. > all(>=all):比子查詢結(jié)果中最大的還要大(大于等于)的數(shù)據(jù)記錄;
2. < all(<= all):比子查詢結(jié)果中最小的還要小(小于等于)的數(shù)據(jù)記錄。
示例:
mysql> select ename,sal from t_employee where sal>all(select sal from t_employee where job='manager');
+-------+---------+
| ename | sal |
+-------+---------+
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
3 rows in set (0.00 sec)
5.3.4 帶有關(guān)鍵字exists的子查詢:
關(guān)鍵字exists是一個(gè)boolean類(lèi)型,當(dāng)能返回結(jié)果集時(shí)為true,不能返回結(jié)果集時(shí)為false。查詢時(shí)exists對(duì)外表采用遍歷方式逐條查詢,每次查詢都會(huì)比較exists的條件語(yǔ)句,當(dāng)exists里的條件語(yǔ)句返回記錄行時(shí)則條件為真,此時(shí)返回當(dāng)前遍歷到的記錄;反之,如果exists里條件語(yǔ)句不能返回記錄行,則丟棄當(dāng)前遍歷到的記錄。
5.4 返回結(jié)果為多行多列子查詢:
當(dāng)子查詢的返回結(jié)果為多行多列數(shù)據(jù)記錄時(shí),該子查詢語(yǔ)句一般會(huì)在主查詢語(yǔ)句的from子句里,被當(dāng)作一張臨時(shí)表的方式來(lái)處理。
示例(查詢雇員表中各部門(mén)的部門(mén)號(hào)、部門(mén)名稱(chēng)、部門(mén)地址、雇員人數(shù)、和平均工資):
通過(guò)內(nèi)連接來(lái)實(shí)現(xiàn):
mysql> select d.deptno,d.dname,d.loc,count(e.empno) number,avg(e.sal) average from t_employee e inner join t_dept d on e
.deptno=d.deptno group by d.deptno;
+--------+------------+----------+--------+-------------+
| deptno | dname | loc | number | average |
+--------+------------+----------+--------+-------------+
| 10 | ACCOUNTING | NEW YORK | 3 | 3100.000000 |
| 20 | RESEARCH | DALLAS | 6 | 1987.500000 |
| 30 | SALES | CHICAGO | 5 | 1880.000000 |
+--------+------------+----------+--------+-------------+
3 rows in set (0.00 sec)
通過(guò)子查詢來(lái)實(shí)現(xiàn):
mysql> select d.deptno,d.dname,d.loc,number,average from t_dept d inner join(select deptno dno,count(empno) number,avg(s
al) average from t_employee group by deptno) employee on d.deptno=employee.dno;
+--------+------------+----------+--------+-------------+
| deptno | dname | loc | number | average |
+--------+------------+----------+--------+-------------+
| 10 | ACCOUNTING | NEW YORK | 3 | 3100.000000 |
| 20 | RESEARCH | DALLAS | 6 | 1987.500000 |
| 30 | SALES | CHICAGO | 5 | 1880.000000 |
+--------+------------+----------+--------+-------------+
3 rows in set (0.00 sec)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
-
關(guān)于mysql時(shí)間區(qū)間問(wèn)題淺析
在很多地方都使用到了mysql的日期查詢,下面這篇文章主要給大家介紹了關(guān)于mysql時(shí)間區(qū)間問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下 2022-04-04
-
Mysql 5.7.17 winx64在win7上的安裝教程
本文給大家介紹Mysql 5.7.17 winx64在win7上的安裝教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧 2017-04-04
最新評(píng)論
在實(shí)際應(yīng)用中,經(jīng)常需要實(shí)現(xiàn)在一個(gè)查詢語(yǔ)句中顯示多張表的數(shù)據(jù),這就是所謂的多表數(shù)據(jù)記錄連接查詢,簡(jiǎn)稱(chēng)來(lái)年將誒查詢。
在具體實(shí)現(xiàn)連接查詢操作時(shí),首先將兩個(gè)或兩個(gè)以上的表按照某個(gè)條件連接起來(lái),然后再查詢到所要求的數(shù)據(jù)記錄。連接查詢分為內(nèi)連接查詢和外連接查詢。
在具體應(yīng)用中,如果需要實(shí)現(xiàn)多表數(shù)據(jù)記錄查詢,一般不使用連接查詢,因?yàn)樵摬僮餍时容^低。于是MySQL又提供 了連接查詢的替代操作,子查詢操作。
1.關(guān)系數(shù)據(jù)操作:
在連接查詢中,首先需要對(duì)兩張或兩張以上的表進(jìn)行連接操作。連接操作是關(guān)系數(shù)據(jù)操作中專(zhuān)門(mén)用于數(shù)據(jù)操作的關(guān)系運(yùn)算。
1.1 并(UNION):
在SQL語(yǔ)言中存在一種關(guān)系數(shù)據(jù)操作,叫做并操作?!安ⅰ本褪前丫哂邢嗤侄螖?shù)目和字段類(lèi)型的表合并到一起。通過(guò)并操作將兩張表的數(shù)據(jù)記錄合并到一起,合并后的字段數(shù)為 表1的字段數(shù)或者表2的字段數(shù);合并后的總記錄數(shù)為:表1的記錄數(shù) + 表2的記錄數(shù) - 表1和表2 重復(fù)的記錄數(shù)。
1.2 笛卡爾積(CARTESIAN PRODUCT):
在SQL語(yǔ)言中存在一種關(guān)系數(shù)據(jù)操作,叫做笛卡爾積操作。笛卡爾就是沒(méi)有連接條件,表中的數(shù)據(jù)任意的組合。笛卡爾積的字段數(shù)為 表1的字段數(shù) + 表2的字段數(shù)。笛卡爾積的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù)。
1.3 內(nèi)連接(INNER JOIN):
為了便于操作,專(zhuān)門(mén)提供了一種針對(duì)數(shù)據(jù)庫(kù)操作的運(yùn)算—連接(JOIN)。所謂連接就是在表關(guān)系的笛卡爾積數(shù)據(jù)記錄中,按照相應(yīng)字段值的比較條件進(jìn)行選擇生成一個(gè)新的關(guān)系。連接又分為內(nèi)連接(INNER JOIN)、外連接(OUTER JOIN)、交叉連接(CROSS JOIN)。
所謂內(nèi)連接,就是在表關(guān)系的笛卡爾積數(shù)據(jù)中,保留表關(guān)系中所有匹配的數(shù)據(jù)記錄,舍棄不匹配的數(shù)據(jù)記錄。按照匹配的條件可以分成自然連接、等值連接和不等連接。
1.3.1 自然連接(NATURAL JOIN):
自然連接就是在表關(guān)系的笛卡爾積中,首先根據(jù)表關(guān)系中相同名稱(chēng)的字段自動(dòng)進(jìn)行記錄匹配,然后去掉重復(fù)的字段。
通過(guò)自然連接后,新關(guān)系的字段數(shù)為:表1字段數(shù) + 表2字段數(shù) - 表1和表2中的重復(fù)字段數(shù)。自然連接后新關(guān)系的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù) - 表1和表2相同字段的值不相等記錄數(shù)。
自然連接又如下特點(diǎn):
1. 在具體執(zhí)行自然連接時(shí),會(huì)自動(dòng)判斷相同名稱(chēng)的字段,然后進(jìn)行數(shù)據(jù)值的匹配。
2. 在執(zhí)行完自然連接的新關(guān)系中,雖然可以指定包含哪些字段,但是不能指定執(zhí)行過(guò)程中的匹配條件,即哪些字段的值進(jìn)行匹配。
3. 在執(zhí)行自然連接的新關(guān)系中,執(zhí)行過(guò)程中所匹配的字段名只有一個(gè),即會(huì)去掉重復(fù)字段。
1.3.2 等值連接:
所謂等值連接操作就是表關(guān)系的笛卡爾積中,選擇所匹配字段值相等的數(shù)據(jù)記錄。
通過(guò)等值連接后,新關(guān)系的字段數(shù)為:表1字段數(shù) + 表2字段數(shù)。等值連接后新關(guān)系的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù) - 表1和表2相同字段的值不相等記錄數(shù)。
與自然連接相比,等值連接操作需要在執(zhí)行過(guò)程中用“=”指定匹配條件,在新關(guān)系中不會(huì)去掉重復(fù)字段。
1.3.3 不等連接:
所謂不等連接操作就是表關(guān)系的笛卡爾積中,選擇所匹配字段值不相等的數(shù)據(jù)記錄。
通過(guò)不等連接后,新關(guān)系的字段數(shù)為:表1字段數(shù) + 表2字段數(shù)。等值連接后新關(guān)系的記錄數(shù)為:表1的記錄數(shù) * 表2的記錄數(shù) - 表1和表2相同字段的值相等的記錄數(shù)。
與自然連接相比,等值連接操作需要在執(zhí)行過(guò)程中用“!=”指定匹配條件,在新關(guān)系中不會(huì)去掉重復(fù)字段。
1.4 外連接(OUTER JOIN):
所謂外連接(OUTER JOIN),就是在表關(guān)系的笛卡爾積數(shù)據(jù)記錄中,不僅保留表關(guān)系中所有匹配的數(shù)據(jù)記錄,而且還會(huì)保留部分不匹配的數(shù)據(jù)記錄。按照保留不不匹配條件數(shù)據(jù)記錄來(lái)源可以分為:左外連接、右外連接、全外連接。
1.4.1 左外連接:
所謂左外連接操作就是表關(guān)系的笛卡爾積中,除了選擇相匹配的數(shù)據(jù)記錄,還包含關(guān)聯(lián)左邊表中不匹配的數(shù)據(jù)記錄。
通過(guò)左外連接后,新關(guān)系的字段數(shù)為:左表字段數(shù) + 右表字段數(shù)。左外連接后新關(guān)系的記錄數(shù)為:左表的記錄數(shù) * 右表的記錄數(shù) - 左表和右表相同字段的值不相等的記錄數(shù) + 左表中未匹配的記錄數(shù)。
1.4.2 右外連接:
所謂右外連接操作就是表關(guān)系的笛卡爾積中,除了選擇相匹配的數(shù)據(jù)記錄,還包含關(guān)聯(lián)右邊表中不匹配的數(shù)據(jù)記錄。
通過(guò)右外連接后,新關(guān)系的字段數(shù)為:左表字段數(shù) + 右表字段數(shù)。右外連接后新關(guān)系的記錄數(shù)為:左表的記錄數(shù) * 右表的記錄數(shù) - 左表和右表相同字段的值不相等的記錄數(shù) + 右表中未匹配的記錄數(shù)。
1.4.3 全外連接:
所謂右外連接操作就是表關(guān)系的笛卡爾積中,除了選擇相匹配的數(shù)據(jù)記錄,還包含關(guān)聯(lián)左右兩邊表中不匹配的數(shù)據(jù)記錄。
通過(guò)全外連接后,新關(guān)系的字段數(shù)為:左表字段數(shù) + 右表字段數(shù)。全外連接后新關(guān)系的記錄數(shù)為:左表的記錄數(shù) * 右表的記錄數(shù) - 左表和右表相同字段的值不相等的記錄數(shù) + 左表未匹配的記錄數(shù) + 右表中未匹配的記錄數(shù)。
2.內(nèi)連接查詢:
在MySQL中實(shí)現(xiàn)連接查詢有兩種語(yǔ)法:
1. 在from子句中利用逗號(hào)區(qū)分多個(gè)表,在where子句中通過(guò)邏輯表達(dá)式來(lái)實(shí)現(xiàn)匹配條件,從而實(shí)現(xiàn)表的連接。
2. ANSI連接語(yǔ)法形式,在from子句中使用“join on”關(guān)鍵字,而連接條件寫(xiě)在關(guān)鍵字on子句中。推薦使用第二種方式。
按照匹配條件,內(nèi)連接查詢可以分為兩類(lèi):等值連接;不等連接。
內(nèi)連接查詢語(yǔ)法為:
select field1, field2 ...fieldn from join_tablename1 inner join join_tablename2 [inner join join_tablename] on join_condition
//參數(shù)filedn 表示所要查詢的字段名稱(chēng),來(lái)源于所連接的表join_tablename1 和 join_tablename2,關(guān)鍵字inner join表進(jìn)行內(nèi)連接,join_condition表示進(jìn)行匹配的條件。
2.1 自連接:
內(nèi)連接查詢中存在一種特殊的等值連接—自連接。所謂自連接就是指表與其自身進(jìn)行連接。
示例(查詢每個(gè)雇員的姓名、職位、領(lǐng)導(dǎo)姓名):
mysql> select e.ename,e.job,l.ename from t_employee e inner join t_employee l on e.MGR=l.empno; +---------+----------+-------+ | ename | job | ename | +---------+----------+-------+ | SCOTT | ANALYST | JONES | | FORD | ANALYST | JONES | | ALLEN | SALESMAN | BLAKE | | MARD | SALESMAN | BLAKE | | MARRTIN | SALESMAN | BLAKE | | TURNER | SALESMAN | BLAKE | | JAMES | CLEAR | BLAKE | | MILLER | CLEAR | CLARK | | ADAMS | CLEAR | SCOTT | | JONES | MANAGER | KING | | BLAKE | MANAGER | KING | | CLARK | MANAGER | KING | | SMITH | CLEAR | FORD | +---------+----------+-------+ 13 rows in set (0.00 sec)
2.2等值連接:
內(nèi)連接查詢中的等值連接,就是在關(guān)鍵字on后的匹配條件中通過(guò)等于關(guān)系運(yùn)算符“=”來(lái)實(shí)現(xiàn)等值條件。
示例:
mysql> select e.empno,e.ename,e.job,d.dname,d.loc from t_employee e inner join t_dept d on e.deptno=d.deptno; +-------+---------+-----------+------------+----------+ | empno | ename | job | dname | loc | +-------+---------+-----------+------------+----------+ | 7788 | SCOTT | ANALYST | ACCOUNTING | NEW YORK | | 7839 | KING | PRESIDENT | ACCOUNTING | NEW YORK | | 7934 | MILLER | CLEAR | ACCOUNTING | NEW YORK | | 7369 | SMITH | CLEAR | RESEARCH | DALLAS | | 7499 | ALLEN | SALESMAN | RESEARCH | DALLAS | | 7566 | JONES | MANAGER | RESEARCH | DALLAS | | 7782 | CLARK | MANAGER | RESEARCH | DALLAS | | 7876 | ADAMS | CLEAR | RESEARCH | DALLAS | | 7902 | FORD | ANALYST | RESEARCH | DALLAS | | 7521 | MARD | SALESMAN | SALES | CHICAGO | | 7654 | MARRTIN | SALESMAN | SALES | CHICAGO | | 7698 | BLAKE | MANAGER | SALES | CHICAGO | | 7844 | TURNER | SALESMAN | SALES | CHICAGO | | 7900 | JAMES | CLEAR | SALES | CHICAGO | +-------+---------+-----------+------------+----------+ 14 rows in set (0.00 sec)
2.3不等連接:
內(nèi)連接查詢中的不等連接,就是在關(guān)鍵字on后的匹配條件中通過(guò)除了等于關(guān)系運(yùn)算符來(lái)實(shí)現(xiàn)不等條件外,可以使用的關(guān)系運(yùn)算符包含> >= < <= !=
示例:
mysql> select e.ename employeename, e.job,l.ename loadername from t_employee e inner join t_employee l on e.mgr=l.empno and e.empno>l.empno; +--------------+----------+------------+ | employeename | job | loadername | +--------------+----------+------------+ | SCOTT | ANALYST | JONES | | FORD | ANALYST | JONES | | TURNER | SALESMAN | BLAKE | | JAMES | CLEAR | BLAKE | | MILLER | CLEAR | CLARK | | ADAMS | CLEAR | SCOTT | +--------------+----------+------------+ 6 rows in set (0.00 sec)
3.外連接查詢:
外連接查詢會(huì)返回所操作表中至少一個(gè)表的所有數(shù)據(jù)。外連接分為三類(lèi):左外連接、右外連接、全外連接
語(yǔ)法為:
select field1, field2, ...fieldn from join_tablename1 left|rigth|full [outer] join join_tablename2 on join_condition
3.1左外連接:
外連接查詢中的左外連接,就是指新關(guān)系中執(zhí)行匹配條件時(shí),以關(guān)鍵字left join 左邊的表為參考。
示例:
mysql> select e.ename employeename, e.job job,l.ename leadername from t_employee e left join t_employee l on e.mgr=l.empno; +--------------+-----------+------------+ | employeename | job | leadername | +--------------+-----------+------------+ | SMITH | CLEAR | FORD | | ALLEN | SALESMAN | BLAKE | | MARD | SALESMAN | BLAKE | | JONES | MANAGER | KING | | MARRTIN | SALESMAN | BLAKE | | BLAKE | MANAGER | KING | | CLARK | MANAGER | KING | | SCOTT | ANALYST | JONES | | KING | PRESIDENT | NULL | | TURNER | SALESMAN | BLAKE | | ADAMS | CLEAR | SCOTT | | JAMES | CLEAR | BLAKE | | FORD | ANALYST | JONES | | MILLER | CLEAR | CLARK | +--------------+-----------+------------+ 14 rows in set (0.00 sec)
3.2右外連接:
外連接查詢中的右外連接,就是指新關(guān)系中執(zhí)行匹配條件時(shí),以關(guān)鍵字right join 右邊的表為參考。
4.合并查詢數(shù)據(jù)記錄:
在MySQL中通過(guò)關(guān)鍵字UNION來(lái)實(shí)現(xiàn)并操作,即可以通過(guò)其將多個(gè)select語(yǔ)句的查詢結(jié)果合并在一起組成新的關(guān)系。
1. 關(guān)鍵字union的合并操作
關(guān)鍵字union會(huì)把查詢結(jié)果集直接合并在一起,同時(shí)將會(huì)去掉重復(fù)數(shù)據(jù)記錄。
2. 關(guān)鍵字union all的合并操作
關(guān)鍵字union all會(huì)把查詢結(jié)果集直接合并在一起。
語(yǔ)法為:
select field1, field2, ...fieldn from tablename1 union | union all select field1, field2, ...fieldn from tablename2 union | union all select field1, field2, ...fieldn from tablename3 ......
5.子查詢:
在MySQL中雖然可以通過(guò)連接查詢實(shí)現(xiàn)多表查詢數(shù)據(jù)記錄,但卻不建議使用。這是因?yàn)檫B接查詢的性能很差。因此出現(xiàn)了連接查詢的替代者子查詢。推薦使用子查詢來(lái)實(shí)現(xiàn)多表查詢數(shù)據(jù)記錄。
5.1 為什么使用子查詢:
在日常開(kāi)發(fā)中,經(jīng)常接觸到查詢多表數(shù)據(jù)記錄操作,例如查詢部門(mén)表t_dept和雇員表t_employee表的數(shù)據(jù)記錄。對(duì)于新手,直接使用select * from t_dept t,t_employee e where t.deptno=e.deptno;這條sql語(yǔ)句在執(zhí)行時(shí),首先會(huì)對(duì)兩個(gè)表進(jìn)行笛卡爾積操作,然后在選取符合匹配條件的數(shù)據(jù)記錄。如果兩張表的數(shù)據(jù)量較大,則在進(jìn)行笛卡爾積操作時(shí)會(huì)造成死機(jī)。有經(jīng)驗(yàn)的開(kāi)發(fā)者通常會(huì)首先用統(tǒng)計(jì)函數(shù)查看操作表笛卡爾積后的數(shù)據(jù)記錄數(shù),然后再進(jìn)行多表查詢。因此多表查詢一般會(huì)經(jīng)過(guò)如下步驟:
1. 通過(guò)統(tǒng)計(jì)函數(shù)count(1)查詢所關(guān)聯(lián)表笛卡爾積后的數(shù)據(jù)的記錄數(shù)。然后再進(jìn)行多表查詢。
2. 如果查詢到的數(shù)據(jù)記錄數(shù)mysql可以接受,然后再進(jìn)行多表查詢,否則就應(yīng)該考慮通過(guò)其他方式來(lái)實(shí)現(xiàn)。
如果笛卡爾積后的數(shù)據(jù)遠(yuǎn)遠(yuǎn)大于mysql軟件可以接受的范圍,為了解決多表查詢,mysql提供了子查詢來(lái)實(shí)現(xiàn)多表查詢。
所謂子查詢,就是指在一個(gè)查詢中嵌套了其他若干查詢,即在一個(gè)select 查詢語(yǔ)句的where或from子句中包含另一個(gè)select查詢語(yǔ)句。在查詢語(yǔ)句中,外層select查詢語(yǔ)句稱(chēng)為主查詢,where子句中select查詢語(yǔ)句被稱(chēng)為子查詢,也被稱(chēng)為嵌套查詢。
通過(guò)子查詢可以實(shí)現(xiàn)多表查詢,該查詢語(yǔ)句中可能包含in,any,all,exists等關(guān)鍵字。除此之外還可能包含比較運(yùn)算符。理論上子查詢可以出現(xiàn)在查詢語(yǔ)句的任何位置,但在實(shí)際開(kāi)發(fā)中,子查詢經(jīng)常出現(xiàn)在where或from子句中。
where子句中的子查詢,該位置處的子查詢一般返回單行單列、多行多列、單行多列數(shù)據(jù)記錄。
from子句中的子查詢,該位置處的子查詢一般返回多行多列數(shù)據(jù)記錄,可以當(dāng)作一張臨時(shí)表。
5.2 返回結(jié)果為單行單列和單行多列子查詢:
當(dāng)子查詢的返回結(jié)果為單行蛋類(lèi)數(shù)據(jù)記錄時(shí),該子查詢語(yǔ)句一般在主查詢語(yǔ)句的where子句中,通常會(huì)包含比較運(yùn)算符(> < = != 等)
5.2.1 單行單列子查詢:
示例(工資比Smith高的全部雇員信息):
mysql> select * from t_employee where sal > (select sal from t_employee where ename='smith'); +-------+---------+-----------+------+------------+---------+---------+--------+ | empno | ename | job | MGR | Hiredate | sal | comm | deptno | +-------+---------+-----------+------+------------+---------+---------+--------+ | 7499 | ALLEN | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 | 20 | | 7521 | MARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 | | 7566 | JONES | MANAGER | 7839 | 1981-03-12 | 2975.00 | NULL | 20 | | 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 | 30 | | 7698 | BLAKE | MANAGER | 7839 | 1981-03-12 | 2850.00 | NULL | 30 | | 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 | | 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 | | 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 | | 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 | 0.00 | 30 | | 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 | | 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 | | 7902 | FORD | ANALYST | 7566 | 0000-00-00 | 3000.00 | NULL | 20 | | 7934 | MILLER | CLEAR | 7782 | 1981-03-12 | 1300.00 | NULL | 10 | +-------+---------+-----------+------+------------+---------+---------+--------+ 13 rows in set (0.00 sec)
5.2.2 單行多列子查詢:
where子句中的子查詢除了是返回單行單列的數(shù)據(jù)記錄外,還可以是返回多行多列的數(shù)據(jù)記錄,不過(guò)這種子查詢很少出現(xiàn)。
示例(工資和職位和Smith一樣的全部雇員):
mysql> select ename,job,sal from t_employee where (sal,job)=(select sal,job from t_employee where ename='smith'); +-------+-------+--------+ | ename | job | sal | +-------+-------+--------+ | SMITH | CLEAR | 800.00 | +-------+-------+--------+ 1 row in set (0.00 sec)
5.3 返回結(jié)果為多行單列子查詢:
當(dāng)子查詢的返回結(jié)果為多行單列數(shù)據(jù)記錄時(shí),該子查詢語(yǔ)句一般會(huì)在主查詢語(yǔ)句的where子句中出現(xiàn),通常會(huì)包含IN ANY ALL EXISTS等關(guān)鍵字。
5.3.1 帶有關(guān)鍵字in的子查詢:
當(dāng)主查詢的條件在子查詢的查詢結(jié)果中時(shí),可以通過(guò)關(guān)鍵字in來(lái)進(jìn)行判斷。相反,如果想實(shí)現(xiàn)主查詢的條件不在子查詢的查詢結(jié)果中時(shí),可以通過(guò)關(guān)鍵字not in來(lái)進(jìn)行判斷。
示例:
mysql> select * from t_employee where deptno in(select deptno from t_dept); +-------+---------+-----------+------+------------+---------+---------+--------+ | empno | ename | job | MGR | Hiredate | sal | comm | deptno | +-------+---------+-----------+------+------------+---------+---------+--------+ | 7369 | SMITH | CLEAR | 7902 | 1981-03-12 | 800.00 | NULL | 20 | | 7499 | ALLEN | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 | 20 | | 7521 | MARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 | | 7566 | JONES | MANAGER | 7839 | 1981-03-12 | 2975.00 | NULL | 20 | | 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 | 30 | | 7698 | BLAKE | MANAGER | 7839 | 1981-03-12 | 2850.00 | NULL | 30 | | 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 | | 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 | | 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 | | 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 | 0.00 | 30 | | 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 | | 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 | | 7902 | FORD | ANALYST | 7566 | 0000-00-00 | 3000.00 | NULL | 20 | | 7934 | MILLER | CLEAR | 7782 | 1981-03-12 | 1300.00 | NULL | 10 | +-------+---------+-----------+------+------------+---------+---------+--------+ 14 rows in set (0.00 sec)
5.3.2 帶有關(guān)鍵字any的子查詢:
關(guān)鍵字any:主查詢的條件為滿足子查詢的查詢結(jié)果中任意一條數(shù)據(jù)記錄,該關(guān)鍵字有三種匹配方式;
1. =any:其功能與關(guān)鍵字in一樣
2. > any(>=any):只要大于(大于等于)子查詢中最小的一個(gè)即可。
3. < any(<=any):只要小于(小于等于)子查詢中最大的一個(gè)即可。
示例(查詢雇員工資不低于職位為manager的工資):
mysql> select ename,sal from t_employee where sal>any(select sal from t_employee where job='manager'); +---------+---------+ | ename | sal | +---------+---------+ | JONES | 2975.00 | | MARRTIN | 2850.00 | | BLAKE | 2850.00 | | SCOTT | 3000.00 | | KING | 5000.00 | | FORD | 3000.00 | +---------+---------+ 6 rows in set (0.00 sec)
5.3.3 帶有關(guān)鍵字all的子查詢:
關(guān)鍵字all用來(lái)表示主查詢的條件為滿足子查詢返回查詢結(jié)果中所有數(shù)據(jù)記錄,有兩種匹配方式:
1. > all(>=all):比子查詢結(jié)果中最大的還要大(大于等于)的數(shù)據(jù)記錄;
2. < all(<= all):比子查詢結(jié)果中最小的還要小(小于等于)的數(shù)據(jù)記錄。
示例:
mysql> select ename,sal from t_employee where sal>all(select sal from t_employee where job='manager'); +-------+---------+ | ename | sal | +-------+---------+ | SCOTT | 3000.00 | | KING | 5000.00 | | FORD | 3000.00 | +-------+---------+ 3 rows in set (0.00 sec)
5.3.4 帶有關(guān)鍵字exists的子查詢:
關(guān)鍵字exists是一個(gè)boolean類(lèi)型,當(dāng)能返回結(jié)果集時(shí)為true,不能返回結(jié)果集時(shí)為false。查詢時(shí)exists對(duì)外表采用遍歷方式逐條查詢,每次查詢都會(huì)比較exists的條件語(yǔ)句,當(dāng)exists里的條件語(yǔ)句返回記錄行時(shí)則條件為真,此時(shí)返回當(dāng)前遍歷到的記錄;反之,如果exists里條件語(yǔ)句不能返回記錄行,則丟棄當(dāng)前遍歷到的記錄。
5.4 返回結(jié)果為多行多列子查詢:
當(dāng)子查詢的返回結(jié)果為多行多列數(shù)據(jù)記錄時(shí),該子查詢語(yǔ)句一般會(huì)在主查詢語(yǔ)句的from子句里,被當(dāng)作一張臨時(shí)表的方式來(lái)處理。
示例(查詢雇員表中各部門(mén)的部門(mén)號(hào)、部門(mén)名稱(chēng)、部門(mén)地址、雇員人數(shù)、和平均工資):
通過(guò)內(nèi)連接來(lái)實(shí)現(xiàn):
mysql> select d.deptno,d.dname,d.loc,count(e.empno) number,avg(e.sal) average from t_employee e inner join t_dept d on e .deptno=d.deptno group by d.deptno; +--------+------------+----------+--------+-------------+ | deptno | dname | loc | number | average | +--------+------------+----------+--------+-------------+ | 10 | ACCOUNTING | NEW YORK | 3 | 3100.000000 | | 20 | RESEARCH | DALLAS | 6 | 1987.500000 | | 30 | SALES | CHICAGO | 5 | 1880.000000 | +--------+------------+----------+--------+-------------+ 3 rows in set (0.00 sec)
通過(guò)子查詢來(lái)實(shí)現(xiàn):
mysql> select d.deptno,d.dname,d.loc,number,average from t_dept d inner join(select deptno dno,count(empno) number,avg(s al) average from t_employee group by deptno) employee on d.deptno=employee.dno; +--------+------------+----------+--------+-------------+ | deptno | dname | loc | number | average | +--------+------------+----------+--------+-------------+ | 10 | ACCOUNTING | NEW YORK | 3 | 3100.000000 | | 20 | RESEARCH | DALLAS | 6 | 1987.500000 | | 30 | SALES | CHICAGO | 5 | 1880.000000 | +--------+------------+----------+--------+-------------+ 3 rows in set (0.00 sec)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于mysql時(shí)間區(qū)間問(wèn)題淺析
在很多地方都使用到了mysql的日期查詢,下面這篇文章主要給大家介紹了關(guān)于mysql時(shí)間區(qū)間問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Mysql 5.7.17 winx64在win7上的安裝教程
本文給大家介紹Mysql 5.7.17 winx64在win7上的安裝教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-04-04